Notas de clase sobre ingeniería economica avanzada usando Python
Juan David Velásquez Henao
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia
Software utilizado
Este es un documento interactivo escrito como un notebook de Jupyter , en el cual se presenta un tutorial sobre finanzas corporativas usando Python. Los notebooks de Jupyter permiten incoporar simultáneamente código, texto, gráficos y ecuaciones. El código presentado en este notebook puede ejecutarse en los sistemas operativos Linux y OS X.
Haga click aquí para obtener instrucciones detalladas sobre como instalar Jupyter en Windows y Mac OS X.
Descargue la última versión de este documento a su disco duro; luego, carguelo y ejecutelo en línea en Try Jupyter!
>
Bibliografía
- [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.
In [2]:
import cashflows as cf
Permite la deducción de los costos de las inversiones (pérdida de valor de ellas) con el fin de reducir el impuesto de renta.
La depreciación en todos los años es igual.
Ejemplo.-- Un activo cuesta \$ 200 . Si la depreciación ocurre durante 5 años, cuál es su depreciación anual?.
In [6]:
#
# los datos del activo se ingresan como una dupla
# conformada asi: (costo, vida util)
costs = cf.cashflow(const_value=0, nper=15, spec=[(1, 200), (7, 200)]) # Costo del
life = cf.cashflow(const_value=0, nper=15, spec=[(1, 5), (7,3)])
#
# 'SL' indica la depreciación en linea recta
# (cost, life)
cf.depreciation_sl(costs=costs, life=life,noprint=False)
#
# el resultado se imprime en forma de tabla:
#
# * Beg. Book Value -- representa el valor total de los activos al inicio del periodo
# * Cost -- Costo en activos en el periodo
# * Depre -- depreciación total para el periodo t
# * Accum. Depre --- depreciación acumulada por periodo
# * End.Book Value -- valor final de los activos al final del periodo
En este método de depreciación se hace mayor al principio y más pequeña al final. Se basa en la progresión desde $N$ hasta 1.
Ejemplo.-- Calcule la depreciación por el método de la suma de los dígitos de los años para el activo del ejemplo anterior.
In [7]:
## 'SOYD' -- sum of year's digits
cf.depreciation_soyd(costs=costs, life=life,noprint=False) # (cost, life)
# noprint es para imprimir la tabla cuando se indica False
In [8]:
##
## es posible obtener la columna 'depreciation' como un flujo de efectivo teniendo en cuenta los periodos anuales y
## en cuales periodos se reflejaran los costos
##
costs = cf.cashflow(const_value=0,
nper=16,
spec=[(0, 1000), (8, 1000)],
pyr=4)
life = cf.cashflow(const_value=0,
nper=16,
spec=[(0, 4), (8, 4)],
pyr=4)
delay22 = cf.cashflow(const_value=0,
nper=16,
spec=[(0, 2), (8, 2)],
pyr=4)
cf.depreciation_sl(costs=costs,
life=life,
delay=delay22)
Out[8]:
In [75]:
##
## es posible obtener la tabla de depreciación
##
cf.depreciation_sl(costs=costs, life=life, delay=delay22, noprint=False)
Caso 1: sin depreciación.
In [10]:
# crea el flujo de caja
i = cf.cashflow(const_value=[500]*5) # ingresos brutos: $ 500 por periodo
g = cf.cashflow(const_value=[250]*5) # gastos operativos: $ 250 por periodo
x = i-g # ingreso antes de impuestos
x
Out[10]:
In [11]:
x = x - cf.after_tax_cashflow(x, tax_rate = cf.nominal_rate(const_value=[35] * 5)) # impuesto de renta del 35%
x # ingreso despues de impuestos
Out[11]:
Caso 2: depreciación en linea recta.
In [14]:
## considere un activo depreciable
d = cf.depreciation_sl(costs=cf.cashflow(const_value=0, nper=5, spec=(0, 200)),
life=cf.cashflow(const_value=0, nper=5, spec=(0, 5)),
noprint=True)
d
Out[14]:
In [15]:
# crea el flujo de caja
i = cf.cashflow(const_value=[500]*5) # ingresos brutos: $ 500 por periodo
g = cf.cashflow(const_value=[250]*5) # gastos operativos: $ 250 por periodo
x = i-g # ingreso antes de impuestos
x
Out[15]:
In [16]:
x = x - d # depreciacion
x # ingreso antes de impuestos
Out[16]:
In [17]:
x = x - cf.after_tax_cashflow(x, tax_rate = cf.nominal_rate(const_value=[35] * 5)) # impuesto de renta del 35%
x # ingreso despues de impuestos
Out[17]:
In [19]:
x + d # flujo de caja
Out[19]:
Note que en el resultado anterior el ingreso después de impuestos es mayor que en el caso 1.
Caso 2: depreciación acelerada.
In [21]:
## activo depreciable
costs=cf.cashflow(const_value=0, nper=5, spec=(0, 200))
life=cf.cashflow(const_value=0, nper=5, spec=(0, 5))
d =cf.depreciation_soyd(costs=costs, life=life)
d
Out[21]:
In [22]:
# crea el flujo de caja
i = cf.cashflow(const_value=[500]*5) # ingresos brutos: $ 500 por periodo
g = cf.cashflow(const_value=[250]*5) # gastos operativos: $ 250 por periodo
x = i-g # ingreso antes de impuestos
x
Out[22]:
In [23]:
x = x - d # depreciacion
x # ingreso antes de impuestos
Out[23]:
In [24]:
x = x - cf.after_tax_cashflow(x, tax_rate = cf.nominal_rate(const_value=[35] * 5)) # impuesto de renta del 35%
x # ingreso despues de impuestos
Out[24]:
In [25]:
x + d # flujo de caja
Out[25]:
Ejercicio.-- Construya el balance para 12 meses, si habre una cuenta de ahorro que paga el 2% mensual, y hace 12 depósitos de \$ 100 (puede usar Microsoft Excel).
In [ ]:
Ejercicio.-- Para el ejercicio anterior, cuánto es la suma de los intereses aritmética de los intereses recibidos?
In [ ]:
Ejercicio.-- Construya el balance para 12 meses, si usted tiene una cuenta de ahorro que paga el 2% mensual con un capital inicial de \$ 1000, y hace retiros mensuales de \$ 100 iniciando hoy (puede usar Microsoft Excel).
In [ ]:
Ejercicio.-- Para el ejercicio anterior, cuánto es la suma de los intereses aritmética de los intereses recibidos?
In [ ]:
cashflows
permite el modelado de cuentas de ahorro (e intrumentos financieros similares).
Ejemplo.-- Construya el balance para 12 meses, si habre una cuenta de ahorro que paga el 2% mensual, y hace 13 depósitos de \$ 100 (con el primer depósito se abre la cuenta).
In [35]:
cflo = cf.cashflow(const_value=[100] * 13)
cflo
Out[35]:
In [36]:
nrate = cf.nominal_rate([2] * 13)
nrate
Out[36]:
In [37]:
cf.savings(deposits = cflo, # deposito periodico
initbal = 0, # balance inicial
rate = nrate, # tasa de interes mensual
noprint = False) # imprime la tabla
In [38]:
x, y = cf.savings(deposits = cflo, # deposito periodico
initbal = 0, # balance inicial
rate = nrate, # tasa de interes mensual
noprint = True) # no imprime la tabla
In [42]:
## intereses como lista
x
Out[42]:
In [40]:
y # balance final
Out[40]:
Ejemplo.-- Realice el mismo ejemplo anterior, pero considerando que la tasa de interes es del 4% a partir de $t$ = 5.
In [44]:
nrate= cf.nominal_rate(const_value=[2] * 13,spec=(5,4))
cflo = cf.cashflow(const_value=[100] * 13)
x = cf.savings(deposits = cflo, # deposito periodico
initbal = 0, # balance inicial
rate = nrate, # tasa de interes mensual
noprint = False)
Ejemplo.-- Se tiene una cuenta con un saldo inicial de \$ 100. Se hacen depósitos al final de cada trimestre por \$ 50 (se hará el primer depósito en 3 meses). La tasa de interés es del 2% mensual y cambiará a 1% a partir del 13avo mes (incluido). Cuál será el saldo al final de mes 24?.
In [152]:
nrate= cf.nominal_rate(const_value=[2] * 25,spec=(13,1))
cflo = cf.cashflow(const_value=0, nper=25, spec=[(t*3,50) for t in range(1,9)] )
x = cf.savings(deposits = cflo, # deposito periodico
initbal = 100, # balance inicial
rate = nrate, # tasa de interes mensual
noprint = False)
Este es un tipo de préstamo en que se pagan únicamente intereses durante la vida del crédito; con la última cuota se paga el capital.
En el siguiente ejemplo se usa cashflow
para modelar un préstamo de \$ 1000 a una tasa de interés del 10% y una duración de 10 periodos de tiempo.
In [159]:
nrate = cf.nominal_rate(const_value=10, nper=11)
x=cf.bullet_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=None)
x
Out[159]:
In [160]:
##
## todos los tipos de créditos tiene funciones
## para obtener las columnas de la tabla de
## amortizacion como un flujo de efectivo
##
x.intpmt
Out[160]:
In [161]:
sum(x.intpmt)
Out[161]:
In [163]:
x.ppalpmt ## pagos a capital
Out[163]:
In [164]:
x.begppalbal ## balance inicial del periodo
Out[164]:
In [165]:
x.endppalbal ## balance final del periodo
Out[165]:
In [168]:
##
## se admiten el prepago de la deuda sin penalizacion
## a continuación se modela un prepago de deuda de $ 500 en t = 5
##
nrate = cf.nominal_rate(const_value=10, nper=11)
x=cf.bullet_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=cf.cashflow(const_value=0, nper=11,spec=(5,500)))
x
Out[168]:
In [170]:
##
## Si el prepago de deuda es superior al monto,
## se ajusta al saldo
##
nrate = cf.nominal_rate(const_value=10, nper=11)
x=cf.bullet_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=cf.cashflow(const_value=0, nper=11,spec=(5,5000)))
x
Out[170]:
In [174]:
##
## este tipo de crédito admite una tasa de interés variable
##
nrate = cf.nominal_rate(const_value=10, nper=11, spec=(6,8)) # cambia en el periodo 6
x=cf.bullet_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=None)
x
Out[174]:
In [175]:
##
## Este tipo es similar a las anteriores, pero siempre
## se abona la misma cantidad a capital. El pago periodico
## es igual al abono a capital más el interés sobre saldos.
##
nrate = cf.nominal_rate(const_value=10, nper=11)
cf.fixed_ppal_loan(amount=1000,
nrate=nrate,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=None)
Out[175]:
In [176]:
##
## periodo de gracia de 3
##
nrate = cf.nominal_rate(const_value=10, nper=11)
cf.fixed_ppal_loan(amount=1000,
nrate=nrate,
grace=3,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=None)
Out[176]:
In [177]:
##
## este tipo de crédito admite una tasa de interés variable
##
nrate = cf.nominal_rate(const_value=10, nper=11, spec=(6,8)) # cambia en el periodo 6
cf.fixed_ppal_loan(amount=1000,
nrate=nrate,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=None)
Out[177]:
In [180]:
##
## este tipo de crédito admite pagos adicionales programados
## como abono a la deuda
##
nrate = cf.nominal_rate(const_value=10, nper=11)
cf.fixed_ppal_loan(amount=1000,
nrate=nrate,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=cf.cashflow(const_value=0, nper = 11, spec=(5, 500)))
Out[180]:
In [181]:
##
## este tipo de crédito admite una tasa de interés variable
##
nrate = cf.nominal_rate(const_value=10, nper=11,spec=(6,8)) # cambia en el periodo 6
cf.fixed_ppal_loan(amount=1000,
nrate=nrate,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=cf.cashflow(const_value=0, nper = 11, spec=(5, 500)))
Out[181]:
In [183]:
##
## ejemplo anterior con periodo de gracia
##
nrate = cf.nominal_rate(const_value=10, nper=11,spec=(6,8)) # cambia en el periodo 6
cf.fixed_ppal_loan(amount=1000,
nrate=nrate,
grace=5,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=cf.cashflow(const_value=0, nper = 11, spec=(5, 500)))
Out[183]:
En este tipo de créditos el pago se realiza en cuotas fijas. La tasa de interés es fija (no cambia en el tiempo). En el siguiente ejemplo se modela un préstamo de \$ 1000 a un plazo de 10 años y una tasa del 10%.
In [211]:
cf.fixed_rate_loan(amount=1000, # monto
nrate=10, # tasa de interés por periodo
life=10, # número de cuotas
start=None,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=None)
Out[211]:
In [238]:
##
## en éste tipo de crédito es posible considerar pagos adicionales
## a los pagos periodicos con el fin de disminuir el monto periodico
## en el siguiente ejemplo se supone pagos de \$ 200
## en los periodos 5 y 10
##
cf.fixed_rate_loan(amount=1000, # monto
nrate=10, # tasa de interés por periodo
life=10, # número de cuotas
start=None,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=cf.cashflow(const_value=0,nper=11,spec=[(5,200),(10,200)]))
Out[238]:
In [239]:
##
## este tipo de créditos tambien admiten el prepago de deuda
## a continuación se modela el caso anterior con un prepago
## de $ 100 en los periodos 3 y 7
##
pmt = cf.cashflow(const_value=0, nper = 11, spec=[(3, 100),(7, 100)])
cf.fixed_rate_loan(amount=1000, # monto
nrate=10, # tasa de interés por periodo
life=10, # número de cuotas
start=None,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=pmt,
balloonpmt=cf.cashflow(const_value=0,nper=11,spec=[(5,200),(10,200)]))
Out[239]:
In [240]:
##
## un crédito bullet puede modelarse como balloon
## usando un prepago igual al monto de la deuda
##
cf.fixed_rate_loan(amount=1000, # monto
nrate=10, # tasa de interés por periodo
life=10, # número de cuotas
start=None,
grace=0,
dispoints=0,
orgpoints=0,
prepmt=None,
balloonpmt=cf.cashflow(const_value=0,nper=11,spec=(10,1000)))
Out[240]:
Este tipo de préstamo es similar a los préstamos de cuota fija (balloon loans) pero con tasa cambiante en el tiempo. No admiten cuotas adicionales para reducir el pago fijo periodico. Cuando hay un cambio en la tasa de interés, el pago periodico total se recalcula para reflejar el cambio de tasa de interés.
In [243]:
##
## los resultados son iguales a un crédito balloon
##
nrate = cf.nominal_rate(const_value=10, nper=11)
cf.buydown_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=None)
Out[243]:
In [244]:
##
## cambios en la tasa de interés
##
nrate = cf.nominal_rate(const_value=10, nper=11,spec=(5,5))
cf.buydown_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=None)
Out[244]:
In [245]:
##
## se introducen 2 prepagos por $ 100 cada uno
## en t = 3, 6
##
nrate = cf.nominal_rate(const_value=10, nper=11)
cf.buydown_loan(amount=1000,
nrate=nrate,
dispoints=0,
orgpoints=0,
prepmt=cf.cashflow(const_value=0,nper=11,spec=[(3,100),(6,100)]))
Out[245]:
Ejercicio.-- Verifique manualmente todos los cálculos realizados para los diferentes tipos de créditos.
In [ ]: