You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历字典对象计算多只股票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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:55:20