文章目录
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)
- 正态分布随机数: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+t2−t1ϕ2=B0+t1ϕ1+t2−t1ϕ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+t3−t2ϕ3=B0+t1ϕ1+t2−t1ϕ2+t3−t2ϕ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=Btn−1+tn−tn−1ϕn=B0+t1ϕ1+t2−t1ϕ2+...+tn−tn−1ϕ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=1∑nϕiti−ti−1
## 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()
![](https://i-blog.csdnimg.cn/blog_migrate/52234e8078c1f547a672986f5bf7272a.png)
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+σϕ2t2−t1+μt2=B0+σϕ1t1+σϕ2t2−t1+μ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+σϕ3t3−t2+μt3=B0+σϕ1t1+σϕ2t2−t1+σϕ3t3−t2+μ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=Xtn−1+σϕntn−tn−1+μtn=B0+σϕ1t1+σϕ2t2−t1+...+σϕntn−tn−1+μ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=1∑nσϕiti−ti−1+μ(ti−ti−1)
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()
![](https://i-blog.csdnimg.cn/blog_migrate/12badcbc0cda153e274ea62cc1f8edaf.png)
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
![](https://i-blog.csdnimg.cn/blog_migrate/18e4d98086ee3c2c438f47ee63b22920.png)
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{σϕ2t2−t1+μt2}=S0exp{σϕ1t1+σϕ2t2−t1+μ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{σϕ3t3−t2+μt3}=S0exp{σϕ1t1+σϕ2t2−t1+σϕ3t3−t2+μ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=Stn−1exp{σϕntn−tn−1+μtn}=S0exp{σϕ1t1+σϕ2t2−t1+...+σϕntn−tn−1+μ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=1∏kexp{σϕti−ti−1+μ(ti−ti−1)}
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()
![](https://i-blog.csdnimg.cn/blog_migrate/17759c73e6b5e75cfc60f68912475a78.png)
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=(r−21σ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()
![](https://i-blog.csdnimg.cn/blog_migrate/423e02bedad0a6309c477dd26fd65488.png)