Un euro mañana no es un euro hoy
Si puedes ganar un 5 % anual, 100 hoy se convierten en 105 dentro de un año. Así que 105 prometidos dentro de un año valen solo 100 hoy. Eso es descontar: convertir una cantidad futura en su valor actual quitando el interés que podría haber ganado. Para una tasa anual r y t años, VA = cash / (1 + r) ** t. Todo bono, préstamo, anualidad y pensión se valora así, lo que lo convierte en la base de la renta fija y de la valoración de opciones en los próximos temas.
def present_value(cash, rate, years):
return cash / (1 + rate) ** years
print(round(present_value(100, 0.05, 3), 4)) # 86.3838 100 received in 3 years, worth 86.38 today
print(round(present_value(100, 0.05, 0), 4)) # 100.0 no waiting, no discount
print(round(present_value(100, 0.10, 3), 4)) # 75.1315 a higher rate discounts harderValor actual neto
Las inversiones reales pagan en flujos: un bono paga cupones y un principal final, un proyecto cuesta dinero ahora y lo devuelve a lo largo de los años. El valor actual neto (VAN) descuenta cada flujo según su propio momento y los suma. Lista los flujos con el primero en el momento 0, de modo que los momentos son 0, 1, 2, ... (np.arange(len(flows))), y descuenta todo el array en una llamada. Un VAN positivo significa que la inversión rinde más que la tasa de descuento; negativo, que rinde menos. Al subir la tasa, el VAN baja.
import numpy as np
flows = np.array([-100.0, 30.0, 40.0, 50.0]) # pay 100 now, receive 30, 40 and 50 over the next three years
times = np.arange(len(flows)) # 0, 1, 2, 3
for rate in (0.08, 0.12, 0.20):
print(rate, round((flows / (1 + rate) ** times).sum(), 3))
# 0.08 1.763 positive: worth doing at 8%
# 0.12 -5.738 negative: not at 12%
# 0.2 -18.287 the higher the rate, the lower the NPVCapitalizar hacia delante y tasas continuas
Ir hacia delante es la imagen especular: VF = PV * (1 + r) ** t. Si el interés se paga m veces al año a la tasa cotizada r, cada periodo gana r / m y hay m * t periodos: VF = PV * (1 + r / m) ** (m * t). Un pago más frecuente crece algo más: 100 al 5 % pasan a 105,00 anual, 105,12 mensual, 105,13 diario. En el límite del pago continuo el factor de crecimiento es exp(r * t) y el de descuento exp(-r * t), la forma usada en la valoración de opciones porque se multiplica bien en el tiempo.
import math
for m in (1, 2, 12, 365):
print(m, round(100 * (1 + 0.05 / m) ** (m * 1), 4))
# 1 105.0
# 2 105.0625
# 12 105.1162
# 365 105.1267
print(round(100 * math.exp(0.05), 4)) # 105.1271 continuous compounding, the limit
print(round(math.exp(-0.05 * 3), 5)) # 0.86071 the continuous discount factor for 3 years
print(round(100 * (1 + 0.05 / 12) ** (12 * 3), 3)) # 116.147 100 grows for 3 years with monthly interest# How long to double the money at 5%? Exactly ln 2 / ln 1.05, roughly 72 / 5
print(round(math.log(2) / math.log(1.05), 2), round(72 / 5, 1)) # 14.21 14.4ln(1 + r) o exp(r) - 1 al pasar de una convención a otra.VA = cash / (1 + r) ** t: el dinero posterior vale menos; una tasa mayor descuenta más.- VAN = suma de los flujos descontados, el primero en el momento 0:
(flows / (1 + r) ** np.arange(n)).sum(); positivo = vale la pena. VF = PV * (1 + r / m) ** (m * t); continuo: crecimientoexp(r * t), descuentoexp(-r * t); indica siempre la convención.
A continuación: los precios de los bonos, descontar un flujo de cupones y un principal final a una tasa de mercado.
Lab: qué se califica
- Traer un pago futuro a hoy con
present_value25 pts - Valorar un flujo de pagos con
npv25 pts - Capitalizar intereses hacia delante con
future_value25 pts - Descontar de forma continua con
continuous_discount_factor25 pts