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

如何对多股票多级列索引OHLC数据进行重采样

问题说明

通过yfinance拉取多只股票OHLC数据时,返回结果为两级列索引的DataFrame:第一级索引为OHLC字段名,第二级为股票名称。
单只股票下载场景下,按周重采样聚合的代码可正常运行;传入多只股票代码触发多级列结构时,代码运行报错。尝试stack、unstack调整数据结构未找到可行的重采样路径。

原实现代码:

import requests
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime, timedelta
N_DAYS_AGO = 15
now = datetime.now()
today = datetime(now.year,now.month,now.day, now.hour)
n_days_ago = today - timedelta(days=N_DAYS_AGO)

df = yf.download(['SPY','TLT'],  start=n_days_ago, end=now, interval = "60m")  #单只股票时无报错

ohlc_dict = {
    'Adj Close':'last',
    'Open':'first',
    'High':'max',
    'Low':'min',
    'Close':'last',
    'Volume':'sum'
    }

df_sample = df.resample('W-FRI', closed='left').agg(ohlc_dict)
df_sample  #传入2只股票时运行报错
报错原因

原聚合逻辑使用的ohlc_dict为单级列匹配设计:字典key直接对应列名,value对应该列的聚合方法。多股票返回的MultiIndex列结构下,pandas无法将单层key的字典与多级列做匹配,因此触发报错。

最简解决方案

无需反复转换行列结构,仅需针对多级列的每一列,匹配其第一级(字段层级)对应的聚合规则传入agg即可,仅需替换原重采样行的代码:

df_sample = df.resample('W-FRI', closed='left').agg(
    {col: ohlc_dict[col[0]] for col in df.columns}
)

该实现完全保留原聚合逻辑:

  • Adj Close、Close取重采样周期内最后一个值
  • Open取周期内第一个值
  • High取周期内最大值
  • Low取周期内最小值
  • Volume取周期内累计和

返回结果仍保留「OHLC字段-股票代码」的两级列索引,和yfinance原始返回的结构完全一致。若需要规整列顺序,可追加一行排序代码:

df_sample = df_sample.sort_index(axis=1)

内容的提问来源于stack exchange,提问作者Jon 310

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:45:40