第二章:金融数据获取——用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 本章知识体系
我把本章的核心逻辑画成了一张图,方便你理解整个流程:
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