Aplicación de montecarlo al flujo de fondos

Definciónes

El valor actual neto de un proyecto de inversión (VAN) es un criterio de selección de inversiones. Este representa el valor actual de los flujos de fondos netos (ingresos menos egresos periódicos) valor actual de los flujos de fondos netos (ingresos menos egresos periódicos) que puede generar la inversión en un determinado tiempo..

Si el VAN es mayor a cero, es decir positivo, se dice que el proyecto crea riqueza para los inversionistas.

Para hallar el valor presente neto hay que descontar sus flujos de efectivo futuros a una tasa de descuento aceptable, conocida también como costo de de capital; es decir aquella tasa de rendimiento estándar de otros activos de riesgo similar o la dispuesta por el Banco Central. Por ejemplo, si el flujo de efectivo futuro es seguro, entonces la tasa de descuento a que se puede tomar como referencia es la tasa de interés sobre títulos de deuda sin riesgo (por ejemplo: bonos de deuda pública de un país).

Según expertos financieros, los flujos de efectivos se descuentan por 2 motivos:

La fórmula para calcular el VAN es la siguiente:

\(VAN = -I_0 + \sum_{t=1}^{n} \frac{F_t}{(1+k)^n}\)

\(VAN = -i_0 + \frac{F_1}{(1+k)^1} +...+\frac{F_t}{(1+k)^n}\)

Donde:

El modelo que construiremos tiene dos variables sobre las que tenemos que tomar dos decisiones. Una es arbitraria, corresponde al lapso de tiempo durante el que analizaremos la inversión. En general para evitar incertidumbre y tener puntos de vistas comparables, utilizamos 10 años.

El segundo parámetro es la tasa de interés, que por definición corresponde a períodos del futuro, es decir que aún no está calculada. Esto nos abre la posiblidad de utilizar la estadística para predecirla.

Inversiones anuales

Armaremos un vector de inversiones que represente en cada componente la inversión en cada año de vida del proyecto.

INVersion <- c(5000,0,0,0,0,0,0,0,0,0)
length(INVersion)
## [1] 10

como sabemos este vector de inversiones podemos importarlo de una table csv, xls, SAP, e incluso de la Bolda de Valores.

para randomizar este vector lo repetiremos 14 veces a efectos de poder aplicar Montecarlo.

INVersion <- c(INVersion,INVersion ,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion,INVersion)
length(INVersion)
## [1] 140

Costos operativos

Supondremos que los costos durante los 3 primeros años serán de $700 y luego de $1350. Admás de ello tenemos una certeza que la variabilidad entre el año 1 al 3 iniciará en 2% y terminará 4%. En tanto que para el periodo del 4to al 10mo año se invermentará en 0.015%.

Generación de flujo de costos

CO <- c(700,700,700,1350,1350,1350,1350,1350,1350,1350)
plot(CO)

Intervalo de incertidumbre

V4inicial <- 0.04

V1_al_3 <- c(0.02,0.03,0.04)

V4_al_10 <- c(0,0,0,0,0,0)
incremento <- 0.015



for (i in 1:7) {
V4_al_10[i] <- V4inicial *(1+incremento)
  incremento <- incremento + incremento
}

V1_al_3
## [1] 0.02 0.03 0.04
V4_al_10
## [1] 0.0406 0.0412 0.0424 0.0448 0.0496 0.0592 0.0784

Concatenar dos vectores

Noise_CO <- c(V1_al_3 ,V4_al_10)
Noise_CO
##  [1] 0.0200 0.0300 0.0400 0.0406 0.0412 0.0424 0.0448 0.0496 0.0592 0.0784
plot(Noise_CO, main="incremento de la incertidumbre", ylab= "% de ruido",xlab="año")

Como podemos observar en el gráfico tenémos una hipótesis de incremente inicial constante durante los años 1 al 3 y luego suponemos una estabilidad política económica (cambio de gobierno), y luego presagiamos nuevamente inestabilidad sumada a incertidumbre más por desconocimiento del futuro que por falta de certeza de lo que puede ocurrir.

