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