3. Python金融数据获取:从零搭建你的数据管道
做量化投资,第一道坎就是数据。我见过太多人,策略写得天花乱坠,结果数据源一塌糊涂。说白了,数据质量直接决定策略生死。今天咱们就聊聊怎么用Python把数据稳稳拿到手。
3.1 为什么选pandas-datareader和yfinance?
市面上数据接口很多,但我个人习惯用这两个库。原因很简单:
- pandas-datareader:老牌库,支持雅虎、谷歌、FRED等多个数据源。适合拿A股和美股历史数据。
- yfinance:后来居上,专门针对雅虎财经优化。速度更快,支持全球市场。
我在项目中遇到过一个问题:用pandas-datareader拿美股数据,偶尔会超时。后来换成yfinance,稳多了。所以我的建议是:A股用datareader,全球市场用yfinance。
小提示:两个库都依赖网络。如果在内网环境,记得配好代理。我曾经因为没配代理,debug了一下午...
3.2 安装与基础配置
先装库。打开终端,一行搞定:
pip install pandas-datareader yfinance
嗯,这里要注意版本兼容性。我建议用Python 3.8以上,pandas 1.3以上。低版本容易出幺蛾子。
3.3 实战:获取A股数据
拿贵州茅台举个例子。用pandas-datareader从雅虎拿数据:
import pandas as pd
import pandas_datareader.data as web
from datetime import datetime
# 定义股票代码和时间范围
stock_code = '600519.SS' # 贵州茅台,上海交易所
start = '2023-01-01'
end = '2024-01-01'
# 获取数据
df = web.DataReader(stock_code, 'yahoo', start, end)
print(df.head())
跑完你会看到这样的表格:
| Date | Open | High | Low | Close | Volume |
|---|---|---|---|---|---|
| 2023-01-03 | 172.0 | 175.5 | 171.0 | 174.0 | 35000000 |
| 2023-01-04 | 174.5 | 176.0 | 173.0 | 175.2 | 28000000 |
注意:雅虎的A股数据有时会缺失。特别是分红、送股后,价格可能不准。我建议用国内数据源(如Tushare)做交叉验证。
3.4 实战:获取全球市场数据
yfinance的用法更简洁。拿苹果和腾讯举例:
import yfinance as yf
# 定义股票列表
tickers = ['AAPL', '0700.HK'] # 苹果、腾讯
# 下载数据
data = yf.download(tickers, start='2023-01-01', end='2024-01-01')
# 只看收盘价
close_prices = data['Close']
print(close_prices.head())
你想想看,yfinance还能直接拿财报数据:
# 获取苹果公司信息
aapl = yf.Ticker('AAPL')
info = aapl.info
print(info['longBusinessSummary']) # 公司简介
这个功能我特别喜欢。做基本面分析时,不用再手动去网站扒数据了。
3.5 数据清洗与预处理
拿到原始数据后,千万别直接用。我踩过坑:有一次策略回测跑得挺好,实盘却亏了。查了半天,发现是数据里有空值没处理。
标准清洗流程如下:
- 检查缺失值:用
df.isnull().sum()看看哪些列有空值 - 处理缺失值:前向填充(ffill)或插值(interpolate)
- 去重:用
df.drop_duplicates()删除重复行 - 调整数据类型:确保日期是datetime,价格是float
来看个完整例子:
# 假设df是原始数据
# 1. 检查缺失
print('缺失值统计:')
print(df.isnull().sum())
# 2. 前向填充(用前一天的数据填充)
df.fillna(method='ffill', inplace=True)
# 3. 去重
df.drop_duplicates(inplace=True)
# 4. 确保日期索引
df.index = pd.to_datetime(df.index)
# 5. 添加收益率列
df['Return'] = df['Close'].pct_change()
print('清洗完成!')
print(df.head())
核心要点:数据清洗不是一次性工作。每次新增数据源,都要重新检查一遍。我习惯写个清洗函数,每次拿数据后自动调用。
3.6 知识体系总览
下面这张图,是我做数据获取时的完整流程。你照着走,基本不会出错:
这张图我画了好几次才满意。你注意看那个循环箭头——数据验证发现问题后,要回到清洗步骤重新处理。这是实战中最重要的环节。
3.7 避坑指南
最后分享几个我踩过的坑:
- 股票代码格式:A股在雅虎上要加后缀(如.SS、.SZ),港股加.HK。我一开始不知道,查了半天没数据。
- 时区问题:雅虎返回的是美国时间。如果你做A股,记得转成北京时间:
df.index = df.index.tz_convert('Asia/Shanghai') - 数据频率:默认是日线。如果需要分钟线,yfinance支持
interval='1m',但只能拿最近7天。
一句话总结:数据获取是量化投资的基石。花80%的时间在数据上,策略才能跑得稳。别像我一样,等到实盘亏了才后悔。