第二章:数据获取——用Tushare/AkShare搞定行情、财务与龙虎榜
做量化交易,数据就是你的弹药。没有数据,策略再好也是纸上谈兵。
我个人习惯把数据获取比作「做饭前的买菜」。菜买不好,厨艺再高也白搭。这一章,咱们就聊聊怎么用 Python 把 A 股的三类核心数据「买」回来:行情数据、财务数据、龙虎榜数据。
2.1 两大工具库:Tushare vs AkShare
先说结论:两个库我都重度用过。Tushare 数据质量高,但部分接口需要积分;AkShare 完全免费,接口多到眼花缭乱。我的建议是——主力用 Tushare,辅助用 AkShare。
| 对比项 | Tushare | AkShare |
|---|---|---|
| 数据质量 | 高,字段规范 | 中等,偶有异常值 |
| 免费程度 | 基础免费,高级需积分 | 完全免费 |
| 接口稳定性 | 稳定,有官方维护 | 依赖上游网站,偶尔变动 |
| 文档清晰度 | 优秀,有中文文档 | 一般,接口说明较简略 |
| 适合场景 | 策略回测、实盘 | 快速验证、补充数据 |
2.2 行情数据获取
行情数据是策略的「地基」。日线、分钟线、复权因子,缺一不可。
2.2.1 日线行情(Tushare)
import tushare as ts
# 初始化(需要你的token)
pro = ts.pro_api('你的token')
# 获取平安银行2024年1月日线数据
df = pro.daily(
ts_code='000001.SZ',
start_date='20240101',
end_date='20240131'
)
print(df.head())
这里有个坑——返回的数据默认是倒序的,最新的在最上面。我刚开始做回测时没注意,直接把数据喂给策略,结果回测曲线漂亮得不像话……后来才发现是未来数据。嗯,血的教训。
df.sort_values('trade_date') 把数据按时间正序排列,否则回测结果全是错的。
2.2.2 复权数据
做套利策略,复权处理是必须的。为什么?因为分红送股会改变股价,不复权的话,你的策略信号会乱掉。
# 获取前复权数据
df_adj = pro.daily(
ts_code='000001.SZ',
start_date='20240101',
end_date='20240131',
adj='qfq' # 前复权
)
我个人习惯用前复权做回测,用后复权做技术分析。前复权能保证历史价格连续,后复权能反映真实收益。你想想看,如果你用不复权的数据做套利,遇到除权日,策略会莫名其妙地发出买入信号——这能忍?
2.2.3 分钟线数据
套利策略往往需要高频数据。Tushare 的分钟线需要一定积分才能获取,但值得投资。
# 获取5分钟线
df_5min = pro.stk_mins(
ts_code='000001.SZ',
start_date='20240101',
end_date='20240131',
freq='5min'
)
stock_zh_a_hist_min_em 接口获取分钟数据,虽然偶尔有缺失,但做策略验证足够了。
2.3 财务数据获取
财务数据是套利策略的「体检报告」。市盈率、市净率、ROE、营收增长率……这些指标决定了股票的基本面是否健康。
2.3.1 基础财务指标(Tushare)
# 获取财务指标
df_fin = pro.fina_indicator(
ts_code='000001.SZ',
start_date='20230101',
end_date='20231231',
fields='roe,eps,profit_dedt,revenue_ps'
)
print(df_fin.head())
这里要特别注意——财务数据是按季度发布的,不是每天都有。我曾经写过一个策略,每天去拉财务数据,结果发现连续好几天数据一模一样。后来才意识到,财务数据是季度更新的,没必要天天拉。
2.3.2 利润表与资产负债表
做深度套利分析时,光看指标不够,得看原始报表。
# 获取利润表
df_income = pro.income(
ts_code='000001.SZ',
start_date='20230101',
end_date='20231231'
)
# 获取资产负债表
df_balance = pro.balancesheet(
ts_code='000001.SZ',
start_date='20230101',
end_date='20231231'
)
2.4 龙虎榜数据获取
龙虎榜是游资和机构的「足迹」。做短线套利,龙虎榜数据能帮你判断资金动向。
2.4.1 用 AkShare 获取龙虎榜
import akshare as ak
# 获取2024年1月龙虎榜数据
df_lhb = ak.stock_sse_summary(
date="20240115"
)
print(df_lhb.head())
AkShare 的龙虎榜接口比较全,但有个问题——数据更新有延迟。交易所一般在收盘后半小时发布龙虎榜,AkShare 可能要等1-2小时才能拿到。所以,如果你要做盘中的实时分析,这条路走不通。
2.4.2 用 Tushare 获取龙虎榜
# Tushare 龙虎榜数据(需要积分)
df_lhb_ts = pro.lhb(
trade_date='20240115'
)
Tushare 的龙虎榜数据更规范,字段包括买入金额、卖出金额、净买入等。我一般用这个数据做「游资追踪」——看看哪些股票被知名游资席位买入,然后结合技术形态做套利。
2.5 数据获取的完整流程
说了这么多,咱们来画个流程图,把整个数据获取的脉络理清楚。
2.6 数据获取的避坑指南
做数据获取这几年,我踩过的坑能写一本书。这里挑几个最要命的说说:
- 频率限制:Tushare 免费版每分钟只能请求 200 次。我刚开始不知道,写了个循环批量拉数据,结果直接被封了半小时。解决办法是加
time.sleep(0.5)控制请求频率。 - 数据对齐:不同数据源的日期格式可能不一样。Tushare 是
YYYYMMDD,AkShare 可能是YYYY-MM-DD。合并数据前一定要统一格式。 - 缺失值处理:财务数据经常有空值,尤其是刚上市的新股。我的做法是:用前一个季度的数据填充,或者直接剔除。
- 缓存策略:别每次都去远程拉数据。我一般把数据存到本地 SQLite 或 CSV 文件里,每天只增量更新。这样既快又省积分。
好了,数据获取这块就聊到这儿。下一章咱们聊聊数据清洗和特征工程——那才是真正考验功力的地方。