9.9 蒙特卡洛与随机打乱:看策略抗不抗揍
课前导读
本节目标
学完能解决什么困惑:为什么同样的平均收益,换一个交易顺序,投资体验可能完全不同。
适合谁学:已经理解回测指标、交易成本、参数扫描和 Walk-forward 的读者。
难度:中级。
用时:约 40 分钟。
回测报告里常见一句话:策略历史收益不错。
但投资者真正经历的不是“平均收益”,而是一笔笔交易按顺序发生的过程。
如果亏损刚好集中在前面,你能不能坚持?
如果几笔大亏挨在一起,最大回撤会不会突破心理承受线?
如果把历史交易顺序打乱很多次,策略结果是否仍然大体可接受?
这就是本节要讲的蒙特卡洛与随机打乱。
它不是预测未来,而是检查策略是否抗揍。
知识正文
1. 类比:同样的路程,不同的颠簸顺序
你要坐车从上海到南京。
总路程一样,平均速度也差不多。
但一种体验是一路平稳,中途偶尔减速。
另一种体验是刚上车就连续急刹,后面才慢慢平稳。
两趟车最后都到达目的地。
可乘客的感受完全不同。
交易策略也是这样。
十笔交易的总收益可能一样。
但如果亏损集中在前五笔,资金曲线会先掉进坑里。
如果盈利先发生,后面再遇到亏损,心理压力会小很多。
蒙特卡洛检查的正是这种“路径压力”。
关键直觉
收益不只看终点,还要看路上怎么颠簸;策略要能经受不利顺序的考验。
2. 术语:蒙特卡洛、随机打乱、抽样
蒙特卡洛,是一类用大量随机模拟来观察可能结果范围的方法。
名字听起来高级,但直觉很朴素:不要只看一次历史路径,多生成很多种可能路径看看。
随机打乱交易顺序,是把历史交易收益保留不变,只改变它们出现的先后顺序。
这样可以观察:同样一批盈利和亏损,如果排列方式不同,最大回撤会怎样。
抽样,是从历史交易或历史日收益中随机抽取一部分,形成新的模拟路径。
有时允许重复抽取,这叫有放回抽样。
压力测试,是故意把条件变得更困难。
例如让大亏更早出现、让滑点更高、让连续亏损更集中。
百分位,是用来描述模拟结果分布的位置。
例如 5% 分位最大回撤,表示在很多模拟里,最差的 5% 情况大约有多难受。
3. 它不是预测未来
很多新手会误解蒙特卡洛。
他们以为模拟一万次,就能知道未来会发生哪一种。
这是错误的。
蒙特卡洛不能告诉你未来行情。
它只能告诉你:如果未来的交易结果与历史有某些相似特征,那么不同排列和抽样下,策略可能经历怎样的压力。
它回答的不是“未来会赚多少钱”。
它回答的是“这套策略如果遇到更差顺序,会不会很快破防”。
所以它属于稳健性检查,不属于收益承诺。
常见误区
模拟次数很多,不代表结论一定可靠。输入样本有偏、成本估计太乐观、交易规则不真实,模拟结果也会跟着失真。
4. A 股案例:同样 20 笔交易,顺序不同
假设某 A 股波段策略在历史里完成 20 笔交易。
每笔收益已经扣除佣金、印花税、过户费和滑点。
为了教学,我们只列出一组简化收益。
| 交易编号 | 单笔收益 |
|---|---|
| 1 | 3.0% |
| 2 | -2.0% |
| 3 | 4.5% |
| 4 | -1.5% |
| 5 | 2.0% |
| 6 | -5.0% |
| 7 | 6.0% |
| 8 | -3.0% |
| 9 | 1.8% |
| 10 | 2.5% |
如果盈利和亏损交替出现,资金曲线可能比较平滑。
如果 -5.0%、-3.0%、-2.0%、-1.5% 连续出现在开头,最大回撤会明显变深。
注意,单笔收益集合没有变。
变的只是顺序。
投资者在实盘中面对的恰恰是顺序。
你不知道下一笔是盈利还是亏损。
你也不知道亏损会不会连续出现。
5. 随机打乱的基本流程
先从回测中取出每笔交易的净收益。
然后随机打乱这些收益的顺序。
接着按新顺序重新计算资金曲线和最大回撤。
重复很多次。
最后观察终值、最大回撤、最长连续亏损等指标的分布。
graph TD
A["提取历史每笔净收益"] --> B["随机打乱顺序"]
B --> C["重算资金曲线"]
C --> D["记录终值与最大回撤"]
D --> E["重复多次模拟"]
E --> F["观察结果分布"]这个流程很适合检查“顺序风险”。
如果打乱后大多数路径都还能接受,说明策略对交易顺序相对不敏感。
如果一打乱就经常出现巨大回撤,说明历史路径可能过于幸运。
6. 抽样模拟:检查样本依赖
随机打乱只改变顺序,不改变每笔交易出现的次数。
抽样模拟会进一步变化。
例如从历史 100 笔交易里随机抽取 100 笔,允许同一笔被抽到多次。
这能粗略观察:如果未来交易结构与历史相似,但具体出现组合不同,结果范围会怎样。
抽样模拟也有局限。
如果历史样本本身太少,抽来抽去还是那几笔。
如果历史没有出现过极端行情,模拟也不容易凭空生成真正极端的风险。
因此抽样不能替代对 A 股现实约束的检查。
涨跌停、停牌、流动性枯竭、政策冲击,都需要单独写进风险边界。
7. 压力测试:故意让坏事先发生
压力测试比随机更直接。
它会故意问:“如果最糟糕的几笔亏损连续出现,会怎样?”
例如把历史里亏损最大的 5 笔放到开头。
或者把滑点提高一倍。
或者把所有卖出价格再不利一点。
这种做法不是为了吓自己。
而是为了提前知道策略有没有承受边界。
如果压力测试一做,账户很快回撤到你完全无法接受的位置,说明仓位或规则需要重新审视。
8. 一个短小的 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:手动打乱交易顺序
原始交易收益如下。
| 顺序 | 单笔收益 |
|---|---|
| 1 | 4% |
| 2 | -3% |
| 3 | 5% |
| 4 | -6% |
| 5 | 2% |
| 6 | -2% |
请做两种排列。
第一种,把盈利尽量放前面。
第二种,把亏损尽量放前面。
然后回答:
两种排列的最终收益是否相同?
两种排列的最大回撤是否相同?
哪一种更容易让你中途放弃?
练习 B:写压力测试假设
请从下面选三条,写进你的回测报告。
| 压力条件 | 你要观察的指标 |
|---|---|
| 最大亏损三笔提前出现 | 最大回撤 |
| 滑点提高一倍 | 净收益和交易次数 |
| 连续 5 笔亏损 | 心理承受与暂停规则 |
| 卖出成交价更不利 | 亏损扩大程度 |
| 测试期只保留弱行情 | 策略环境依赖 |
写完后补一句:
如果压力测试触发 ______,我会暂停策略复查,而不是继续扩大仓位。
练习 C:读懂模拟结论
假设 1000 次模拟后得到:
| 指标 | 中位数 | 较差 5% 情况 |
|---|---|---|
| 最终收益 | 18% | -6% |
| 最大回撤 | -16% | -32% |
| 最长连续亏损 | 4 笔 | 9 笔 |
请回答:
你能否接受较差 5% 情况下的回撤?
连续 9 笔亏损时,你的暂停规则是什么?
这个策略是“不能研究”,还是“需要更严格仓位和风险边界”?
核心复盘
知识清单:
[ ] 我知道蒙特卡洛是稳健性检查,不是未来预测。
[ ] 我能解释随机打乱交易顺序为什么会改变最大回撤。
[ ] 我知道抽样模拟可以观察结果范围,但不能弥补坏数据。
[ ] 我会重点观察终值分布、最大回撤分布和最长连续亏损。
[ ] 我知道压力测试是主动让坏情况出现,检查策略承受边界。
[ ] 我会记录随机种子、模拟次数、抽样对象和压力假设。
金句总结
好策略不只要会赚钱,还要在坏顺序、坏运气和坏行情里不轻易散架。