为何对数正态回报的cumprod/cumsum得到的最终价格均值偏离1.0?
几何布朗运动最终价格期望偏离1的问题分析与解决
理论正确性确认
你的公式mu = -sigma²/2是完全正确的。几何布朗运动的离散化中,单步对数回报r_t = ln(S_t/S_{t-1})服从正态分布N(mu, sigma²),对应的单步价格因子exp(r_t)的期望为:
E[exp(r_t)] = exp(mu + sigma²/2)
要让该期望为1(保证每一步价格的期望不变),解得mu = -sigma²/2,进而最终价格S_n = S_0 * product(exp(r_t))的期望为1^(n-1) = 1,理论上完全成立。
模拟结果偏离的原因
你观察到的结果并非理论缺陷或数值稳定性问题,而是参数组合导致最终价格的分布极度右偏,有限次模拟中未抽到足够多的极端大值样本:
当你设置sigma=1、n=100时,共有99个对数回报,它们的和服从正态分布N(99*mu, 99*sigma²),代入mu=-0.5后,和的均值为-49.5,标准差约为9.95。此时:
- 绝大多数样本的和会落在
-49.5 ± 3*9.95区间内,对应exp(和)的取值约为3e-9到1e-34; - 和为正值的概率极低(Z值约为4.97,对应概率仅约3e-7),意味着10万次模拟中几乎抽不到让
exp(和)大幅大于1的样本。
这种情况下,样本均值会被大量极小值主导,远低于理论均值1。
解决方法
1. 调整模拟参数
选择更合理的参数组合,让最终价格的分布右偏程度降低:
- 减小
sigma:比如将sigma设为0.1,此时单步对数回报的均值为-0.005,99个回报和的均值为-0.495,标准差约0.995,和为正值的概率约31%,10万次模拟就能得到接近1的均值。 - 减小
n:比如设n=2(仅1个对数回报),此时和的分布为N(-0.5,1),和为正值的概率约31%,模拟结果会快速收敛到1。
2. 大幅增加模拟次数
如果必须使用原参数,需要将模拟次数提升到千万甚至亿级,才能抽到足够多的极端大值样本,让样本均值收敛到理论值。
验证示例
调整参数后的代码:
import numpy as np def gen_prices(n: int, start_price: float = 1.0, sigma: float = 1.0) -> np.ndarray: mu = -(sigma**2) / 2 log_returns = np.random.normal(mu, sigma, size=n - 1) prices = np.exp( np.cumsum( np.concatenate([np.array([np.log(start_price)]), log_returns]), ) ) return prices # 使用sigma=0.1,n=100 num_iter = 100000 num_prices = 100 final_prices = [gen_prices(n=num_prices, sigma=0.1)[-1] for _ in range(num_iter)] print(np.mean(final_prices)) # 结果会接近1.0
内容的提问来源于stack exchange,提问作者bluenote10
相关产品推荐
相关产品推荐

