Skip to content

一个看起来完整的模型,为什么后来被推翻

0. 背景

FTX-0003参数设计方案 V1形成以后,一度看起来已经比较完整。

  • 方法论层面:用固定 Anchor(而非滚动 250 日高点)计算回撤,解决了坐标漂移问题;用历史峰谷回撤统计(510300 的 -28%~-53%,159915 最深 -70%)证明“-30% 不是极限”;还专门推导了“回撤扩大 20 个百分点 ≠ 实际再亏 20%”这类容易产生数学错觉的地方。
  • 执行层面:前段按股数(100 → +500 → +1000 → +1500),深水区改用累计本金投入率(-35% → 25%、-40% → 45%、-45% → 70%、-50% → 100%),并且严格定义投入率只看实际成本、不看浮亏市值,避免“越跌越像有空余额度”的危险反馈。
  • 架构层面:进一步扩展出总资金分层(场外储备 E / 证券账户 B / 永久现金 R / 风险本金 C)、融资支线(双重锁:绝对额度 + 担保比)、Call 尾部支线,四条资金线各司其职、互不透支。

但是——

这次对方案 V1 的重新审视,并不是从“检查 V1 是否有问题”开始的。

最初只是想了解一下:沪深300和标普500到底有什么区别?

讨论标普500时,提到了它的成分股筛选中还包含盈利能力等要求。“盈利”这个词由此进入了讨论。

继续往下聊,又回到了 2024 年 9·24 前后的行情。这时我产生了一个很直接的想法:

如果当时能在 9·24 之前开始买入就好了。

把这个想法重新放回方案 V1,会发现一个很明显的不吻合。

方案 V1 使用此前的重要高点作为 Anchor,并根据相对 Anchor 的回撤幅度逐步启动买入。

而到了 9·24 之前,我现在回头认为“如果从这里开始买就好了”的位置,市场距离此前高点其实已经非常远,相对 Anchor 已经进入了很深的回撤区域。

也就是说,我实际认为值得开始承担风险的位置,和方案 V1 根据 Anchor 推导出来的 START,相差很远。

这时问题第一次变得具体:为什么会差这么远?

顺着前面已经出现的“盈利”这个词,问题又继续往下走:深度回撤实验历史回测到底能赚多少?这些盈利又是从哪里来的?

如果收益主要来自深度下跌之后的修复,那么仅仅知道“已经从 Anchor 跌了多少”还不够。

还需要回答另一个问题:为什么到了这个位置以后,修复开始变得值得期待?

到这里,我才第一次真正开始怀疑:

Anchor 能够描述市场已经跌了多深,但它是否真的应该决定 START?

随后又想到自己对白酒 ETF 的实际交易经历。

我并不是从 2021 年开始持续关注白酒 ETF,而是在 2026 年看到它时,发现它已经连续下跌约 5 年、相对高点回撤约 50%。也正因为已经经历了这么长时间和这么深的下跌,我才开始认为这里进入了可以考虑承担风险的位置,并在 2026 年第一季度分批入场。

这再次说明:重要高点早已存在,但真正愿意开始承担风险,并不是因为价格机械地跌到了某个固定 Anchor Level。

1. 方案 V1 原本想解决什么问题

方案 V1 的目标很明确:

当市场进入深度回撤以后,不去猜真正的底,而是根据回撤深度逐步释放资金。

因此,它选择本轮下跌前的重要高点作为 Anchor。

以 Anchor 为固定基准,可以计算当前市场已经从高点下跌多少:

DDAnchor=PtPAnchor1

相比滚动高点,这种方式不会因为时间窗口移动而改变回撤坐标。

在这个基础上,方案 V1 继续向前走了一步:

text
Anchor

-20%

-25%

-30%

-35%
……

市场距离高点越远,逐步增加投入。

这种设计在当时很容易成立。

价格跌得越深,风险释放通常越充分,因此越往下可以越愿意承担仓位。

随着方案继续完善,Anchor 逐渐同时承担了三个职责:

  • 描述市场已经跌了多深;
  • 判断什么时候开始买入;
  • 决定后续加仓的位置。

当时没有意识到,这三个问题并不是同一个问题。

2. 一个现实反例,把核心漏洞暴露出来

前面想到的白酒 ETF,是一个更直接的现实例子。

9·24 的想法毕竟来自事后回看:“如果当时能在那个位置开始买就好了。”这个判断不可避免地已经知道了后面的市场走势。

白酒 ETF 不一样。这是一笔真实发生过的交易决策。

前面已经提到,我是在 2026 年开始关注这个方向,并在当年第一季度分批入场。真正值得关注的不是具体买入时间,而是当时形成决策的方式:我并不是因为价格刚好跌到了某个预先设定的 Anchor Level 才决定买入。

我看到的是一个已经连续下跌多年、距离历史高点已有很深回撤的方向,并据此开始认为这里进入了可以承担风险的位置。而且买入以后,价格并没有立即修复,仍然继续出现了明显浮亏(最大约-25%)。

这使得问题更加直接。如果 Anchor 回撤本身就足以决定 START,那么只要价格依次达到预设的 Anchor Level,就应该自然产生买入信号。但我的实际决策并不是这样形成的。这说明 Anchor 真正能够回答的是:

现在距离过去的重要高点已经有多远?

但它不能单独回答:

现在是不是一个值得开始承担风险的时刻?

这两个问题在方案 V1 中被混在了一起。

问题不在于 -30% 设置错了

发现这个问题以后,很容易想到一种修补方式:

text
既然 -30% 太早,
那就改成 -40%。

如果 -40% 仍然太早,
那就改成 -50%。

但这样并没有解决根本问题。