Costos Operativos Estocasticos

Generaremos 12 flujos anuales de fondos aleatorios (equivalen a 144 muestras) en los que la incertidumbre será tomada como varianza de los costos esperados para cada año.

COAleatorios <- rnorm(144,CO[1:10],Noise_CO[1:10]*10000)
# Flujos recortados para imprimir
COArecortados <- rnorm(144,CO[1:12],Noise_CO[1:12]*10000)
## Warning in rnorm(144, CO[1:12], Noise_CO[1:12] * 10000): NAs produced
plot(COArecortados,type="l")

Repetiremos ahora este trabajo para los ingresos, utilizando la misma incertidumbre.

Generación de flujo de Ingresos

Nuevamente utilizaremos valores sencillo para familiarizarnos con el método. Recomendamos que estos valores los ajustes con los datos de tu caso particular. A efectos de ver las posibilidades, agregaremos al comando plot que utilizamos antes, una opción que es para trazar una línea (roja) que representa un valor de alguna cantidad que nos interese tener como referencia. Se podría implementar una línea que represente el punto de equilibri, la media de impuestos previstos, o como en este caso, una media de las cuentas a pagar (crédito de proveedores) que deberíamos cubrir y que están conteplandos en los costos que ya hemos calculado.

INcome <- c(2700,1700,2700,4350,4350,4350,4350,4350,4350,4350)
plot(INcome,type="l")
# Línea roja indica promedio de cuentas por pagar
abline(a=3000, b=0, col="red", lty=2)

Flujo de Ingresos

Procederemos a generar el ruido de entrada que demanda Montecarlo

V4inicial <- 0.045

V1_al_3 <- c(0.025,0.035,0.045)

V4_al_10 <- c(0,0,0,0,0,0)
incremento <- 0.025



for (i in 1:7) {
V4_al_10[i] <- V4inicial *(1+incremento)
  incremento <- incremento + incremento
}

V1_al_3
## [1] 0.025 0.035 0.045
V4_al_10
## [1] 0.046125 0.047250 0.049500 0.054000 0.063000 0.081000 0.117000

Concatenar dos vectores de ingresos

Noise_IN <- c(V1_al_3 ,V4_al_10)
Noise_IN
##  [1] 0.025000 0.035000 0.045000 0.046125 0.047250 0.049500 0.054000 0.063000
##  [9] 0.081000 0.117000
eje_X <- seq(1:10)
# genereremos una curva de suavizaso exponencial para superponer a los datos
lo <- loess(Noise_IN~eje_X)
plot(Noise_IN, main="incremento de la incertidumbre", ylab= "% de ruido",xlab="año")
lines(predict(lo),col="red")

Ejemplo de otro suavizado exponencial

scatter.smooth(eje_X, Noise_IN)

Banda de flotación al 30%

library(ggplot2)
qplot(eje_X,Noise_IN, geom='smooth', span =1.3)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Flujo de Ingresos Estocásticos

INAleatorios <- rnorm(144,INcome[1:10],Noise_IN[1:10]*10000)
## Flujo recortado para imprimir
INArecortado <- rnorm(144,INcome[1:12],Noise_IN[1:12]*10000)
## Warning in rnorm(144, INcome[1:12], Noise_IN[1:12] * 10000): NAs produced
plot(INArecortado,type="l", xlab="Año")

Construcción del flujo neto

length(INAleatorios)
## [1] 144
length(INVersion)
## [1] 140
length(COAleatorios)
## [1] 144
FF <- INAleatorios -INVersion -COAleatorios
## Warning in INAleatorios - INVersion: longer object length is not a multiple of
## shorter object length
plot(FF)

Cálculo de 12 muestras del VAN

Para realizar esta operación utilizaremos la biblioteca de matemática financiera FinCal.

El comando ls(“nombre de la biblioteca”) nos muestra los nuevos comandos que una biblioteca nos agrega a R.

