# Interés compuesto: versión completa para YouTube (Apokryfin Lab, S1)
# Contenido educativo, no es recomendación de inversión. Las tasas son hipotéticas.
#
# Supuestos: tasa nominal anual constante, capitalización mensual (i = tasa/12),
# depósito al final de cada mes, sin inflación, impuestos ni comisiones.
import matplotlib.pyplot as plt


def simular(tasa_anual, aporte, meses_aportando, meses_totales):
    """Saldo al final de cada mes. Aporta los primeros `meses_aportando` meses y luego solo deja crecer."""
    saldo = 0
    historia = []
    for mes in range(1, meses_totales + 1):
        interes = saldo * tasa_anual / 12            # interés sobre todo lo acumulado, no solo lo aportado
        deposito = aporte if mes <= meses_aportando else 0
        saldo = saldo + interes + deposito
        historia.append(saldo)
    return historia


def valor_futuro(tasa_anual, aporte, meses):
    """Misma cuenta con la fórmula cerrada de una anualidad: PMT * ((1+i)^n - 1) / i  (Excel: VF / FV)."""
    i = tasa_anual / 12
    return aporte * ((1 + i) ** meses - 1) / i


for tasa in (0.06, 0.08):
    # Las dos personas terminan a los 65; la que empieza a los 25 tiene 120 meses de cero al inicio.
    desde_15 = simular(tasa, 100, 600, 600)
    desde_25 = [0] * 120 + simular(tasa, 100, 480, 480)
    # Variante: ahorra solo de los 15 a los 25 y después no vuelve a aportar.
    solo_10_anios = simular(tasa, 100, 120, 600)

    print(f"Tasa {tasa:.0%}")
    print(f"  desde los 15: aporta 60,000 y llega a {desde_15[-1]:,.2f}"
          f" (fórmula: {valor_futuro(tasa, 100, 600):,.2f})")
    print(f"  desde los 25: aporta 48,000 y llega a {desde_25[-1]:,.2f}"
          f" (fórmula: {valor_futuro(tasa, 100, 480):,.2f})")
    print(f"  solo de 15 a 25: aporta 12,000 y llega a {solo_10_anios[-1]:,.2f}")

    edades = [15 + m / 12 for m in range(1, 601)]
    plt.figure(figsize=(8, 4.5))
    plt.plot(edades, desde_15, label="desde los 15")
    plt.plot(edades, desde_25, label="desde los 25")
    plt.plot(edades, solo_10_anios, "--", label="solo de los 15 a los 25")
    plt.title(f"100 pesos al mes al {tasa:.0%} anual (hipotético)")
    plt.xlabel("edad")
    plt.ylabel("saldo (pesos)")
    plt.legend()
    plt.tight_layout()
    plt.savefig(f"ahorro_15_vs_25_{round(tasa * 100)}.png", dpi=120)
    plt.close()