下一轮深度回撤中,真正适合 START 的位置可能出现在:

  • -20%;
  • -35%;
  • -50%;
  • 或者更深的位置。

不同市场周期中的政策环境、资金行为、估值状态和风险来源都可能不同。

因此真正需要被推翻的并不是:

START = -30%

而是:

试图用固定的 Anchor 回撤百分比定义 START。

如果这个关系本身没有被证明成立,那么继续寻找一个“更好的百分比”,只是在错误模型上优化参数。

Anchor 承担了太多职责

回头看方案 V1,一个明显的风险信号其实已经存在。

Anchor 同时被用来回答:

text
市场跌了多深?
什么时候开始?
下一笔什么时候买?

三个问题性质不同。

方案 V2 后来之所以能够变得更清楚,并不是因为公式更复杂,而是因为重新拆分了职责:

text
Anchor
→ 描述市场已经跌了多深

START
→ 决定什么时候第一次承担风险

局部回撤梯度
→ 决定 START 以后什么时候继续买入

这也形成了一个以后可以重复使用的检查方法:

当一个变量同时控制多个不同阶段时,需要检查这些职责是否真的属于同一个判断逻辑。

3. 为什么当时没有更早发现问题

完整感容易被误认为正确性

方案 V1 不是一个明显粗糙的方案。

恰恰相反,它有:

  • 历史数据;
  • 回撤统计;
  • 数学公式;
  • 分档参数;
  • 资金比例;
  • 极端行情回测。

这些东西会产生很强的完整感。

当一个模型已经可以写成公式、整理成表格、跑出回测结果以后,很容易产生一种感觉:

主要问题已经解决,剩下只是参数优化。

但内部完整并不能证明基础假设成立。

一个模型可以:

  • 数学上完全自洽;
  • 程序运行完全正确;
  • 回测结果也没有计算错误;

同时仍然建立在一个错误的问题定义上。

方案 V1 就存在这个问题。

程序可以正确计算:

text
从 Anchor 下跌 30%

但这并不能证明:

text
下跌 30% 就应该开始买入

前者是市场状态。

后者是行动判断。

两者之间缺少了一层证据。

当时缺少的是“专门反对这个模型的人”

方案 V1 形成以后,后面的讨论更多是在问:

怎样把这套方案做得更合理?

例如:

  • 回撤档位应该多密;
  • 创业板是否应该更保守;
  • 深水区应该投入多少;
  • 应该保留多少现金。

这些问题都默认了一个前提:

这套模型的基本结构是成立的。

没有单独安排一个阶段去问:

这套模型为什么可能根本就是错的?

设计者和审查者其实是两个不同角色。

设计者关注:

怎样让方案工作?

审查者应该关注:

怎样找到一个例子把方案推翻?

如果一直处在设计者角色,就很容易继续完善现有结构,而不是挑战这个结构本身。

没有主动拿现实经历做冲突测试

白酒 ETF 的交易经历已经发生,但此前并没有把它和方案 V1 放在一起比较。

直到 9·24 的 START 错位已经引出了问题,再回头想到白酒 ETF,才发现自己的实际决策里也存在同样的现象:

重要高点很早就存在,但真正愿意开始承担风险的位置,并不是由某个固定 Anchor Level 自动决定的。

现实行为不是天然正确,但当模型给出的动作和真实决策发生明显冲突时,至少应该继续追问:

为什么会冲突?

这个问题有时比继续增加回测样本更重要。

回测验证了执行结果,却没有验证行动依据

历史回测通常回答:

如果按照这套规则执行,结果会怎样?

但它没有自动回答:

为什么我要相信这套规则本身值得执行?

例如可以回测:

text
Anchor -30% 买入
-35% 加仓
-40% 再加仓

然后得到平均成本、最大浮亏和修复时间。

这些结果可以全部计算正确。但它们并不能证明:

-30% 为什么应该是第一次承担风险的位置?

这是两类不同的问题。

如果行动依据没有被验证,再精确的回测也只能证明这套规则如果执行,会得到什么结果。不能证明 这套规则为什么应该这样定义

4. 下一代方案应该增加什么检查

方案 V1 的退役,不只是留下了一个“Anchor 不应该决定 START”的结论。

更重要的是,它暴露出模型设计过程中缺少一个独立的反证阶段。

以后每一代参数方案准备冻结之前,都应该先尝试主动证明它是错的。

可以固定检查几个问题:

  • 有没有真实经历与模型结论明显冲突;
  • 把关键参数放到极端位置后,模型是否仍然合理;
  • 是否有一个变量承担了多个不同职责;
  • 是否把“市场处于某种状态”直接等同于“应该采取行动”;
  • 使用的信号在真实执行当时是否能够观察到;
  • 哪些事实一旦出现,就足以推翻当前方案。

尤其应该保留一个问题:

如果我的解释是真的,我还应该看到什么?

以及另一个相反的问题:

出现什么现象时,我会承认当前解释是错的?

方案完成以后,不应该立即进入参数优化。

先寻找:

text
现实反例
极端场景
隐藏假设
职责混淆
不可观察信号
状态与行动之间缺失的判断依据

如果这些检查没有击穿模型,再继续讨论具体参数。

方案 V1 仍然保留,不是因为它还可以继续执行,而是因为它完整记录了一次模型形成、获得完整感、暴露反例并最终退役的过程。

如果只保留后来的方案 V2,能够看到的是:

Anchor、START 和局部回撤梯度应该分开。

但看不到为什么需要这样分开。

这次真正值得留下的教训是:

一个模型最危险的时候,有时并不是它明显不完整的时候,而是它已经足够完整,以至于让人停止继续怀疑它的时候。