3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!出现这种收益差距巨大的情况,主要是由滑点单位的误解以及回测与归因分析计算逻辑的差异这两个原因造成的。下面为你详细解答:
FixedSlippage 的单位是“元”而不是“百分比(bp)”在 JoinQuant 的 API 中,FixedSlippage 代表的是固定价格滑点,单位是元。
FixedSlippage(0.003) 意味着每笔交易的买卖价差是 0.003 元(买入加 0.0015 元,卖出减 0.0015 元)。FixedSlippage(0.0062) 意味着价差是 0.0062 元。你提到的 32个bp(基点),1 bp = 0.01% = 0.0001,32 bp 是 0.32%。这是一个百分比概念。
如果你想在策略中设置百分比滑点,应该使用 PriceRelatedSlippage:
# 设置 0.32% 的百分比滑点(即 32 bp)
set_slippage(PriceRelatedSlippage(0.0032))
因为你误把“元”当成了“百分比”,所以 FixedSlippage(0.0062) 实际上对高价股的影响微乎其微(比如 10 元的股票,0.0062 元的滑点只有 0.062%),这远小于归因分析中 32bp(0.32%)的惩罚力度,所以你回测出来的收益(443.75%)会远高于归因分析的预测(319.05%)。
即使你使用了正确的 PriceRelatedSlippage,直接在代码中修改滑点跑出来的回测收益,与归因分析中显示的“受滑点影响的净值曲线”依然会有差异。原因是两者的计算维度不同:
归因分析是“事后线性扣除”:
根据 JoinQuant 文档,归因分析中滑点对净值曲线的影响公式为:
受滑点影响的每日收益 = 每日收益 - 滑点 * 每日换手率 * 2
这是一种事后近似计算。它假设你的交易行为、买入股数完全不变,只是每天硬生生地从你的收益里扣除掉滑点损耗。
回测引擎是“事前路径依赖”:
在代码中真实修改 set_slippage 后重新跑回测,滑点会真实地加到你的委托价上。这会带来复利效应和路径依赖:
set_slippage(PriceRelatedSlippage(0.0032))。祝你的策略越跑越好!