Representación de flujos de efectivo y tasas de interés

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.


Preparación


In [1]:
# Importa la librería financiera.
# Solo es necesario ejecutar la importación una sola vez.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cashflows as cf

Función interest_rate

interest_rate(const_value=0, start=None, end=None, periods=None, freq='A', chgpts=None)

Crea una serie de tiempo que representa una tasa de interés.

  • const_value -- valor por defecto de la tasa de interés.
  • start-- período de tiempo inicial.
  • end -- período de tiempo final.
  • periods-- número de períodos (longitud de la serie).
  • chgpts -- especificación de cambios en la tasa de interés.

In [2]:
cf.interest_rate(const_value=10,    # tasa de interés
                 start='2000Q1',    # primer trimestre del año 2000
                 periods=8,         # 8 trimestres
                 freq='Q')          # 4 períodos por año


Out[2]:
2000Q1    10.0
2000Q2    10.0
2000Q3    10.0
2000Q4    10.0
2001Q1    10.0
2001Q2    10.0
2001Q3    10.0
2001Q4    10.0
Freq: Q-DEC, dtype: float64

In [3]:
cf.interest_rate(const_value=10,    # valor por defecto
                 start='2000Q1',    # primer bimestre del año 2000 
                 periods=8,         # 8 bimestres
                 freq='Q')          # 6 bimestres por año


Out[3]:
2000Q1    10.0
2000Q2    10.0
2000Q3    10.0
2000Q4    10.0
2001Q1    10.0
2001Q2    10.0
2001Q3    10.0
2001Q4    10.0
Freq: Q-DEC, dtype: float64

In [4]:
cf.interest_rate(const_value=1,        # valor por defecto  
                 start='2000Q1',      # primer trimestre del año 2000
                 periods=8,               # ocho trimestres de longitud
                 freq='Q',                # capitalización trimestral
                 chgpts={'2000Q3':10}) # cambia en el 4to trimestre a 10


Out[4]:
2000Q1     1.0
2000Q2     1.0
2000Q3    10.0
2000Q4    10.0
2001Q1    10.0
2001Q2    10.0
2001Q3    10.0
2001Q4    10.0
Freq: Q-DEC, dtype: float64

In [5]:
cf.interest_rate(const_value=1,          # valor por defecto  
                 start='2000Q1',         # primer trimestre del año 2000
                 periods=8,              # ocho trimestres de longitud
                 freq='Q',               # capitalización trimestral
                 chgpts={3:10,           # cambia en el 3r trimestre a 10 
                         6:20})          # y en el 7to a 20


Out[5]:
2000Q1     1.0
2000Q2     1.0
2000Q3     1.0
2000Q4    10.0
2001Q1    10.0
2001Q2    10.0
2001Q3    20.0
2001Q4    20.0
Freq: Q-DEC, dtype: float64

In [6]:
cf.interest_rate(const_value=1,          # valor por defecto  
                 start='2000Q1',         # primer trimestre del año 2000
                 periods=8,              # ocho trimestres de longitud
                 freq='Q',               # capitalización trimestral
                 chgpts={'2000Q4':10,           # cambia en el 3r trimestre a 10 
                         '2001Q3':20})          # y en el 7to a 20


Out[6]:
2000Q1     1.0
2000Q2     1.0
2000Q3     1.0
2000Q4    10.0
2001Q1    10.0
2001Q2    10.0
2001Q3    20.0
2001Q4    20.0
Freq: Q-DEC, dtype: float64

In [7]:
cf.interest_rate(const_value=[10, 20]*10, # especificación como un vector 
                 start='2000Q1',
                 freq='Q')                   # capitalización trimestral


Out[7]:
2000Q1    10.0
2000Q2    20.0
2000Q3    10.0
2000Q4    20.0
2001Q1    10.0
2001Q2    20.0
2001Q3    10.0
2001Q4    20.0
2002Q1    10.0
2002Q2    20.0
2002Q3    10.0
2002Q4    20.0
2003Q1    10.0
2003Q2    20.0
2003Q3    10.0
2003Q4    20.0
2004Q1    10.0
2004Q2    20.0
2004Q3    10.0
2004Q4    20.0
Freq: Q-DEC, dtype: float64

Ejemplo.-- Se va a tomar un crédito a 48 meses a partir de enero del 2000. La tasa inicial es del 3% y aumenta un punto cada año. Represente la tasa de interés.


In [8]:
cf.interest_rate(const_value=3,        # valor por defecto
                 start='2000-01',      # primer mes del año 2000
                 periods=48,           # longitud de la serie
                 freq='M',             # capitalización mensual
                 chgpts={'2001-01':4,  # tasa para el año 2
                         '2002-01':5,  # tasa para el año 3
                         '2003-01':6}) # tasa para el año 4


