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]:
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í:
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]:
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:
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?
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]:
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?
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]:
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]:
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]: