如何针对含空值的股票数据生成协方差/相关矩阵?
含空值时间序列数据的协方差/相关矩阵计算方案
核心逻辑:针对每一对资产,仅保留两者同时有非空数据的时间戳条目,基于这些重叠数据计算协方差(或相关系数),最终组合成矩阵。
实现步骤(Python + Pandas)
假设你的时间序列数据已存入DataFrame df,其中包含timestamp列和各资产价格列:
提取资产列
先分离出所有需要计算的资产列(排除timestamp):asset_cols = df.columns.drop('timestamp')初始化结果矩阵
创建一个空的协方差矩阵,行和列都以资产名为索引:import pandas as pd import numpy as np # 协方差矩阵初始化 cov_matrix = pd.DataFrame( np.zeros((len(asset_cols), len(asset_cols))), index=asset_cols, columns=asset_cols )遍历资产对计算协方差
对每一对资产,筛选共同有效数据后计算协方差:for i, asset_x in enumerate(asset_cols): for j, asset_y in enumerate(asset_cols): # 筛选两者均非空的行 valid_pairs = df[[asset_x, asset_y]].dropna() # 至少需要2个数据点才能计算协方差 if len(valid_pairs) >= 2: # 提取两者的协方差值 cov_value = valid_pairs.cov().iloc[0, 1] cov_matrix.iloc[i, j] = cov_value else: # 数据不足时标记为NaN cov_matrix.iloc[i, j] = np.nan
扩展:计算相关矩阵
如果需要生成相关矩阵,只需将上述代码中的cov()替换为corr()即可:
corr_value = valid_pairs.corr().iloc[0, 1]
示例验证
用你提供的测试数据,usdjpy与AAPL的有效重叠数据为行1、2、3:
- usdjpy数据:[5, 6, 4]
- AAPL数据:[5, 6, 2]
计算得协方差为2,与代码运行结果一致。
内容的提问来源于stack exchange,提问作者gustavjaune
相关产品推荐
相关产品推荐

