当前位置:
AIGC文章详情

回测曲线好看得反常?小心Tushare财务数据"偷看答案":中报季里4个抬高收益的坑

源自167位全网作者

14:48

每年8月底,A股中报披露进入最后冲刺,按规则财报要在8月31日前披露完毕。而今年入场的量化新人格外多——有媒体报道,春节后Tushare这类金融数据平台的新增用户数和接口调用量大幅上涨,"量化平权"不只是一句口号。微博

很多人正在写自己的第一个财务因子策略:用ROE选股、用营收增速过滤、搭多因子模型。但有个几乎没人告诉新手的坑,杀伤力巨大——你回测用的财务数据,可能在"那个时间点"根本还不存在于市场上知乎量化圈管这叫"未来函数",它最常见的藏身处,就是Tushare财务数据接口里的几个日期字段。最近两个月知乎上连续有实战玩家写踩坑心得,我把它们和Tushare官方文档核对后整理成一篇,开工前存下来,能省你一个月的无用功。

回测曲线好看得反常?小心Tushare财务数据

一、最贵的一个字段:end_date不等于"可用日"

Tushare的财务类接口(fina_indicator、income等)里,最重要的两个日期字段是:

  • end_date:报告期截止日,比如年报是20231231,中报是20260630;

  • ann_date:公告日期,即这份财报真正对外公开的那天。

问题在于:接口按报告期组织数据,但市场看到数据的时间不是报告期。一份2023年年报,end_date是2023年12月31日,却可能2024年4月才公告。如果你的策略在2024年1月就用上这份年报选股,相当于提前3个月偷看答案——回测收益就是这么虚高的。知乎

社区的做法一句话:报告期决定查什么,公告日决定什么时候能用知乎更保守的做法是,从ann_date之后的第一个交易日开始,策略才允许使用这条财务数据。知乎利润表接口里还有个f_ann_date(实际公告日),口径更严格,需要精确时优先用它。Tushare

回测曲线好看得反常?小心Tushare财务数据

二、第二个坑:修订版本藏在重复记录里

同一家公司、同一个报告期、甚至同一个公告日,接口可能返回多条内容不同的记录——其中就有修订版本。很多人拿到数据随手groupby去重,或者按顺序取最后一条,实际上你保留的是"哪个版本",自己并不知道。

更麻烦的是update_flag字段:它能告诉你哪条是"最新版本",但它不告诉你这次修订是什么时候公开的。回测里直接用最新版本,等于又把修订后的数值提前塞回了原始公告日。知乎

踩过坑的玩家的做法是:完全相同的行可以去重;内容不同的,全部保留,研究时再明确选哪个口径。如果找不到唯一的"修订前版本",就停下来检查,而不是靠文件顺序猜。

三、第三个坑:限量规则写在官方文档的小字里

有几条规则,是调用侧完全看不出来的,我逐条对照了官方文档:

  • fina_indicator(财务指标)和income(利润表)都需要至少2000积分才能调取。Tushare

  • 这两个接口只支持按单只股票获取历史数据,想一次拿某一季度全部上市公司的财务数据,要用参数一致的fina_indicator_vip / income_vip接口,需要5000积分Tushare

  • fina_indicator每次请求最多返回100条记录,需要设置日期区间多次请求。Tushare

这类截断不会报错,只会悄悄漏数据。社区的处理方式是:返回行数一旦触及上限,就把报告期区间二分重取,拆到单日还触顶就宁可报错失败,也不写"看似完整、其实缺数"的表。知乎

回测曲线好看得反常?小心Tushare财务数据

调用频次限制也跟积分挂钩,比如每日涨跌停价格接口stk_limit,2000积分是200次/分钟,5000积分是500次/分钟。知乎打算全市场批量拉数据之前,先把调用量算清楚,不然跑到一半被限频,浪费的是积分和时间。

四、第四个坑:行情数据也有"口径分离"

顺带用行情数据的朋友记住一条分离原则:算因子用前复权价,模拟成交用原始价。动量、波动率、反转这类技术因子用前复权价格计算,但模拟实际下单时,涨跌停、停牌、成交量、成交额都要用原始数据。知乎把复权价混进交易撮合,分红送转就会悄悄扭曲你的成交价。

五、本周就能用的一个技巧:disclosure_date查披露进度

Tushare有个比较冷门的接口disclosure_date(财报披露日期表,2000积分可用),按end_date='20260630’这样的报告期查询,能拿到每家公司的pre_date(预计披露日)、actual_date(实际披露日)和modify_date(披露日期修正记录)。Tushare

两个用途:

  1. 中报季里查一查你的股票池里谁还没披露中报,依赖新财报的策略不至于干等数据"迟到";

  2. 交叉核对公告日期。拿不准某条财务数据的公告时间是否准确时,用它或者巨潮资讯网抽查几条,比猜靠谱。

自查清单(建议收藏)

写完财务数据回测之前,逐条过一遍:

  1. 财务数据的可见性,是按ann_date过滤的,还是直接按end_date用了?

  2. 股票池包含已退市股票吗(用stock_basic的上市/退市日期生成股票池)?小心幸存者偏差。

  3. 字段是显式指定的,还是依赖接口默认返回列?默认列将来可能变化。

  4. 增量更新看的是"公告日水位",而不是最大报告期?旧年报可能现在还有迟到公告和修订。

  5. 返回行数触及上限时,有没有做截断处理?

  6. 模拟交易用的是原始价+涨跌停+停牌约束,而不是复权价?

谁可以不用这么紧张

如果你的策略只用价量技术指标(daily+adj_factor),完全不碰财务接口,上面大部分坑跟你无关——这篇主要写给做基本面因子、多因子、事件驱动的朋友。

回测曲线好看得反常?小心Tushare财务数据

另外多说一句:别急着充积分。2000积分档已经覆盖绝大多数财务接口,先按单只股票慢慢拉,把逻辑跑通,再决定要不要上5000积分的vip接口,完全来得及。

数据的坑不报错,但会亏钱。你用Tushare踩过的第一个坑是什么?评论区聊聊。

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章