先算这一笔:用一个公式判断你的收益目标做不做得到

5 阅读5分钟

先算这一笔:用一个公式判断你的收益目标做不做得到

本文是《Python 量化回测系统工程》系列的第 3 篇。前两篇讲回测里的摩擦和验证协议,这一篇往前挪一步:在你写第一行回测代码之前,先回答一个问题——这个目标,现实吗?

一、大部分失败,在动手之前就已经注定了

一个典型的开场是这样的:

"我想要年化 40%,回撤别超过 10%。"

这句话听起来很克制——没说翻倍,没说稳赚。但它在数学上意味着什么,说的人往往没算过。

年化 40%、回撤 10%,换算成 Calmar 比率(年化收益 ÷ 最大回撤)就是 4.0。作为参照:长期业绩优秀的股票型公募,Calmar 能到 1 就已经是头部水平;对冲基金里能长期维持在 1.5 以上的不多。

换句话说,这个"克制"的目标,要求你做到顶级机构的数倍水平。

问题不在于目标高,而在于没人提前告诉他这个目标有多高。于是他花三个月写代码、调参、跑回测,最后得到的结论是"做不到"——而这本该是三分钟就能算出来的。

二、一个公式:所需 Calmar

我们把这件事固化成了一个指标,叫所需 Calmar:

所需 Calmar = 年化收益目标 ÷ 回撤容忍度

它衡量的不是策略好不好,而是你的目标离现实有多远。算出这个数,直接查表:

所需 Calmar判定该怎么做
≤ 0.5宽松正常做,有冗余空间
0.5 – 0.8可行正常做,但要留好验证余量
0.8 – 1.2偏紧可以做,必须严格验证,且明确告知风险
1.2 – 2.0需降级建议调低收益目标,或放宽回撤容忍度
> 2.0不可行直接拒绝,不建议启动

举几个例子,把这张表用起来:

  • 年化 20% / 回撤 10% → 所需 Calmar = 2.0,落在"需降级"的上沿,要谈;
  • 年化 15% / 回撤 15% → 1.0,偏紧但可做;
  • 年化 8% / 回撤 20% → 0.4,宽松;
  • 年化 40% / 回撤 10% → 4.0,直接拒。

三、为什么这个公式有用:它把谈判提前了

这个指标真正的价值不在于"算得准",而在于它把一场注定失败的谈判,从三个月后挪到了三分钟前。

没有它的时候,对话是这样的:

客户:"我要年化 40%,回撤 10%。" 你:"我试试。" (三个月后)你:"做不到。" 客户:"那你早说啊。"

有了它,对话变成:

客户:"我要年化 40%,回撤 10%。" 你:"所需 Calmar 是 4.0,这个级别长期能做到的机构一只手数得过来。我们有两个选择:把年化降到 15%,或者把回撤容忍度提到 25%。你选哪个?" 客户:"那就 15% 吧。" 你:"行,那我们开始。"

降级谈判本身就是交付的一部分。 一个在需求阶段就明确说"做不到"的人,比一个闷头做三个月再说"做不到"的人靠谱得多——虽然前者当场会让人不高兴。

四、工程上怎么落地

把它做成可执行的检查,而不是口头经验。我们的实现里有几条硬规矩:

1. 必须在需求阶段跑,且只能跑一次。 和回测不一样,这个模块没有任何可调参数——输入就是两个数(收益目标、回撤容忍度),输出就是判定。不允许为了让结果好看去"微调"。

2. 判定结果直接写进需求单和最终报告。 报告头部固定有一栏"目标体检结论",写明:原始目标、所需 Calmar、判定、是否经过降级、降级后的目标。读者一眼能看到这个结论是在什么目标下得出的。

3. 拒绝也是一等公民。 > 2.0 的输出不是"警告",是REJECT,流程直接终止。这比给一个带免责声明的回测报告负责任得多。

4. 三个数字必须同时给。 年化、最大回撤、所需 Calmar 缺一不可。只给年化不给回撤,是最常见的误导手法——也是最容易让客户产生错误预期的地方。

五、把这个指标和前两篇连起来

到这里,我们其实已经有了一条完整的检查链:

目标体检(这篇)  →  需求能不能成立
      ↓
回测引擎(第1篇) →  带滑点、手续费、限单、熔断地跑
      ↓
验证协议(第2篇) →  样本内 / 样本外 / 跨品种,看结论脆不脆
      ↓
脱敏交付(第1篇) →  能给别人看,但不泄露构造

每一环都有明确的判据,每一环都可能把流程终止掉。一条会随时说"不"的流水线,比一条永远说"行"的流水线有用得多——后者产出的不是结论,是安慰。

顺带复习一下第 1 篇那组数字,它们是这条链跑完之后的真实产物:滑点 0 / 1 / 2 跳三档收益分别是 +6.24% / +2.72% / +2.49%,最大回撤 0.49% / 1.08% / 1.16%,期末权益 1,024,907.77,胜率 60%,盈亏比 3.09。

收益目标 6% 出头、回撤 1% 上下,算下来所需 Calmar 在 5 左右——这说明这套演示参数的目标设定本身是"超标"的,只是它演示的是计算链路的正确性,不是一套可上线的目标。真实作业里,这个数会先被目标体检拦下来,然后降级谈判。

六、一句话总结

先算,再干。 一个三分钟能算完的除法,可以省掉三个月注定失败的工作。而"做不到"这三个字,越早说出口,越专业。

下一篇预告

《把一句人话改成可判定的规则:需求改写的三个硬指标》——讲怎么把"我觉得这样能赚"改写成无歧义、能编码、能判定真假的规则条目,以及哪些需求应该当场拒掉。


本文数据来自一套真实的 Python 回测作业(演示模式),所有数字可复现。系列文章只讲工程与数据口径,不涉及任何具体策略、指标与参数;文中所有收益数字均附带样本区间、滑点假设与最大回撤,不构成任何投资建议。