如何确定 Euler-Maruyama 方法的收敛顺序?

计算科学 有限差分 收敛 数字 随机 随机颂歌
2021-12-13 12:28:14

这个问题最初发布在 Quant.StackExchange 中,但已经有一段时间没有得到解答,所以我在这里提问。

为了简单起见,让我们考虑几何布朗运动(GBM)。

我的问题:

  • 1. 如何使用 GBM 证明 Euler-Maruyama 方法是收敛的?
  • 2.如何确定收敛的顺序?

背景和我面临的问题:

根据数值分析理论SDE 求解器有阶p如果错误的期望值为p时间步长中的 th 阶

现在让St成为GBMS0=1, μ=0.1σ=0.15然后E[S10]=e

当我运行求解器时10,000不同尺寸的时间dt,我希望我的样本均值和真实均值之间的差异,e, 将减少为dt变小。但是,当我运行这些模拟时,这就是我得到 的:这并不表示误差收敛为零,因为在此处输入图像描述 dt归零?

为什么……这是因为随机性?我实际上已经尝试过1000,10000, 和20000模拟。一般来说,10000模拟应该足以消除大部分差异。

请建议我如何确定/显示收敛顺序。

如果有人对代码感兴趣

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 复制粘贴

0个回答
没有发现任何回复~