首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >合并后行数翻倍,我给回测加了一个“数据合同”

合并后行数翻倍,我给回测加了一个“数据合同”

原创
作者头像
量化行业新引擎
发布于 2026-10-15 10:00:54
发布于 2026-10-15 10:00:54
380
举报
文章被收录于专栏:AI量化视界AI量化视界

回测里有一种错误很难从收益曲线上看出来:行情表和因子表合并后,行数悄悄增加了。常见原因不是 merge 本身,而是右表的股票代码和交易日并不唯一。同一只股票同一天有两条因子记录,左表的一条收益就会被复制成两条,后面的分组收益、换手率和净值都会跟着失真。

我现在更愿意把“合并关系”写成代码约束,而不是靠肉眼检查。假设 daily 是日收益表,每个 symbol、trade_date 只能有一行;factor 是因子表,也应保持同样的唯一性,可以这样写:

keys = ["symbol", "trade_date"]

result = daily.merge(

factor,

on=keys,

how="left",

validate="one_to_one",

indicator=True

)

validate="one_to_one" 相当于给两张表签了一份数据合同:任意一侧出现重复键,程序立即抛出 MergeError。若业务上明确允许一只股票对应多条记录,就把关系改成 one_to_many 或 many_to_one,而不是直接使用 many_to_many 放过检查。

第二步是看 indicator 生成的 _merge 列。left_only 表示行情存在但因子缺失,both 才是正常匹配。我的做法不是把缺失因子直接补成零,而是先统计比例,再抽取几只股票核对原因:可能是上市时间不足、停牌,也可能是代码格式或交易日类型不一致。

合并完成后还可以加三条很便宜的断言:结果行数是否等于左表、主键是否仍唯一、收益列是否出现异常重复。它们不会提高策略收益,却能让数据问题在进入回测引擎前就失败。对量化程序来说,早点报错通常比生成一条漂亮但错误的净值曲线更有价值。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档