Se requiere evaluar el riesgo del VPN de un proyecto de inversión en una empresa perteneciente al sector alimenticio, con las siguientes características: * Inversión inicial: $5.000.000.000.
* Precio de venta unitario inicial: $8.000.
* Unidades vendidas para el primer mes: 20.000.
* Los costos totales para el primer mes se supone que siguen una distribución normal con media de $65.000.000 y una desviación estándar de $15.000.000.
* tasa de crecimiento de costos: Según la proyección de la inflación (usar regresión lineal con datos históricos).
* tasa de crecimiento de las ventas: Se proporciona muestra para estimar elcrecimiento. Realice un ajuste de los datos históricos del crecimiento porcentual mensual, utilizando la herramienta de ajuste de distribuciones de @Risk: Con los parámetros encontrados, defina la distribución y los parámetros para tasa de crecimiento de las ventas.
* El 40% de la inversión se financia con un banco al 20% EA.
* Para el calculo del costo del patrimonio, utilice el modelo del CAPM. Se espera que el mercado rente al 8% anual. Se proporcionan datos para la estimación del Beta de mercado de la inversión.
Numero_meses=60
Inversion_inicial=5000000000
precio_unit_ini=8000
Und_ini=20000
Ingreso_inicial=precio_unit_ini*Und_ini
mu_costos_ini=65000000
sigma_costos_ini=15000000
tasa_crecimiento_costos=0.015 #según IPC
tasa_crecimiento_ventas=0.01
#infomación Wacc
ratio_deuda_activo=0.4
ratio_patrimonio_activo=0.6
costo_deuda=0.2
Rtos_mercado=0.08
Para estimar la tasa de descuento, se utilza el modelo del Wacc.
El costo del patrimonio se calcula con el modelo del CAPM. La tasa libre de riesgo puede ser extraida de la curva cero de los TES, publicada en la siguiente pagina:
Se debe de tomar un punto de la curva con tiempo de maduración aproximado al tiempo de duración del proyecto.
\[E[R_i]=rf-B*[E[R_m]-rf]\]
Para estimar el beta de mercado, se estima una regresión lineal entre los rendimientos diarios de Nutresa y el COLCAP.
Se toma una muestra diaria desde 2018-05-02, hasta 2018-10-18 con un total de 114 datos.
Los datos pueden ser obtenidos de la pagina de la Bolsa de Valores de Colombia
Link para acciones. https://www.bvc.com.co/pps/tibco/portalbvc/Home/Mercados/enlinea/acciones?action=dummy
Link para el índice COLCAP. https://www.bvc.com.co/pps/tibco/portalbvc/Home/Mercados/enlinea/indicesbursatiles?action=dummy
library(readxl)
historico_precios_nutresa <- read_excel("historico_precios_nutresa.xls")
Historico_Indice_colcap <- read_excel("Indices_colcap.xls")
Historico_Indice_colcap=Historico_Indice_colcap[-115,] #le sobra el ultimo dato
plot(historico_precios_nutresa,type="l", main="precio historico Nutresa")
## Warning in as.POSIXlt.POSIXct(z): unknown timezone 'zone/tz/2018f.1.0/
## zoneinfo/America/Bogota'
plot(Historico_Indice_colcap$`Valor Hoy`,type="l", main="valor historico COLCAP")
Modelo Lineal para la estimación del Beta
Rtos_nutrsa=diff(log(historico_precios_nutresa$`Precio Cierre`))
Rtos_COLCAP=diff(log(Historico_Indice_colcap$`Valor Hoy`))
plot(Rtos_nutrsa,type = "l", main = "rendimientos mutresa")
plot(Rtos_COLCAP,type = "l", main = "rendimientos Colcap")
capm=lm(Rtos_nutrsa~Rtos_COLCAP)
resultados_capm=summary(capm)
print(resultados_capm)
##
## Call:
## lm(formula = Rtos_nutrsa ~ Rtos_COLCAP)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0249762 -0.0052414 0.0004468 0.0050328 0.0226412
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.0008898 0.0008246 -1.079 0.282927
## Rtos_COLCAP 0.4198414 0.1195152 3.513 0.000642 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.008731 on 111 degrees of freedom
## Multiple R-squared: 0.1001, Adjusted R-squared: 0.09194
## F-statistic: 12.34 on 1 and 111 DF, p-value: 0.0006423
beta=capm$coefficients[2]
error_std_beta=resultados_capm$coefficients[2,2]
El Beta sigue una distribución t-student con 112 grados de libertad (se aproxima a la normal) con media de \(0.4198414\) y un error estándar de \(0.1195152\).
Para la estimación deterministica del CAPM, se utilizará la media estimada del Beta (\(0.4198414\) )
Cálculo de la tasa de descuento deterministica
rf=0.0648 #rentabilidad de los TES 2024 obtenida de la curva cero
beta=capm$coefficients[2]
costo_oport_patrim=rf+beta*(Rtos_mercado-rf)
Tasa_descuento_EA=ratio_deuda_activo*costo_deuda+ratio_patrimonio_activo*costo_oport_patrim
######3
print(Tasa_descuento_EA)
## Rtos_COLCAP
## 0.122709
La tasa de descuento del proyecto es del 12.27% Efectivo Anual.
En esta sección se realiza la evaulación del proyecto bajo el modelo deterministico. Las variables aleatorias como los costos iniciales y las tasas de crecimiento, se asumen deterministicas y se proyecta según su media (Valor esperado).
# Se crean vectores vacios para almacenar los ingresos, los egresos y el Factor de descuento
ingresos=vector()
egresos=vector()
Factor_descuento=vector()
#Se asignan los valores iniciales a los vectores
ingresos[1]=Ingreso_inicial
egresos[1]=mu_costos_ini
Factor_descuento[1]=(1+Tasa_descuento_EA)^(1/12)
#Se calulan los ingresos, los egresos y el Factor de descuento para el resto de los periódos
for (j in 2:Numero_meses) {
ingresos[j]=ingresos[j-1]*(1+tasa_crecimiento_ventas)
egresos[j]=egresos[j-1]*(1+tasa_crecimiento_costos)
Factor_descuento[j]=Factor_descuento[j-1]*(1+Tasa_descuento_EA)^(1/12)
}
Flujo_neto=ingresos-egresos
plot(ingresos,type = "l",main = "flujos Mensuales", xlab = "mes",ylab = "ingresos", ylim = c(0,287793536+10),lwd=2,lty=2)
lines(egresos,type = "l", col="blue")
lines(Flujo_neto, type = "l", col="red",lty=3,lwd=3)
legend("topleft",legend = c("ingresos","egresos","flujo neto"),col = c("black","blue","red"),lty = c(2,1,3),bty = "n",lwd = c(2,1,3))
Valor_presente_flujos=Flujo_neto/Factor_descuento
VPN=sum(Valor_presente_flujos)-Inversion_inicial
Valor Presente Neto
## [1] 66603414
El VPN deterministico es negativo, por lo tanto no es viable el proyecto.
Para evaluar el proyecto bajo riesgo, es necesario tener en cuenta la aleatoriedad de las variables de entrada. En este caso, las variables aleatorias son:
\(\sim N(\$65000000,\$15000000^2)\)
La tasa de crecimiento de las ventas. Para determinar el tipo de distribución que al que se aproxima, se realizará un ajuste de una distribución paramétrica.
Tasa de crecimiento de los gastos. Se debe de hacer un ajuste a la serie histórica del índice de inflación.
Beta de mercado del proyecto: Se estima para el modelo CAPM con los rendimientos históricos de una empresa pertenenciente al sector alimenticio y los rendimientos del COPLCAP.
Se requiere hacer un ajuste que aproxime la distribución de frecuencias de la muestra, con una distribución teórica.
Lectura de datos históricos de las ventas mensuales en excel
Se cargan los datos de una hoja de excel, utilizando la libreria readxl y la función read_excel
library(readxl)
historico_ventas_mensuales <- read_excel("historico ventas mensuales.xlsx")
plot(historico_ventas_mensuales$ventas,type = "l", main = "ventas mensuales",xlab = "mes",ylab="ventas en pesos")
plot(historico_ventas_mensuales$`crecimiento porcentual`,type = "l",main = "crecimiento porcentual ventas", xlab = "mes",ylab="porcentaje de cambio mensual")
Comparación del histograma de los crecimientos mensuales con una distribución normal
Se sobre pone al histograma de frecuencias de los crecimientos mensuales, una curva normal, en donde la media se estima como el promedio de la muestra y La varianza como la diferencia al cuadrado promedio entre cada observación y el promedio de la muestra
\[\bar{x}=\frac{\sum_{i=1}^{n} x_i}{n}\]
\[\sigma^2=\frac{\sum_{i=1}^{n} (x_i-\bar{x})^2}{n}\]
promedio_ventas=mean(is.na(historico_ventas_mensuales$`crecimiento porcentual`))
sd_ventas=sd(is.na(historico_ventas_mensuales$`crecimiento porcentual`))
hist(historico_ventas_mensuales$`crecimiento porcentual`,breaks = 20,col = "gray",main = "histograma de crecimiento porcentual mensual de ventas",freq = FALSE,xlim = c(-0.3,0.3))
curve(dnorm(x,mean=promedio_ventas,sd=sd_ventas),-0.3,0.3,add = T,col="blue")
print(promedio_ventas)
## [1] 0.00990099
print(sd_ventas)
## [1] 0.09950372
La cantidad de datos no es suficiente para hacer una buena comparación gráfica, pero no se descarta que se pueda asumir una distribución normal.
Se realiza una comparación entre los cuantiles teóricos de la distribución normal de la gráfica anterior, con los cuantiles del histograma de la muestra, a través de un plano cartesiano llamado QQ-plot. Cuando el cuantil teórico coincide con el observado, los puntos se ubican sobre una recta con pendiente de 45 grados. Entre mmas se alejen los puntos de esta recta, mas será la diferencia entre el cuantil teórico y el observado.
qqnorm((historico_ventas_mensuales$`crecimiento porcentual`))
qqline((historico_ventas_mensuales$`crecimiento porcentual`))
Se observa que los cuantiles centrales tienden a estar sobre la recta de 45 grados, pero que en las colas de la distribución, se presentan diferencias entre los cuantiles observados y los cuantiles teóricos.
Para tener mejores argumentos para asumir que las tasa ce crecimienrto de las ventas siguen una distribución normal, realizaremos 2 pruebas de hipótesis que tienen como hipótesis nula:
Ho: los crecimientos porcentuales mensuales de las ventas siguen una distribución normal
Para probar esta hipótesis, existen diferentes pruebas con diferentes enfoques. para ampliar la información, consultar el siguiente link https://rpubs.com/MSiguenas/122473
Se aplica la prueba de Shapiro.test.
shapiro.test(historico_ventas_mensuales$`crecimiento porcentual`)
##
## Shapiro-Wilk normality test
##
## data: historico_ventas_mensuales$`crecimiento porcentual`
## W = 0.98042, p-value = 0.1433
El valor P de la prueba es mayor al 10%, por lo tanto no se rechaza que la muestra se apoxime a una distribución normal.
Se aplica la prueba de Kolmogorov-Smirnov
#install.packages("nortest")
library(nortest)
lillie.test(historico_ventas_mensuales$`crecimiento porcentual`)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: historico_ventas_mensuales$`crecimiento porcentual`
## D = 0.072182, p-value = 0.2255
El valor P de la prueba es mayor al 10%, por lo tanto no se rechaza que la muestra se apoxime a una distribución normal.
Con la evidencia de las pruebas de hipotesis, se puede asumir que la muestra evaluada se aproxima a la distribución normal con la que se está comparando.
Para la tasa de crecimiento de los costos, se supondrá que estos distribuyen normal con una media mensual del 1.5% y una desviación del 0.8%
El Beta sigue una distribución t-student con 112 grados de libertad (se aproxima a la normal) con media de \(0.4198414\) y un error estándar de \(0.1195152\).
numero_iteraciones=1000
ingresos_Monte_carlo=matrix(,Numero_meses,numero_iteraciones)
egresos_Monte_carlo=ingresos_Monte_carlo
Tasa_descuento_EA=ingresos_Monte_carlo
ingresos_Monte_carlo[1,]=Ingreso_inicial
for (i in 1:numero_iteraciones)
{
egresos_Monte_carlo[1,]=rnorm(1,mu_costos_ini,sigma_costos_ini)
for (j in 2:Numero_meses) {
ingresos_Monte_carlo[j,i]=ingresos_Monte_carlo[j-1,i]*(1+rnorm(1,mean(is.na(historico_ventas_mensuales$`crecimiento porcentual`)),sd(is.na(historico_ventas_mensuales$`crecimiento porcentual`))))
egresos_Monte_carlo[j,i]=egresos_Monte_carlo[j-1,i]*(1+rnorm(1,tasa_crecimiento_costos,0.008))
costo_oport_patrim=rf+rnorm(1,beta,error_std_beta)*(Rtos_mercado-rf)
Tasa_descuento_EA[j,i]=ratio_deuda_activo*costo_deuda+ratio_patrimonio_activo*costo_oport_patrim
}
}
matplot(ingresos_Monte_carlo,type = "l", main="ingresos")
matplot(egresos_Monte_carlo,type = "l", main="egresos")
Flujo_neto_Monte_Carlo=ingresos_Monte_carlo-egresos_Monte_carlo
matplot(Flujo_neto_Monte_Carlo,type = "l", main="Flujo neto")
Valor_presente_flujos_Monte_carlo=Flujo_neto_Monte_Carlo/Factor_descuento
matplot(Valor_presente_flujos_Monte_carlo,type = "l", col = "gray", main="valor presente de los flujos netos")
VPN=colSums(Valor_presente_flujos_Monte_carlo)-Inversion_inicial
hist(VPN,breaks = 50, col="gray")
El Histograma resultante tiene
Estimación del promedio, la desviación estandar y un intervalo de estimación del 90%
mean(VPN) # promedio
## [1] -74449189
sd(VPN) #desviacion estandar
## [1] 4521388491
quantile(VPN,c(0.05,0.95))
## 5% 95%
## -5503733743 8896421194
Para estimar la probabilidad de que el VPN sea un 30% superior a la inversión inicial se requiere contar el número de casos entre \(\$5.000.000.000*(1+30\%)\) y el máximo valor obtenido con el los VPN simulados, el resultado de este conteo, se divide por el número de casos totales que corresponde al número de iteraciones de la simulación.
# Se toma de los datos simulados del VPN que están entre Inversion_inicial*(1+30%) y el maximo valor del VPN
corte=cut(VPN,breaks = c(Inversion_inicial*(1.3),max(VPN)),right = FALSE)
probabilidad de que el VPN esté un 30% por encima de la inversión inicial
# Se cuentan el numero de casos favorables con la función table
(table(corte)/numero_iteraciones)
## corte
## [6.5e+09,3.11e+10)
## 0.089