4、金融数据获取:用Tushare/Akshare搞定股票数据
做量化交易,第一步就是搞数据。没有数据,再牛的因子也是空中楼阁。
我个人习惯把数据获取比作「做饭前的买菜」。菜买不好,厨艺再好也白搭。金融数据也一样——源头的质量直接决定后续分析的成败。
4.1 两大主流数据工具:Tushare vs Akshare
国内做量化,绕不开这两个库。我当年入行时,Tushare还是付费为主,现在Akshare免费开源,选择更多了。
| 对比项 | Tushare | Akshare |
|---|---|---|
| 数据源 | 自建数据库,稳定 | 爬取公开网站,灵活 |
| 费用 | 基础免费,高级付费 | 完全免费 |
| 速度 | 较快,有缓存机制 | 依赖目标网站,略慢 |
| 适用场景 | 专业研究、回测 | 快速验证、小规模分析 |
我的建议是:两个都装。Tushare做主力,Akshare做补充。遇到Tushare没有的数据,用Akshare兜底。
核心原则:数据获取不是一次性的。你需要建立一套「获取-清洗-存储-更新」的流水线。
4.2 实战:用Tushare获取股票日线数据
先装库:pip install tushare。然后去官网注册,拿到token。
import tushare as ts
# 初始化
pro = ts.pro_api('你的token')
# 获取平安银行日线数据
df = pro.daily(
ts_code='000001.SZ',
start_date='20230101',
end_date='20231231'
)
print(df.head())
嗯,这里要注意:daily接口返回的是未复权数据。做因子分析时,必须用复权数据。我刚开始做的时候,直接用未复权数据算收益率,结果回测曲线漂亮得不行,实盘一跑就崩——后来才发现是复权没处理。
避坑指南:千万不要直接用未复权数据做因子计算。分红、送股、配股都会导致价格跳空,你的因子会失真。
4.3 复权处理:前复权 vs 后复权
复权说白了就是「消除分红送股对价格的影响」。两种方式:
- 前复权:调整历史价格,让当前价格不变。适合回测,因为能看到「如果一直持有,收益是多少」。
- 后复权:调整当前价格,让历史价格不变。适合看真实涨幅,但当前价格会变。
我个人习惯用前复权做因子回测。Tushare提供了复权因子接口:
# 获取复权因子
adj_factor = pro.adj_factor(ts_code='000001.SZ')
# 合并到日线数据
df = df.merge(adj_factor, on='trade_date')
# 计算前复权价格
df['adj_close'] = df['close'] * df['adj_factor']
为什么用前复权?你想想看,回测时我们关心的是「策略在当前价格下能否执行」。前复权保持了当前价格的真实性,历史价格被调整,但交易逻辑不受影响。
4.4 数据清洗与对齐
数据拿到手,别急着用。先做三件事:
- 检查缺失值:停牌、节假日、数据缺失都会导致NaN。
- 对齐时间轴:不同股票的交易日期可能不同,需要统一。
- 去重排序:按日期升序排列,删除重复行。
# 清洗示例
df = df.dropna(subset=['adj_close']) # 删除缺失值
df = df.sort_values('trade_date') # 按日期排序
df = df.drop_duplicates(subset=['trade_date', 'ts_code']) # 去重
# 对齐:生成统一交易日历
trade_cal = pro.trade_cal(start_date='20230101', end_date='20231231')
trade_cal = trade_cal[trade_cal['is_open'] == 1]['cal_date']
小技巧:对齐时,用pd.merge的how='outer'可以保留所有交易日,然后用ffill填充缺失值。但注意:停牌日的数据不要用前向填充,否则会引入未来信息。
4.5 缺失值处理策略
缺失值怎么处理?没有万能公式。我在项目中总结了几种场景:
| 缺失原因 | 处理方法 | 适用场景 |
|---|---|---|
| 停牌 | 保留NaN,不填充 | 因子计算时跳过 |
| 节假日 | 前向填充 | 流动性因子、波动率因子 |
| 数据源缺失 | 用Akshare补充 | 所有场景 |
| 异常值 | 中位数填充或删除 | 极端值影响大的因子 |
我曾经踩过一个坑:用前向填充处理停牌数据,结果因子在停牌期间「看起来」很稳定,实盘时股票复牌直接跌停,因子瞬间失效。所以,停牌数据不要填充,直接保留NaN,在因子计算时用dropna跳过。
4.6 知识体系总览
下面这张图,是我梳理的本章核心逻辑。数据获取不是终点,而是起点。
这张图展示了从数据源到最终对齐的完整链路。每一步都有坑,但每一步也都有解法。记住:数据质量决定因子质量,因子质量决定策略上限。
本章小结:
- Tushare和Akshare各有优劣,建议组合使用
- 复权处理是必须的,前复权更适合因子回测
- 缺失值处理要区分原因,停牌数据不要填充
- 数据对齐是保证多因子分析正确性的基础
公众号:蓝海资料掘金营,微信deep3321