library(FinCal)
ls("package:FinCal")
##  [1] "bdy"                   "bdy2mmy"               "candlestickChart"     
##  [4] "cash.ratio"            "coefficient.variation" "cogs"                 
##  [7] "current.ratio"         "ddb"                   "debt.ratio"           
## [10] "diluted.EPS"           "discount.rate"         "ear"                  
## [13] "ear.continuous"        "ear2bey"               "ear2hpr"              
## [16] "EIR"                   "EPS"                   "financial.leverage"   
## [19] "fv"                    "fv.annuity"            "fv.simple"            
## [22] "fv.uneven"             "geometric.mean"        "get.ohlc.google"      
## [25] "get.ohlc.yahoo"        "get.ohlcs.google"      "get.ohlcs.yahoo"      
## [28] "gpm"                   "harmonic.mean"         "hpr"                  
## [31] "hpr2bey"               "hpr2ear"               "hpr2mmy"              
## [34] "irr"                   "irr2"                  "iss"                  
## [37] "lineChart"             "lineChartMult"         "lt.d2e"               
## [40] "mmy2hpr"               "n.period"              "npm"                  
## [43] "npv"                   "pmt"                   "pv"                   
## [46] "pv.annuity"            "pv.perpetuity"         "pv.simple"            
## [49] "pv.uneven"             "quick.ratio"           "r.continuous"         
## [52] "r.norminal"            "r.perpetuity"          "sampling.error"       
## [55] "SFRatio"               "Sharpe.ratio"          "slde"                 
## [58] "total.d2e"             "twrr"                  "volumeChart"          
## [61] "was"                   "wpr"

Esta biblioteca tiene una enorme cantidad de comandos que te serán de suma utilidad, incluso puedes capturar datos en tiempo real de la cotización de bonos y acciones, precio del oro, etc.

En este caso de estudio trabajaremos con la función npv Utiliza este comando para ver la ayuda de la síntaxis.

?npv

Por el momento utilizaremos la misma tasa de descuento, aún cuando para realizar el análisis Montecralo también deberíamos aleatorizar este valor. Supondremos una tasa del 12%.

Construiremos los 12 flujos de fondos

CF1 <- FF[1:10]
CF2 <- FF[11:20]
CF3 <- FF[21:30]
CF4 <- FF[31:40]
CF5 <- FF[41:50]
CF5 <- FF[51:60]
CF6 <- FF[61:70]
CF7 <- FF[71:80]
CF8 <- FF[81:90]
CF9 <- FF[91:100]
CF10<- FF[101:110]
CF11<- FF[111:120]
CF12<- FF[121:130]

Calculo de los VANs

Vector_VANS <- c(0,0,0,0,0,0,0,0,0,0,0,0)
Vector_VANS[1] <- npv(0.12,CF1)
Vector_VANS[2] <- npv(0.12,CF2)
Vector_VANS[3] <- npv(0.12,CF3)
Vector_VANS[4] <- npv(0.12,CF4)
Vector_VANS[5] <- npv(0.12,CF5)
Vector_VANS[6] <- npv(0.12,CF6)
Vector_VANS[7] <- npv(0.12,CF7)
Vector_VANS[8] <- npv(0.12,CF8)
Vector_VANS[9] <- npv(0.12,CF9)
Vector_VANS[10] <- npv(0.12,CF10)
Vector_VANS[11] <- npv(0.12,CF11)
Vector_VANS[12] <- npv(0.12,CF12)

boxplot(Vector_VANS)

Análisis montecarlo

Calcularemos el VAN promedio del experimento

VAN_Promedio <- mean(Vector_VANS)
VAN_Promedio
## [1] 10309.97

Desvio estandar del VAN

VAN_Desvio <- sd(Vector_VANS)
VAN_Desvio
## [1] 1830.214

¿Qué probabilidad tenemos de cubrir la inversión inicial de $50.000 ?

Generaremos una muestra de 500 valores con media VAN_Promedio y Desvio Standard VAN_Desvio

muestra <- rnorm(500,VAN_Promedio,VAN_Desvio)
plot(density(muestra))

Probabilidad de cubrir la inversión de $84.000

(1 - pnorm(8400,VAN_Promedio,VAN_Desvio))*100
## [1] 85.16596