如何修正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
相关产品推荐
相关产品推荐

