📅  最后修改于: 2023-12-03 15:36:49.611000             🧑  作者: Mango
几何布朗运动是随机微分方程的一种,它描述的是一个随机移动的粒子在曲率为 $K$ 的曲面上的运动,其方程如下:
$$ d\boldsymbol{X}_t = -K\boldsymbol{N}_t dt + \sqrt{2D} d\boldsymbol{W}_t $$
其中,$\boldsymbol{X}_t$ 表示粒子在时刻 $t$ 的位置,$\boldsymbol{N}_t$ 表示曲面在该点的法向量,$D$ 为扩散系数,$d\boldsymbol{W}_t$ 表示随机的布朗运动。欧拉离散化则是一种数值求解该方程的方法,将相邻两个时刻的位置差分,得到下一时刻的位置。
首先需要计算曲面在某点的法向量 $\boldsymbol{N}_t$,具体方法根据曲面形状决定,例如对于球面,可将曲面看作以原点为中心,半径为 $r$ 的球,那么某点 $\boldsymbol{X}_t$ 的法向量即为 $\boldsymbol{X}_t$ 与球心的连线。对于更加复杂的曲面,可以使用数值方法求解。
对于某个时刻 $t$,需要生成随机布朗运动增量 $d\boldsymbol{W}_t$,一般使用正态分布生成。
设 $\Delta t$ 为时间间隔,则粒子在下一个时刻的位置 $\boldsymbol{X}_{t+\Delta t}$ 可以使用以下公式求解:
$$ \boldsymbol{X}_{t+\Delta t} = \boldsymbol{X}_t - K\boldsymbol{N}_t\Delta t + \sqrt{2D\Delta t} \boldsymbol{\mathcal{N}}(0,1) $$
其中,$\boldsymbol{\mathcal{N}}(0,1)$ 表示正态分布随机变量。
重复步骤 1-3,模拟整个过程。
以下是使用 Python 实现欧拉离散化的代码示例:
import numpy as np
def geometric_brownian_motion(x0, t, r, sig, dt):
"""
模拟几何布朗运动的欧拉离散化
参数:
x0:初始位置
t:时刻数组,长度为 N
r:无风险利率
sig:波动率
dt:时间步长
返回:
pos:位置数组,长度为 N
"""
pos = np.zeros_like(t)
pos[0] = x0
for i in range(1, len(t)):
# 计算随机增量
dW = np.random.normal(scale=np.sqrt(dt))
# 计算前一时刻的法向量 N
N = np.array([0, np.cos(pos[i-1]/10.0), -np.sin(pos[i-1]/10.0)])
# 计算下一时刻的位置
pos[i] = pos[i-1] + r*pos[i-1]*dt + sig*pos[i-1]*N.dot(dW)
return pos
以上代码中,x0
表示初始位置,t
是时刻数组,r
和 sig
分别是无风险利率和波动率,dt
表示时间步长。实现的方法是使用 for 循环按步骤 2-3 计算出每个时刻的位置,最终返回位置数组 pos
。