Out[8]:
2000-01    3.0
2000-02    3.0
2000-03    3.0
2000-04    3.0
2000-05    3.0
2000-06    3.0
2000-07    3.0
2000-08    3.0
2000-09    3.0
2000-10    3.0
2000-11    3.0
2000-12    3.0
2001-01    4.0
2001-02    4.0
2001-03    4.0
2001-04    4.0
2001-05    4.0
2001-06    4.0
2001-07    4.0
2001-08    4.0
2001-09    4.0
2001-10    4.0
2001-11    4.0
2001-12    4.0
2002-01    5.0
2002-02    5.0
2002-03    5.0
2002-04    5.0
2002-05    5.0
2002-06    5.0
2002-07    5.0
2002-08    5.0
2002-09    5.0
2002-10    5.0
2002-11    5.0
2002-12    5.0
2003-01    6.0
2003-02    6.0
2003-03    6.0
2003-04    6.0
2003-05    6.0
2003-06    6.0
2003-07    6.0
2003-08    6.0
2003-09    6.0
2003-10    6.0
2003-11    6.0
2003-12    6.0
Freq: M, dtype: float64

In [9]:
x = cf.interest_rate(const_value=3,     # valor por defecto
                     start='2000-1',    # primer mes del año 2000
                     periods=48,        # longitud de la serie
                     freq='M',          # capitalización mensual
                     chgpts={12:4,      # tasa para el año 2
                             24:5,      # tasa para el año 3
                             36:6})     # tasa para el año 4

# se cambia el valor de la serie en este punto
x[5] = 10                          
x


Out[9]:
2000-01     3.0
2000-02     3.0
2000-03     3.0
2000-04     3.0
2000-05     3.0
2000-06    10.0
2000-07     3.0
2000-08     3.0
2000-09     3.0
2000-10     3.0
2000-11     3.0
2000-12     3.0
2001-01     4.0
2001-02     4.0
2001-03     4.0
2001-04     4.0
2001-05     4.0
2001-06     4.0
2001-07     4.0
2001-08     4.0
2001-09     4.0
2001-10     4.0
2001-11     4.0
2001-12     4.0
2002-01     5.0
2002-02     5.0
2002-03     5.0
2002-04     5.0
2002-05     5.0
2002-06     5.0
2002-07     5.0
2002-08     5.0
2002-09     5.0
2002-10     5.0
2002-11     5.0
2002-12     5.0
2003-01     6.0
2003-02     6.0
2003-03     6.0
2003-04     6.0
2003-05     6.0
2003-06     6.0
2003-07     6.0
2003-08     6.0
2003-09     6.0
2003-10     6.0
2003-11     6.0
2003-12     6.0
Freq: M, dtype: float64

cashflow(const_value=0, start=None, end=None, periods=None, freq='A')

Crea una serie de tiempo que representa un flujo genérico de efectivo.

  • const_value -- valor por defecto.
  • start-- período de tiempo inicial.
  • end -- período de tiempo final.
  • periods-- número de períodos (longitud de la serie).
  • freq-- número de períodos de capitalización por año.

In [10]:
cf.cashflow(const_value=1,   # valor constante
            start='2000Q1',  # fecha inicial
            periods=8,       # número total de períodos
            freq='Q')        # número de períodos por año


Out[10]:
2000Q1    1.0
2000Q2    1.0
2000Q3    1.0
2000Q4    1.0
2001Q1    1.0
2001Q2    1.0
2001Q3    1.0
2001Q4    1.0
Freq: Q-DEC, dtype: float64

In [11]:
## es posible alterar y acceder a valores individuales 
## para cada período de tiempo usando []
x = cf.cashflow(const_value=[0, 1, 2, 3], start='2000Q1', freq='Q')  
x[3] = 10                                         
x


Out[11]:
2000Q1     0.0
2000Q2     1.0
2000Q3     2.0
2000Q4    10.0
Freq: Q-DEC, dtype: float64

In [12]:
x[3]


Out[12]:
10.0

In [13]:
x['2000Q4'] = 0
x


Out[13]:
2000Q1    0.0
2000Q2    1.0
2000Q3    2.0
2000Q4    0.0
Freq: Q-DEC, dtype: float64

In [14]:
x['2000Q4']


Out[14]:
0.0

In [15]:
## función valor absoluto
abs(cf.cashflow(const_value=[-10]*4,  
                start='2000Q1', 
                freq='Q'))


Out[15]:
2000Q1    10.0
2000Q2    10.0
2000Q3    10.0
2000Q4    10.0
Freq: Q-DEC, dtype: float64

