📜  几何布朗运动方程的欧拉离散化 (1)

📅  最后修改于: 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$ 表示随机的布朗运动。欧拉离散化则是一种数值求解该方程的方法,将相邻两个时刻的位置差分,得到下一时刻的位置。

步骤
  1. 首先需要计算曲面在某点的法向量 $\boldsymbol{N}_t$,具体方法根据曲面形状决定,例如对于球面,可将曲面看作以原点为中心,半径为 $r$ 的球,那么某点 $\boldsymbol{X}_t$ 的法向量即为 $\boldsymbol{X}_t$ 与球心的连线。对于更加复杂的曲面,可以使用数值方法求解。

  2. 对于某个时刻 $t$,需要生成随机布朗运动增量 $d\boldsymbol{W}_t$,一般使用正态分布生成。

  3. 设 $\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)$ 表示正态分布随机变量。

  4. 重复步骤 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 是时刻数组,rsig 分别是无风险利率和波动率,dt 表示时间步长。实现的方法是使用 for 循环按步骤 2-3 计算出每个时刻的位置,最终返回位置数组 pos