Librería Cashflows

Juan David Velásquez Henao
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia


Haga click aquí para acceder a la última versión online

Haga click aquí para ver la última versión online en nbviewer.


Cashflows

cashflows es una librería para el cálculo interactivo del valor del dinero en IPython. Las funciones implementadas son similares a las usadas en Microsoft Excel, las calculadoras financieras y otros softwares similares. cashflows permite el análisis de diferentes tipos de inversiones: ara los siguientes tipos de inversiones:

  • Créditos

  • Ahorros

  • Depreciaciones

  • Bonos

  • Flujos genéricos de efectivo

Este análisis ayuda a responder diferentes preguntas:

  • ¿Cuáles son los indicadores financieros de un proyecto de generación?

  • ¿Cuáles es la mejor alternativa de crédito para financiar la compra de un equipo?

  • ¿Cuál es el incentivo mínimo que debe darse a una nueva tecnología para incentivar su adopción?

  • ¿Cuál es el riesgo en el que se incurre en una inversión (transmisión, generación, distribución, etc.)?

Instalación de la librería

La instalación de la librería puede realizarse usando pip:

pip install cashflows


Ayuda

Las funciones de la librería se encuentran documentadas y su ayuda puede obtenerse a través de la función help. Por ejemplo, para obtener la ayuda de la función cashflow se digita el siguiente comando en el prompt interactivo:

>>> help(cashflow)

como resultado se abrirá la ayuda de dicha función.

Documentación

La documentación de la libraría puede consultarse en:

 http://cashflows.readthedocs.io/en/latest/


Carga de la librería

Para cargar la librería use:

import cashflows as cf

Lenguaje de desarrollo

La librería está desarrollada en Python 3.6. No hay compatibilidad para Python 2.x.


In [1]:
import cashflows as cf

Tipos de interés

Interés nominal (nrate): expresado sobre una base anual para un número pyr de períodos de pago en el año.

Interés efectivo por período de pago (o períodico) (prate): representa el interés real para cada período de pago en el año.

Interés efectivo anual (erate): interés real para un período único de pago de un año.

$$ prate= \frac{nrate}{pyr}, \qquad erate = \left( \displaystyle 1 + prate\right)^{nper} - 1 = \left( \displaystyle 1 + \frac{nrate}{pyr}\right)^{nper} - 1 $$

Ejemplo.-- Se está considerando abrir una cuenta de ahorros en uno de tres bancos. ¿Cuál banco tienen la tasa de interés más favorable?

  • Banco #1: 6.72% anual, compuesto semestralmente.

  • Banco #2: 6.70% anual, compuesto trimestralmente.

  • Banco #3: 6.65% anual, compuesto mensualmente.

Solución manual


In [3]:
pow(1+0.0672/2, 2) - 1 ## tasa efectiva anual para el Banco #1


Out[3]:
0.0683289600000001

In [4]:
pow(1+0.0670/4, 4) - 1 ## tasa efectiva anual para el Banco #2 
                       ## tasa mas favorable


Out[4]:
0.0687022514028166

In [5]:
pow(1+0.0665/12, 12) - 1 ## tasa efectiva anual para el Banco #3


Out[5]:
0.0685647762811652

Función iconv

iconv(nrate=None, erate=None, prate=None, pyr=1)

donde:

  • nrate -- tasa nominal.
  • prate -- tasa períodica o tasa efectiva por período de capitalización.
  • erate -- tasa efectiva por año.
  • pyr -- número de períodos de capitalización por año.

La función recibe una de las tasa de interés y retorna las otras dos así:

  • Al especificar nrate retorna (erate, prate).
  • Al especificar erate retorna (nrate, prate).
  • Al especificar prate retorna (nrate, erate).

Los cálculos son ejecutados usando las siguientes ecuaciones:

$$ prate= \frac{nrate}{pyr}, \qquad erate = \left( \displaystyle 1 + prate\right)^{nper} - 1 = \left( \displaystyle 1 + \frac{nrate}{pyr}\right)^{nper} - 1 $$

