Simulación de cobertura con opciones

Importar datos.

datos = read.csv("TRM diaria febrero 2020.csv", sep = ";", dec = ",")
head(datos)
A data.frame: 6 × 2
FechaTRM
<fct><dbl>
120/04/20182724.47
223/04/20182757.96
324/04/20182799.45
425/04/20182785.22
526/04/20182820.29
627/04/20182812.83

Vector de precios.

precios = datos[,2]
precios = ts(precios)

Rendimientos continuos

rendimientos = diff(log(precios))

Gráfico de los precios

plot(precios, main = "Precio", lwd = 3)
../../../_images/output_9_0.png

Gráfico de los rendimientos

plot(rendimientos, main = "Rendimientos", t = "h")
../../../_images/output_11_01.png

\(S_0:\)

s = tail(precios,1)
s = as.numeric(s)
s
3401.56

\(\mu:\) Rendimiento esperado

mu = mean(rendimientos) #diario
mu
0.000504455082133001

\(\sigma:\)Volatilidad

volatilidad = sd(rendimientos) #diaria
volatilidad
0.00641517094088037

Estrategias de cobertura con opciones financieras

Call

Call

Spread Comprador

Spread Comprador

Put

Put

Spread Vendedor

Spread Vendedor

Valoración de una opción europea sobre divisas con vencimiento a un mes.

Estrategias de cobertura para compradores:

  • Call:

\[PrecioCobertura = |-S_T + máx[S_T - K_1,0] - primaCall_1|\]
  • Spread:

\[PrecioCobertura = |-S_T + máx[S_T - K_1,0] - primaCall_1 + mín[K_2 - S_T,0] + primaCall_2|\]

Estrategias de cobertura para vendedores:

  • Put:

\[PrecioCobertura = S_T + máx[K_1 - S_T,0] - primaPut_1\]
  • Spread:

\[PrecioCobertura = S_T + mín[S_T - K_1,0] + primaPut_1 + máx[K_2 - S_T,0] - primaPut_2\]

\(K_1 = 3.400\).

\(K_2 = 3.450\).

k1 = 3400
k2 = 3450
# Tasas libres de riesgo

r = 0.018 # E.A. (Colombia)

rf = 0.003 # Nominal (USA)

# Con el modelo Black-Scholes se trabaja con tasas continuas:

r = log(1+r) # C.C.A.

rf = log(1+rf/12)*12 # C.C.A.
T = 30 # 1 mes
dt = 1 # saltos diarios
iteraciones = 10000
set.seed(1) # Valor semilla para la simulación. Con esto siempre se obtendrá el mismo valor.
# Simulación del precio del activo subyacente con un mundo neutral al riesgo

st_prima = matrix(, iteraciones, T+1)

st_prima[,1] = s

for(i in 1:iteraciones){

    for(j in 2:(T+1)){

   st_prima[i,j] = st_prima[i,j-1]*exp((r/360-rf/360-volatilidad^2/2)*dt+volatilidad*sqrt(dt)*rnorm(1))

   }
}
compensacionesCall1 = vector()
compensacionesCall2 = vector()
compensacionesPut1 = vector()
compensacionesPut2 = vector()

for(i in 1:iteraciones){

    compensacionesCall1[i] = max(st_prima[i,T+1]-k1,0)*exp(-(r-rf)*1/12)
    compensacionesCall2[i] = max(st_prima[i,T+1]-k2,0)*exp(-(r-rf)*1/12)

    compensacionesPut1[i] = max(k1-st_prima[i,T+1],0)*exp(-(r-rf)*1/12)
    compensacionesPut2[i] = max(k2-st_prima[i,T+1],0)*exp(-(r-rf)*1/12)
}
primaCall1 = mean(compensacionesCall1)
primaCall1
50.0354164730773
primaCall2 = mean(compensacionesCall2)
primaCall2
28.6308069043686
primaPut1 = mean(compensacionesPut1)
primaPut1
44.570561858486
primaPut2 = mean(compensacionesPut2)
primaPut2
73.1041559547008

Simulación de coberturas con opciones europeas

# Simulación del precio del activo subyacente con riesgo, se utiliza el rendimiento esperado.

st = matrix(, iteraciones, T+1)

st[,1] = s

for(i in 1:iteraciones){

    for(j in 2:(T+1)){

   st[i,j] = st[i,j-1]*exp((mu-volatilidad^2/2)*dt+volatilidad*sqrt(dt)*rnorm(1))

   }
}
# Precios con cobertura.

coberturaCall = vector()
coberturaPut = vector()
coberturaSpreadComprador = vector()
coberturaSpreadVendedor = vector()

for(i in 1:iteraciones){

   coberturaCall[i] = abs(-st[i,T+1]+max(st[i,T+1]-k1,0)-primaCall1)

   coberturaPut[i] = st[i,T+1]+max(k1-st[i,T+1],0)-primaPut1

   coberturaSpreadComprador[i] = abs(-st[i,T+1]+max(st[i,T+1]-k1,0)+min(k2-st[i,T+1],0))

   coberturaSpreadVendedor[i] = st[i,T+1]+min(st[i,T+1]-k1,0)+max(k2-st[i,T+1],0)

}
resultados = data.frame(st[,T+1], coberturaCall, coberturaSpreadComprador, coberturaPut, coberturaSpreadVendedor)
colnames(resultados) = c("Sin cobertura", "Cobertura Call", "Cobertura Spread Comprador", "Cobertura Put", "Cobertura Spread Vendedor")
head(resultados)
A data.frame: 6 × 5
Sin coberturaCobertura CallCobertura Spread CompradorCobertura PutCobertura Spread Vendedor
<dbl><dbl><dbl><dbl><dbl>
13530.1933450.0353480.1933485.6223530.193
23439.4833450.0353400.0003394.9123450.000
33552.6633450.0353502.6633508.0923552.663
43581.8643450.0353531.8643537.2933581.864
53564.2433450.0353514.2433519.6723564.243
63777.6313450.0353727.6313733.0603777.631

Gráficos con ggplot2

Instalar la librería: install.packages("tidyverse")

library(ggplot2)

1. Escenario sin cobertura: \(S_T\)

Valor esperado

mean(resultados[,"Sin cobertura"])
3452.98946373105

Percentil del 5% y 95%

quantile(resultados[,"Sin cobertura"], c(0.05, 0.95))
5%
3259.0653544565
95%
3653.75953422285

Desviación estándar

