如何用好基本面数据,提高量化策略收益?

在量化交易当中,财务数据和行情数据有一个很大的区别,你今天去查某支个股的收盘价,和过几年再去查,这两个时间点的价格都是一致的。但是财务数据呢,某家企业去年的净利润是多少,今天查到的数值,却不一定等于三年后的数值。
下面举个栗子就明白了~
炒股年头儿长的小伙伴都应该听说过一个上市公司,叫獐Z岛,对,就是那个扇贝跑来跑去的公司。
这个公司呢,在2014、2015已经连续两年亏损,已经被实施退市风险警示,如果接着2016年再亏损,那就可以喜提毕业大礼包了,所以,2016年的经营结果对公司能否保壳十分关键。
2017年3月21日,獐Z岛披露了2016年度报告。按照年报当中显示,2016全年实现归母净利润7959w,终于扭亏为盈,保壳成功,胜天半子。

但是,不出意外的话,就要出意外了,2019年7月,证监会经过调查,最终认定獐Z岛存在虚增利润,涉案金额达到1.3个小目标。经过追溯调整以后,公司2016年的净利润和归母净利润都双双转负,倒亏5000w+。

更吊诡的是,明明这个公司的净利润数据已经修订过了,但在2026年的今天去查,还有好多行情软件上显示的是那个最初的造假金额。
TDX

DFCF

上面的例子想说的是,同一个报告期,同一家公司,同一个净利润科目,在不同的时间点,出现了两个完全相反的答案。
平常咱F10看财报数据,很多人都以为财报数据是静态的,发布出来后就不变了,其实不是的,财报数据是动态的,会随着日期发生改变的 ,除了那种造假被揪出来强制改正之外,日常上市公司也是会对之前的财报主动进行修订。
由于财报数据的动态性,稍不注意,你的基本面量化策略可能就在引入未来函数,今天回测2017年的基本面策略,查询到的是那调整后的亏损的5000w。
假设策略要求净利润必须为正,或者要求净利润同比保持一定增速,那么獐Z岛自然会被排除在候选股票池之外,策略在2017年就成功识别出了獐Z岛的经营问题,提前避开了后面财务暴雷的风险。
这样的回测结果看起来可能非常亮眼,但实际上经历了一次穿越时空的爱恋,2017年的策略不可能知道2019年的证监会的调查结果,更不可能提前使用2年后才出现的净利润调整结果,站在2017年,投资者能够看到的就是盈利7000w,而不是亏损5000w,这个财务造假的雷没有那么顺利避开。
要在量化中用好基本面数据,首先就要理解A股上市公司的财务报告是怎样披露的,通常情况下,一季报需要在当年4月底之前披露,半年报需要在当年8月底之前披露,三季报需要在当年10月底之前披露,年报则需要在次年4月底之前披露,所以每年4月你就可能前脚看到去年年报披露,后脚就看到今年一季报。
比较低级的错误就是,比如说,在2026年1月就调用2025年的年报数据,以为过完年就可以调数据了,这种就实在太低级了,但凡了解过交易所披露规则的都不会犯,就不在今天的讨论之列了。
用好财报数据,至少要了解3个时间概念,第一个是报告期,也就是财务数据描述的是哪个经营阶段。第二个是公告日期,也就是上市公司在什么时候把这份财务报告公开给市场看。第三个是修订日期,也就是公司在首次披露(公告日期)之后,什么时候对原来的数字进行了更正、追溯调整或者重新披露。
很多基础数据库只强调报告期,而量化回测真正关心的则是后两个时间,数据什么时候首次可见,以及后来发生的修订在什么时候开始可见。
咱以浓眉大眼的中X国际为例,“2024-12-31”是报告期,表示这份财务报告是年报,统计的是2024年1月1日至2024年12月31日的财务状况,“2025-02-12”是公告日期,表示它在这一天公开了自己2024年年报,修订标志为0,表示这是首次发布,“2025-03-28”是修订日期,别是它在这一天对自己的财报进行更正,将自己的净利润和归母净利润分别提高了1.93亿和2.19亿,修订标志为1,表示这是修订版本。

