Simulación con Modelos Determinísticos

Minicaso 3 Freight Forwarder

Un caso de emprendedora exitoso en la región vitı́cola de Mednoza Argentina está ligado a una egresada de la carrera de ingenierı́a industrial que a comienzos de la década de 1990, ante la incertidumbre de las crisis económicas decidió, sin capital alguno, lanzarse como free lance en el negocio de mover containers con vino a los puertos de Valparaı́so y San Antonio - Chile. Su empresa actuaba como intgradora de servicios entre transportistas, despachantes de aduana, bodegas, navieras y clientes de brokers en el extranjero.
Un factor clave de éxito ( KPI ) era el tamaño de lote óptimo a transportar en cada envı́o. Es bien conocido el modelo de Wilson que data de la década de 1920, pero que hoy resulta casi una garantı́a al fracaso si se utiliza en contextos tan turbulentos como los que nos toca vivir. A pesar de ello el modelo aún se estudia y no es descartado, pués sirve de base para ser mejorado. El modelo tiene tres variables independientes y una dependiente, a saber:

El modelo de Wilson

Variables Independientes

  • Demanda Media Anual D (en Containers por año)

  • Costo de almacenamiento unitario Ca ($ por mes)

  • Costo de emisión o gestión Ce ($ por orden)

Variable Dependiente

  • Tamaño de Lote Mensual EOQ

Modelo Mateático

\[ {EOQ} = \sqrt {(\frac {2*D * Ce} {Ca} )}\]

El caso de la Bodega Torrenti operada por el Freight Forwarder

Esta bodega tiene tres destinos principales de exportación.

  • Estados Unidos demanda 500 TEUs al año
  • Brasil demanda 53 TEUs al año
  • Cadandá demand 28 TEUs al año

  • Costo de Almacenamiento U$D 2.500

  • Costo de Gestión U$D 750

Modelado numérico en R-CRAN

D1 <-500
D2 <-52
D3 <-28

D<- D1+D2+D3

Ca <- 2500
Ce <- 750

EOQ <- sqrt(2*D*Ce/Ca)

EOQ
[1] 18.65476

Inventarios Estocásticos con Simulación Montecarlo

** Simulación con modelos Estocásticos **

Cálculo del EOQ por Montecarlo

Este método no concibe a las variables independientes como fijas, sino que las considera variables aleatorias e introduce Ruido en el modelo matemático. En esta parte deberíaos analizar el comportamento de cada variable y asociarle una distribución (función paramétrica) de probabilidad. Por sencillez supondremos en este ejemplo que las varaibles siguen una distribución normal.
En rigor deberíamos estudiar que distribución siguen los datos con los que alimentaremos el modelo. <bR R-Cran tiene por defecto definidas las siguientes distribuciones de probabilidad.

  • Normal
  • Logística
  • Uniforme
  • Gamma
  • Lognormal
  • Weibull
  • Cauchy
  • Exponencial
  • Chi-cuadrado
  • F
  • T-Student.


Puede explorar el paquete rriskDistributions que le dará una idea más clara. Generaremos una muestra al azar de 47 valores con media 40 y desvio standard 5

%{r, echo=TRUE} library(rriskDistributions) muestra=rnorm(47,40,5) muestra fit.cont(muestra) %

Estocatización de Variables

  • Estados Unidos demanda promedio 500 TEUs al año con una varianza de 90

  • Cadandá demanda promedio 28 TEUs con una varianza de 6 al año

  • Brasil demanda promedio 93 TEUs al año con una varianza de 8


  • Costo de Almacenamiento U$D 2.500 Varianza 1.000

  • Costo de Gestión U$D 750 varianza 250

Cálculo del EOQ Montecarlo

#Genero tres variables aleatorias normales con 
#una cantidad de muestras m igual a tres veces #el tamaño de la media 

m1 <- 500*3
D1 <- rnorm(m1,500,90)
m2 <- 93*3
D2 <- rnorm(m2,93,8)
m3 <- 28*3
D3 <- rnorm(m3,28,6)
D <- c(D1,D2,D3)
# m_d muestras de demanda
m_d <- length(D)

#Generamos las variables aleatorias de costos igual a la cantidad de muestras de demanda que tenemos.

Ca <- rnorm(m_d,2500,1000)

Ce <- rnorm (m_d,750,250)

# Preparo área de graficos 3 filas 1 columna
#par(mfcol=c(1,3))

#Grafico 1
plot(density(D), 
xlab="Demanda TEU", #Change the x-axis label
ylab="Densidad", #y-axis label
main="Muestras de Demanda 5 años")#Main title

