Los conceptos pueden verse en el libro “Introducción al riesgo financiero” que puede obtenerse en:
https://1drv.ms/b/s!Aj-hHTVbsx01h4JmNiA9O57JQuANWg?e=l4IFbm
Con el método de Montecarlo también es posible simular el precio de una opción.
Suponer que el proceso que sigue el activo subyacente en el mercado es de la forma:
\(dS=\mu S dt+\sigma S dz\)
Donde \(S\) es el precio del subyacente en el mercado; \(dz\) es un proceso Weiner; \(\mu\) es el rendimiento esperado y \(\sigma\) es la volatilidad.
Para simular la ruta seguida por \(S\) se puede dividir la vida de la opción en \(n\) pequeños intervalos de longitud \(\Delta t\) y aproximar la anterior ecuación mediante:
\(S(t+\Delta t)-S(t)=\mu S(t) \Delta t +\sigma S(t) \varepsilon \sqrt{\Delta t}\)
Donde \(S(t)\) es el valor de \(S\) en el tiempo \(t\), \(\varepsilon\) es una variable aleatoria con distribución normal estándar. Esto permite que el valor de \(S\) en el tiempo \(\Delta t\) pueda ser calculado a partir de un valor inicial de \(S\), el valor en el tiempo \(2 \Delta t\) puede ser calculado a partir del valor en el tiempo \(\Delta t\), y así sucesivamente. En la práctica, por lo general, se suele simular el \(ln\,S\) en lugar de \(S\). El proceso seguido por el \(ln\,S\) es:
\(d ln S=( \mu-\frac{\sigma^{2}}{2})dt + \sigma dz\)
De la cual se obtiene que:
\(ln\,S(t+\Delta t)-ln\,S(t) =(\mu -\frac{\sigma^{2}}{2} )\Delta t +\sigma \varepsilon \sqrt{\Delta t}\)
o en forma equivalente:
\(S (t+\Delta t )=S(t) e^ {[ ( \mu -\frac{\sigma ^{2}}{2}) \Delta t+\sigma \varepsilon \sqrt{\Delta t} ] }\)
Esta ecuación puede utilizarse para construir la trayectoria de \(S\).
En la práctica puede utilizarse: \[\begin{equation*} S_{t+1}=S_{t}\,e^{[ ( r-\frac{\sigma^{2}}{2})\Delta t +\sigma \varepsilon_{t}\sqrt{\Delta t}\,] } \end{equation*}\]
Donde:
\(S_{t}\) es el precio de mercado del subyacente en el periodo \(t\).
\(r\) es la tasa libre de riesgo compuesta continuamente.
\(\sigma^{2}\) es la varianza del precio del subyacente.
\(t\) el número de periodos a simular.
\(\Delta t=\frac{1}{t}\)
La simulación anterior permite estimar el valor intrínseco de la opción call para cada escenario, mediante:
\(VI=e^{-r\Delta t}máx(S-K,0)\)
Donde \(K\) es el precio de ejercicio de la opción call.
La media aritmética de los valores obtenidos para el valor intrínseco es el valor de la opción call.
Para una sola simulación, se tiene:
k=5100; r=0.07; sigma=0.20; t=250; dt=1/t
s.1=5000; vi.1=exp(-r*dt)*max(s.1-k,0)
S=rep(s.1,t); VI=rep(0,t); VI[1]=vi.1; precio=0
plot(c(1,t),c(s.1-2000,s.1+2000),col="white",ylab="S",xlab="Días",main="Simulación")
abline(h=s.1,lty=2); text(0,k,"k",pos=2,col="red")
# número de simulaciones.
n=1
for(j in 1:n)
{
E=rnorm(t,0,1)
for(i in 2:t)
{
S[i]=S[i-1]*(exp((r-sigma^2/2)*dt)+(sqrt(sigma^2*dt)*E[i-1]))
VI[i]=exp(-r*dt)*max(S[i]-k,0)
}
lines(S,col=j+1)
precio[j]=mean(VI)
}
B=cbind(E,VI,S)
head(B)
## E VI S
## [1,] -0.6018914 0 5000.000
## [2,] -0.4911866 0 4962.933
## [3,] -1.1134645 0 4933.091
## [4,] -1.0982316 0 4864.598
## [5,] 0.5108019 0 4797.994
## [6,] 3.3037911 0 4829.954
print("El precio de la opción sería:"); precio
## [1] "El precio de la opción sería:"
## [1] 497.2874
Para 20 simulaciones
k=5100; r=0.07; sigma=0.20; t=250; dt=1/t
s.1=5000; vi.1=exp(-r*dt)*max(s.1-k,0)
S=rep(s.1,t); VI=rep(0,t); VI[1]=vi.1; precio=0
plot(c(1,t),c(s.1-2000,s.1+2000),col="white",ylab="S",xlab="Días",main="Simulación")
abline(h=s.1,lty=2); text(0,k,"k",pos=2,col="red")
# número de simulaciones.
n=20
for(j in 1:n)
{
E=rnorm(t,0,1)
for(i in 2:t)
{
S[i]=S[i-1]*(exp((r-sigma^2/2)*dt)+(sqrt(sigma^2*dt)*E[i-1]))
VI[i]=exp(-r*dt)*max(S[i]-k,0)
}
lines(S,col=j+1)
precio[j]=mean(VI)
}
print("Los precios serían:"); precio
## [1] "Los precios serían:"
## [1] 134.54669 519.84277 0.00000 0.00000 282.40146 1027.14650
## [7] 96.88007 522.68244 149.63329 514.40892 262.79951 682.23672
## [13] 301.20715 137.07687 144.52901 117.33927 0.00000 577.61671
## [19] 1758.46342 172.31633
A=cbind(E,VI,S)
head(A)
## E VI S
## [1,] 0.8546767 0 5000.000
## [2,] -0.4828965 0 5055.055
## [3,] -1.0171186 0 5025.188
## [4,] 0.8952083 0 4961.541
## [5,] -0.1092095 0 5018.716
## [6,] -0.2236201 0 5012.787
call=mean(VI)
print("El precio de la opción sería:");call
## [1] "El precio de la opción sería:"
## [1] 172.3163