Los cálculos usando iconv se realizan de la siguiente manera:


In [2]:
cf.iconv(nrate = 6.72, pyr =  2)  ## Banco 1: 6.72% comp semestralmente


Out[2]:
(6.8328960000000105, 3.36)

In [3]:
cf.iconv(nrate = 6.70, pyr =  4)  ## Banco 2 6.70% comp trimestralmente


Out[3]:
(6.8702251402816605, 1.675)

In [4]:
cf.iconv(nrate = 6.65, pyr = 12)  ## Banco 3: 6.65% comp mensualmente


Out[4]:
(6.85647762811652, 0.5541666666666667)

Los cálculos pueden ejecutarse con una sola llamada a la función.


In [5]:
## Otra forma
cf.iconv(nrate = [6.72, 6.79, 6.65], pyr = [2, 4, 12])


Out[5]:
([6.8328960000000105, 6.964855220821997, 6.85647762811652],
 [3.36, 1.6975, 0.5541666666666667])

Función pvfv

pvfv(pval=None, fval=None, nrate=None, nper=None, pyr=1, noprint=True)

La función pvfv returna el valor faltante en la siguiente ecuación:

$$fval = - pval * \left(1 + \frac{nrate}{pyr}\right) ^ {nper}$$

donde:

  • pval -- valor presente.
  • fval -- valor futuro.
  • nper -- cantidad de períodos.
  • nrate -- tasa de interés nominal.
  • pyr -- número de períodos de capitalización por año.

Ejemplo.-- [3, pág. 88] Se depositan $ 2000 en una cuenta de ahorros que paga un interés anual del 7.2% (capitalizado anualmente). Si no se hacen otros depósitos en la cuenta, ¿cuánto tiempo se requiere para que la cuenta tenga $ 3000? R/ 5.83


In [10]:
cf.pvfv(nrate =     7.2,   # tasa de interes
        pval  = -2000,     # valor presente
        fval  = +3000)     # valor futuro


Out[10]:
5.8318433820838607

In [11]:
# Ya que nper es un valor entre 5 y 6, se requieren 6 años 
# para tener un balance de al menos $ 3000.
# El balance al final de los seis años es (R/ 3035.28):
cf.pvfv(nrate =     7.2, # tasa de interes
        pval  = -2000,   # valor presente
        nper  =     6)   # numero de periodos


Out[11]:
3035.2796326007801

Ejemplo.-- ¿Cuál será el valor futuro de $ 100, $ 200, $ 300 y $ 400 en 5 años a una tasa de interés del 3% anual?


In [12]:
# uno de los parámetros puede ser un vector
cf.pvfv(pval  =  [100, 200, 300, 400], 
        nper  =  5,
        nrate =  3.0)


Out[12]:
0   -115.927408
1   -231.854815
2   -347.782223
3   -463.709630
dtype: float64

Ejemplo.-- ¿Cuál será el valor futuro de $ 100 en 1, 2, 3 y 4 años a una tasa de interés de 3% anual?


In [13]:
cf.pvfv(pval  =  100, 
        nper  =    [1, 2, 3, 4],
        nrate =    3.0)


Out[13]:
0   -103.000000
1   -106.090000
2   -109.272700
3   -112.550881
dtype: float64

Ejercicio.-- Se compra un propiedad por $ 32000. Si se presenta una depreciación del 2% por año, ¿cuál será el valor de la propiedad al final de 6 años?

Función pvpmt

pvpmt(pmt=None, pval=None, nrate=None, nper=None, pyr=1, noprint=True)

Calcula el parámetro faltante en el siguiente flujo de efectivo.

Nomenclatura para los parámetros:

  • pval -- valor presente.
  • pmt -- pago períodico o anualidad.
  • nper -- cantidad de períodos.
  • nrate -- tasa nominal de interés por año.
  • pyr -- número de períodos por año.

Ejemplo.-- [2, pág. 57] Si se va a realizar un leasing a una tasa nominal de 5.9% y se deben realizar 48 pagos mensuales de $ 450 y un pago inicial de $ 1500 al constituirse el crédito, ¿cuál es el monto del préstamo?


