蒙特卡洛模拟的计算公式与 1,000 条路径的误差
定投蒙特卡洛模拟内部算的是什么:余额递推公式、对数收益率、百分位和成功率的求法,以及 1,000 条路径的结果会有多大变动,并与运行 50 次的实测对比。
更新
定投蒙特卡洛模拟内部算的是什么:余额递推公式、对数收益率、百分位和成功率的求法,以及 1,000 条路径的结果会有多大变动,并与运行 50 次的实测对比。
更新
蒙特卡洛模拟是一种把随机试验重复很多次、统计结果如何分布来求得答案的方法。[1]用于投资计划时,每次试验用一个按月更新余额的公式(递推公式)逐月往后推算,每个月的收益率随机抽取,一直推到最后一个月。在 compoundsim 中,20 年的计划每条路径要走 240 次这样的月度更新,模拟器共运行 1,000 条路径。用 1,000 条路径求出的中位数,换一组随机数也只变动百分之几,比例的变动也很小。真正让结果大幅变化的,是每月收益率怎么抽取。
本文先不谈收益率模型,而是用公式写出所有模型共用的计算。不用公式的同类讲解,见蒙特卡洛模拟在投资中如何运作。
把月份编号为 ,记第 个月末的余额为 ,每月投入为 。固定收益率的定投复利计算器把年化收益率 当作有效年利率,换算成每月的增长倍数,每个月都乘以同一个数:
蒙特卡洛模拟把其中的 换成每个月随机抽取的增长倍数 ,其中 是当月的对数收益率(见下一节):
每月投入在月末、当月收益之后加入,顺序与固定收益率的计算相同;去掉随机性,两者结果一致。20 年的计划 ,把这 240 个月走完一遍就是一条路径。模拟器计算 1,000 条。
取用模拟器的顺序相反:月初先取出,剩下的再增长。取用金额 从第一年金额的十二分之一开始,每月随通胀上调:
某个月的取用让余额降到零或以下时,这条路径就算资金用完,之后一直为零。
蒙特卡洛模拟器选择“实际”时,以及取用模拟器在任何时候,都会用当时的物价水平去除余额。设预期通胀率为年 (默认 2%),第 个月的实际余额就是 。物价按这个固定比率上涨,不涉及随机数。
设 为当月的简单收益率(5% 记作 0.05),它的对数收益率是 。模拟器的模型是把过去的月度收益率换成对数之后拟合的。用对数表示,多个月的增长就变成了求和。只有初始投资、没有每月投入时:
随着月数增加, 之和的分布越来越接近对称。记 为期望值(平均值),则这个和的中位数约为 ,余额的中位数约为 。但 是向上弯曲的,所以余额的平均值会比这个数更高()。少数非常好的路径会把平均值拉高,却几乎不影响中位数。
中位数就是不太受这几条路径左右的数字。简单平均收益率与资金实际增长速度之间的差距(波动率拖累),见平均收益率不等于资金增长的速度。有每月投入时,公式不再是这个形式,但出于同样的原因,平均值仍然高于中位数。
把 1,000 条路径在某个月的余额从小到大排列,记作 ,其中 。第 百分位取排位 处的值; 不是整数时,就在它两侧的两条路径之间按直线插值( 表示把 向下取整)。在统计软件计算百分位的各种方法中,这是被归为“定义 7”的那一种。[2]写成公式:
中位数是 。图表上外层区间是 到 ,内层区间是 到 。每个月的区间都单独计算,所以区间的边缘并不沿着某一条路径走。
比例是满足某个条件的路径数除以 。取用模拟器的成功率,就是资金撑到最后的路径占比:
回撤是余额低于此前所达最高值的幅度。最高值从初始投资额开始算,余额也包含已经投入的钱(看实际值时,用实际余额来衡量):
一条路径上最深的 ,就是这条路径的最大回撤。
这里的每个 和 ,描述的都是模型生成的 1,000 条路径。模型是否符合现实,路径再多也无法判断。
路径(试验)的数量有限,所以换一个随机数的起点(种子),结果就会略有不同。变动有多大,可以用公式估算。
比例 是把概率为 的事件试了 次后统计出来的,所以它的标准差(标准误差)是
成功率为 90% 时,这个值是 ,标准误差约 0.95 个百分点。上下大约两倍的范围内,也就是大致 88% 到 92%,成功率可能只因偶然而变动。
百分位也有类似的公式。设 为余额分布在该百分位处的密度(路径在这个金额附近聚集得有多密),则
在路径稀疏的尾部, 较小,误差较大。两个公式都按 缩小,所以要把误差减半,需要四倍的路径。
为了看清它有多大,我们把与蒙特卡洛模拟器相同的计算运行了 50 次,只改变种子。条件是:标普 500(SPY,股息再投资,模型拟合自 1993 年以来的全部历史),美元名义值,每月 1 美元,持续 20 年(共投入 240 美元)。
| 20 年后的余额 | 50 次的平均值(投入本金的倍数) | 1,000 条路径时的变动 | 250 条路径时的变动 |
|---|---|---|---|
| 第10百分位 | 1.7 倍 | 3.0% | 4.1% |
| 中位数 | 3.5 倍 | 2.5% | 5.5% |
| 第90百分位 | 7.6 倍 | 3.1% | 6.5% |
变动是 50 次结果的标准差除以它们的平均值。用 1,000 条路径时,20 年后的中位数每次运行会变动约 2.5%,所以读 1,000 条路径的中位数时,最好把它看作带有百分之几的误差。
对比例也做了同样的检验:最大回撤达到 −30% 或更深的路径占比,50 次的平均值为 21.3%。下表中的标准差,是这个比例本身变动的幅度,单位为百分点。
| 最大回撤 −30% 或更深的路径占比 | 1,000 条路径 | 250 条路径 |
|---|---|---|
| 50 次实测的标准差 | 1.5% | 2.8% |
| 公式 的值 | 1.3% | 2.6% |
对于比例,实测的变动与公式几乎一致。路径减少到四分之一,大多数指标的变动大约翻倍。不过,用 50 次运行测出的标准差本身就有约一成的不确定性,两者之比的不确定性更大,所以有些行会明显偏离两倍,比如第一张表的第10百分位那一行。
每条路径先自行重新抽取模型的平均收益率和状态切换的概率,然后再抽取各个月份。路径之间仍然相互独立,所以 的规律照样成立。
模拟器的种子是打开页面那天的日期(UTC),写成八位数 。一个叫 mulberry32 的小型伪随机数生成器把它变成 上的均匀随机数,从第一条路径开始依次使用。同一天、同样的设置,谁打开页面都会得到同样的 1,000 条路径。
换一天打开页面,种子就变了,页面会重新抽取 1,000 条路径(页面一直开着的话,过了午夜种子也不变)。上面的实验在 50 次运行中也只改变了种子,所以中位数在两天之间变动百分之几,仍在那里测出的变动范围之内。比这大得多的差异,来自改变设置或模型拟合的历史数据,或者数据更新后模型重新拟合。
单一资产时,递推公式中的 来自该资产的月度对数收益率 。对于组合,设资产 的比例为 (比例之和为 1),每月再平衡回这些比例,增长倍数为
投资组合模拟器(不使用融资买入时)和取用模拟器,都把这个 代替 放进递推公式。
以美元以外的货币来看、并打开“计入汇率波动”(默认)时,该货币一个单位的美元价值在当月的变化,会和各资产一起从模型中抽取。记其对数变化为 ,则以该货币计的增长倍数为 ,其中 是拟合历史的模型中汇率的长期平均变化。汇率的长期趋势未必会延续,所以把它去掉,只保留波动及其发生的时间。
和 如何在平静状态与动荡状态之间切换着抽取,见蒙特卡洛模拟在投资中如何运作。
上面的变动来自用给定的模型运行有限条路径,路径越多,变动越小。但有两样东西,无论跑多少条路径都不会变。
一是收益率模型。 来自哪个模型,会改变分布本身;拟合历史的模型,很少会生成与历史上任何行情都不同的市场。
二是计算中没有包含的东西。税、交易手续费和账户费用都没有扣除(ETF 自身的费率已体现在收益中)。每月投入始终不变,物价按固定比率上涨。
这些假设对结果的影响,远大于 1,000 条路径百分之几的变动。在与上面实验相同的条件下,只改变模型拟合的历史数据,用同一个种子各运行一次 1,000 条路径,20 年后的中位数在全部历史下是投入本金的 3.4 倍,在最近 5 年下是 4.1 倍:差距远大于路径数带来的变动(2.5%)。