Operaciones entre flujos genéricos de efectivo


In [16]:
x = cf.cashflow(const_value=[1]*4, start='2000Q1', freq='Q')
y = cf.cashflow(const_value=[2]*4, start='2000Q1', freq='Q')

In [17]:
x + y


Out[17]:
2000Q1    3.0
2000Q2    3.0
2000Q3    3.0
2000Q4    3.0
Freq: Q-DEC, dtype: float64

In [18]:
x * y


Out[18]:
2000Q1    2.0
2000Q2    2.0
2000Q3    2.0
2000Q4    2.0
Freq: Q-DEC, dtype: float64

In [19]:
x - y


Out[19]:
2000Q1   -1.0
2000Q2   -1.0
2000Q3   -1.0
2000Q4   -1.0
Freq: Q-DEC, dtype: float64

In [20]:
x // y


Out[20]:
2000Q1    0.0
2000Q2    0.0
2000Q3    0.0
2000Q4    0.0
Freq: Q-DEC, dtype: float64

In [21]:
x.cumsum()


Out[21]:
2000Q1    1.0
2000Q2    2.0
2000Q3    3.0
2000Q4    4.0
Freq: Q-DEC, dtype: float64

Asignación


In [22]:
x = cf.cashflow( const_value=[2]*4, start='2000Q1', freq='Q')
x += cf.cashflow( const_value=[3]*4, start='2000Q1', freq='Q')
x


Out[22]:
2000Q1    5.0
2000Q2    5.0
2000Q3    5.0
2000Q4    5.0
Freq: Q-DEC, dtype: float64

In [23]:
x = cf.cashflow( const_value=[6]*4, start='2000Q1', freq='Q')
x //= cf.cashflow( const_value=[4]*4, start='2000Q1',freq='Q')
x


Out[23]:
2000Q1    1.0
2000Q2    1.0
2000Q3    1.0
2000Q4    1.0
Freq: Q-DEC, dtype: float64

In [24]:
x = cf.cashflow( const_value=[2]*4, start='2000Q1', freq='Q')
x *= cf.cashflow( const_value=[3]*4, start='2000Q1', freq='Q')
x


Out[24]:
2000Q1    6.0
2000Q2    6.0
2000Q3    6.0
2000Q4    6.0
Freq: Q-DEC, dtype: float64

In [25]:
x = cf.cashflow( const_value=[6]*4, start='2000Q1', freq='Q')
x -= cf.cashflow( const_value=[4]*4, start='2000Q1', freq='Q')
x


Out[25]:
2000Q1    2.0
2000Q2    2.0
2000Q3    2.0
2000Q4    2.0
Freq: Q-DEC, dtype: float64

In [26]:
## suma de dos series con diferente longitud
x = cf.cashflow([100]*12, start='2000Q1', freq='Q')
y = cf.cashflow([100]*12, start='2001Q1', freq='Q')
x + y


Out[26]:
2000Q1      NaN
2000Q2      NaN
2000Q3      NaN
2000Q4      NaN
2001Q1    200.0
2001Q2    200.0
2001Q3    200.0
2001Q4    200.0
2002Q1    200.0
2002Q2    200.0
2002Q3    200.0
2002Q4    200.0
2003Q1      NaN
2003Q2      NaN
2003Q3      NaN
2003Q4      NaN
Freq: Q-DEC, dtype: float64

In [27]:
z = cf.cashflow([0]*24, start='1999Q1', freq='Q')
z


Out[27]:
1999Q1    0.0
1999Q2    0.0
1999Q3    0.0
1999Q4    0.0
2000Q1    0.0
2000Q2    0.0
2000Q3    0.0
2000Q4    0.0
2001Q1    0.0
2001Q2    0.0
2001Q3    0.0
2001Q4    0.0
2002Q1    0.0
2002Q2    0.0
2002Q3    0.0
2002Q4    0.0
2003Q1    0.0
2003Q2    0.0
2003Q3    0.0
2003Q4    0.0
2004Q1    0.0
2004Q2    0.0
2004Q3    0.0
2004Q4    0.0
Freq: Q-DEC, dtype: float64

In [28]:
z[x.index] += x
z


Out[28]:
1999Q1      0.0
1999Q2      0.0
1999Q3      0.0
1999Q4      0.0
2000Q1    100.0
2000Q2    100.0
2000Q3    100.0
2000Q4    100.0
2001Q1    100.0
2001Q2    100.0
2001Q3    100.0
2001Q4    100.0
2002Q1    100.0
2002Q2    100.0
2002Q3    100.0
2002Q4    100.0
2003Q1      0.0
2003Q2      0.0
2003Q3      0.0
2003Q4      0.0
2004Q1      0.0
2004Q2      0.0
2004Q3      0.0
2004Q4      0.0
Freq: Q-DEC, dtype: float64

