如何遍历字典对象计算多只股票Close列的相关性?
解决方法
方法1:合并后直接计算(推荐高效方案)
先从字典里提取所有股票的Close列,合并成一个以股票代码为列、日期为索引的DataFrame——pandas会自动对齐不同股票的日期索引,解决维度不匹配的核心问题。之后直接用内置方法计算相关性矩阵,比循环高效得多:
import pandas as pd # 提取所有股票的Close列,构建统一的DataFrame close_df = pd.DataFrame({ticker: df['Close'] for ticker, df in xrz_data.items()}) # 处理缺失值(二选一,根据需求调整) # 方式1:删除包含缺失值的日期行 close_df = close_df.dropna() # 方式2:用前一天的收盘价填充缺失值 # close_df = close_df.fillna(method='ffill') # 一键生成所有股票两两之间的相关性矩阵 corr_matrix = close_df.corr()
方法2:手动循环实现(适配自定义需求)
如果必须用循环,核心要先对齐两只股票的日期索引,确保计算时的Close列长度一致。代码如下:
import numpy as np import pandas as pd # 获取所有股票代码列表 tickers = list(xrz_data.keys()) # 初始化空的相关性矩阵 corr_matrix = pd.DataFrame(index=tickers, columns=tickers) # 双重循环计算两两相关性 for i in range(len(tickers)): ticker_a = tickers[i] close_a = xrz_data[ticker_a]['Close'] for j in range(i, len(tickers)): ticker_b = tickers[j] close_b = xrz_data[ticker_b]['Close'] # 对齐两个股票的日期,只保留共同存在的日期数据 aligned_data = pd.concat([close_a, close_b], axis=1).dropna() # 只有对齐后有有效数据才计算相关性 if len(aligned_data) > 0: corr_val = np.corrcoef(aligned_data.iloc[:,0], aligned_data.iloc[:,1])[0,1] corr_matrix.loc[ticker_a, ticker_b] = corr_val corr_matrix.loc[ticker_b, ticker_a] = corr_val # 相关性矩阵对称,直接赋值对称位置 else: corr_matrix.loc[ticker_a, ticker_b] = np.nan # 无共同日期时标记为缺失值 # 可选:将矩阵转为数值类型 corr_matrix = corr_matrix.astype(float)
错误原因说明
你触发的ValueError: 维度匹配错误,本质是不同股票的DataFrame日期范围不一致,导致Close列的长度不同——np.corrcoef要求输入的两个数组必须长度完全一致。上面两种方案都先处理了日期索引对齐的问题,从根源上解决了维度不匹配的问题。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