#Grafico 2
plot(density(Ca),
xlab="Costo Almacenamiento", #x-axis label
ylab="% eventos registrados", # y label
main="Población Costos Almacenamiento")     

#Grafico 3
plot(density(Ce),
xlab="Costo Gestión Inventario", #x-axis label
ylab="% eventos registrados", # y label
main="Población Costos Emisión")     

Cálculo de muestras de lote Económico EOQ

En este caso realizaremos las mismas operaciones que antes, pero las variables independientes ahora serán matrices y el resultado será un conjunto de valores con su propia distribución de probabilidades.

EOQ <- sqrt(2*D*Ce/Ca)
#Media del Lote Económico
mean(EOQ, na.rm=TRUE)
[1] 16.46535
#Varianza del Lote Económico
var(EOQ, na.rm=TRUE)
[1] 139.6855
#Desvio Estandard del Lote Económico
sd(EOQ, na.rm=TRUE)
[1] 11.81886
plot(density(EOQ,na.rm=TRUE))

Hallaremos los valores máximos y mínimos de las variables dependientes e independientes

[1] 469
[1] 177
[1] 1651

Valores Mínimos

[1] -546.7855
[1] -32.45866
[1] 0.6399603
[1] 247
[1] 882
[1] 199

VAN y TIR por el método Montecarlo

Recurriremos al uso de una biblioteca llamada FinCal, para repetir el proceso que ya ensayamos con el modelo del lote económico EOQ. Es decir veremos como usar R-CRAN para operar sobre un vector que tiene los flujos de fondos descontados e un proyecto utilizando una biblioteca específicamente diseñada para ello. Luego alimentaremos al modelo no con un vector de datos sino con un vector que contiene dos filas. La primera será el flujo de fondo tal como se usó en el primer caso y la segunda es una componente que representa la volatilidad. Este concepto de “volatilidad” hace referencia al riesgo que sumimos en pronosticar ingresos y egresos a futuro. Nuestra certeza sobre los flujos de hace menos confiable conforme transcurre más tiempo en el desarrollo del proyecto. Por lo tanto la segundo componente del nuevo vector tiene algo así como la varianza creciente por la que afectaremos a los pronósticos de fondos futuros.

Repaso de Matemática Financiera

Uso de la biblioteca FinCal

Tal como se señalo más arriba deberemos instalar la biblioteca usanso el comando respectivo solo la primera vez que deseemos instalar en unestro computador. Ejecuteremos entonces:

    install.packages("FinCal")
    

A partir de este momento podemos invocar a la biblioteca como ya sabemos.

library(FinCal)

Esta biblioteca ha agregado 62 comandos de matemática financiera a nuestra computadora. para saber cuales son ejecutamos la siguiente línea.

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"                  

Si necesito conocer que hace cada comando nuevo puedo usar el signo de pregunta para ver la página de ayuda interna. Asi:

    ?npv

Esto debería darle información sobre cada comando nuevo. Veremos algunos ejemplos simples para que tome experiencia en el caso de simulación determinística de flujo de fondos.

Minicaso Van y TIR

Un inversionista coloca $100 durante un año a una tasa de interés simple de 1.5% mensual pagadera mensualmente
¿Qué retribución obtiene durante el año?

I= 100*0.015*12
F=100 + I
F
[1] 118

Minicaso Reinversión de Dividendos

Considere el caso del inversionista del ejemplo anterior, pero suponiendo que recibe los intereses al final de cada mes y que los reinvierte inmediatamente en las mismas condiciones de la inversión inicial.
¿Qué cantidad de dinero recibirá al cabo de un año ?

fv.simple(r = 0.015, n=12, pv = -100)
[1] 119.5618

Convertir de tasa Anual a Mensual

¿Cuál es la tasa de interés nominal anual de una inversión que ofrece el 1.5% de interés pagado al final de cada mes?

r.norminal(r = 0.015, 12) * 12
[1] 0.1801125

Plazo fijo

¿Cuál es la tasa efectiva anual de rendimiento de una inversión que ofrece un interés nominal anual del 8%, pagadero cada semestre vencido, pero que el interesado procede a reinvertirlo?

ear(r = 0.08, 2)
[1] 0.0816

Minicaso flujo de fondos

Crearemo un flujo de fondos consolidado de un proyecto hipotético de la creación de una bodega boutique con destino enoturístico que compite contra otro proyecto similar pero del terreno de la cervezería artesanal. Cada uno de estos proyectos será identificado por los flujos totales FFN1 y FFN2. El proyecto comienza en 2019 y se puede recuperar la inversión hasta 2028


