Пример #1
0
 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)
     });
 }
Пример #2
0
 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)
     });
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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));
        }
Пример #7
0
        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);
        }
Пример #8
0
        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));
        }
Пример #9
0
        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);
        }