In [29]:
z[y.index] += y
z


Out[29]:
1999Q1      0.0
1999Q2      0.0
1999Q3      0.0
1999Q4      0.0
2000Q1    100.0
2000Q2    100.0
2000Q3    100.0
2000Q4    100.0
2001Q1    200.0
2001Q2    200.0
2001Q3    200.0
2001Q4    200.0
2002Q1    200.0
2002Q2    200.0
2002Q3    200.0
2002Q4    200.0
2003Q1    100.0
2003Q2    100.0
2003Q3    100.0
2003Q4    100.0
2004Q1      0.0
2004Q2      0.0
2004Q3      0.0
2004Q4      0.0
Freq: Q-DEC, dtype: float64

In [30]:
## convierte el flujo a una lista
cf.cashflow(const_value=[6]*4, start='2000Q1', freq='Q').tolist()


Out[30]:
[6.0, 6.0, 6.0, 6.0]

En algunos casos es necesario introducir patrones de flujo más complejos.


In [31]:
cf.cashflow(const_value=[0, 1, 2, 2, 4, 5, 6, 7, 8],  start='2000Q1', freq='Q')


Out[31]:
2000Q1    0.0
2000Q2    1.0
2000Q3    2.0
2000Q4    2.0
2001Q1    4.0
2001Q2    5.0
2001Q3    6.0
2001Q4    7.0
2002Q1    8.0
Freq: Q-DEC, dtype: float64

In [32]:
cflo = cf.cashflow(const_value=0, 
                start='2000',
                periods=15, 
                freq='A')

cflo[5:10] = 100
cflo


Out[32]:
2000      0.0
2001      0.0
2002      0.0
2003      0.0
2004      0.0
2005    100.0
2006    100.0
2007    100.0
2008    100.0
2009    100.0
2010      0.0
2011      0.0
2012      0.0
2013      0.0
2014      0.0
Freq: A-DEC, dtype: float64

In [33]:
cflo = cf.cashflow(const_value=0, 
                start='2000',
                periods=15, 
                freq='A')
cflo[0:5]   = 100
cflo[5:10]  = 150
cflo[10:15] = 200
cflo


Out[33]:
2000    100.0
2001    100.0
2002    100.0
2003    100.0
2004    100.0
2005    150.0
2006    150.0
2007    150.0
2008    150.0
2009    150.0
2010    200.0
2011    200.0
2012    200.0
2013    200.0
2014    200.0
Freq: A-DEC, dtype: float64

In [34]:
## gradiente geometrico
cflo = cf.cashflow(const_value=0, 
                start='2000',
                periods=15, 
                freq='A')
cflo[5:10] = [100 * 1.05 ** (t-5) for t in range(5,10)]
cflo


Out[34]:
2000      0.000000
2001      0.000000
2002      0.000000
2003      0.000000
2004      0.000000
2005    100.000000
2006    105.000000
2007    110.250000
2008    115.762500
2009    121.550625
2010      0.000000
2011      0.000000
2012      0.000000
2013      0.000000
2014      0.000000
Freq: A-DEC, dtype: float64

In [35]:
cflo[4:11] += 200
cflo


Out[35]:
2000      0.000000
2001      0.000000
2002      0.000000
2003      0.000000
2004    200.000000
2005    300.000000
2006    305.000000
2007    310.250000
2008    315.762500
2009    321.550625
2010    200.000000
2011      0.000000
2012      0.000000
2013      0.000000
2014      0.000000
Freq: A-DEC, dtype: float64

In [36]:
cflo.plot.barh()
plt.grid(True)
plt.show()



In [37]:
cflo.plot.barh(figsize=(3,10))
plt.grid(True)
plt.show()



In [38]:
cflo.plot.bar(figsize=(10, 4), ylim=(-max(abs(cflo)), max(abs(cflo))))
plt.grid(True)
plt.xlabel('Años')
plt.ylabel('Millones de $')
plt.show()



In [39]:
cf.textplot(cflo)


time    value +------------------+------------------+
2000     0.00                    *
2001     0.00                    *
2002     0.00                    *
2003     0.00                    *
2004   200.00                    ************
2005   300.00                    ******************
2006   305.00                    ******************
2007   310.25                    *******************
2008   315.76                    *******************
2009   321.55                    ********************
2010   200.00                    ************
2011     0.00                    *
2012     0.00                    *
2013     0.00                    *
2014     0.00                    *

Ejercicio.-- Represente los siguientes flujos de fondos y luego cómpute y grafique su suma.

Representación de flujos de efectivo y tasas de interés

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.