模拟布朗运动

2020-06-11 09:29:46 浏览数 (2)

  • Simulation of Brownian Motion
    • Geometric Brownian Motion (GBM)

Simulation of Brownian Motion

模拟布朗运动和其他连续鞅

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
import warnings
warnings.filterwarnings("ignore")
Brownian Motion

因为布朗运动每一个的增量都服从正态分布,因此可以直接生成。

代码语言:javascript复制
plt.figure(figsize=(10, 4.5))
delta_t = 0.01
rd = np.cumsum(np.sqrt(delta_t) * np.random.randn(999))
rd = np.insert(rd, 0, 0)
t = np.arange(0, 10, 0.01)
plt.plot(t, rd);plt.title('标准布朗运动的轨道')
plt.show()

Geometric Brownian Motion (GBM)

几何布朗运动是如下SDE的解:,其中是布朗运动 给定初始值,有

给定不同的的值,模拟一条的轨道。,其中

代码语言:javascript复制
plt.figure(figsize=(11, 17))
for i in range(4):
    plt.subplot(4, 1, i 1)
    mu, sigma = 0.1, 0.5
    t = np.arange(0, 10, 0.01)
    delta_t = 0.01
    path = [10]
    for i in range(1, t.size):
        path.append(path[-1]   mu * path[-1] * delta_t   
            sigma * path[-1] * np.sqrt(delta_t) * np.random.randn())
    plt.plot(t, path, label=f'$mu={mu}, sigma={sigma}$')
plt.suptitle(f'$S_0=10, mu={mu}, sigma={sigma}$的几何布朗运动的轨道', y=0.91); plt.show()
代码语言:javascript复制
plt.figure(figsize=(11, 17))
for i in range(4):
    plt.subplot(4, 1, i 1)
    mu, sigma = 0.5, 0.8
    t = np.arange(0, 10, 0.01)
    delta_t = 0.01
    path = [10]
    for i in range(1, t.size):
        path.append(path[-1]   mu * path[-1] * delta_t   
            sigma * path[-1] * np.sqrt(delta_t) * np.random.randn())
    plt.plot(t, path, label=f'$mu={mu}, sigma={sigma}$')
plt.suptitle(f'$S_0=10, mu={mu}, sigma={sigma}$的几何布朗运动的轨道', y=0.91); plt.show()

通过这个轨道图,也容易看出,几何布朗运动是对股票价格的良好模拟,能代表CAMP模型中股票的期望收益率,而是股票风险的度量!

对于任意时间,是一个对数正态分布随机变量。(服从正态分布) 所以具有概率密度函数这意味着我们可以得到在任意时间上的分布

代码语言:javascript复制
mu, sigma = 0.2, 0.8
t = np.arange(0, 1, 0.01)
delta_t = 0.01
distribution = []
for _ in range(10000):
    path = [10]
    for i in range(1, t.size):
        path.append(path[-1]   mu * path[-1] * delta_t   
            sigma * path[-1] * np.sqrt(delta_t) * np.random.randn())
    distribution.append(path[-1])
代码语言:javascript复制
sns.distplot(distribution, kde=False, norm_hist=True)
plt.title(f'$mu={mu}, sigma={sigma}, S_1$的分布')
plt.show()

0 人点赞