REF · 方法

蒙特卡罗与集合模拟MONTE CARLO & ENSEMBLE SIMULATION

Ulam 与 von Neumann,1946 — 当你算不出分布,就把过程跑一万遍

被引用于:Topic 37 厚尾世界的风险

01它问的是什么问题(The Question It Poses)

1946 年,数学家 Stanisław Ulam 在病中打单人纸牌,想算某种牌局能顺利走完的概率。组合数学的路子走不通——可能的排列太多了。于是他冒出一个念头:与其算,不如发一百次牌,数一下成功了几次。他把这个想法说给 John von Neumann 听,两人很快把它用到了洛斯阿拉莫斯的中子扩散问题上。代号取自摩纳哥的赌场,因为 Ulam 有位叔叔常去那里。

它要问的问题是:当一个系统的结果分布写不出公式时,怎么知道它长什么样?这在复杂系统里是常态而不是例外——过程里有阈值、有反馈、有路径依赖,输入的一点分布叠加起来就没有解析解了。

还有一个更硬的版本:有些量本来就不是分布的性质,而是路径的性质——"中途破产的概率""在第 30 天之前触及某个下限的概率""连续三次失败的可能"。这类问题即使你知道分布也算不出来,因为它们问的是过程怎么走的,而不是终点在哪儿。模拟能直接回答它们,因为模拟本来就是在走路径。

02规则本身(The Rules)

  1. 产生结果的过程写成规则——不是写结果的分布,是写机制。
  2. 给每个不确定的输入指定一个分布(销量、工期、故障率、收益率……)。
  3. 抽一组输入,把过程完整跑一遍,记下结果。
  4. 重复 N 次,N 通常是几千到几百万。
  5. 看这 N 个结果的整个分布:中位数、分位数、最坏的那一小撮,而不只是均值。

集合模拟(ensemble simulation)是同一个想法的另一种用法:模型只有一个,但你用略微不同的初始条件和参数各跑一遍,得到一"束"未来。天气预报里的集合预报就是这么做的——不确定性来自初值的敏感依赖,跑一束轨迹比跑一条更诚实。两者的共同点是:用一群样本代替一个答案。

整个方法就是这个循环把过程写成规则给每个不确定输入抽一个值跑完一次 → 得到一个结果重复 N 次,把结果都留着看整个分布,而不是那个均值重复 N 次
方法本身只有这一个循环。难的从来不是循环,是第 1 步和第 2 步里那些你不得不做的假设。

03跑起来会看到什么(What You See When It Runs)

拿一个人人都碰到过的例子:一个项目由五道工序串起来,每道工序"最可能"耗时 5 天,但都有拖长的可能(很少提前,偶尔大拖)。把五个"最可能"加起来是 25 天——这是几乎所有人给出的排期。

把它跑两万遍,看到的是这样:

同一个五道工序的项目,跑两万遍2030405060总工期(天)五道工序「最可能耗时」直接相加25 天中位数30 天90 分位36 天点估计落在 14 分位 — 把「最可能耗时」相加,忽略了拖延是右偏的、不会互相抵消
点估计 25 天落在第 14 分位:也就是说,按这个排期承诺,大约每七次里只有一次能按时交付。

中位数是 30 天,90 分位是 36 天。25 天不是"平均情况",它是好运气的情况。原因很简单:拖延是右偏的(能拖很久,很难提前很多),五道工序的偏斜不会互相抵消,而是加起来。这件事凭直觉几乎不可能想清楚,但模拟一跑就直接看见了。

还会看到两个稳定的现象。一是收敛慢且有节奏:估计的精度大致按 1/√N 提高,也就是精度翻一倍要四倍的样本量。二是尾部比中间难得多:估中位数几百次就够了,估 99.9% 分位需要的样本量高好几个数量级——尾部本来就是最稀有的那一小撮,而模拟并不会凭空多给你几个。

04它解释了现实中的什么(What It Explains)

它算不上"解释"什么,它是一台把假设翻译成后果的机器。真正的价值有三个:

给出分布而不是点估计。项目排期、产能规划、预算,凡是承诺一个数字的地方,都可以改成承诺一个分位数("90% 的把握在 36 天内交付"),而这句话只有跑过才说得出口。

算得出路径属性。破产概率、触及某个下限的概率、一年内至少发生一次的概率——这些是期望值公式给不了的,而它们往往才是真正的决策变量。

让不确定性可以被搬运。天气的集合预报(欧洲中期天气预报中心跑几十个成员)、期权定价、工程可靠性、粒子输运、供应链断点分析,用的都是同一个循环。它们的共同处境是:机制清楚、解析解没有、而尾部要命。

它不能解释什么(What It Cannot Explain)

延伸阅读(Further Reading)