Skip to content

蒙特卡洛模拟在回测中的应用:通过随机模拟评估策略的稳健性和置信区间

做量化策略回测这么多年,我踩过最大的坑是什么?

就是看着回测曲线漂亮得不行,实盘一跑就崩。后来我明白了——回测结果只是一个样本点,你根本不知道它是不是运气好撞上的。

这时候,蒙特卡洛模拟就派上用场了。

什么是蒙特卡洛模拟?

说白了,就是让计算机帮你做无数次「假设实验」。你想想看,历史只有一条路径,但未来有无数种可能。蒙特卡洛模拟就是通过随机生成大量可能的路径,来评估你的策略在各种场景下的表现。

我个人习惯把它叫做「压力测试的升级版」。普通回测只测一次,蒙特卡洛模拟测一万次。

核心思想: 用大量随机模拟来逼近真实世界的概率分布,从而评估策略的稳健性。

蒙特卡洛模拟的三种常见应用

1. 残差重采样法

这个方法我在项目中用过很多次。具体做法是:

  • 先跑一遍标准回测,得到每天的收益率序列
  • 把这些收益率打乱顺序,重新组合成新的序列
  • 每个新序列都跑一遍策略,记录结果
  • 重复几千次,看结果分布

为什么要打乱顺序?因为真实市场存在序列相关性,但我们的策略可能恰好利用了某种偶然的模式。打乱后如果策略还能赚钱,那才是真本事。

我的经验: 残差重采样法特别适合检测「过拟合」。我曾经有个策略,原始回测年化收益30%,重采样后中位数只有5%——嗯,果断放弃。

2. 参数随机化法

这个方法更暴力。你把策略参数当成随机变量,每次模拟都随机抽取一组参数跑回测。

比如一个双均线策略,有快线周期和慢线周期两个参数。你可以让快线在5-20之间随机,慢线在20-60之间随机。跑一万次,看结果分布。

import numpy as np

def monte_carlo_params(strategy, param_ranges, n_simulations=10000):
    results = []
    for _ in range(n_simulations):
        # 随机抽取参数
        params = {
            'fast': np.random.randint(param_ranges['fast'][0],
                                      param_ranges['fast'][1]),
            'slow': np.random.randint(param_ranges['slow'][0],
                                      param_ranges['slow'][1])
        }
        # 跑回测
        result = run_backtest(strategy, params)
        results.append(result)
    return results

注意: 参数随机化法不能用来「选参数」!它的目的是评估策略在参数空间中的稳定性,而不是帮你找到最优参数。我曾经见过有人用这个方法找参数,结果过拟合得更严重。

3. 路径生成法

这个方法更接近金融工程的思路。用历史数据的统计特征(均值、方差、相关性等)来生成新的价格路径。

常用的模型有:

  • 几何布朗运动(GBM)
  • GARCH 模型
  • Bootstrap 重抽样

我个人比较喜欢用 Bootstrap,因为它不需要假设数据服从某种分布。直接从历史数据中有放回地抽样,生成新的序列。

如何解读蒙特卡洛结果?

跑完一万次模拟,你会得到一个结果分布。这时候要关注三个指标:

指标 含义 理想值
中位数收益 模拟结果的中位数 大于0
95% 置信区间 去掉两端 2.5% 后的区间 下界大于0
亏损概率 收益为负的模拟次数占比 小于 20%

判断标准: 如果 95% 置信区间的下界大于0,说明策略有 95% 的概率赚钱。这才是真正的稳健策略。

避坑指南

我曾经犯过一个低级错误:用蒙特卡洛模拟来「优化」策略参数。结果呢?模拟出来的参数在实盘上一塌糊涂。

为什么?因为蒙特卡洛模拟的随机性会放大过拟合。你越优化,策略就越适应模拟中的噪声,而不是真实的市场规律。

正确的做法是:

  • 先用历史数据做标准回测
  • 再用蒙特卡洛模拟评估稳健性
  • 如果结果不理想,重新设计策略逻辑
  • 绝对不要用蒙特卡洛结果来调整参数

一个小技巧: 我习惯把蒙特卡洛结果画成直方图,然后在图上标出原始回测结果的位置。如果原始结果在分布的尾部(比如前 5%),那就要小心了——你的策略可能只是运气好。

蒙特卡洛模拟的局限性

任何方法都有局限,蒙特卡洛也不例外:

  • 它假设历史会重演,但黑天鹅事件往往不会
  • 计算量很大,特别是路径生成法
  • 不能完全消除过拟合,只能帮你发现它

说白了,蒙特卡洛模拟是一个「否定工具」,而不是「肯定工具」。它不能证明你的策略一定赚钱,但可以帮你排除那些纯粹靠运气的策略。

蒙特卡洛模拟应用流程

flowchart TD
    A[历史回测数据] --> B[选择随机化方法]
    B --> C1[残差重采样法]
    B --> C2[参数随机化法]
    B --> C3[路径生成法]
    C1 --> D[生成10000次模拟结果]
    C2 --> D
    C3 --> D
    D --> E[置信区间 / 稳健性评估]

这张图展示了蒙特卡洛模拟的完整流程。从历史数据出发,经过三种不同的随机化方法,最终得到策略的置信区间和稳健性评估。

记住一句话:回测只能告诉你过去发生了什么,蒙特卡洛模拟能告诉你未来可能发生什么。两者结合,才是完整的策略评估体系。


公众号:蓝海资料掘金营,微信deep3321