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

如何修正yfinance数据获取代码 输出无NaN/零值的单一DataFrame

代码问题修正方案

原代码存在的问题

  • 循环缩进错误:给df赋值列的代码df[i] = data['Adj Close'].pct_change()写在for循环外,只会保留最后一个标的(^GSPC)的计算结果
  • 自定义的起止时间未生效:代码里定义了start和end变量,但调用yf.download时传了start=None, end=None,没有用到指定的2015年10月至今的时间范围
  • 缺失值处理逻辑不完善:仅用前向填充无法排除初始NaN以及涨跌幅为0的无效值
  • 没有对齐不同标的的时间索引:不同标的上市时间不同,需要统一索引范围避免错位

修正后代码

import datetime
import pandas as pd
import numpy as np
import yfinance as yf

start = datetime.datetime(2015, 10, 1)
end = datetime.datetime.now()
symbols = ['BTC-USD', 'ETH-USD', '^GSPC']
df = pd.DataFrame()

for i in symbols:
    # 调用自定义的起止时间拉取月度数据
    data = yf.download(i, start=start, end=end, interval="1mo")
    # 计算涨跌幅后赋值到对应列,缩进放在循环内
    df[i] = data['Adj Close'].pct_change()

# 先删除所有包含NaN的行(对齐所有标的都有数据的时间段)
df = df.dropna()
# 再过滤掉所有涨跌幅为0的行
df = df[(df != 0).all(axis=1)]

代码修改说明

  • 修正了循环缩进:把列赋值逻辑放到for循环内部,三个标的的涨跌幅都会被写入df的对应列
  • 生效自定义时间范围:yf.download传入已定义的start、end参数,拉取2015年10月至今的数据
  • 优化无效值处理:先使用dropna()删除所有存在缺失值的行,保留三个标的都有交易数据的共同时间段,再过滤掉所有涨跌幅为0的无效记录,符合无NaN、无零值的要求
  • 移除了冗余的period="max"参数:指定start和end后该参数无需传入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:24:03