In [14]:
cf.pvpmt(pmt   =  -450,   # pago mensual
         nrate =     5.9, # tasa de interés
         nper  =    48,   # numero de periodos
         pyr   =    12)   # periodos de capitalización por año


Out[14]:
19198.600408593771

In [15]:
_ + 1500


Out[15]:
20698.600408593771

Ejemplo.-- [2, pág. 59] Calcule el pago mensual de una hipoteca por $ 243400 pagada en 348 meses a una tasa nominal de 5.25%.


In [16]:
cf.pvpmt(pval  = 243400,    # monto
         nrate =      5.25, # tasa de interés
         nper  =    348,    # número de períodos
         pyr   =     12)    # períodos de capitalización por año


Out[16]:
-1363.286877407623

Ejemplo.-- [3, pág. 81] Se está financiando la compra de un carro nuevo con un leasing a tres años a una tasa nominal del 10.5%. El precio del carro es de $ 7250. Se debe realizar un pago inicial de $ 1500. ¿Cuánto es el pago mensual si los pagos se hacen al final del mes?


In [17]:
cf.pvpmt(pval  = 5750,  # = 7250 - 1500
         nrate =   10.5,   
         nper  =   36,
         pyr   =   12)


Out[17]:
-186.88905015194922

Ejemplo.-- Para el caso del ejemplo anterior, se desea reducir la cuota mensual en $ 10, ¿cuál tasa de interés debería obtenerse?


In [18]:
cf.pvpmt(pval = 5750,
         pmt  = -176.89,   
         nper =   36,
         pyr  =   12)


Out[18]:
6.7512207241012856

Ejercicio.-- Se hará un préstamo de $ 35000 para la compra de una turbina de generación a gas. Si la tasa nominal es del 10.5% con pagos pagos mensuales de $ 550 al final de cada mes, ¿cuánto tiempo se requiere para cancelar la deuda?

Función pmtfv

pmtfv(pmt=None, fval=None, nrate=None, nper=None, pyr=1, noprint=True)

Calcula el parámetro faltante para el siguiente flujo de efectivo.

Nomenclatura para los parámetros:

  • pmt -- pago períodico.
  • fval -- valor futuro.
  • nper -- cantidad de períodos.
  • nrate -- tasa nominal.
  • pyr -- número de períodos de capitalización por año.

Ejemplo.-- Si al principio de cada mes se ahorran $ 1000, a una tasa nominal del 12% con capitalización mensual, ¿Cuánto se tendrá ahorrado al final del mes 12?


In [19]:
cf.pmtfv(pmt=-1000, nrate=12, nper=12, pyr=12)


Out[19]:
12809.328043328947

Función tvmm

tvmm(pval=None, fval=None, pmt=None, nrate=None, nper=None, due=0, pyr=1, noprint=True)

Esta función calcula el parámetro faltante en el flujo de efectivo especificado por el parámetro due.

Nomenclatura para los parámetros:

  • pval -- valor presente.
  • fval -- valor futuro.
  • pmt -- pago períodico.
  • nper -- cantidad de períodos.
  • nrate -- tasa de interés por período.
  • pyr -- número de períodos por año.
  • due -- momento del período en que se paga la anualidad: 'end' (o 0) indica el pago al final del período; 'begin' (o 1) indica el pago al principio del período.

Ejemplo.-- [2, pág. 55] ¿Qué tasa de interés debe obtenerse para acumular $ 10000 en 32 meses si se hace una inversión de $ 6000? R/ 1.61%


In [20]:
cf.tvmm(pval = -6000,     # depósito inicial
        nper =    32,     # número de períodos
        pmt  =     0,     # pago períodico
        fval = 10000,     # saldo final
        pyr  =    12)     # capitalización mensual


Out[20]:
19.309673922518478

Ejemplo.-- [2, pág. 58] ¿Cuánto se puede pagar por una propiedad que generará un flujo neto anual de $ 17500 durante 5 años, si al final la propiedad se puede vender en $ 540.000? (la tasa nominal de interés es del 12%)


