这个问题最初发布在 Quant.StackExchange 中,但已经有一段时间没有得到解答,所以我在这里提问。
为了简单起见,让我们考虑几何布朗运动(GBM)。
我的问题:
- 1. 如何使用 GBM 证明 Euler-Maruyama 方法是收敛的?
- 2.如何确定收敛的顺序?
背景和我面临的问题:
根据数值分析理论SDE 求解器有阶如果错误的期望值为时间步长中的 th 阶
现在让成为GBM 和然后
当我运行求解器时不同尺寸的时间,我希望我的样本均值和真实均值之间的差异,, 将减少为变小。但是,当我运行这些模拟时,这就是我得到
的:这并不表示误差收敛为零,因为
归零?
为什么……这是因为随机性?我实际上已经尝试过,, 和模拟。一般来说,模拟应该足以消除大部分差异。
请建议我如何确定/显示收敛顺序。
如果有人对代码感兴趣
import matplotlib.pyplot as plt
import numpy as np
T = 10
mu = 0.1
sigma = 0.15
S0 = 1
ns = 10000
solution = S0*np.exp( mu*T )
dt_ = np.array([0.1,0.05,0.01,0.005])
err = np.zeros( len(dt_ ));
for j in range ( len(dt_ )):
dt = dt_[j]
Sn = np.zeros( (ns) )
for i in range(ns):
N = int(round(T/dt))
t = np.linspace(0, T, N)
ex= np.linspace(0, T, N)
W = np.random.standard_normal(size = N)
W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ###
X = (mu-0.5*sigma**2)*t + sigma*W
S = S0*np.exp(X) ### geometric brownian motion ###
Sn[i]= S[-1]
mn = np.mean(Sn)
print(mn)
err[j] = abs( mn - solution)
plt.clf();
plt.loglog(dt_,err, color ="black", label = "Error (abs)");plt.xlabel("dt",fontsize = 20); plt.ylabel("Error (abs)",fontsize = 20)
plt.loglog(dt_,err, 'o', color ="black" , label = "x")
plt.title("loglog-plot",fontsize = 30);
plt.loglog(dt_,0.05*dt_**0.5, linestyle = ":")
代码大多只是从 StackOverflow 复制粘贴