Skip to content

9.9 蒙特卡洛与随机打乱:看策略抗不抗揍

课前导读

本节目标

学完能解决什么困惑:为什么同样的平均收益,换一个交易顺序,投资体验可能完全不同。

适合谁学:已经理解回测指标、交易成本、参数扫描和 Walk-forward 的读者。

难度:中级。

用时:约 40 分钟。

回测报告里常见一句话:策略历史收益不错。

但投资者真正经历的不是“平均收益”,而是一笔笔交易按顺序发生的过程。

如果亏损刚好集中在前面,你能不能坚持?

如果几笔大亏挨在一起,最大回撤会不会突破心理承受线?

如果把历史交易顺序打乱很多次,策略结果是否仍然大体可接受?

这就是本节要讲的蒙特卡洛与随机打乱。

它不是预测未来,而是检查策略是否抗揍。


知识正文

1. 类比:同样的路程,不同的颠簸顺序

你要坐车从上海到南京。

总路程一样,平均速度也差不多。

但一种体验是一路平稳,中途偶尔减速。

另一种体验是刚上车就连续急刹,后面才慢慢平稳。

两趟车最后都到达目的地。

可乘客的感受完全不同。

交易策略也是这样。

十笔交易的总收益可能一样。

但如果亏损集中在前五笔,资金曲线会先掉进坑里。

如果盈利先发生,后面再遇到亏损,心理压力会小很多。

蒙特卡洛检查的正是这种“路径压力”。

关键直觉

收益不只看终点,还要看路上怎么颠簸;策略要能经受不利顺序的考验。

2. 术语:蒙特卡洛、随机打乱、抽样

蒙特卡洛,是一类用大量随机模拟来观察可能结果范围的方法。

名字听起来高级,但直觉很朴素:不要只看一次历史路径,多生成很多种可能路径看看。

随机打乱交易顺序,是把历史交易收益保留不变,只改变它们出现的先后顺序。

这样可以观察:同样一批盈利和亏损,如果排列方式不同,最大回撤会怎样。

抽样,是从历史交易或历史日收益中随机抽取一部分,形成新的模拟路径。

有时允许重复抽取,这叫有放回抽样。

压力测试,是故意把条件变得更困难。

例如让大亏更早出现、让滑点更高、让连续亏损更集中。

百分位,是用来描述模拟结果分布的位置。

例如 5% 分位最大回撤,表示在很多模拟里,最差的 5% 情况大约有多难受。

3. 它不是预测未来

很多新手会误解蒙特卡洛。

他们以为模拟一万次,就能知道未来会发生哪一种。

这是错误的。

蒙特卡洛不能告诉你未来行情。

它只能告诉你:如果未来的交易结果与历史有某些相似特征,那么不同排列和抽样下,策略可能经历怎样的压力。

它回答的不是“未来会赚多少钱”。

它回答的是“这套策略如果遇到更差顺序,会不会很快破防”。

所以它属于稳健性检查,不属于收益承诺。

常见误区

模拟次数很多,不代表结论一定可靠。输入样本有偏、成本估计太乐观、交易规则不真实,模拟结果也会跟着失真。

4. A 股案例:同样 20 笔交易,顺序不同

假设某 A 股波段策略在历史里完成 20 笔交易。

每笔收益已经扣除佣金、印花税、过户费和滑点。

为了教学,我们只列出一组简化收益。

交易编号单笔收益
13.0%
2-2.0%
34.5%
4-1.5%
52.0%
6-5.0%
76.0%
8-3.0%
91.8%
102.5%

如果盈利和亏损交替出现,资金曲线可能比较平滑。

如果 -5.0%、-3.0%、-2.0%、-1.5% 连续出现在开头,最大回撤会明显变深。

注意,单笔收益集合没有变。

变的只是顺序。

投资者在实盘中面对的恰恰是顺序。

你不知道下一笔是盈利还是亏损。

你也不知道亏损会不会连续出现。

