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.)?
La instalación de la librería puede realizarse usando pip:
pip install cashflows
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.
La documentación de la libraría puede consultarse en:
 http://cashflows.readthedocs.io/en/latest/
Para cargar la librería use:
import cashflows as cf
La librería está desarrollada en Python 3.6. No hay compatibilidad para Python 2.x.
In [1]:
    
import cashflows as cf
    
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.
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]:
In [4]:
    
pow(1+0.0670/4, 4) - 1 ## tasa efectiva anual para el Banco #2 
                       ## tasa mas favorable
    
    Out[4]:
In [5]:
    
pow(1+0.0665/12, 12) - 1 ## tasa efectiva anual para el Banco #3
    
    Out[5]:
iconviconv(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í:
nrate retorna (erate, prate).erate retorna (nrate, prate).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]:
In [3]:
    
cf.iconv(nrate = 6.70, pyr =  4)  ## Banco 2 6.70% comp trimestralmente
    
    Out[3]:
In [4]:
    
cf.iconv(nrate = 6.65, pyr = 12)  ## Banco 3: 6.65% comp mensualmente
    
    Out[4]:
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]:
pvfvpvfv(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:
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]:
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]:
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]:
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]:
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?
pvpmtpvpmt(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]:
In [15]:
    
_ + 1500
    
    Out[15]:
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]:
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]:
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]:
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?
pmtfvpmtfv(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]:
tvmmtvmm(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]:
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]:
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]:
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)?
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]:
In [24]:
    
table = cf.amortize(pval=1000, fval=0, pmt=None, nrate=1.0, 
                    nper=6, due=0)
    
In [25]:
    
table['Principal']
    
    Out[25]:
In [26]:
    
sum(table['Principal'])
    
    Out[26]:
In [27]:
    
table['Interest']
    
    Out[27]:
In [28]:
    
table['Interest'].tolist()
    
    Out[28]:
In [29]:
    
sum(table['Interest'])
    
    Out[29]:
In [30]:
    
table['Payment']
    
    Out[30]:
In [31]:
    
sum(table['Payment'])
    
    Out[31]: