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.
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.
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")
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.
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\)
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.
Se realiza una simulación de Montecarlo. Se realizan 10.000 iteraciones a través del modelo Browniano geometrico y los parámetros estimados.
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")
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
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
En esta sección se presentan los resultados observados de la cobertura
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
Utilidad_POR_USD_Observada=TRM_OBSERVADA-Precio_Entrega
Utilidad_total_observada= Cuotas_USD*Utilidad_POR_USD_Observada
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)