Crearemos el primer flujo de fondos:

#Enoturismo
año<-
c(2019,2020,2021,2022,2023,2024,2025,2026,2027,2028)
FFN1<-c(-940693, 186255, 186255, 186255,
37323,37323,37323,37323, 116482, 280651)
plot(año,FFN1,pch=19,cex=3,col="dark red",type="b")
abline(0,0)

Ahora crearemos el flujo de fondo correspondientes a la actividad de la cerveza. Este proyecto tiene equipos de frío que no sirven más a partir del año 2024.

#Cerveza artesanal
FFN2<-c(-19132841, 5691206, -14230711,
16387818, 24645898)
plot(año[2:6],FFN2,pch=19,cex=3,col=rgb(.25,
0.5, .3), type="b")
abline(0,0)

Selección de proyecto más conveniente

Comparemos los VAN de ambos proyectos

VAN Enoturismo

# Enoturismo
FinCal::pv.uneven(0.03339,-FFN1)
[1] 5643.277

Este proyecto se realiza en un país riesgoso de modo que lo castigo con una tasa más alta.

VAN Cerveza Artesanal

# Creveza artesanal
FinCal::pv.uneven(0.018,-FFN2)
[1] 11009906

Selección de mejor proyecto

    Proyecto del Enoturismo

Comparación por TIR

TIR1 = irr(FFN1)
TIR2 = irr(FFN2)
TIR1
[1] 0.03481718
TIR2
[1] 0.1487625

Según el TIR el proyecto más conveniente es:

  Proyecto de creveza artesanal.
  

¿Que proyecto elegirías tu?

TIR y VAN con Montecarlo

Determinaremos cuantos períodos tiene cada proyecto y le asignaremos una varianza creciente a sus flujos de fondos. Esto podría hacerse con la distribución de probalilidades F se Snedecor (Senedorv o Snedecorf). Pero por sencillez tomaremos valores estimados por nosotros.

Vector de Volatilidad

length(FFN1)
[1] 10
Volatilidad <- c( 0.01 ,0.02, 0.03, 0.04, 0.05,
0.06, 0.07, 0.08, 0.09, 0.10)

Flujo de Fondos Estocástico

VAN con Montecarlo

Al parecer el uso de matemática financiera nos dice que el proyecto de la cerveza artesanal es el mejor, pero ¿que tan cierto es esto si consideramos la volatilidad creciente o incertidumbre a futuro?

Las funciones de FinCal pueden aplicarse a una variable sola (que en realidad es una matriz de uno por uno), pero también a una matriz de mayores dimensiones. En lugar de darnos un valor nos dará una campana de Gauss de valores de salida.

Para ello crearemos un dataset. En lugar de tomas

Generaremos 144 (12x12) valores aleatorios con una media igual al flujo de fondos que usamos antes (FFN1 como valor promedio), pero ahora usaremos la volatilidad como varianza para este dataset

FFN_S <- matrix(rnorm(144,FFN1,Volatilidad),
ncol=12, nrow=12, byrow=TRUE )
# FFN_S[ ,1] <- rnorm(12, FFN1[1],0.1*Volatilidad[1])

En este caso FFN_S representa el flujo de fondos Estocástico de 12 alternativas tomadas aleatoriamente usando la volatilidad como generador estocástico.

¿Por qué el proyecto de enoturismo es tan riesgoso?

Histograma del VAN Enoturismo

#creo una variable auxiliar

VAN_S <- c(0,0,0,0,0,0,0,0,0,0,0,0)

# cargo en esa variable los valores de flujos aleatorios 
for (i in 1:12) { (VAN_S[i] <-
# calculo para cada uno de los 12 fondos un VAN
                     FinCal::npv(18,FFN_S[i,] ))}
# imprimo el histograma
hist(VAN_S, breaks = 20)

Que opinas de la posibilidad de éxito de este proyecto

Densidad de valores en el VAN Montecarlo

density(VAN_S)

Call:
    density.default(x = VAN_S)

Data: VAN_S (12 obs.);  Bandwidth 'bw' = 9.327e+04

       x                  y            
 Min.   :-1255821   Min.   :8.593e-09  
 1st Qu.:-1004397   1st Qu.:2.485e-07  
 Median : -752973   Median :1.167e-06  
 Mean   : -752973   Mean   :9.928e-07  
 3rd Qu.: -501549   3rd Qu.:1.561e-06  
 Max.   : -250124   Max.   :2.021e-06  

Gráfica de densidad del VAN Montecarlo

plot(density(VAN_S))