从这里就可以看出来,公告日期和修订日期是让量化回测不要出现未来函数的关键变量,也给提高基本面利用效率打下基础。
以往很多人做基本面策略研究,为了避免未来函数,财务数据的使用都非常保守。比如说,2026年4月中旬这个时点,有的上市公司已经发了2025年报和2026一季报,有的则发了2025年报,有的则还停留在2025年的三季报,大部分是业绩不好不敢见公婆,非要压点的,为了避免未来函数,则4月只能取去年三季报的数据,要到5月初才能统一取今年一季度的数据,以此类推,9月初以后才能统一使用半年报,11月初以后才能使用三季报。
这种用法虽然避免了未来函数,但从信息利用效率来看,过度保守同样会付出代价。假设一家公司在3月份的时候就发了去年年报,经营现金流、净利润和ROE都出现明显改善,而策略直到5月初才能使用这一part数据,那么财报公布后的2个月里,策略仍然把它当成一家只披露到去年三季报的公司,市场已经开始根据年报重新定价,策略却仍然停留在旧数据上。
反过来,一家公司3月份公布的财报如果明显恶化,继续使用旧数据也可能导致策略继续错误持有,原来的ROE、利润增速和现金流或许还符合标准,但新财报已经表明经营质量下降。如果策略必须等到统一时点才更新,基本面风险就无法及时进入选股程序。
所以啊, 从信息利用率的角度出发,可以不要求所有股票在同一个交易日使用相同报告期 ,假设策略在4月中旬调仓,有些上市公司可能尚未发布年报,只能继续使用上一年三季报,有些公司已经发布年报,可以使用年度数据,还有极少数公司可能已经披露一季报,可以进一步使用一季报。
除非你是要做报告期横截面建模,不然不同上市公司使用不同报告期也不算是口径混乱,反而更加符合当时真实的信息环境,真正需要统一的并不是报告期,而是“所有数据在决策时都已经公开”这一条规则。
哦豁,废话太多了,总结一下,在量化入门期,想用好基本面数据,记住三个基础要点就够了。
(1)基本面数据不是F10里面看到的那种静态横截面,而是会不定时动态改变的。
(2)要记住和区分报告期、公告日期和修订日期这3个概念,不踩未来函数的坑和提高效率就都靠这哥仨。
(3)取数规则不用太保守,只要在决策时财报已公开就大胆用,不要求必须是统一报告期。
都说到这儿了,那就利用这些规则对上期的绩优红利策略进行改进一下,是骡子是马牵出来溜溜。
这个红利策略是作为小市值互补的防空洞策略,主打的是纯基本面选股,逻辑神经大条,中规中矩保持每年正向收益, 类似于GARP(Growth at a Reasonable Price)策略,用合理的价格买成长型公司,只不过这些基本面只是用来做股票池筛选,最终还是在候选池子当中买股息率最高的前N支股票,具体构建过程请见上月的文章 《 两个群的人都瞄上了这个策略 》 。
现在来回顾一下策略绩效,作为改进对比的基准。
选股5支


选股10支


一般情况下,红利策略跟小市值策略是跷跷板效应,但 这俩冤家之前都是被AI拿去当血包,被狂抽流动性,成难兄难弟了,最近AI拉胯,资金回流,红利跟小市值就开始分化了,目前是小市值苦一苦,红利板块开路虎。最近小市值策略也是遇到了2次行业冥灯,算是信号互相印证了。
在原始版的红利策略当中,用来过滤选股池的基本面因子用的是最保守的取数规则,也就是统一报告期,5月才能对一季报全部可见。
在改进版的策略中,就采用时效性更高的取数规则,不统一报告期,具体来说就是, 在1月至4月,改进版会同时查询上一年三季报、上一年年报和当年一季报;在5月至8月,同时查询当年一季报和半年报;在9月至10月,同时查询半年报和三季报;11月至12月则查询三季报。
这样的财报候选范围覆盖了当前月份中可能提前披露的新财报,同时又保留了尚未披露新财报公司的上一期数据。然后根据公告日期和修订日期进行判断,如果昨日及之前可见,那么就取可见范围内的最新财报的最新数据,为了避免未来函数,默认所有财报公布后都只能是第二天可见。
来看一下改进版的策略绩效。
选股5支


选股10支


从中可以看出来, 选股5支,改进版红利策略年化收益从25.30%提升到26.34%,夏普率从0.9103提升到0.9497,最大回撤从26.37%下降到26.04%。 选股10支,改进版红利策略年化收益从20.45%提升到21.92%,夏普率从0.8019提升到0.8705,最大回撤从23.31%下降到23.18%
有一丢丢的提升作用,但效用不是特别明显,主要的原因是,该策略当中最核心的选股因子股息率,原本就是日级别更新的TTM数据,基本面取数规则的改进对它没有影响,影响的是用来进行股票池过滤的基本面因子,因此最大的效用就没有发挥出来,看来下次还是得找个更保守的基本面策略才行。
再来进行一个分年收益统计,依旧是中规中矩。


好了,这个绩优红利策略的改进说完了,如果之前有用原始版进行魔改/模拟/实盘的小伙伴,建议改用新版的,下面是参数设置的要点。

ACCOUNT_ID :就是你自己的股票账户的资金账号,回测的时候可以不填或乱填,实盘的时候一定要填自己正确的账号。
ACCOUNT_TYPE :因为要使用股票账户进行交易,所以该参数固定为“STOCK”。
ACCOUNT_MODE :就是你打算用多少钱来跑这个策略,可选值为MONEY和RATIO。选MONEY就表示按照ACCOUNT_MONEY设定的金额,选RATIO就表示使用总账户ACCOUNT_RATIO那么多比例的资金。
ACCOUNT_MONEY :策略金额,单位是“元”,根据自己的资金情况设置。
ACCOUNT_RATIO :占总账户资金的比例,数值在0~1.0之间,0.3表示占30%比例。
STRATEGY_TRADETIME :策略进行交易的时间,因为该策略是日线策略,一天那么长,所以需要指定一个具体的时间进行下单交易,必须是在交易时间段内。
ORDER_TIMEOUT :订单超时时间,默认是60秒,下单后超过60秒没有全部成交就是超时, 策略程序会自动检查出超时的委托单,然后撤单重下 。
STRATEGY_PATH :策略相关文件的存储路径,策略程序会在STRATEGY_PATH这个路径底下再新建一个名为STRATEGY_NAME的文件夹,策略相关的持仓文件和交易日志文件都会保存在这个文件夹底下,这些文件是做仓位隔离和信息回溯的关键。
STRATEGY_NAME :策略名称, 一旦开启实盘之后,策略名称不要随意修改 ,不然就无法识别策略持仓文件,如果在盘中修改然后重启策略的话,就识别不了修改之前下的委托单和成交单。 特别说明就是,策略名称除了中文和英文之外,不要含有任何特殊字符,不然就无法正确识别券商柜台的委托回报。
SELECT_NUM : 每一次选择多少支符合条件的股票作为目标持仓,这里默认是5支。
PE_HIGH :基本面估值筛选时,市盈率PE指标的上限。
PB_HIGH : 基本面估值筛选时,市净率PB指标的上限。
PEG_HIGH : 基本面估值筛选时, 市盈增长比率 PEG指标的上限。
ROE_LOW :基本面盈利筛选时, 净资产收益率ROE 指标的下限。
PROFIT_YOY_LOW : 基本面成长筛选时,净利润增长率的下限。
MONTH_DAY :每个月的第几个交易日进行交易,默认是第1个交易日。
TOKEN : 因为这里用到Tushare数据源,所以这里要填入自己Tushare的token,关于如何在QMT当中安装tushare,详见文章 《QMT自带的基本面数据这么拉胯,量化大神是怎么用它来实盘的》 。
本次绩优红利 策略改进版 的回测/实盘源代码,已经分享在『量化达摩院』社群当中,群友请原路径自取,还不会使用QMT进行策略回测和实盘的小伙伴,请参照社群知识库第二章的第3和第4部分进行操作。

根据之前的规则约定,带V1字样的是回测版,仅支持回测,主要是代码少,方便看策略逻辑,带V2字样的是回测实盘一体版,同时兼顾实盘和回测,方便对比回测实盘之间的差异,后缀py的是策略源码文件,rzrk是QMT当中的策略备份文件,在QMT中导入后,除了能看到源码外,还会带有策略回测时的各项参数,因此墙裂建议量化萌新通过rzrk导入的方式使用策略,会非常省心省力。
下期见~
★
往期回顾
★
------量化社群------
------量化策略------
------心得杂谈------
_ Tip:点击关键字可以直接查看对应文章。 _
END
如果对本文有疑惑,或是想聊聊
亦或是围观朋友圈当点赞之交
戳我,让我们一路同行
吃瓜吐槽写代码

![]()
风险提示:市场有风险,投资需谨慎。所有策略思路和策略源码仅供参考和学习,不构成投资建议,策略回测仅代表历史收益,不代表未来收益。
本文由量化君原创。转载时请注明作者及出处。
在微信公众号阅读原文 ↗