5. 随机打乱的基本流程

先从回测中取出每笔交易的净收益。

然后随机打乱这些收益的顺序。

接着按新顺序重新计算资金曲线和最大回撤。

重复很多次。

最后观察终值、最大回撤、最长连续亏损等指标的分布。

mermaid
graph TD
    A["提取历史每笔净收益"] --> B["随机打乱顺序"]
    B --> C["重算资金曲线"]
    C --> D["记录终值与最大回撤"]
    D --> E["重复多次模拟"]
    E --> F["观察结果分布"]

这个流程很适合检查“顺序风险”。

如果打乱后大多数路径都还能接受,说明策略对交易顺序相对不敏感。

如果一打乱就经常出现巨大回撤,说明历史路径可能过于幸运。

6. 抽样模拟:检查样本依赖

随机打乱只改变顺序,不改变每笔交易出现的次数。

抽样模拟会进一步变化。

例如从历史 100 笔交易里随机抽取 100 笔,允许同一笔被抽到多次。

这能粗略观察:如果未来交易结构与历史相似,但具体出现组合不同,结果范围会怎样。

抽样模拟也有局限。

如果历史样本本身太少,抽来抽去还是那几笔。

如果历史没有出现过极端行情,模拟也不容易凭空生成真正极端的风险。

因此抽样不能替代对 A 股现实约束的检查。

涨跌停、停牌、流动性枯竭、政策冲击,都需要单独写进风险边界。

7. 压力测试:故意让坏事先发生

压力测试比随机更直接。

它会故意问:“如果最糟糕的几笔亏损连续出现,会怎样?”

例如把历史里亏损最大的 5 笔放到开头。

或者把滑点提高一倍。

或者把所有卖出价格再不利一点。

这种做法不是为了吓自己。

而是为了提前知道策略有没有承受边界。

如果压力测试一做,账户很快回撤到你完全无法接受的位置,说明仓位或规则需要重新审视。

8. 一个短小的 Python 思路示例

下面代码只演示思路,不要求真实外部数据。

python
trade_returns = [0.03, -0.02, 0.045, -0.015, 0.02, -0.05, 0.06, -0.03]
sim_results = []

for _ in range(1000):
    shuffled = np.random.permutation(trade_returns)
    equity = (1 + pd.Series(shuffled)).cumprod()
    drawdown = equity / equity.cummax() - 1
    sim_results.append({
        "ending_equity": equity.iloc[-1],
        "max_drawdown": drawdown.min(),
    })

summary = pd.DataFrame(sim_results).describe()

这段代码做了四件事。

第一,把每笔交易收益放进列表。

第二,每次随机打乱顺序。

第三,重新计算资金曲线。

第四,记录终值和最大回撤。

真正重要的不是 describe() 这个函数名。

真正重要的是你得到一组结果范围,而不再只盯着历史唯一顺序。

9. 该看哪些输出

第一,看终值分布。

如果很多模拟的最终资金都明显低于起点,策略可能没有足够优势。

第二,看最大回撤分布。

如果 5% 较差情形下的最大回撤远超你的承受能力,策略即使平均收益不错,也可能不适合你。

第三,看最长连续亏损。

连续亏损比单次亏损更容易摧毁执行纪律。

第四,看低分位结果。

不要只看平均值。

平均值像班级平均分,低分位更像“倒霉时可能考多少分”。

10. 专业老师视角:把“坏运气”讲清楚

稳健性教学里,最难的是让新手接受不确定性。

一个策略即使有正收益期望,也可能先遇到一串亏损。

这不一定说明策略立刻失效。

但如果亏损串的深度已经超过报告里允许的风险边界,就必须停止复查。

老师会要求你把“正常波动”和“规则失效”分开。

蒙特卡洛提供的不是答案,而是一把尺子。

它帮助你估计:什么程度的坏运气仍在预期范围内,什么程度已经超出策略说明书。

11. 投资者视角:先问自己能不能扛

