问题描述
策略中设置滑点为:0.003
set_slippage(FixedSlippage(0.003))
和设置滑点为:0.0062(原来基础上增加32个bp)
set_slippage(FixedSlippage(0.0062))
的收益居然和归因分析中显示的不一样(有些许下降,但没有归因分析中明显)。
问题:
1、设置滑点为0.003;收益为501.83%;归因分析显示32bp净值曲线最终收益为:319.05%。
2、设置滑点为0.0062(0.003上增加32bp);最终收益为:443.75%
两种不同的场景,收益为319.05%和443.75%。为什么差距这么大?!
请教哪位大佬能帮忙解答下?
谢谢!!好人一生平安
解决方案
你好!出现这种收益差距巨大的情况,主要是由滑点单位的误解以及回测与归因分析计算逻辑的差异这两个原因造成的。下面为你详细解答:
1. 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%)。
2. 回测引擎与归因分析的计算逻辑不同
即使你使用了正确的 PriceRelatedSlippage,直接在代码中修改滑点跑出来的回测收益,与归因分析中显示的“受滑点影响的净值曲线”依然会有差异。原因是两者的计算维度不同:
归因分析是“事后线性扣除”:
根据 JoinQuant 文档,归因分析中滑点对净值曲线的影响公式为:
受滑点影响的每日收益 = 每日收益 - 滑点 * 每日换手率 * 2
这是一种事后近似计算。它假设你的交易行为、买入股数完全不变,只是每天硬生生地从你的收益里扣除掉滑点损耗。
回测引擎是“事前路径依赖”:
在代码中真实修改 set_slippage 后重新跑回测,滑点会真实地加到你的委托价上。这会带来复利效应和路径依赖:
- 滑点变大 -> 买入单价变高 -> 同样的资金能买到的股数变少(因为 A 股必须是 100 的整数倍)。
- 买入股数变少 -> 后续股票上涨时赚到的绝对金额变少 -> 下一次调仓时可用的总资金变少。
- 这种微小的股数差异在长期的回测中会产生巨大的蝴蝶效应(复利衰减),导致最终的真实回测收益与归因分析的简单线性扣除产生偏差。
总结与建议
- 修正代码:如果你想测试 32bp 的滑点影响,请将代码改为
set_slippage(PriceRelatedSlippage(0.0032))。 - 理解差异:归因分析中的滑点收益曲线仅供快速参考,它能帮你直观感受策略对滑点的敏感度(换手率越高,惩罚越重)。但如果要得到最准确的收益数据,必须以修改代码后实际跑出来的回测结果为准。
祝你的策略越跑越好!