随机过程笔记(二):布朗运动

Random number Generation

  • Normal distribution:np.random.normal(loc=0., scale=0.25, size=10000)
  • Uniform distribution:np.random.uniform(a=0, b=1, size=10000)
  • Random Integrate: np.random.randint(0, 2, size = 1000)
  1. 正态分布随机数:np.random.normal(loc=0., scale=0.25, size=10000)
    – 默认标准正态分布
    – loc位置参数,表示均值 μ \mu μ,默认为0
    – scale 尺度参数,表示标准差 σ \sigma σ,默认为1

1 Brownian Motion

1.1 Simulation of a Brownian Motion Path<?font>

draw 𝑧1,𝑧2,…,𝑧𝑘 drawn 𝑖.𝑖.𝑑. from 𝑁(0,1), so that we can define:

  • B t 1 = B 0 + t 1 ϕ 1 B_{t_1} = B_0 + \sqrt{t_1}\phi_1 Bt1=B0+t1 ϕ1
  • B t 2 = B t 1 + t 2 − t 1 ϕ 2 = B 0 + t 1 ϕ 1 + t 2 − t 1 ϕ 2 B_{t_2} = B_{t_1} + \sqrt{t_2 - t_1}\phi_2 = B_0 + \sqrt{t_1}\phi_1 + \sqrt{t_2 - t_1}\phi_2 Bt2=Bt1+t2t1 ϕ2=B0+t1 ϕ1+t2t1 ϕ2
  • B t 3 = B t 2 + t 3 − t 2 ϕ 3 = B 0 + t 1 ϕ 1 + t 2 − t 1 ϕ 2 + t 3 − t 2 ϕ 3 B_{t_3} = B_{t_2} + \sqrt{t_3 - t_2}\phi_3 = B_0 + \sqrt{t_1}\phi_1 + \sqrt{t_2 - t_1}\phi_2 + \sqrt{t_3 - t_2}\phi_3 Bt3=Bt2+t3t2 ϕ3=B0+t1 ϕ1+t2t1 ϕ2+t3t2 ϕ3
  • B t n = B t n − 1 + t n − t n − 1 ϕ n = B 0 + t 1 ϕ 1 + t 2 − t 1 ϕ 2 + . . . + t n − t n − 1 ϕ n B_{t_n} = B_{t_{n-1}} + \sqrt{t_n - t_{n-1}}\phi_n = B_0 + \sqrt{t_1}\phi_1 + \sqrt{t_2 - t_1}\phi_2 +... + \sqrt{t_n - t_{n-1}}\phi_n Btn=Btn1+tntn1 ϕn=B0+t1 ϕ1+t2t1 ϕ2+...+tntn1 ϕn

Hence, we know:
B t n = ∑ i = 1 n ϕ i t i − t i − 1 B_{t_n} = \sum\limits_{i=1}^{n} \phi_i\sqrt{t_i - t_{i-1}} Btn=i=1nϕititi1

## path for diffusion item, assume the drift equal to zero
k = 10
z = np.random.normal(size=k-1) # draw 9 samples from standard normal distribution
t_max = 20. # set T
t = np.arange(0, t_max, t_max/k) # generate time sequence
dt = np.diff(t) # dt1 = t1 - t0; dt2 = t2 - t1; ...
# np.sqrt(dt) * z : the diffusion item
# np.concatenate([[0.0],x]) : Assign 0.0 to the initial value
plt.plot(t, np.concatenate([[0.0], np.cumsum(np.sqrt(dt) * z)]), '+-', 'b')
plt.xlabel('$t$'); plt.ylabel('$B_t$'); plt.show()

1.2 Brownian Motion with Drift in Python

