Some Stochastic Models
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from random import sample
#!pip install mplcyberpunk
#import mplcyberpunk
#plt.style.use("cyberpunk")
set() sns.
class StochasticSimulation:
def __init__(self, steps=100, n_times=1, t=1):
self.steps = steps
self.n_times = n_times
self.dt = t / steps
def SimpleRandomWalk(self, p):
# creating array
= np.zeros( (self.n_times, self.steps+1))
rw # initiate the loop
for j in range(rw.shape[1]-1):
for i in range(rw.shape[0]):
+1] = rw[i][j] + np.random.choice([-1,1], p=[1-p, p])#sample([-1,1], 1)
rw[i][j
= pd.DataFrame(rw)
df return df
def BrownianMotion(self):
# creating array
= np.zeros( (self.n_times, self.steps+1))
bm # initiate the loop
for j in range(bm.shape[1]-1):
for i in range(bm.shape[0]):
+1] = bm[i][j] + np.random.normal(size=1)
bm[i][j
= pd.DataFrame(bm)
df return df
def BrownianBridge(self):
# creating Brownian motion
= np.zeros( (self.n_times, self.steps+1))
bm # initiate the loop
for j in range(bm.shape[1]-1):
for i in range(bm.shape[0]):
+1] = bm[i][j] + np.random.normal(size=1)
bm[i][j# array of Brownian Bridge
= np.zeros( (self.n_times, self.steps+1))
bb # initiate the loop
for j in range(bb.shape[1]-1):
for i in range(bb.shape[0]):
+1] = bm[i][j] + -(j/self.steps)*bm[i][self.steps]
bb[i][j
= pd.DataFrame(bb)
df return df
def BrownianMotionDrift(self, mu, sigma):
# creating array
= np.zeros( (self.n_times, self.steps+1))
bmd # initiate the loop
for j in range(bmd.shape[1]-1):
for i in range(bmd.shape[0]):
+1] = bmd[i][j] + mu*self.dt + sigma*np.sqrt(self.dt)*np.random.normal(size=1)
bmd[i][j
= pd.DataFrame(bmd)
df return df
def GeometricBrownianMotion(self, S0, alpha, beta):
# creating array
= np.zeros( (self.n_times, self.steps+1))
gbm # initiate the loop
for j in range(gbm.shape[1]):
for i in range(gbm.shape[0]):
if(j == 0):
= S0
gbm[i][j] else:
= gbm[i][j-1]*np.exp(np.random.normal(loc=(alpha - (beta**2)/2)*self.dt, scale=np.sqrt(self.dt)*beta, size=1))
gbm[i][j]
= pd.DataFrame(gbm)
df return df
Movimiento Browniano
Definición:
Un proceso estocástico \(\{B(t), t\geq 0\}\) se dice que es un movimoento Browniano si:
1.- \(B(0) = 0\)
2.- \(\{B(t), t\geq 0\}\) tiene incrementos independientes y estacionarios.
3.- Para \(t>0\), B(t) tiene distribución normal con media cero y varianza \(t\).
Movimiento Browniano (1-D)
# simulación
= 10000 # pasos
steps = 100 # trayectorias
n = StochasticSimulation(steps=steps, n_times=n).BrownianMotion()
bm_sim
# gráfico
=(16,7))
plt.figure(figsizefor i in range(bm_sim.shape[0]):
list(bm_sim.columns), bm_sim.iloc[i][:], color='grey')
plt.plot('Brownian Motion Simulation: {} steps and {} paths'.format(steps, n))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Movimiento Browniano (2-D)
# Brownian Bridge
=(16,10))
plt.figure(figsizefor i in range(bm_sim.shape[0]):
0][:], bm_sim.iloc[1][:], color='blue', linewidth=0.4)
plt.plot(bm_sim.iloc[0][:], bm_sim.iloc[1][:], 'o', color='black', markersize=0.4)
plt.plot(bm_sim.iloc['Brownian Motion Simulation: {} steps'.format(steps))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Puente Browniano
Definición:
Un procesos estocástico \(\{X(t)= B(t) - \frac{t}{T} B(T) , 0 \leq t \leq T \}\), es un puente Browniano si satisface las siguientes propiedades:
1.- \(X(0)=X(T)=0\)
2.- \(X(t)\) se distribuye como una normal con media cero y varianza \(t(1-t/T)\)
\[E(X(t)) = 0\], y \[Var(X(t)) = t(1-t/T)\]
3.- \(Cov(X(s), X(t)) = min(s, t) - \frac{st}{T}\)
Puente Browniano (1-D)
# simulación
= 100000 # número de pasos
steps = 100 # número de trayectorias
n = StochasticSimulation(steps=steps, n_times=n).BrownianBridge()
bm_sim
# gráfico
=(16,7))
plt.figure(figsizefor i in range(bm_sim.shape[0]):
list(bm_sim.columns), bm_sim.iloc[i][:], color='grey')
plt.plot('Brownian Bridge Simulation: {} steps and {} paths'.format(steps, n))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Puente Browniano (2-D)
# Brownian Bridge
=(16,10))
plt.figure(figsizefor i in range(bm_sim.shape[0]):
0][:], bm_sim.iloc[1][:], color='blue', linewidth=0.4)
plt.plot(bm_sim.iloc[0][:], bm_sim.iloc[1][:], 'o', color='black', markersize=0.4)
plt.plot(bm_sim.iloc['Brownian Bridge Simulation: {} steps'.format(steps))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Caminata aleatoria simple
Definición:
La caminata aleatoria en \(\mathbb{Z}\), es la más simple de todas, de ahí su nombre. \(X_i\) toma valores en \(\{−1,1\}\), y la caminata comienza en \(S_n = 0\) y está definida para valores enteros. Las probabilidades de ir a la derecha o a la izquierda se denotan como \(P(X_i=1)\) y \(P(X_i=-1)\), respectivamente, con las siguientes probabilidades para el caso de una caminata aleatoria simétrica:
\[\begin{equation*} P(X_i=1)=P(X_i=−1)=1/2 \end{equation*}\]
Considerando el caso más general, se tiene que el caminante puede ir a la derecha con probabilidad \(p\), y a la izquierda con probabilidad \(1-p\)
\[\begin{equation*} P(X_i=1)=p \ \text{ y } \ P(X_i=−1)=1−p \end{equation*}\]
Caminata aleatoria simple (1-D)
# simulación
= 100000 # número de pasos
steps = 100 # número de trayectorias
n = StochasticSimulation(steps=steps, n_times=n).SimpleRandomWalk(p=0.5)
bm_sim
# gráfico
=(16,7))
plt.figure(figsizefor i in range(bm_sim.shape[0]):
list(bm_sim.columns), bm_sim.iloc[i][:], color='grey')
plt.plot('Brownian Bridge Simulation: {} steps and {} paths'.format(steps, n))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Caminata aleatoria simple (2-D)
# Brownian Bridge
=(16,10))
plt.figure(figsizefor i in range(bm_sim.shape[0]):
0][:], bm_sim.iloc[1][:], color='blue', linewidth=0.4)
plt.plot(bm_sim.iloc[0][:], bm_sim.iloc[1][:], 'o', color='black', markersize=0.4)
plt.plot(bm_sim.iloc['Simple Random Walk Simulation: {} steps'.format(steps))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Movimiento Browniano con deriva y volatilidad
Definición:
Sea \(\{B(t), t \geq 0\}\) un movimiento Browniano estándar. El procesos estocástico \(\{X(t)= \mu t + \sigma B(t), t \geq 0\}\) recibe el nombre de movimiento Browniano con coeficiente de deriva (drift) \(\mu\), y coeficiente de volatilidad (o difusión) \(\sigma\).
Poposición:
La distribucuión de \(X(t)\) es normal con media \(\mu t\), y varianza \(\sigma^2 t\). Y la covarianza entre \(X(s)\) y \(X(t)\) es \[Cov(X(s), X(t)) = \sigma^2 min(s, t)\].
Movimiento Browniano con coeficiente de deriva y volatilidad (1-D)
# simulación
= 100000 # pasos
steps = 100 # trayectorias
n = StochasticSimulation(steps=steps,n_times=n).BrownianMotionDrift(mu=1.4, sigma=0.8)
bmd_sim
# gráfico
=(16,7))
plt.figure(figsizefor i in range(bmd_sim.shape[0]):
list(bmd_sim.columns), bmd_sim.iloc[i][:], color='grey', linewidth=0.4)
plt.plot('Brownian motion with drift and volatility Simulation: {} steps and {} paths'.format(steps, n))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Movimiento Browniano con coeficiente de deriva y volatilidad (2-D)
# Brownian motion with drift and volatility
=(14,10))
plt.figure(figsizefor i in range(bmd_sim.shape[0]):
0][:], bmd_sim.iloc[1][:], color='black', linewidth=0.4)
plt.plot(bmd_sim.iloc[0][:], bmd_sim.iloc[1][:], 'o', color='blue', markersize=0.4)
plt.plot(bmd_sim.iloc['Brownian motion with drift and volatility Simulation: {} steps'.format(steps))
plt.title('Time')
plt.xlabel( plt.show()
Movimiento Browniano Geométrico
Definición:
Sea \(\{W(t), t\geq 0\}\) es un movimiento Browniano estándar (Proceso de Wiener), el proceso estocástico \(\{S(t)= S(0) \exp\{(\mu t - \sigma^2/2)t + \sigma W(t)\}, S(0)=S_0, t\geq 0\}\) es un movimiento Browniano geométrico con valor esperado y varianza:
\[\begin{eqnarray} E[S(t)] & = & S(0) e^{\mu t}, \ \ y \\ Var(S(t)) & = & S(0)^2 \left(e^{2\mu t}\right) \left(e^{\sigma^2 t} -1 \right) \end{eqnarray}\]
Movimiento Browniano Geométrico (1-D)
# simulation
= 100000 # número de pasos
steps = 100 # número de trayectorias
n = 7.1
S0 =0.3
alpha=0.08
beta= StochasticSimulation(steps=steps, n_times=n).GeometricBrownianMotion(S0=S0, alpha=alpha, beta=beta)
gbm_sim
# Geometric Brownian motion
=(16,7))
plt.figure(figsizefor i in range(gbm_sim.shape[0]):
list(gbm_sim.columns), gbm_sim.iloc[i][:], color='grey')
plt.plot('Geometric Brownian Motion Simulation: {} steps and {} paths'.format(steps, n))
plt.title('Time')
plt.xlabel(#mplcyberpunk.add_glow_effects()
plt.show()
Movimiento Browniano Geométrico (2-D)
# Geometric Brownian Motion
=(14,10))
plt.figure(figsizefor i in range(gbm_sim.shape[0]):
0][:], gbm_sim.iloc[1][:], color='black', linewidth=0.4)
plt.plot(gbm_sim.iloc[0][:], gbm_sim.iloc[1][:], 'o', color='blue', markersize=0.4)
plt.plot(gbm_sim.iloc['Geometric Brownian motion Simulation: {} steps'.format(steps))
plt.title('Time')
plt.xlabel( plt.show()