In [21]:
cf.tvmm(pmt   =  17500,   # pago períodico anual
        fval  = 540000,   # valor de venta
        nrate =     12.0, # tasa de interés
        nper  =      5)   # numero de periodos


Out[21]:
-369494.08562908118

Ejemplo.-- ¿Cuál es la amortización para los siguientes préstamos (fval es el pago final residual)?

plazo 5, 5, 6, 7 pval 100, 110, 110, 105 fval -20, -10, -20, 0 tasa 0.020, 0.017, 0.016, 0.017


In [22]:
cf.tvmm(pval  = [ 100,   110,   110,   105   ],
        fval  = [ -20,   -10,   -20,     0   ],         
        nper  = [   5,     5,     6,     7   ], 
        nrate = [   2.0,   1.7,   1.6,   1.7 ])


Out[22]:
0   -17.372672
1   -21.201461
2   -16.171110
3   -16.037190
dtype: float64

Ejercicio.-- Se abre una cuenta hoy con un depósito de $ 775. La tasa nominal es 6.25% con capitalización mensual. ¿Si se desea tener un capital de $ 4000 en 60 meses, ¿Cuánto se debe depositar mensualmente (al final del mes)?

Función amortize

amortize(pval=None, fval=None, pmt=None, nrate=None, nper=None, due=0, pyr=1)

Imprime la tabla de amortizaciones. La llamada a la función retorna un pandas.DataFrame. Esta función usa los mismos parámetros de la función tvmm.

Ejemplo.-- Construya la tabla de amortización (balance) para un préstamo de $ 1000 a 6 meses con pagos mensuales iguales a una tasa de interés del 1% mensual.


In [23]:
cf.amortize(pval=1000, fval=0, pmt=None, nrate=1.0, 
            nper=6, due=0)


Out[23]:
Beg_Balance Payment Interest Principal Final_Balance
0 1000.00 0.00 0.00 0.00 1000.00
1 1000.00 -172.55 10.00 -162.55 837.45
2 837.45 -172.55 8.37 -164.17 673.28
3 673.28 -172.55 6.73 -165.82 507.46
4 507.46 -172.55 5.07 -167.47 339.99
5 339.99 -172.55 3.40 -169.15 170.84
6 170.84 -172.55 1.71 -170.84 0.00

In [24]:
table = cf.amortize(pval=1000, fval=0, pmt=None, nrate=1.0, 
                    nper=6, due=0)

In [25]:
table['Principal']


Out[25]:
0      0.00
1   -162.55
2   -164.17
3   -165.82
4   -167.47
5   -169.15
6   -170.84
Name: Principal, dtype: float64

In [26]:
sum(table['Principal'])


Out[26]:
-1000.0

In [27]:
table['Interest']


Out[27]:
0     0.00
1    10.00
2     8.37
3     6.73
4     5.07
5     3.40
6     1.71
Name: Interest, dtype: float64

In [28]:
table['Interest'].tolist()


Out[28]:
[0.0, 10.0, 8.37, 6.73, 5.07, 3.4, 1.71]

In [29]:
sum(table['Interest'])


Out[29]:
35.280000000000001

In [30]:
table['Payment']


Out[30]:
0      0.00
1   -172.55
2   -172.55
3   -172.55
4   -172.55
5   -172.55
6   -172.55
Name: Payment, dtype: float64

In [31]:
sum(table['Payment'])


Out[31]:
-1035.3

Librería Cashflows

Juan David Velásquez Henao
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia


Haga click aquí para acceder a la última versión online

Haga click aquí para ver la última versión online en nbviewer.


Bibliografía utilizada

  • [1] SAS/ETS 14.1 User's Guide, 2015.
  • [2] hp 12c platinum financial calculator. User's guide.
  • [3] HP Business Consultant II Owner's manual.
  • [4] C.S. Park and G.P. Sharp-Bette. Advanced Engineering Economics. John Wiley & Sons, Inc., 1990.