如果某策略历史年化看起来不错,但模拟显示最差 5% 情况可能回撤 35%。

你要诚实问自己:我能不能坚持?

如果答案是否定的,就不要因为收益数字漂亮而勉强使用。

对于 A 股新手,心理承受能力往往比模型更脆弱。

连续亏损时,人会想加仓摊平、临时换规则、追别的热点。

这些行为会让策略结果和回测完全脱节。

蒙特卡洛的价值,是在实盘前就把这种压力摆到桌面上。

12. 量化开发视角:随机也要可复现

随机模拟不是随便摇一摇。

开发时要记录随机种子。

要记录模拟次数。

要记录抽样对象是“单笔交易收益”还是“日收益”。

要记录是否允许重复抽样。

要记录是否加了额外压力假设。

否则今天模拟出来的结果,明天可能无法复查。

可复现的随机,才是研究工具。

不可复现的随机,只是制造幻觉。

13. 什么时候不适合直接用

如果交易笔数太少,蒙特卡洛结论会很弱。

例如只有 8 笔交易,打乱顺序能看到的东西有限。

如果策略收益高度依赖市场环境,简单抽样可能破坏时间结构。

例如趋势策略在连续趋势里赚钱,在震荡里亏钱。

把日收益完全随机打散,可能丢失真实行情的连续性。

如果数据没有处理停牌、涨跌停和不可成交问题,模拟再多也没有意义。

所以蒙特卡洛要和前面学过的成本、成交现实性、Walk-forward 一起使用。

14. 可执行练习:给策略做一次纸面压力测试

拿出一组历史交易净收益。

先按原顺序计算累计收益。

再把亏损最大的三笔放到最前面。

然后重新计算资金曲线。

最后比较最大回撤。

你会直观看到:同样的交易集合,最难受的路径可能完全不同。

这一步不需要复杂代码。

用表格就能完成。


交互实验室

本节实验室用一张小表训练路径思维。

请不要急着追求精确计算。

重点是感受“顺序风险”。

练习 A:手动打乱交易顺序

原始交易收益如下。

顺序单笔收益
14%
2-3%
35%
4-6%
52%
6-2%

请做两种排列。

第一种,把盈利尽量放前面。

第二种,把亏损尽量放前面。

然后回答:

  1. 两种排列的最终收益是否相同?

  2. 两种排列的最大回撤是否相同?

  3. 哪一种更容易让你中途放弃?

练习 B:写压力测试假设

请从下面选三条,写进你的回测报告。

压力条件你要观察的指标
最大亏损三笔提前出现最大回撤
滑点提高一倍净收益和交易次数
连续 5 笔亏损心理承受与暂停规则
卖出成交价更不利亏损扩大程度
测试期只保留弱行情策略环境依赖

写完后补一句:

如果压力测试触发 ______,我会暂停策略复查,而不是继续扩大仓位。

练习 C:读懂模拟结论

假设 1000 次模拟后得到:

指标中位数较差 5% 情况
最终收益18%-6%
最大回撤-16%-32%
最长连续亏损4 笔9 笔

请回答:

  1. 你能否接受较差 5% 情况下的回撤?

  2. 连续 9 笔亏损时,你的暂停规则是什么?

  3. 这个策略是“不能研究”,还是“需要更严格仓位和风险边界”?


核心复盘

知识清单

  • [ ] 我知道蒙特卡洛是稳健性检查,不是未来预测。

  • [ ] 我能解释随机打乱交易顺序为什么会改变最大回撤。

  • [ ] 我知道抽样模拟可以观察结果范围,但不能弥补坏数据。

  • [ ] 我会重点观察终值分布、最大回撤分布和最长连续亏损。

  • [ ] 我知道压力测试是主动让坏情况出现,检查策略承受边界。

  • [ ] 我会记录随机种子、模拟次数、抽样对象和压力假设。

金句总结

好策略不只要会赚钱,还要在坏顺序、坏运气和坏行情里不轻易散架。

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。