X t = σ ϕ B t + μ t X_t = \sigma \phi B_t + \mu t Xt=σϕBt+μt

  • X t 1 = X 0 + σ ϕ 1 t 1 + μ t 1 X_{t_1} = X_0 + \sigma \phi_1\sqrt{t_1} + \mu t_1 Xt1=X0+σϕ1t1 +μt1
  • X t 2 = X t 1 + σ ϕ 2 t 2 − t 1 + μ t 2 = B 0 + σ ϕ 1 t 1 + σ ϕ 2 t 2 − t 1 + μ t 1 + μ t 2 X_{t_2} = X_{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} + \mu t_2 = B_0 + \sigma \phi_1\sqrt{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} + \mu t_1 + \mu t_2 Xt2=Xt1+σϕ2t2t1 +μt2=B0+σϕ1t1 +σϕ2t2t1 +μt1+μt2
  • X t 3 = X t 2 + σ ϕ 3 t 3 − t 2 + μ t 3 = B 0 + σ ϕ 1 t 1 + σ ϕ 2 t 2 − t 1 + σ ϕ 3 t 3 − t 2 + μ t 1 + μ t 2 + μ t 3 X_{t_3} = X_{t_2} + \sigma \phi_3\sqrt{t_3 - t_2} + \mu t_3 = B_0 + \sigma \phi_1\sqrt{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} + \sigma \phi_3\sqrt{t_3 - t_2} + \mu t_1 + \mu t_2 + \mu t_3 Xt3=Xt2+σϕ3t3t2 +μt3=B0+σϕ1t1 +σϕ2t2t1 +σϕ3t3t2 +μt1+μt2+μt3
  • X t n = X t n − 1 + σ ϕ n t n − t n − 1 + μ t n = B 0 + σ ϕ 1 t 1 + σ ϕ 2 t 2 − t 1 + . . . + σ ϕ n t n − t n − 1 + μ t 1 + μ t 2 + . . . + μ t n X_{t_n} = X_{t_{n-1}} +\sigma \phi_n\sqrt{t_n - t_{n-1}} +\mu t_n = B_0 + \sigma \phi_1\sqrt{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} +...+ \sigma \phi_n\sqrt{t_n - t_{n-1}} + \mu t_1 + \mu t_2 +...+ \mu t_n Xtn=Xtn1+σϕntntn1 +μtn=B0+σϕ1t1 +σϕ2t2t1 +...+σϕntntn1 +μt1+μt2+...+μtn
    X t n = ∑ i = 1 n σ ϕ i t i − t i − 1 + μ ( t i − t i − 1 ) X_{t_n} = \sum\limits_{i=1}^{n}\sigma \phi_i\sqrt{t_i - t_{i-1}} + \mu (t_i - t_{i-1}) Xtn=i=1nσϕititi1 +μ(titi1)
sigma = 0.005; mu = 0.005; k = 100; T = 10.
z = np.random.normal(size=k-1)
t = np.arange(0, T, T/k)
dt = np.diff(t)
plt.plot(t[1:], np.cumsum(sigma*np.sqrt(dt)*z + mu*dt))
plt.xlabel('$t$'); plt.ylabel('$X_t$'); plt.title('$\mu=+0.005$')
plt.show()

1.3 Brownian Motion with Multiple Paths in Python

import numpy as np
import matplotlib.pyplot as plt
from numpy.random import normal

initial_value = 100.0
t_max = 100
n = 10
sigma = 0.005
mu = 0

random_numbers = normal(loc=mu, scale=sigma, size=(t_max,n))  # 每个随机过程占 1 列
multipliers = 1 + random_numbers
values = initial_value * np.cumprod(multipliers,axis=0) # 按列累积(累乘)
values_multiple_initial = np.concatenate((np.matrix([initial_value]*n), values),axis=0) # 加一行初始值(给每列加一个)
plt.xlabel('$t$')
plt.ylabel('$y_t$')
plt.plot(values_multiple_initial)
plt.plot

2 Geometric Brownian Motion

2.1 Simulating Geometric Brownian Motion

