Aplicación de montecarlo al flujo de fondos

Inversiones anuales

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

para randomizar este vector lo repetiremos 10 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)
## Warning: replacing previous import 'lifecycle::last_warnings' by
## 'rlang::last_warnings' when loading 'tibble'
## Warning: replacing previous import 'lifecycle::last_warnings' by
## 'rlang::last_warnings' when loading 'pillar'
qplot(eje_X,Noise_IN, geom='smooth', span =1.3)
## `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: longitud de objeto mayor no es múltiplo de
## la longitud de uno menor
plot(FF)

Cálculo de 12 muestras del VAN

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

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] 10125.43

Desvio estandar del VAN

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

¿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 $64.000

(1 - pnorm(64000,VAN_Promedio,VAN_Desvio))*100
## [1] 0