Informe de estrategia de cobertura del riesgo de tasa de cambio USDCOP a través de contratos Forward para cubrir los pagos de un crédito en Dólares.

1 Contexto del problema:

La empresa AAA adqurió un crédito en Dolares el cual fue desembolsado el 30 de noviembre de 2015.

La información facial del crédito es la siguiente:

La modalidad del crédito es de abono constante a capital.

Se debe Proponer una estrategia de cobertura para los 6 primeros pagos de cuotas.

Fecha Cuota USD
dic-30-2015 175.000
ene-30-2016 170.313
feb-30-2016 165.625
mar-30-2016 160.937
mar-30-2016 156.250
mar-30-2016 151.562

La tasa de cambio actual es de 3101.10.

Por Politica, la compañia cubre el 80% del monto total de sus flujos expuestos a riesgo cambiario.

El intermediario financiero IF le ofrece contratos Forward con un precio de entrega de 3000 COP por USD, los cuales serán liquidados financieramente entregando o recibiendo la diferencia entre el valor de la TRM para del dia de vencimiento de cada contrato, con el precio de entrega.

En este informe se presenta la proyección y análisis de una estrategia de cobertura basada en los contratos Forward ofertados por El intermediario financiero IF, teniendo en cuenta las politicas de cobertura de la compañia.

2 Análisis de la TRM.

Se tiene una base de datos del valor de la TRM con frecuencia diaria desde 27/11/1991 hasta la fecha

Datos_TRM<-read.csv(file = "TRM.csv", header = TRUE)


# Convertir a formato de fecha la columna "Fecha"

Datos_TRM[,"Fecha"]<-as.Date(Datos_TRM[,"Fecha"],format = "%d/%m/%Y")

3 Muestra

Se extrae una muestra de la base de datos desde 2008-01-01 hasta 2015-11-30, dado que en esta fecha se observa un cambio de estructura en la serie, ocasionado por la crisis financiera que comenzó en 2008.

Inicio_muestra=which(Datos_TRM[,1]=="2008-01-01")
Fin_muestra=which(Datos_TRM[,1]=="2015-11-30")


TRM_2008_2015=Datos_TRM[Inicio_muestra :Fin_muestra,]

library(plotly)
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot_ly(TRM_2008_2015, x = ~Fecha, y=~TRM, type = "scatter" ,mode="line" )
## Warning in arrange_impl(.data, dots): '.Random.seed' is not an integer
## vector but of type 'NULL', so ignored
## A line object has been specified, but lines is not in the mode
## Adding lines to the mode...
Rtos_TRM=diff(log(TRM_2008_2015[,"TRM"]))



plot_ly(TRM_2008_2015, x=~TRM_2008_2015[-1,"Fecha"],y=~diff(log(TRM_2008_2015[,"TRM"])), type = "scatter", mode="line")
## A line object has been specified, but lines is not in the mode
## Adding lines to the mode...
summary(Rtos_TRM)
##       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
## -0.0562200 -0.0014800  0.0000000  0.0001492  0.0016680  0.0480500
sd(Rtos_TRM)
## [1] 0.006477308
hist(Rtos_TRM, breaks = 50, col = "gray", main = "histograma de rendimientos", freq = FALSE, xlim = c(-0.02,0.02))
curve(dnorm(x,mean=mean(Rtos_TRM),sd=sd(Rtos_TRM)),-0.02,0.02,add = T,col="blue")

Se observa que en el 2009 la tasa de cambio presenta una fuerte caida de aproximadamente el 30% de febrero a octubre pasando de 2588 a 1830. Para el periodo comprendido entre finales del 2009 y finales del 2014, la TRM presenta un comportamiento relativamente estable. Desde finales de 2014 a finales de agosto de 2015, la TRM presenta una fuerte tendendia alcista alcanzando un maximo de 3238 en agosto de 2015.

4 Proyección de la TRM.

Para la proyección de la TRM se utiliza simulación de montecarlo a través de un proceso de Wiwiner generalizado, conocido como Modelo Browniano geometrico el cual se presenta a continuación:

\({\Delta}TRM_t=TRM_{t-1}*{\mu}*{\Delta}t +TRM_{t-1}*\sigma*{\Delta}w\)

Donde:

\({\Delta}TRM_t=TRM_t-TRM_{t-1}\) Representa el cambio de la TRM en un intervalo de tiempo \({\Delta}t\) entre \(t\) y \(t-1\).
\({\mu}\) Es el valor Esperado de la tasa de crecimiento anual continuo de la TRM.

\({\sigma}\) Es la volatilidad anual de los rendimientos de la TRM.

\({\Delta}w\) Es el cambio de un proceso de Wieiner simple entre el momento \(t\) y \(t-1\)

\({\Delta}w={\epsilon}_t*\sqrt{{\Delta}t}\)

\({\epsilon}_t \sim N(0,1),\) \(cov({\epsilon}_i,{\epsilon}_j)=0\) \(\forall i \neq j\)

4.1 Estimación de parámetros

Se estima \({\mu}\) como el rendimiento promedio de la muestra seleccionada y \({\sigma}\) se calcula como la volatilidad historica. Para anualización de los parámetros, se asume que la divisa se negocia 250 dias al año.

Mu=mean(Rtos_TRM)*250

print(Mu)
## [1] 0.03730595
Sigma=sd(Rtos_TRM)*sqrt(250)
print(Sigma)
## [1] 0.1024152

El crecimiento anual esperado es de 3.7% y la volatilidad anual es del 10% anual.

5 Simulación de Montecarlo

Se realiza una simulación de Montecarlo. Se realizan 10.000 iteraciones a través del modelo Browniano geometrico y los parámetros estimados.

5.1 Simulación de Montecarlo de la TRM