The μ \mu μ below is the drift of S (lognormal)
d S = μ S d t + σ S d X dS = \mu Sdt + \sigma S dX dS=μSdt+σSdX

  • S t 1 = S 0 e x p { σ ϕ 1 t 1 + μ t 1 } S_{t_1} = S_0 exp\{ \sigma \phi_1\sqrt{t_1} + \mu t_1\} St1=S0exp{σϕ1t1 +μt1}
  • S t 2 = S t 1 e x p { σ ϕ 2 t 2 − t 1 + μ t 2 } = S 0 e x p { σ ϕ 1 t 1 + σ ϕ 2 t 2 − t 1 + μ t 1 + μ t 2 } S_{t_2} = S_{t_1} exp\{\sigma \phi_2\sqrt{t_2 - t_1} + \mu t_2 \}= S_0 exp\{ \sigma \phi_1\sqrt{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} + \mu t_1 + \mu t_2\} St2=St1exp{σϕ2t2t1 +μt2}=S0exp{σϕ1t1 +σϕ2t2t1 +μt1+μt2}
  • S t 3 = S t 2 e x p { σ ϕ 3 t 3 − t 2 + μ t 3 } = S 0 e x p { σ ϕ 1 t 1 + σ ϕ 2 t 2 − t 1 + σ ϕ 3 t 3 − t 2 + μ t 1 + μ t 2 + μ t 3 } S_{t_3} = S_{t_2} exp \{ \sigma \phi_3\sqrt{t_3 - t_2} + \mu t_3 \}= S_0 exp\{ \sigma \phi_1\sqrt{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} + \sigma \phi_3\sqrt{t_3 - t_2} + \mu t_1 + \mu t_2 + \mu t_3\} St3=St2exp{σϕ3t3t2 +μt3}=S0exp{σϕ1t1 +σϕ2t2t1 +σϕ3t3t2 +μt1+μt2+μt3}
  • S t n = S t n − 1 e x p { σ ϕ n t n − t n − 1 + μ t n } = S 0 e x p { σ ϕ 1 t 1 + σ ϕ 2 t 2 − t 1 + . . . + σ ϕ n t n − t n − 1 + μ t 1 + μ t 2 + . . . + μ t n } S_{t_n} = S_{t_{n-1}} exp\{\sigma \phi_n\sqrt{t_n - t_{n-1}} +\mu t_n \}= S_0 exp\{ \sigma \phi_1\sqrt{t_1} + \sigma \phi_2\sqrt{t_2 - t_1} +...+ \sigma \phi_n\sqrt{t_n - t_{n-1}} + \mu t_1 + \mu t_2 +...+ \mu t_n\} Stn=Stn1exp{σϕntntn1 +μtn}=S0exp{σϕ1t1 +σϕ2t2t1 +...+σϕntntn1 +μt1+μt2+...+μtn}
    S t k = S 0 ∏ i = 1 k e x p { σ ϕ t i − t i − 1 + μ ( t i − t i − 1 ) } S_{t_k} = S_0 \prod\limits_{i=1}^{k}exp\{\sigma \phi \sqrt{t_i-t_{i-1}}+\mu (t_i - t_{i-1})\} Stk=S0i=1kexp{σϕtiti1 +μ(titi1)}
sigma = 0.4 # relevantly small
mu = 0.1; k = 1000; t_max = 12.0; S0 = 100.0
dt = t_max / k
T = np.arange(0, t_max, dt)
z = np.random.normal(size=len(T))
S = S0 * np.cumprod(np.exp(sigma*np.sqrt(dt)*z + mu*dt))
plt.plot(T, S, '+-')
plt.xlabel('$t$'); plt.ylabel('$S_t$'); plt.show()

2.2 GBM with Multiple Paths in Python

The r r r here is the drift of X t X_t Xt(normal)
d X = r d t + σ d B t dX = r dt + \sigma d B_t dX=rdt+σdBt
d S = ( r − 1 2 σ 2 ) S d t + σ ϕ S d X dS = (r - \frac{1}{2}\sigma^2)Sdt + \sigma \phi SdX dS=(r21σ2)Sdt+σϕSdX

def gbm(sigma, r, k, t_max, S0, I=1):
    phi = np.random.normal(size=(k-1, I))  
    dt = t_max/k
    y = sigma * np.sqrt(dt)*phi + (r - sigma**2 / 2.) * dt
    return S0 * np.exp(np.cumsum(y, axis=0))  
sigma = 0.05; r = 0.01; k = 100; t_max = 10.; S0 = 100.
T = np.arange(0, t_max - t_max/k, t_max/k)
ax = plt.plot(T, gbm(sigma, r, k, t_max, S0, I=50))
plt.xlabel('$t$'); plt.ylabel('$S_t$'); plt.show()
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值