3、金融数据获取:使用yfinance库获取历史股票数据
做量化交易,第一步就是搞数据。没有数据,再牛的模型也是空中楼阁。
我个人习惯把数据获取比作「做饭前的买菜」。菜买不好,厨艺再高也白搭。金融数据也一样,源头的质量直接决定了后续分析的可靠性。
这一章,咱们就聊聊怎么把「菜」买回来。重点讲两个主流数据源:Yahoo Finance 和 Alpha Vantage。我会结合自己踩过的坑,给你讲明白。
3.1 数据源介绍:Yahoo Finance vs Alpha Vantage
先说说这两个数据源的区别。你想想看,选数据源就像选工具,得知道各自的脾气。
| 特性 | Yahoo Finance | Alpha Vantage |
|---|---|---|
| 免费额度 | 无限制(但可能不稳定) | 每分钟5次,每天500次 |
| 数据范围 | 全球主要交易所 | 全球主要交易所 |
| 历史深度 | 最多30年 | 最多20年 |
| 实时数据 | 延迟15-20分钟 | 有实时API(付费) |
| Python库支持 | yfinance(第三方) | alpha_vantage(官方) |
| 稳定性 | 中等(偶尔断连) | 较高(有API Key管控) |
Yahoo Finance 是我最常用的。为什么?因为它免费、数据全、用起来简单。用 yfinance 库几行代码就能拉数据,特别适合快速验证想法。
但注意,它有个毛病——偶尔会抽风。我在项目中遇到过几次,早上跑策略时突然报错,发现是 Yahoo 那边接口变了。嗯,这就是免费午餐的代价。
Alpha Vantage 则更「正规」一些。你需要申请 API Key,有频率限制。但它数据质量更稳定,而且提供一些技术指标的计算结果,省得自己算。
我个人建议:做原型验证用 Yahoo Finance,做生产环境用 Alpha Vantage 或者付费数据源。
3.2 使用 yfinance 获取历史数据
好,咱们直接上手。先装库:
pip install yfinance
然后拉数据。以苹果公司(AAPL)为例:
import yfinance as yf
# 下载苹果公司2023年全年的日线数据
aapl = yf.download('AAPL', start='2023-01-01', end='2023-12-31')
print(aapl.head())
输出长这样:
Open High Low Close Volume
Date
2023-01-03 129.929993 130.990005 124.169998 125.070000 74629900
2023-01-04 126.889999 128.660004 125.080002 126.360001 58457400
2023-01-05 126.139999 127.129997 124.480003 125.019997 64850800
2023-01-06 124.339996 130.470001 123.830002 129.619995 79355700
2023-01-09 130.470001 132.410004 129.889999 130.149994 70509100
你看,返回的是一个 DataFrame,索引是日期,列包括开盘价、最高价、最低价、收盘价、成交量。这就是标准的 OHLCV 格式。
yf.download(['AAPL', 'MSFT', 'GOOGL'], start='2023-01-01', end='2023-12-31')。返回的 DataFrame 会多一层列索引,用 .xs() 方法可以提取单只股票的数据。
3.3 数据格式理解
拿到数据后,咱们得知道每一列代表什么。说白了,就是理解「股票数据长什么样」。
- Open(开盘价):当天第一笔成交的价格。注意,不是9:30整的价格,而是第一笔实际成交价。
- High(最高价):当天最高成交价。
- Low(最低价):当天最低成交价。
- Close(收盘价):当天最后一笔成交价。这是最常用的价格,很多技术指标都基于它计算。
- Volume(成交量):当天成交的股票数量。单位是股,不是手。
这里有个坑,我必须要提醒你:
另外,yfinance 返回的数据默认是按日期升序排列的(从早到晚)。但有些数据源可能是降序的。我建议你拿到数据后先检查一下:
# 检查数据是否按日期升序排列
print(aapl.index.is_monotonic_increasing)
如果不是,用 sort_index() 排一下序。
3.4 使用 Alpha Vantage 获取数据
如果你需要更稳定的数据源,可以试试 Alpha Vantage。先装库:
pip install alpha_vantage
然后去 Alpha Vantage 官网 申请一个免费的 API Key。拿到 Key 后,就可以拉数据了:
from alpha_vantage.timeseries import TimeSeries
# 替换成你自己的 API Key
api_key = 'YOUR_API_KEY'
ts = TimeSeries(key=api_key, output_format='pandas')
# 获取苹果公司的日线数据
data, meta_data = ts.get_daily(symbol='AAPL', outputsize='full')
print(data.head())
输出格式和 yfinance 类似,但列名略有不同:
1. open 2. high 3. low 4. close 5. volume
date
2023-12-29 193.6100 194.40 191.7200 192.5300 42946600
2023-12-28 193.0000 194.49 192.9000 193.5800 32720600
2023-12-27 192.4900 193.50 191.8900 193.1500 31680800
2023-12-26 192.6700 193.92 192.1100 193.0500 29528400
2023-12-22 194.3000 195.99 192.3500 193.6200 45332600
注意,Alpha Vantage 的列名带数字前缀,比如 1. open。你可以重命名一下,方便后续处理:
data.columns = ['open', 'high', 'low', 'close', 'volume']
3.5 本章知识体系
为了让你更直观地理解本章内容,我画了一张图:
这张图把本章的核心逻辑串起来了。从数据源到获取方式,再到数据格式,最后落到应用场景。你跟着这个脉络走,就不会乱。
3.6 实战小贴士
最后,分享几个我自己的经验:
- 数据缓存:别每次都从网络拉数据。我习惯把数据存到本地 CSV 文件,每天更新一次。这样既快又稳。
- 异常处理:网络请求总会出问题。用
try-except包一下,失败了就重试三次。 - 数据对齐:如果你拉多只股票的数据,注意它们的交易日可能不同。比如 A 股和美股节假日不一样。用
pd.merge()时记得指定how='inner'或how='outer'。
嗯,数据获取这部分就讲到这里。记住,数据是量化交易的基石。花时间把数据搞明白,后面的路会顺很多。