public static Utilidad ResultadosUtilidad(Estructuracion estructuracion, List <Periodo> periodos) { return(new Utilidad { precioActual = Math.Round(HallarVAN(estructuracion, periodos), 2), utilidad = Math.Round(HallarUtilidad(HallarVAN(estructuracion, periodos), periodos), 2) }); }
public static Rentabilidad ResultadosRentabilidad(Estructuracion estructuracion, List <Periodo> resultados, Bono bono) { return(new Rentabilidad { TCEAEmisor = Math.Round(HallarTCEAEmisor(estructuracion, resultados, bono), 7), TCEAEmisorEscudo = Math.Round(HallarTCEAEmisorEscudo(estructuracion, resultados, bono), 7), TREABonista = Math.Round(HallarTREABonista(estructuracion, resultados, bono), 7) }); }
public static double HallarVAN(Estructuracion estructuracion, List <Periodo> resultados) { double VAN; List <double> flujo = new List <double>(); for (int i = 1; i < resultados.Count(); i++) { flujo.Add(resultados[i].flujoBonista); } var arrFlujos = flujo.ToArray(); double c*k = estructuracion.C*K / 100; VAN = Financial.NPV(c*k, ref arrFlujos); return(VAN); }
public static List <Periodo> ResultadosPeriodosFrances(Bono bono, Estructuracion estructuracion) { List <Periodo> lista = new List <Periodo>(); Periodo cero = new Periodo { N = 0, FechaPago = bono.fechaEmision, plazoGracia = "S", bono = 0, cupon = 0, amortizacion = 0, inflacionA = estructuracion.IA, inflacionPer = estructuracion.IPer, cuota = 0, prima = 0, escudo = 0, flujoEmisor = (double)bono.vcomercial - estructuracion.costesInicialesEmisor, flujoEmisorEscudo = bono.vcomercial - estructuracion.costesInicialesEmisor, flujoBonista = bono.vcomercial - estructuracion.costesInicialesBonista }; lista.Add(cero); for (int i = 0; i < estructuracion.totalPeriodos; i++) { Periodo aux = new Periodo(); DateTime fechaPago = cero.FechaPago.AddDays(bono.frecuencia * i); aux.FechaPago = fechaPago; aux.N = i + 1; aux.plazoGracia = "S"; aux.bono = i == 0 ? bono.vnominal : Math.Round(lista[i].bono.Value - lista[i].amortizacion.Value, 2); double Arriba = bono.vnominal * estructuracion.TEP / 100; double Abajo = 1 - Math.Pow(1 + estructuracion.TEP / 100, -estructuracion.totalPeriodos); aux.cupon = Math.Round(aux.bono.Value * (estructuracion.TEP) / 100, 2); aux.cuota = Math.Round(Arriba / Abajo, 2); aux.amortizacion = Math.Round(aux.cuota.Value - aux.cupon.Value, 2); aux.prima = aux.N == estructuracion.totalPeriodos ? Math.Round(aux.bono.Value * bono.pPrima / 100, 2) : 0.00; aux.escudo = Math.Round(aux.cupon.Value * bono.impRenta / 100, 2); aux.flujoEmisor = Math.Round(aux.cuota.Value + aux.prima.Value, 2); aux.flujoEmisorEscudo = Math.Round(aux.flujoEmisor - aux.escudo.Value, 2); aux.flujoBonista = aux.flujoEmisor; lista.Add(aux); } return(lista); }
public static List <Periodo> ResultadosPeriodos(Bono bono, Estructuracion estructura) { List <Periodo> lista = new List <Periodo>(); double flujo = bono.tipoActor == "Emisor" ? Math.Round(bono.vcomercial - estructura.costesIniciales, 7): Math.Round(-bono.vcomercial - estructura.costesIniciales, 7); Periodo cero = new Periodo { N = 0, plazoGracia = null, bono = null, cupon = null, cuota = null, amortizacion = null, prima = null, escudo = null, flujo = flujo, flujoEscudo = bono.tipoActor == "Emisor" ? flujo : (double?)null, flujoActivo = null, flujoActivoPlazo = null, factorConvexidad = null, }; lista.Add(cero); for (int i = 0; i < estructura.totalPeriodos; i++) { Periodo aux = new Periodo(); aux.N = i + 1; aux.plazoGracia = null; aux.bono = i == 0 ? bono.vnominal : Math.Round(lista[i].bono.Value + lista[i].amortizacion.Value, 2); aux.cupon = Math.Round(-aux.bono.Value * estructura.TEP, 2); aux.cuota = HallarCuota(aux.bono.Value, estructura.TEP, estructura.totalPeriodos - aux.N + 1); aux.amortizacion = Math.Round(aux.cuota.Value - aux.cupon.Value, 2); aux.prima = aux.N == estructura.totalPeriodos ? -Math.Round(bono.pPrima * bono.vnominal, 2) : 0; aux.escudo = Math.Round(-aux.cupon.Value * bono.impuestoRenta, 2); aux.flujo = bono.tipoActor == "Bonista" ? -Math.Round(aux.cuota.Value + aux.prima.Value, 2) : Math.Round(aux.cuota.Value + aux.prima.Value, 2); aux.flujoEscudo = aux.escudo + aux.flujoEscudo; if (bono.tipoActor == "Bonista") { aux.flujoActivo = Math.Round(aux.flujo / Math.Pow(1 + estructura.C*K, aux.N), 2); aux.flujoActivoPlazo = Math.Round(aux.flujoActivo.Value * aux.N * bono.frecuencia / bono.diasAño, 2); aux.factorConvexidad = Math.Round(aux.flujoActivo.Value * aux.N * (1 + aux.N), 2); } lista.Add(aux); } return(lista); }
public ActionResult Resultados(int?bonoId) { Bono bono; bono = _context.Bonos.FirstOrDefault(x => x.Id == bonoId); Estructuracion estructuracion = new Estructuracion(); estructuracion = Finanzas.ResultadosEstructuracion(bono); List <Periodo> periodos = new List <Periodo>(); if (bono.TipoMetodo == "Americano") { periodos = Finanzas.ResultadosPeriodosAmericano(bono, estructuracion); } else if (bono.TipoMetodo == "Frances") { periodos = Finanzas.ResultadosPeriodosFrances(bono, estructuracion); } else { periodos = Finanzas.ResultadosPeriodosAleman(bono, estructuracion); } Rentabilidad rentabilidad = new Rentabilidad(); rentabilidad = Finanzas.ResultadosRentabilidad(estructuracion, periodos, bono); Utilidad utilidad = new Utilidad(); utilidad = Finanzas.ResultadosUtilidad(estructuracion, periodos); ResultadosViewModel resultados = new ResultadosViewModel(); resultados.estructura = estructuracion; resultados.periodos = periodos; resultados.rentabilidad = rentabilidad; resultados.utilidad = utilidad; resultados.bono = bono; ViewBag.nombre = bono.Nombre; ViewBag.tipometodo = bono.TipoMetodo; return(View(resultados)); }
public static double HallarTREABonista(Estructuracion estructuracion, List <Periodo> resultados, Bono bono) { double TIR; double TCEA; List <double> flujo = new List <double>(); for (int i = 0; i < resultados.Count(); i++) { if (i == 0) { flujo.Add(-resultados[i].flujoBonista); } else { flujo.Add(resultados[i].flujoBonista); } } var arrFlujos = flujo.ToArray(); TIR = Financial.IRR(ref arrFlujos); TCEA = Math.Round(Math.Pow(TIR + 1, bono.diasporanio / estructuracion.frecCupon) - 1, 7); return(TCEA); }
public ActionResult Resultados(int?bonoId) { Bono bono; using (var context = new FinanzasDBEntities()) { bono = context.Bono.FirstOrDefault(x => x.Id == bonoId); SessionHelper.tipoActor = bono.tipoActor; SessionHelper.nombreBono = bono.nombre; } Estructuracion estructura = new Estructuracion(); estructura = Finanzas.Helpers.Finanzas.ResultadosEstructuracion(bono); List <Periodo> periodos = new List <Periodo>(); periodos = Finanzas.Helpers.Finanzas.ResultadosPeriodos(bono, estructura); ResultadosViewModel resultados = new ResultadosViewModel(); resultados.estructura = estructura; resultados.periodos = periodos; ViewBag.tipoActor = SessionHelper.tipoActor; ViewBag.nombre = SessionHelper.nombreBono; return(View(resultados)); }
public static List <Periodo> ResultadosPeriodosAmericano(Bono bono, Estructuracion estructuracion) { List <Periodo> lista = new List <Periodo>(); Periodo cero = new Periodo { N = 0, FechaPago = bono.fechaEmision, plazoGracia = "S", bono = 0, cupon = 0, inflacionA = estructuracion.IA, inflacionPer = estructuracion.IPer, amortizacion = 0, bonoindexado = 0, cuota = 0, prima = 0, escudo = 0, flujoEmisor = (double)bono.vcomercial - estructuracion.costesInicialesEmisor, flujoEmisorEscudo = bono.vcomercial - estructuracion.costesInicialesEmisor, flujoBonista = bono.vcomercial - estructuracion.costesInicialesBonista }; lista.Add(cero); for (int i = 0; i < estructuracion.totalPeriodos; i++) { Periodo aux = new Periodo(); DateTime fechaPago = cero.FechaPago.AddDays(bono.frecuencia * i); aux.FechaPago = fechaPago; aux.N = i + 1; if (i < bono.PlazoGraciaCant) { aux.plazoGracia = "T"; } else { aux.plazoGracia = "S"; } if (aux.plazoGracia == "T") { aux.bono = i == 0 ? bono.vnominal : Math.Round(lista[i].bonoindexado.Value + lista[i].cupon.Value, 3); double inf = aux.bono.Value * estructuracion.IPer / 100; aux.bonoindexado = inf + aux.bono.Value; } else if (lista[i].plazoGracia == "T") { aux.bono = Math.Round(lista[i].bonoindexado.Value + lista[i].cupon.Value, 3); double inf = aux.bono.Value * estructuracion.IPer / 100; aux.bonoindexado = Math.Round(inf + aux.bono.Value, 2); } else { aux.bono = i == 0? bono.vnominal: Math.Round(lista[i].bonoindexado.Value - lista[i].amortizacion.Value, 3); double inf = aux.bono.Value * estructuracion.IPer / 100; aux.bonoindexado = Math.Round(inf + aux.bono.Value, 2); } aux.cupon = Math.Round(aux.bonoindexado.Value * (estructuracion.TEP) / 100, 2); if (aux.plazoGracia == "T") { aux.amortizacion = 0; } else { aux.amortizacion = aux.N == estructuracion.totalPeriodos ? aux.bonoindexado.Value : 0.00; } if (aux.plazoGracia == "T") { aux.cuota = 0; } else { aux.cuota = aux.cupon.Value + aux.amortizacion.Value; } aux.prima = aux.N == estructuracion.totalPeriodos ? Math.Round(aux.bono.Value * bono.pPrima / 100, 2) : 0.00; aux.escudo = Math.Round(aux.cupon.Value * bono.impRenta / 100, 2); aux.flujoEmisor = Math.Round(aux.cuota.Value + aux.prima.Value, 2); aux.flujoEmisorEscudo = Math.Round(aux.flujoEmisor - aux.escudo.Value, 2); aux.flujoBonista = aux.flujoEmisor; lista.Add(aux); } return(lista); }