TRM_30_Nov_15=Datos_TRM[Fin_muestra,2] 
dt=1/12
Numero_periodos=7
Numero_iteraciones=10000
TRM=matrix(0,Numero_periodos,Numero_iteraciones)
TRM[1,]=TRM_30_Nov_15

for(j in 1:Numero_iteraciones){
  for(i in 2:Numero_periodos){
    Cambio_TRM=TRM[i-1,j]*(Mu*dt+Sigma*rnorm(1)*sqrt(dt))
    TRM[i,j]=TRM[i-1,j]+Cambio_TRM
  }
}

matplot(TRM, type="l" ,col="deepskyblue")

5.2 Simulación de Montecarlo del Flujo de caja total esperado para cada cuota sin cobertura

Dada la proyección de la TRM, se hace una estimación del valor de las cuotas en COP para cada periodo.

Cuotas_USD=c(175000,170313,165625,160937,156250,151562)

Cuotas_COP=TRM[2,]*Cuotas_USD[1]

for(j in 2:length(Cuotas_USD)){
Cuotas_COP=rbind(Cuotas_COP,TRM[j+1,]*Cuotas_USD[j])
}

media_cuotas=vector()
volatilidad_cuotas=vector()
percentil_5_cuotas=vector()
percentil_95_cuotas=vector()

for(l in 1:6){
media_cuotas[l]=mean(TRM[l+1,]*Cuotas_USD[l])
volatilidad_cuotas[l]=sd(TRM[l+1,]*Cuotas_USD[l])
percentil_5_cuotas[l]=quantile(TRM[l+1,]*Cuotas_USD[l],0.05)
percentil_95_cuotas[l]=quantile(TRM[l+1,]*Cuotas_USD[l],0.95)
}

matplot(Cuotas_COP,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas, type = "l")
lines(percentil_95_cuotas, type = "l")
lines(media_cuotas, type = "l")

print("Volatilidad de cada cuota  en millones de COP")
## [1] "Volatilidad de cada cuota  en millones de COP"
print(volatilidad_cuotas/1000000)
## [1] 16.13011 22.18975 26.48382 29.98934 32.67192 34.96101

5.3 Simulación de Montecarlo de los pagos de cuotas con cobertura

Dado que quien tiene una deuda en USD tiene una posición corta en la tasa de cambio, se debe de tomar una posición larga en los contratos Forward para hacer la cobertura.

proporcion_cobertura=0.8
Precio_Entrega=3000

Utilidad_POR_USD=TRM[-1,]-Precio_Entrega


matplot(Utilidad_POR_USD,type="l", col="gray")

Utilidad_total=Utilidad_POR_USD[1,]*Cuotas_USD[1]*0.8

for(j in 2:length(Cuotas_USD)){
Utilidad_total=rbind(Utilidad_total,Utilidad_POR_USD[j,]*Cuotas_USD[j]*0.8)
}

matplot(Utilidad_total,type="l", col = "lightblue")

Cuotas_COP_CON_C=Cuotas_COP-Utilidad_total

media_cuotas_COP_CON_C=vector()
volatilidad_cuotas_COP_CON_C=vector()
percentil_5_cuotas_COP_CON_C=vector()
percentil_95_cuotas_COP_CON_C=vector()

for(l in 1:6){
media_cuotas_COP_CON_C[l]=mean(Cuotas_COP_CON_C[l,])
volatilidad_cuotas_COP_CON_C[l]=sd(Cuotas_COP_CON_C[l,])
percentil_5_cuotas_COP_CON_C[l]=quantile(Cuotas_COP_CON_C[l,],0.05)
percentil_95_cuotas_COP_CON_C[l]=quantile(Cuotas_COP_CON_C[l,],0.95)
}

matplot(Cuotas_COP_CON_C,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas_COP_CON_C, type = "l")
lines(percentil_95_cuotas_COP_CON_C, type = "l")
lines(media_cuotas_COP_CON_C, type = "l")

print("Volatilidad de cada cuota con cobertura  en millones de COP")
## [1] "Volatilidad de cada cuota con cobertura  en millones de COP"
print(volatilidad_cuotas_COP_CON_C/1000000)
## [1] 3.226023 4.437949 5.296764 5.997868 6.534385 6.992201

6 Resultados

En esta sección se presentan los resultados observados de la cobertura

6.1 Valor real observado del pago de cuotas en COP

Fechas_pago=c("2015-12-30","2016-01-30","2016-02-28","2016-03-30","2016-04-30","2016-05-30")

TRM_OBSERVADA=vector()
for(j in 1:6){TRM_OBSERVADA[j]=Datos_TRM[which(Datos_TRM[,1]==Fechas_pago[j]),2]}

Cuota_Real_COP=TRM_OBSERVADA*Cuotas_USD


matplot(Cuotas_COP,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas, type = "l")
lines(percentil_95_cuotas, type = "l")
lines(media_cuotas, type = "l")
lines(Cuota_Real_COP, type = "l",lwd=2)

print(Cuota_Real_COP)
## [1] 552163500 559871628 547556250 491232833 445490625 465169544

6.2 Beneficio Real Observado

Utilidad_POR_USD_Observada=TRM_OBSERVADA-Precio_Entrega
Utilidad_total_observada= Cuotas_USD*Utilidad_POR_USD_Observada

6.3 Valor Real cuota con cobertura

Valor_Observado_Cuotas_con_cobertura=Cuota_Real_COP-Utilidad_total_observada

matplot(Cuotas_COP_CON_C,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas_COP_CON_C, type = "l")
lines(percentil_95_cuotas_COP_CON_C, type = "l")
lines(media_cuotas_COP_CON_C, type = "l")
lines(Valor_Observado_Cuotas_con_cobertura, type = "l", lwd=2)