第二章:金融数据获取——用yfinance搞定历史股票数据

做量化交易,第一步就是搞数据。没有数据,再牛的模型也是空中楼阁。

我个人习惯用yfinance这个库。它免费、轻量、直接对接雅虎财经,获取美股、港股甚至A股的历史数据都非常方便。说白了,它就是金融数据领域的「瑞士军刀」。

2.1 安装与导入yfinance

先装库。我建议你用pip安装,干净利落:

pip install yfinance

导入的时候,我习惯这样写:

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

嗯,pandas和numpy是标配,后面清洗数据、做计算都离不开它们。

2.2 获取单只股票的历史数据

获取数据其实就一行代码。比如拿苹果(AAPL)过去一年的日线数据:

aapl = yf.download('AAPL', start='2023-01-01', end='2023-12-31')
print(aapl.head())

返回的是一个DataFrame,包含Open、High、Low、Close、Volume、Adj Close这几列。你想想看,这些就是最原始的「原材料」。

小技巧: 我刚开始做的时候,经常忘记设置start和end参数。如果不设,yfinance默认只拉最近60个交易日的数据。别问我怎么知道的——有一次模型跑出来结果特别奇怪,查了半天才发现数据量不够。

2.3 数据清洗与预处理

真实世界的数据,从来都不是干净的。我遇到过不少坑,比如:

  • 停牌日导致数据缺失
  • 分红除权导致价格跳空
  • 节假日没有交易数据

所以拿到数据后,第一步就是检查缺失值:

print(aapl.isnull().sum())

如果有缺失,我一般用前向填充法:

aapl.fillna(method='ffill', inplace=True)

为什么用前向填充?因为金融数据是时间序列,缺失值用上一个交易日的价格来补,最符合逻辑。

避坑指南: 我曾经直接用dropna()把缺失行全删了,结果发现连续删了三天数据,导致模型训练时时间序列断裂。后来我学乖了——先看缺失比例,再决定填充还是删除。

2.4 数据可视化基础

光看数字不够直观。我习惯先画个收盘价走势图,一眼就能看出趋势:

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(aapl.index, aapl['Close'], label='AAPL Close Price', color='blue')
plt.title('Apple Stock Price (2023)')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.grid(True)
plt.show()

这张图能告诉你很多信息:有没有明显的上升/下降趋势?波动大不大?有没有异常跳空?

我个人还喜欢画成交量柱状图,配合价格走势一起看:

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

ax1.plot(aapl.index, aapl['Close'], color='blue')
ax1.set_title('AAPL Close Price')
ax1.grid(True)

ax2.bar(aapl.index, aapl['Volume'], color='gray')
ax2.set_title('AAPL Volume')
ax2.grid(True)

plt.tight_layout()
plt.show()

你想想看,价格涨了但成交量萎缩,说明上涨动力不足。这种量价背离的信号,在量化模型里很有价值。

2.5 本章知识体系

我把本章的核心逻辑画成了一张图,方便你理解整个流程:

金融数据获取与预处理流程 1. 安装yfinance 2. 下载历史数据 3. 数据清洗 4. 可视化 pip install yfinance 指定股票代码、起止日期 处理缺失值、异常值 绘制价格/成交量图 关键输出 • 收盘价序列(Close) • 成交量序列(Volume) • 最高/最低价(High/Low) • 无缺失值的干净DataFrame • 可视化图表(趋势判断) • 可用于建模的标准化数据

2.6 实战小贴士

最后分享几个我踩过的坑:

  • 股票代码格式: 美股直接写代码(如AAPL),港股要加后缀(如0700.HK),A股要加.SS或.SZ(如600519.SS)。我一开始不知道,拉了一堆空数据回来。
  • 数据频率: yfinance默认是日线。如果你想用分钟线,可以加参数interval='1m',但免费版只能拉最近7天的分钟数据。
  • 多只股票: 用列表传参就行:yf.download(['AAPL', 'MSFT', 'GOOG'], start='...'),返回的是MultiIndex DataFrame。

核心要点: 数据质量决定模型上限。花80%的时间清洗数据,只花20%的时间建模——这是量化金融的铁律。

好了,数据拿到手、清洗干净、可视化也看过了。下一步就是把这些数据喂给机器学习模型,让模型学会预测涨跌。不过那是后面章节的事,咱们先把基础打牢。


公众号:蓝海资料掘金营,微信deep3321