第二章:数据获取——用Tushare/AkShare搞定行情、财务与龙虎榜

做量化交易,数据就是你的弹药。没有数据,策略再好也是纸上谈兵。

我个人习惯把数据获取比作「做饭前的买菜」。菜买不好,厨艺再高也白搭。这一章,咱们就聊聊怎么用 Python 把 A 股的三类核心数据「买」回来:行情数据、财务数据、龙虎榜数据。

2.1 两大工具库:Tushare vs AkShare

先说结论:两个库我都重度用过。Tushare 数据质量高,但部分接口需要积分;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'
)
小技巧: 如果积分不够,可以用 AkShare 的 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'
)
避坑指南: 我曾经遇到过财务数据「跳变」的情况——某只股票突然营收暴增10倍,后来发现是报表合并范围变了。所以,拉完数据一定要做异常值检测,别直接喂给策略。

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 的龙虎榜数据更规范,字段包括买入金额、卖出金额、净买入等。我一般用这个数据做「游资追踪」——看看哪些股票被知名游资席位买入,然后结合技术形态做套利。

我的经验: 龙虎榜数据不要只看单日,要看连续3-5天的累计净买入。单日数据噪音太大,连续数据才能看出资金的真实意图。

2.5 数据获取的完整流程

说了这么多,咱们来画个流程图,把整个数据获取的脉络理清楚。

数据获取核心流程 数据源层 Tushare Pro AkShare 本地缓存 数据获取层 行情数据 财务数据 龙虎榜数据 其他数据 数据处理层 数据清洗 异常检测 复权处理 存储入库

2.6 数据获取的避坑指南

做数据获取这几年,我踩过的坑能写一本书。这里挑几个最要命的说说:

  1. 频率限制:Tushare 免费版每分钟只能请求 200 次。我刚开始不知道,写了个循环批量拉数据,结果直接被封了半小时。解决办法是加 time.sleep(0.5) 控制请求频率。
  2. 数据对齐:不同数据源的日期格式可能不一样。Tushare 是 YYYYMMDD,AkShare 可能是 YYYY-MM-DD。合并数据前一定要统一格式。
  3. 缺失值处理:财务数据经常有空值,尤其是刚上市的新股。我的做法是:用前一个季度的数据填充,或者直接剔除。
  4. 缓存策略:别每次都去远程拉数据。我一般把数据存到本地 SQLite 或 CSV 文件里,每天只增量更新。这样既快又省积分。
核心要点: 数据获取不是「一把梭」,而是「分层处理」。数据源层、获取层、处理层各司其职,才能保证数据质量。记住——垃圾数据进,垃圾策略出

好了,数据获取这块就聊到这儿。下一章咱们聊聊数据清洗和特征工程——那才是真正考验功力的地方。

专注资料整理