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 数据清洗与对齐

数据拿到手,别急着用。先做三件事:

  1. 检查缺失值:停牌、节假日、数据缺失都会导致NaN。
  2. 对齐时间轴:不同股票的交易日期可能不同,需要统一。
  3. 去重排序:按日期升序排列,删除重复行。
# 清洗示例
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.mergehow='outer'可以保留所有交易日,然后用ffill填充缺失值。但注意:停牌日的数据不要用前向填充,否则会引入未来信息。

4.5 缺失值处理策略

缺失值怎么处理?没有万能公式。我在项目中总结了几种场景:

缺失原因 处理方法 适用场景
停牌 保留NaN,不填充 因子计算时跳过
节假日 前向填充 流动性因子、波动率因子
数据源缺失 用Akshare补充 所有场景
异常值 中位数填充或删除 极端值影响大的因子

我曾经踩过一个坑:用前向填充处理停牌数据,结果因子在停牌期间「看起来」很稳定,实盘时股票复牌直接跌停,因子瞬间失效。所以,停牌数据不要填充,直接保留NaN,在因子计算时用dropna跳过。

4.6 知识体系总览

下面这张图,是我梳理的本章核心逻辑。数据获取不是终点,而是起点。

金融数据获取核心流程 数据源 Tushare / Akshare 数据获取 日线 / 复权因子 数据清洗 去重 / 排序 复权处理 前复权 / 后复权 数据对齐 交易日历 / 缺失值处理 关键提醒 • 停牌数据不填充 • 前复权用于回测 • 双数据源互补

这张图展示了从数据源到最终对齐的完整链路。每一步都有坑,但每一步也都有解法。记住:数据质量决定因子质量,因子质量决定策略上限

本章小结

  • Tushare和Akshare各有优劣,建议组合使用
  • 复权处理是必须的,前复权更适合因子回测
  • 缺失值处理要区分原因,停牌数据不要填充
  • 数据对齐是保证多因子分析正确性的基础

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