sd(resultados[,"Sin cobertura"])
121.118584544262
ggplot(data = resultados, aes(resultados[,"Sin cobertura"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Sin cobertura"], c(0.05, 0.95)), colour="black", size=1.5)+
  labs(title = "Escenario sin cobertura", x = "Precio")
../../../_images/output_52_0.png

2. Escenario con cobertura: Call

Valor esperado

mean(resultados[,"Cobertura Call"])
3423.96108935102

Percentil del 5% y 95%

quantile(resultados[,"Cobertura Call"], c(0.05, 0.95))
5%
3309.10077092958
95%
3450.03541647308

Desviación estándar

sd(resultados[,"Cobertura Call"])
51.6029775705823
ggplot(data = resultados, aes(resultados[,"Cobertura Call"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Call"], c(0.05, 0.95)), colour="darkgreen", size=1.5)+
  labs(title = "Escenario cobertura Call", x = "Precio")
../../../_images/output_60_0.png

3. Escenario con cobertura: Spread Comprador

Valor esperado

mean(resultados[,"Cobertura Spread Comprador"])
3423.54774036469

Percentil del 5% y 95%

quantile(resultados[,"Cobertura Spread Comprador"], c(0.05, 0.95))
5%
3259.0653544565
95%
3603.75953422285

Desviación estándar

sd(resultados[,"Cobertura Spread Comprador"])
102.746807530895
ggplot(data = resultados, aes(resultados[,"Cobertura Spread Comprador"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Spread Comprador"], c(0.05, 0.95)), colour="darkblue", size=1.5)+
  labs(title = "Escenario cobertura Spread Comprador", x = "Precio")
../../../_images/output_68_0.png

Sin cobertura, cobertura Call y cobertura Spread Comprador

ggplot(data = resultados, aes(resultados[,"Sin cobertura"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Sin cobertura"], c(0.05, 0.95)), colour="black", size=1.5)+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Call"],c(0.05, 0.95)), colour="darkgreen", size=1.5)+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Spread Comprador"],c(0.05, 0.95)), colour="darkblue", size=1.5)+
  labs(x = "Precio")
../../../_images/output_70_0.png

4. Escenario con cobertura: Put

Valor esperado

mean(resultados[,"Cobertura Put"])
3434.49322899461

Percentil del 5% y 95%

quantile(resultados[,"Cobertura Put"], c(0.05, 0.95))
5%
3355.42943814151
95%
3609.18897236437

Desviación estándar

sd(resultados[,"Cobertura Put"])
88.788296453783
ggplot(data = resultados, aes(resultados[,"Cobertura Put"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Put"], c(0.05, 0.95)), colour="darkgreen", size=1.5)+
  labs(title = "Escenario cobertura Put", x = "Precio")
../../../_images/output_78_0.png

5. Escenario con cobertura: Spread Vendedor

Valor esperado

mean(resultados[,"Cobertura Spread Vendedor"])
3473.54774036469

Percentil del 5% y 95%

quantile(resultados[,"Cobertura Spread Vendedor"], c(0.05, 0.95))
5%
3309.0653544565
95%
3653.75953422285

Desviación estándar

sd(resultados[,"Cobertura Spread Vendedor"])
102.746807530895
ggplot(data = resultados, aes(resultados[,"Cobertura Spread Vendedor"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Spread Vendedor"], c(0.05, 0.95)), colour="darkblue", size=1.5)+
  labs(title = "Escenario cobertura Spread Vendedor", x = "Precio")
../../../_images/output_86_0.png

Sin cobertura, cobertura Put y cobertura Spread Vendedor

ggplot(data = resultados, aes(resultados[,"Sin cobertura"]))+
  geom_histogram(aes(y=..density..),binwidth = 50, colour = "darkgray", fill = "darkgray")+
  geom_vline(xintercept = quantile(resultados[,"Sin cobertura"], c(0.05, 0.95)), colour="black", size=1.5)+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Put"], c(0.05, 0.95)), colour="darkgreen", size=1.5)+
  geom_vline(xintercept = quantile(resultados[,"Cobertura Spread Vendedor"], c(0.05, 0.95)), colour="darkblue", size=1.5)+
  labs(x = "Precio")
../../../_images/output_88_0.png

Sin cobertura, cobertura Call y cobertura Spread Comprador

ggplot(resultados, aes(resultados[,"Sin cobertura"])) + geom_histogram(binwidth = 50, alpha = 0.5, colour = "darkgray", fill = "darkgray")+
  geom_histogram(aes(resultados[,"Cobertura Call"]), alpha = 0.3, binwidth = 50, colour = "darkgreen", fill = "darkgreen")+
  geom_histogram(aes(resultados[,"Cobertura Spread Comprador"]), alpha = 0.3, binwidth = 50, colour = "darkblue", fill = "darkblue")+
  labs(title = "Histogramas", x = "Precio", y = "Frecuencia")
../../../_images/output_90_0.png

Sin cobertura, cobertura Put y cobertura Spread Vendedor

ggplot(resultados, aes(resultados[,"Sin cobertura"])) + geom_histogram(binwidth = 50, alpha = 0.5, colour = "darkgray", fill = "darkgray")+
  geom_histogram(aes(resultados[,"Cobertura Put"]), alpha = 0.3, binwidth = 50, colour = "darkgreen", fill = "darkgreen")+
  geom_histogram(aes(resultados[,"Cobertura Spread Vendedor"]), alpha = 0.3, binwidth = 50, colour = "darkblue", fill = "darkblue")+
  labs(title = "Histogramas", x = "Precio", y = "Frecuencia")
../../../_images/output_92_0.png