def genera_flujos_aux(self, info):
        cn = self.cn
        fechaActual = self.fechaActual
        fechaValores = self.fechaValores
        hora_insert = "--"
        fondo = info["Fondo"]
        id = info["ID"]
        fecha_efectiva = info["FechaEfectiva"]
        fecha_venc = info["FechaVenc"]
        ajuste_feriados = info["AjusteFeriados"]
        paises_feriados = ajuste_feriados.split(",")

        activo_pasivo = info["ActivoPasivo"]
        moneda = info["Moneda"]
        tipo_tasa = info["TipoTasa"]
        tasa = info["Tasa"]
        spread = info["Spread"]
        frecuencia = info["Frecuencia"]
        nocional = info["Nocional"]

        flujos_f_DV01 = -1000

        if tipo_tasa[0:4] == "Fija":
            if len(tipo_tasa) == 4:
                convencion = "30/360"

            else:
                convencion = cast_convencion(tipo_tasa[-5:])
                if convencion == "":
                    convencion = "30/360"
            #Conversion a float

            flujos_f = genera_flujos(max(fechaActual,
                                         fecha_efectiva), fecha_efectiva,
                                     fecha_venc, tasa + spread / 100,
                                     frecuencia, convencion)

            for i in flujos_f:
                i[0] = siguiente_habil_paises(add_days(i[0], -1),
                                              paises_feriados, cn)
            flujos_f_ns = np.array(flujos_f)

        elif moneda == "USD":
            hora_insert = self.hora

            arr_factor_descuento = (
                "SELECT Curva FROM dbDerivados.dbo.TdCurvasDerivados "
                "WHERE Hora = '" + hora_insert + "' AND Fecha = " +
                fecha_str(fechaValores) +
                " AND Tipo = 'CurvaCero_SwapUSD_V2_6M'")

            arr_factor_descuento = pd.io.sql.read_sql(arr_factor_descuento,
                                                      cn).Curva.iloc[0]

            arr_factor_descuento = parsear_curva(arr_factor_descuento)

            fecha_aux = add_days(max(fechaActual, fecha_efectiva), -1)
            fecha_aux = add_days(
                ultimo_habil_paises(fecha_aux, paises_feriados, cn), 1)

            flujos_f = genera_flujos(fecha_aux, fecha_efectiva, fecha_venc, 0,
                                     frecuencia, "ACT360")
            flujos_f_DV01 = np.array(flujos_f)
            flujos_f_ns = np.array(flujos_f)

            for j in range(len(flujos_f)):
                fecha_anterior = delta_frecuencia(flujos_f[j][0], frecuencia,
                                                  -1)

                fecha_fijacion_libor = ultimo_habil_pais(
                    add_days(
                        ultimo_habil_pais(add_days(fecha_anterior, -1), "UK",
                                          cn), -1), "UK", cn)

                fecha_fijacion_libor_siguiente = ultimo_habil_pais(
                    add_days(
                        ultimo_habil_pais(add_days(flujos_f[j][0], -1), "UK",
                                          cn), -1), "UK", cn)

                flujos_f[j][0] = siguiente_habil_paises(
                    add_days(flujos_f[j][0], -1), paises_feriados, cn)
                flujos_f_DV01[j][0] = flujos_f[j][0]
                flujos_f_ns[j][0] = flujos_f[j][0]

                max_fecha_libor = (
                    "SELECT Max(T.Fecha) as FechaMax "
                    "FROM dbAlgebra.dbo.TdInfoTasas I "
                    "INNER JOIN dbAlgebra.dbo.TdTasas T "
                    "ON I.TickerCorto = T.Tasa WHERE (T.SiValida = 1) "
                    "AND (T.Hora = 'CIERRE') "
                    "AND (I.Plazo = '" + frecuencia + "') "
                    "AND (I.TipoTasa = 'LIBOR') "
                    "AND (I.MonedaActiva = 'USD') "
                    "AND (T.Fecha <= " + fecha_str(fecha_fijacion_libor) + ")")

                max_fecha_libor = pd.io.sql.read_sql(
                    max_fecha_libor,
                    cn).FechaMax.iloc[0].to_pydatetime().date()
                if fecha_fijacion_libor <= fechaActual:
                    libor = ("SELECT T.Valor "
                             "FROM dbAlgebra.dbo.TdInfoTasas I "
                             "INNER JOIN dbAlgebra.dbo.TdTasas T "
                             "ON I.TickerCorto = T.Tasa "
                             "WHERE (T.SiValida = 1) AND (T.Hora = 'CIERRE') "
                             "AND (I.Plazo = '" + frecuencia +
                             "') AND (I.TipoTasa = 'LIBOR') "
                             "AND (I.MonedaActiva = 'USD') "
                             "AND (T.Fecha = " + fecha_str(max_fecha_libor) +
                             ") ORDER BY I.Plazo360")

                    libor = pd.io.sql.read_sql(libor, cn).Valor.iloc[0]

                    tasa = libor + spread / 100
                    tasa_DV01 = tasa

                    if fecha_fijacion_libor_siguiente > fechaActual or len(
                            flujos_f) == j:
                        flujos_f_ns[j][1] = 100 + tasa * (
                            flujos_f_ns[j][0] - fecha_anterior).days / 360
                        flujos_f[j][6] = tasa * (
                            (flujos_f[j][0] - fecha_anterior).days) / 360 * (
                                fechaActual - fecha_anterior).days / (
                                    flujos_f[j][0] - fecha_anterior).days

                    else:
                        flujos_f_ns[j][1] = tasa * (flujos_f_ns[j][0] -
                                                    fecha_anterior).days / 360
                        flujos_f[j][6] = 0
                else:
                    plazo_ini = (fecha_fijacion_libor - fechaActual).days
                    plazo_fin = (fecha_fijacion_libor_siguiente -
                                 fechaActual).days

                    tasa_arr = tasa_FRA_y_tasa_DV01(plazo_ini, plazo_fin,
                                                    spread,
                                                    arr_factor_descuento)
                    tasa = tasa_arr[0]
                    tasa_DV01 = tasa_arr[1]

                    flujos_f_ns[j][1] = (spread / 100) * (
                        flujos_f_ns[j][0] - fecha_anterior).days / 360
                    flujos_f[j][6] = 0

                flujos_f[j][1] += tasa * (flujos_f[j][0] -
                                          fecha_anterior).days / 360
                flujos_f[j][4] = tasa * (flujos_f[j][0] -
                                         fecha_anterior).days / 360

                flujos_f_DV01[j][1] += tasa_DV01 * (flujos_f_DV01[j][0] -
                                                    fecha_anterior).days / 360

        elif moneda == "CLP":
            hora_insert = self.hora
            if tipo_tasa == "Flotante_Tab30dNom" or tipo_tasa == "Flotante_Tab":
                arr_factor_descuento = curva_cero_CLP_TAB(
                    fechaValores, hora_insert, cn)

                fecha_aux = add_days(max(fechaActual, fecha_efectiva), -1)
                fecha_aux = add_days(
                    ultimo_habil_paises(fecha_aux, paises_feriados, cn), 1)

                flujos_f = genera_flujos(fecha_aux, fecha_efectiva, fecha_venc,
                                         0, frecuencia, "ACT360")

                flujos_f_DV01 = np.array(flujos_f)
                flujos_f_ns = np.array(flujos_f)

                for j in range(len(flujos_f)):
                    if j == 0:
                        fecha_anterior = delta_frecuencia(
                            flujos_f[j][0], frecuencia, -1)
                    else:
                        fecha_anterior = flujos_f[j - 1][0]

                    fecha_fijacion_tab = ultimo_habil_pais(
                        add_days(
                            ultimo_habil_pais(add_days(fecha_anterior, -1),
                                              "CL", cn), -1), "CL", cn)

                    fecha_fijacion_tab_siguiente = ultimo_habil_pais(
                        add_days(
                            ultimo_habil_pais(add_days(flujos_f[j][0], -1),
                                              "CL", cn), -1), "CL", cn)

                    flujos_f[j][0] = siguiente_habil_paises(
                        add_days(flujos_f[j][0], -1), paises_feriados, cn)
                    flujos_f_DV01[j][0] = flujos_f[j][0]  # REVISAR
                    flujos_f_ns[j][0] = flujos_f[j][0]

                    if fecha_fijacion_tab <= fechaActual:
                        if frecuencia == "1M":
                            campo = "TabNominal30"
                        elif frecuencia == "3M":
                            campo = "TabNominal90"
                        elif frecuencia == "6M":
                            campo = "TabNominal180"
                        elif frecuencia == "1A":
                            campo = "TabNominal360"
                        else:
                            pass  #TODO ERROR

                        tab = ("SELECT Top 1 " + campo +
                               " FROM [dbAlgebra].[dbo].[TdIndicadores] "
                               "Where Fecha <= " +
                               fecha_str(fecha_fijacion_tab) + " and " +
                               campo + " <> -1000 Order by Fecha desc")

                        tab = pd.io.sql.read_sql(tab, cn)

                        tasa = tab + spread / 100
                        tasa_DV01 = tasa

                        if fecha_fijacion_tab_siguiente > fechaActual or len(
                                flujos_f) == j:
                            flujos_f_ns[j][1] = 100 + tasa * (
                                flujos_f_ns[j][0] - fecha_anterior).days / 360
                            flujos_f[j][6] = tasa * (
                                (flujos_f[j][0] - fecha_anterior).days /
                                360) * (fechaActual - fecha_anterior).days / (
                                    flujos_f[j][0] - fecha_anterior).days
                        else:
                            flujos_f_ns[j][1] = tasa * (
                                flujos_f_ns[j][0] - fecha_anterior).days / 360
                            flujos_f[j][6] = 0

                    else:

                        plazo_ini = (fecha_fijacion_tab - fechaActual).days
                        plazo_fin = (fecha_fijacion_tab_siguiente -
                                     fechaActual).days

                        tasa_arr = tasa_FRA_y_tasa_DV01(
                            plazo_ini, plazo_fin, spread, arr_factor_descuento)
                        tasa = tasa_arr[0]
                        tasa_DV01 = tasa_arr[1]

                        flujos_f_ns[j][1] = (spread / 100) * (
                            flujos_f_ns[j][0] - fecha_anterior).days / 360
                        flujos_f[j][6] = 0

                    flujos_f[j][1] += tasa * (flujos_f[j][0] -
                                              fecha_anterior).days / 360
                    flujos_f[j][4] = tasa * (flujos_f[j][0] -
                                             fecha_anterior).days / 360

                    flujos_f_DV01[j][1] += tasa_DV01 * (
                        flujos_f_DV01[j][0] - fecha_anterior).days / 360

            else:

                arr_factor_descuento = (
                    "SELECT Curva FROM dbDerivados.dbo.TdCurvasDerivados "
                    "WHERE Hora = '" + hora_insert + "' AND Fecha = " +
                    fecha_str(fechaValores) +
                    " AND Tipo = 'CurvaCero_CLP_LibreRiesgo'")
                arr_factor_descuento = pd.io.sql.read_sql(
                    arr_factor_descuento, cn).Curva.iloc[0]
                arr_factor_descuento = parsear_curva(arr_factor_descuento)

                flujos_f = genera_flujos(max(fechaActual,
                                             fecha_efectiva), fecha_efectiva,
                                         fecha_venc, 0, frecuencia, "ACT360")

                flujos_f_DV01 = np.array(flujos_f)

                for j in range(len(flujos_f)):
                    fecha_IPC_inicial = delta_frecuencia(
                        flujos_f[j][0], frecuencia, -1)
                    fecha_IPC_inicial = siguiente_habil_paises(
                        fecha_IPC_inicial, paises_feriados, cn)

                    fecha_IPC_final = siguiente_habil_paises(
                        flujos_f[j][0], paises_feriados, cn)

                    flujos_f[j][0] = fecha_IPC_final

                    flujos_f_DV01[j][0] = flujos_f[j][0]

                    plazo_ini = (fecha_IPC_inicial - fechaActual).days
                    plazo_fin = (fecha_IPC_final - fechaActual).days

                    if fecha_IPC_inicial <= fechaActual:
                        vpv = (
                            "SELECT ICP1.ICP / ICP0.ICP AS Cupon FROM (SELECT ICP FROM dbAlgebra.dbo.TdIndicadores "
                            "WHERE (Fecha = " + fecha_str(fechaValores) +
                            ")) ICP1 "
                            "CROSS JOIN (SELECT ICP FROM dbAlgebra.dbo.TdIndicadores "
                            "WHERE (Fecha = " + fecha_str(fecha_IPC_inicial) +
                            ")) ICP0")

                        vpv = pd.io.sql.read_sql(vpv, cn).Cupon.iloc[0]
                        tasa = (
                            (vpv / interpolacion_log_escalar(
                                plazo_fin, arr_factor_descuento[1:]))**
                            (360 /
                             (plazo_fin - plazo_ini)) - 1) * 100 + spread / 100

                        tasa_DV01 = tasa

                        if fechaActual < fecha_IPC_final:
                            flujos_f_ns = [[fechaActual, vpv * 100]]

                        flujos_f[j][6] = tasa * (
                            (flujos_f[j][0] - fecha_IPC_inicial).days /
                            360) * (fechaActual - fecha_IPC_inicial).days / (
                                flujos_f[j][0] - fecha_IPC_inicial).days

                    else:
                        tasa_arr = tasa_FRA_y_tasa_DV01(
                            plazo_ini, plazo_fin, spread, arr_factor_descuento)
                        tasa = tasa_arr[0]
                        tasa_DV01 = tasa_arr[1]
                        flujos_f_ns = [[fecha_IPC_inicial, 100]]
                        flujos_f[j][6] = 0

                    flujos_f[j][1] += tasa * (flujos_f[j][0] -
                                              fecha_IPC_inicial).days / 360
                    flujos_f[j][4] = tasa * (flujos_f[j][0] -
                                             fecha_IPC_inicial).days / 360

                    flujos_f_DV01[j][1] += tasa_DV01 * (
                        flujos_f_DV01[j][0] - fecha_IPC_inicial).days / 360

        else:
            send_msg(
                "ERROR: Moneda '" + moneda +
                "' no soportada para tasa flotante", self.filename)

        if fecha_efectiva >= fechaActual:

            flujos_f = np.append(
                [[fecha_efectiva, -100, fecha_efectiva, -100, 0, 0, 0]],
                flujos_f,
                axis=0)

            if type(flujos_f_DV01) != int:
                flujos_f_DV01 = np.append(
                    [[fecha_efectiva, -100, fecha_efectiva, -100, 0, 0, 0]],
                    flujos_f_DV01,
                    axis=0)

        insert = dict()
        insert["Fecha"] = fechaActual
        insert["Fondo"] = fondo
        insert["Tipo"] = "XCCY"
        insert["ID"] = id
        insert["Hora"] = hora_insert
        insert["ActivoPasivo"] = activo_pasivo
        insert["Moneda"] = moneda

        for j in range(len(flujos_f)):
            insert["Flujo"] = flujos_f[j][1] / 100 * nocional
            insert["Amortizacion"] = flujos_f[j][3] / 100 * nocional
            insert["Interes"] = flujos_f[j][4] / 100 * nocional
            insert["FechaFixing"] = flujos_f[j][0]
            insert["FechaFlujo"] = flujos_f[j][0]
            insert["FechaPago"] = flujos_f[j][0]
            insert["InteresDevengado"] = flujos_f[j][6] / 100 * nocional

            try:
                insert["Sensibilidad"] = (flujos_f_DV01[j][1] -
                                          flujos_f[j][1]) / 100 * nocional
            except:
                insert["Sensibilidad"] = 0

            self.flujos_derivados = self.flujos_derivados.append(
                insert, ignore_index=True)

        insert = dict()
        insert["Fecha"] = fechaActual
        insert["Fondo"] = fondo
        insert["Tipo"] = "XCCY"
        insert["ID"] = id
        insert["ActivoPasivo"] = activo_pasivo
        insert["Moneda"] = moneda

        for j in range(len(flujos_f_ns)):
            insert["FlujoNoSensible"] = flujos_f_ns[j][1] / 100 * nocional
            insert["FechaFlujoNoSensible"] = flujos_f_ns[j][0]

            self.flujos_nosensibles = self.flujos_nosensibles.append(
                insert, ignore_index=True)
    def __init__(self, fecha, hora, info_cartera, cn, fechaValores=None, filename="placeholder"):
        """
        Constructor para una clase derivados
        :param fecha: datetime.date con la fecha para la cual se está valorizando
        :param hora: string con la hora en la cual se está valorizando (EJ: '1500', '1700')
        :param info_cartera: pandas.DataFrame con la información en cartera de derivados
        :param cn: pyodbc.connect con permisos en base de datos
        :param filename: nombre del archivo para dejar los mensajes de error
        """

        if len(info_cartera) == 0:
            self.set_status("ERROR: Derivado sin información")
            send_msg("ERROR: Se intentó crear un derivado sin información", filename)
            return

        if len(info_cartera) > 1:
            self.set_status("ERROR: Derivado con más de una fila de información")
            self.set_status("ERROR: Se intentó crear un derivado con información de varios")
            return

        self.col_flujos_derivados = ['Fecha', 'Fondo', 'Tipo', 'ID', 'Hora',
                                       'ActivoPasivo', 'FechaFixing', 'FechaTenorFixing', 'FechaFlujo', 'FechaPago',
                                       'Moneda', 'Flujo', 'Amortizacion', 'Interes', 'Sensibilidad', 'InteresDevengado',
                                    ]

        self.col_flujos_nosensibles = ['Fecha', 'Fondo', 'Tipo', 'ID', 'ActivoPasivo',
                                       'FechaFlujoNoSensible', 'Moneda', 'FlujoNoSensible']

        self.col_flujos_valorizados = ['Fecha', 'Fondo', 'Tipo', 'ID', 'Hora',
                                       'Mercado', 'ActivoPasivo', 'FechaFixing', 'FechaTenorFixing', 'FechaFlujo',
                                       'FechaPago', 'Moneda', 'Flujo', 'Amortizacion', 'Interes', 'MonedaBase',
                                       'PlazoTipoCambioFwd', 'PlazoDescuento', 'TipoCambioSpot', 'TipoCambioFwd',
                                       'FactorDescMonBase', 'FactorDescMonFlujo', 'ValorPresenteMonBase',
                                       'ValorPresenteMonFlujo', 'TipoCambioSpotFix', 'FactorDescMonFlujoFix',
                                       'FactorDescMonBaseFix', 'ValorPresenteCLP', 'TipoCambioCLPBase',
                                       'ValorPresenteUSD', 'TipoCambioUSDBase', 'Sensibilidad', 'TipoValorizacion',
                                       ]

        self.col_flujos_DV01_valorizados = ['Fecha', 'Fondo', 'Tipo', 'ID', 'Hora',
                                            'Mercado', 'ActivoPasivo', 'FechaFixing', 'FechaFlujo', 'FechaPago',
                                            'Moneda', 'Flujo', 'Amortizacion', 'Interes', 'MonedaBase',
                                            'PlazoTipoCambioFwd', 'PlazoDescuento', 'TipoCambioSpot', 'TipoCambioFwd',
                                            'FactorDescMonBase', 'FactorDescMonFlujo', 'ValorPresenteMonBase',
                                            'ValorPresenteMonFlujo', 'TipoCambioSpotFix', 'FactorDescMonFlujoFix',
                                            'FactorDescMonBaseFix', 'ValorPresenteCLP', 'TipoCambioCLPBase',
                                            'ValorPresenteUSD', 'TipoCambioUSDBase', 'TasaEqCompAct360', 'TasaDV01',
                                            'FactorDescMonFlujoFixDV01', 'TipoCambioFwdDV01',
                                            'ValorPresenteMonBaseDV01', 'ValorPresenteMonFlujoDV01', 'Dv01MonBase',
                                            'Dv01MonFlujo', 'Dv01CLP', 'Dv01USD', 'Duracion', 'SensibilidadTasa',
                                            ]

        self.flujos_DV01_valorizados = pd.DataFrame(columns=self.col_flujos_DV01_valorizados)
        self.flujos_valorizados = pd.DataFrame(columns=self.col_flujos_valorizados)
        self.flujos_derivados = pd.DataFrame(columns=self.col_flujos_derivados)
        self.flujos_nosensibles = pd.DataFrame(columns=self.col_flujos_nosensibles)
        self.cn = cn
        
        self.filename = filename
        
        
        if not ('MonedaBase' in info_cartera.columns and isinstance(info_cartera.MonedaBase[0],str)):
            info_cartera["MonedaBase"] = 'CLP'
        
        
        if  not ('Mercado' in info_cartera.columns and isinstance(info_cartera.Mercado[0],str)):
            info_cartera["Mercado"] = "Local"
            
        if  not ('AjustesFeriados' in info_cartera.columns and isinstance(info_cartera.Mercado[0],str)):
            info_cartera["AjusteFeriados"] = "CL"
        
        if  fecha>pd.to_datetime(datetime.datetime.strptime(info_cartera.FechaVenc[0].split(" ")[0], "%d/%m/%Y").strftime("%Y-%m-%d")).date():
            send_msg("ERROR: Fecha vencimiento anterior a la fecha de valorizacion.",self.filename)
        
        
        
        self.info_cartera = info_cartera

        # Fecha en que se valoriza (puede ser feriado)
        self.fechaActual = fecha

        if fechaValores is None:
            # Fecha para obtener datos (se fuerza día hábil)
            # Se utiliza Chile por defecto (ubicación de LVA)
            self.fechaValores = ultimo_habil_pais(fecha, "CL", self.cn)
            if self.fechaActual != self.fechaValores:
                print("Valorizando en un día no hábil")
        else:
            self.fechaValores = fechaValores
            
        self.hora = hora
        self.msg = "INFO: Derivado inicializado"
        self.revisar_input()
Beispiel #3
0
    def genera_flujos(self):
        hora = self.hora
        cn = self.cn
        fecha = self.fecha

        admin = self.info_cartera.Administradora[0]

        fondo = self.info_cartera.Fondo[0]
        contraparte = self.info_cartera.Contraparte[0]
        id = self.info_cartera.ID[0]

        fecha_efectiva = pd.to_datetime(self.info_cartera.FechaEfectiva[0]).date()
        fecha_venc = pd.to_datetime(self.info_cartera.FechaVenc[0]).date()

        ajuste_feriados = self.info_cartera.AjusteFeriados[0]
        paises_feriados = ajuste_feriados.split(',')

        moneda = self.info_cartera.MonedaActivo[0]

        if self.info_cartera.TipoTasaActivo[0] == 'Fija':
            factor_recibo_fijo = 1
            tasa = self.info_cartera.TasaActivo[0]
        else:
            factor_recibo_fijo = -1
            tasa = self.info_cartera.TasaPasivo[0]

        nocional = self.info_cartera.NocionalActivo[0]

        frecuencia = cast_frecuencia(self.info_cartera.FrecuenciaActivo[0])

        id_key = self.info_cartera.ID_Key[0]

        convencion = "ACT360"
        flujos_f = genera_flujos(max(fecha, fecha_efectiva), fecha_efectiva, fecha_venc, tasa, frecuencia, convencion)

        fecha_cupon = flujos_f[0][0]

        fecha_aux = delta_frecuencia(fecha_cupon, frecuencia, -1)
        fecha_aux = max(fecha_aux, fecha_efectiva)

        fecha_cupon_anterior = ultimo_habil_pais(fecha_aux, "MX", cn)

        flujos_v = proyectar_flujos_tabla(fecha, fecha, 1, hora, fecha_efectiva, fecha_venc, frecuencia, moneda, 0,
                                          "Local", ajuste_feriados, cn)

        if fecha >= fecha_cupon_anterior:
            tasaV = ("SELECT T.Valor FROM dbAlgebra.dbo.TdInfoTasas I "
                     "INNER JOIN dbAlgebra.dbo.TdTasas T "
                     "ON I.TickerCorto = T.Tasa "
                     "INNER JOIN (SELECT MAX(T.Fecha) AS Fecha FROM "
                     "dbAlgebra.dbo.TdInfoTasas I INNER JOIN "
                     "dbAlgebra.dbo.TdTasas T ON I.TickerCorto = T.Tasa "
                     "WHERE (T.SiValida = 1) AND (T.Hora = 'CIERRE') AND (I.TipoTasa = 'TIIE') "
                     "AND (I.MonedaActiva = 'MXN') AND (T.Fecha <= " + fecha_str(fecha_cupon_anterior) + ") "
                    "AND (I.Plazo = '28D')) F ON T.Fecha = F.Fecha "
                    "WHERE (T.SiValida = 1) AND (T.Hora = 'CIERRE') AND (I.TipoTasa = 'TIIE') "
                    "AND (I.MonedaActiva = 'MXN') AND (I.Plazo = '28D')")
            tasaV = pd.io.sql.read_sql(tasaV, cn)
            tasaV = tasaV.Valor[0]

            cupon = (1/factor_descuento(tasaV/100, fecha_cupon_anterior, fecha_cupon, "ACT360", 0)-1) * 100

            devengo = cupon * (fecha_cupon_anterior-fecha).days / (fecha_cupon_anterior-fecha_cupon).days

            fecha_flujo_variable = fecha_cupon

            fecha_pago = siguiente_habil_paises(add_days(fecha_flujo_variable, -1), paises_feriados, cn)

            flujos_v[0][0] = fecha_flujo_variable

            flujos_v[0][1] = cupon
            flujos_v[0][2] = fecha_pago
            flujos_v[0][3] = 0
            flujos_v[0][4] = cupon
            flujos_v[0][5] = 0
            flujos_v[0][6] = devengo

            fecha_FNS = fecha_flujo_variable
            flujo_FNS = nocional * ((cupon/100)+1)

        else:
            fecha_FNS = fecha_cupon_anterior
            flujo_FNS = nocional

        col_flujos_derivados = ['Fecha', 'Administradora', 'Fondo', 'Contraparte', 'Tipo', 'ID', 'ActivoPasivo',
                                'FechaFixing', 'FechaFlujo', 'FechaPago', 'Moneda', 'Flujo', 'Amortizacion', 'Interes',
                                'Sensibilidad', 'InteresDevengado', 'Id_Key_Cartera']

        col_flujos_nosensibles = ['Fecha', 'Administradora', 'Fondo', 'Contraparte', 'Tipo', 'ID', 'ActivoPasivo',
                                  'FechaFlujoNoSensible', 'Moneda', 'FlujoNoSensible', 'Id_Key_Cartera']

        flujos_derivados = pd.DataFrame(columns=col_flujos_derivados)

        flujos_nosensibles = pd.DataFrame(columns=col_flujos_nosensibles)

        for i in flujos_v:
            flujos_derivados = flujos_derivados.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SMT', id,
                                                                      -factor_recibo_fijo, i[0], i[0],
                                                                      i[2], moneda, i[1] / 100 * nocional,
                                                                      i[3] / 100 * nocional,
                                                                      i[4] / 100 * nocional, i[5] / 100 * nocional,
                                                                      i[6] / 100 * nocional, id_key]],
                                                                    columns=col_flujos_derivados))

        flujos_nosensibles = flujos_nosensibles.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SMT', id,
                                                                      -factor_recibo_fijo, fecha_FNS,
                                                                      moneda,
                                                                      flujo_FNS, id_key]],
                                                                    columns=col_flujos_nosensibles))

        for i in flujos_f:
            flujo_fijo = i[1] / 100 * nocional
            amortizacion = i[3] / 100 * nocional
            interes_fijo = i[4] / 100 * nocional
            fecha_flujo_f = i[0]
            devengo = i[6] / 100 * nocional
            fecha_pago = siguiente_habil_paises(add_days(fecha_flujo_f, -1), paises_feriados, cn)

            flujos_derivados = flujos_derivados.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SMT', id,
                                                                     factor_recibo_fijo, fecha_flujo_f, fecha_flujo_f,
                                                                     fecha_pago, moneda, flujo_fijo, amortizacion,
                                                                     interes_fijo, 0, devengo, id_key]],
                                                                    columns=col_flujos_derivados))

            flujos_nosensibles = flujos_nosensibles.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SMT', id,
                                                                         factor_recibo_fijo, fecha_flujo_f, moneda,
                                                                         flujo_fijo, id_key]],
                                                                        columns=col_flujos_nosensibles))

            self.flujos_nosensibles = flujos_nosensibles
            self.flujos_derivados = flujos_derivados

        self.set_status("INFO: Flujos generados para SMT con ID " + str(self.info_cartera.ID.iloc[0]))
Beispiel #4
0
    def genera_flujos(self):
        hora = self.hora
        cn = self.cn
        fecha = self.fecha

        admin = self.info_cartera.Administradora[0]

        fondo = self.info_cartera.Fondo[0]
        contraparte = self.info_cartera.Contraparte[0]
        id = self.info_cartera.ID[0]

        fecha_efectiva = pd.to_datetime(
            self.info_cartera.FechaEfectiva[0]).date()
        fecha_venc = pd.to_datetime(self.info_cartera.FechaVenc[0]).date()

        ajuste_feriados = self.info_cartera.AjusteFeriados[0]
        paises_feriados = ajuste_feriados.split(',')

        moneda = self.info_cartera.MonedaActivo[0]

        if self.info_cartera.TipoTasaActivo[0] == 'Fija':
            factor_recibo_fijo = 1
            tasa = self.info_cartera.TasaActivo[0]
        else:
            factor_recibo_fijo = -1
            tasa = self.info_cartera.TasaPasivo[0]

        nocional = self.info_cartera.NocionalActivo[0]
        mercado = self.info_cartera.Mercado[0]
        id_key = self.info_cartera.ID_Key[0]

        moneda_base = self.info_cartera.MonedaBase[0]
        if moneda_base == "--":
            moneda_base = moneda

        fecha_aux1 = fecha_str(add_days(fecha_efectiva, 1))
        fecha_aux2 = fecha_str(fecha_venc)
        fecha_aux3 = fecha_str(add_days(max(fecha_efectiva, fecha), 1))
        fecha_aux4 = fecha_str(fecha_venc)

        plazo_ini = ("SELECT SUM(SiHabil) AS Lab "
                     "FROM dbAlgebra.dbo.TdFeriados "
                     "WHERE Pais = 'BR' AND (Fecha BETWEEN " + fecha_aux1 +
                     " AND " + fecha_aux2 + ")")

        plazo_ini = pd.io.sql.read_sql(plazo_ini, cn).Lab[0]

        plazo = ("SELECT SUM(SiHabil) AS Lab "
                 "FROM dbAlgebra.dbo.TdFeriados "
                 "WHERE Pais = 'BR' AND (Fecha BETWEEN " + fecha_aux3 +
                 " AND " + fecha_aux4 + ")")

        plazo = pd.io.sql.read_sql(plazo, cn).Lab[0]

        pv = nocional / (1 + tasa / 100)**(plazo_ini / 252)

        if fecha < fecha_efectiva:
            vpv = 1
            flujo_variable_presente = vpv * pv
            fecha_flujo_variable_presente = fecha_efectiva

        else:
            fecha_aux1 = fecha_str(add_days(fecha_efectiva, 1))
            fecha_aux2 = fecha_str(add_days(max(fecha_efectiva, fecha), -1))

            arr_di = (
                "SELECT COALESCE ((EXP(SUM(LOG(POWER(1 + T.Valor / 100, 1 / CAST(252 AS float))))) - 1) * 100, 0) "
                "AS DIAcum, COUNT(*) AS N "
                "FROM dbAlgebra.dbo.TdTasas T "
                "INNER JOIN dbAlgebra.dbo.TdInfoTasas I "
                "ON T.Tasa = I.TickerCorto "
                "INNER JOIN dbAlgebra.dbo.TdFeriados F "
                "ON T.Fecha = F.Fecha "
                "WHERE (T.SiValida = 1) AND (T.Hora = 'CIERRE') AND (I.Plazo = '1D') AND (I.TipoTasa = 'SWAP') "
                "AND (I.MonedaActiva = 'BRL') AND (T.Fecha BETWEEN " +
                fecha_aux1 + " "
                "AND " + fecha_aux2 +
                ") AND (T.Valor >= 0) AND (F.Pais = 'BR') AND (F.SiHabil = 1)")

            arr_di = pd.io.sql.read_sql(arr_di, self.cn)

            if ultimo_habil_pais(fecha, "BR",
                                 cn) == fecha and plazo_ini != plazo:
                fecha_aux1 = fecha_str(
                    ultimo_habil_pais(add_days(max(fecha_efectiva, fecha), -1),
                                      "BR", cn))

                di_dia = (
                    "SELECT T.Valor AS DIDia "
                    "FROM dbAlgebra.dbo.TdTasas T "
                    "INNER JOIN dbAlgebra.dbo.TdInfoTasas I "
                    "ON T.Tasa = I.TickerCorto WHERE (T.SiValida = 1) AND (T.Hora = 'CIERRE') "
                    "AND (I.Plazo = '1D') AND (I.TipoTasa = 'SWAP') AND (I.MonedaActiva = 'BRL') "
                    "AND (T.Fecha = " + fecha_aux1 + ")")

                di_dia = pd.io.sql.read_sql(di_dia, self.cn).DIDia.iloc[0]

                di_acum = (((arr_di.DIAcum.iloc[0] / 100) + 1) *
                           ((1 + di_dia / 100)**(1 / 252)) - 1) * 100

            else:
                di_acum = arr_di.DIAcum.iloc[0]

            vpv = (di_acum / 100) + 1

            flujo_variable_presente = vpv * pv
            fecha_flujo_variable_presente = fecha

            fecha_pago = add_days(fecha_venc, -1)
            fecha_pago = siguiente_habil_paises(fecha_pago, paises_feriados,
                                                cn)

        fecha_flujo_variable = fecha_venc

        flujo_variable = proyectar_flujo(fecha_flujo_variable_presente, hora,
                                         fecha_venc, fecha_venc, mercado,
                                         moneda, flujo_variable_presente,
                                         moneda_base, cn)

        insert = dict()
        insert_nosensible = dict()

        insert["Fecha"] = fecha
        insert["Administradora"] = admin
        insert["Fondo"] = fondo
        insert["Contraparte"] = contraparte
        insert["Tipo"] = "SPD"
        insert["ID"] = id
        insert["ActivoPasivo"] = -factor_recibo_fijo
        insert["FechaFixing"] = fecha_flujo_variable
        insert["FechaFlujo"] = fecha_flujo_variable
        insert["FechaPago"] = fecha_pago
        insert["Moneda"] = moneda
        insert["Flujo"] = flujo_variable
        insert["Amortizacion"] = flujo_variable
        insert["Interes"] = 0
        insert["Id_Key_Cartera"] = id_key

        self.flujos_derivados = self.flujos_derivados.append(insert,
                                                             ignore_index=True)

        insert_nosensible["Fecha"] = fecha
        insert_nosensible["Administradora"] = admin
        insert_nosensible["Fondo"] = fondo
        insert_nosensible["Contraparte"] = contraparte
        insert_nosensible["Tipo"] = "SPD"
        insert_nosensible["ID"] = id
        insert_nosensible["ActivoPasivo"] = -factor_recibo_fijo
        insert_nosensible[
            "FechaFlujoNoSensible"] = fecha_flujo_variable_presente
        insert_nosensible["Moneda"] = moneda
        insert_nosensible["FlujoNoSensible"] = flujo_variable
        insert_nosensible["Id_Key_Cartera"] = id_key

        self.flujos_nosensibles = self.flujos_nosensibles.append(
            insert_nosensible, ignore_index=True)

        insert["Flujo"] = nocional
        insert["Amortizacion"] = nocional

        insert_nosensible["FlujoNoSensible"] = nocional

        insert["FechaFixing"] = fecha_venc
        insert["FechaFlujo"] = fecha_venc

        insert_nosensible["FechaFlujoNoSensible"] = fecha_venc

        insert["FechaPago"] = siguiente_habil_paises(add_days(fecha_venc, -1),
                                                     paises_feriados, cn)

        insert_nosensible["ActivoPasivo"] = factor_recibo_fijo
        insert["ActivoPasivo"] = factor_recibo_fijo

        self.flujos_derivados = self.flujos_derivados.append(insert,
                                                             ignore_index=True)
        self.flujos_nosensibles = self.flujos_nosensibles.append(
            insert_nosensible, ignore_index=True)

        self.set_status("INFO: Flujos generados para SPD con ID " +
                        str(self.info_cartera.ID.iloc[0]))
Beispiel #5
0
    def genera_flujos(self):
        hora = self.hora
        cn = self.cn
        fechaActual = self.fechaActual
        fechaValores = self.fechaValores

        fondo = self.info_cartera.Fondo[0]
        id = self.info_cartera.ID[0]

        fecha_efectiva = pd.to_datetime(
            datetime.datetime.strptime(
                self.info_cartera.FechaEfectiva[0].split(" ")[0],
                "%d/%m/%Y").strftime("%Y-%m-%d")).date()
        fecha_venc = pd.to_datetime(
            pd.to_datetime(
                datetime.datetime.strptime(
                    self.info_cartera.FechaVenc[0].split(" ")[0],
                    "%d/%m/%Y").strftime("%Y-%m-%d")).date()).date()

        ajuste_feriados = self.info_cartera.AjusteFeriados[0]
        paises_feriados = ajuste_feriados.split(',')

        moneda = self.info_cartera.MonedaActivo[0]

        if self.info_cartera.TipoTasaActivo[0] == 'Fija':
            factor_recibo_fijo = 1
            tasa = self.info_cartera.TasaActivo[0]
        else:
            factor_recibo_fijo = -1
            tasa = self.info_cartera.TasaPasivo[0]

        #tasa = float(tasa.replace(",","."))
        nocional = self.info_cartera.NocionalActivo[0]

        frecuencia = cast_frecuencia(self.info_cartera.FrecuenciaActivo[0])

        if frecuencia == cast_frecuencia("Semi annual"):
            convencion = "ACT360"
        else:
            convencion = "LACT360"

        flujos_f = genera_flujos(max(fechaActual,
                                     fecha_efectiva), fecha_efectiva,
                                 fecha_venc, tasa, frecuencia, convencion)

        fecha_cupon = flujos_f[0][0]

        fecha_aux = delta_frecuencia(fecha_cupon, frecuencia, -1)
        fecha_aux = max(fecha_aux, fecha_efectiva)
        fecha_cupon_anterior = ultimo_habil_pais(fecha_aux, "CL", cn)
        if fechaActual < fecha_cupon_anterior:
            vpv = 1
        else:
            vpv = (
                "SELECT ICP1.ICP / ICP0.ICP AS Cupon FROM (SELECT ICP FROM dbAlgebra.dbo.TdIndicadores "
                "WHERE (Fecha = " + fecha_str(fechaValores) +
                ")) ICP1 CROSS JOIN ("
                "SELECT ICP FROM dbAlgebra.dbo.TdIndicadores "
                "WHERE (Fecha = " + fecha_str(fecha_cupon_anterior) + ")) "
                "ICP0")
            vpv = pd.io.sql.read_sql(vpv, cn)
            vpv = vpv.Cupon[0]
        flujos_v = proyectar_flujos_tabla(fechaActual, fechaValores, vpv, hora,
                                          fecha_efectiva, fecha_venc,
                                          frecuencia, moneda, 0, "Local",
                                          ajuste_feriados, cn)

        # Simulamos los insert a base de datos

        col_flujos_derivados = [
            'Fecha', 'Fondo', 'Tipo', 'ID', 'ActivoPasivo', 'FechaFixing',
            'FechaFlujo', 'FechaPago', 'Moneda', 'Flujo', 'Amortizacion',
            'Interes', 'Sensibilidad', 'InteresDevengado'
        ]

        col_flujos_nosensibles = [
            'Fecha', 'Fondo', 'Tipo', 'ID', 'ActivoPasivo',
            'FechaFlujoNoSensible', 'Moneda', 'FlujoNoSensible'
        ]

        flujos_derivados = pd.DataFrame(columns=col_flujos_derivados)

        flujos_nosensibles = pd.DataFrame(columns=col_flujos_nosensibles)
        for i in flujos_v:
            flujos_derivados = flujos_derivados.append(
                pd.DataFrame([[
                    fechaActual, fondo, 'SCC', id, -factor_recibo_fijo, i[0],
                    i[0], i[2], moneda, i[1] / 100 * nocional,
                    i[3] / 100 * nocional, i[4] / 100 * nocional,
                    i[5] / 100 * nocional, i[6] / 100 * nocional
                ]],
                             columns=col_flujos_derivados))

        flujos_nosensibles = flujos_nosensibles.append(
            pd.DataFrame([[
                fechaActual, fondo, 'SCC', id, -factor_recibo_fijo,
                max(fechaActual, fecha_efectiva), moneda, vpv * nocional
            ]],
                         columns=col_flujos_nosensibles))

        for i in flujos_f:
            flujo_fijo = i[1] / 100 * nocional
            amortizacion = i[3] / 100 * nocional
            interes_fijo = i[4] / 100 * nocional
            fecha_flujo_f = i[0]
            devengo = i[6] / 100 * nocional
            fecha_pago = siguiente_habil_paises(add_days(fecha_flujo_f, -1),
                                                paises_feriados, cn)
            test = pd.DataFrame([fecha_flujo_f], columns=["fech"])
            flujos_derivados = flujos_derivados.append(
                pd.DataFrame([[
                    fechaActual, fondo, 'SCC', id, factor_recibo_fijo,
                    fecha_flujo_f, fecha_flujo_f, fecha_pago, moneda,
                    flujo_fijo, amortizacion, interes_fijo, 0, devengo
                ]],
                             columns=col_flujos_derivados))

            flujos_nosensibles = flujos_nosensibles.append(
                pd.DataFrame([[
                    fechaActual, fondo, 'SCC', id, factor_recibo_fijo,
                    fecha_flujo_f, moneda, flujo_fijo
                ]],
                             columns=col_flujos_nosensibles))

        self.flujos_nosensibles = flujos_nosensibles
        self.flujos_derivados = flujos_derivados
        self.set_status("INFO: Flujos generados para SCC con ID " +
                        str(self.info_cartera.ID.iloc[0]))
Beispiel #6
0
    def genera_flujos(self):
        hora = self.hora
        cn = self.cn
        fecha = self.fecha

        admin = self.info_cartera.Administradora[0]

        fondo = self.info_cartera.Fondo[0]
        contraparte = self.info_cartera.Contraparte[0]
        id = self.info_cartera.ID[0]

        fecha_efectiva = pd.to_datetime(
            self.info_cartera.FechaEfectiva[0]).date()
        fecha_venc = pd.to_datetime(self.info_cartera.FechaVenc[0]).date()

        ajuste_feriados = self.info_cartera.AjusteFeriados[0]
        paises_feriados = ajuste_feriados.split(',')

        moneda = self.info_cartera.MonedaActivo[0]

        if self.info_cartera.TipoTasaActivo[0] == 'Fija':
            factor_recibo_fijo = 1
            tasa = self.info_cartera.TasaActivo[0]
            frecuencia_fija = self.info_cartera.FrecuenciaActivo[0]
            frecuencia_variable = self.info_cartera.FrecuenciaPasivo[0]
        else:
            factor_recibo_fijo = -1
            tasa = self.info_cartera.TasaPasivo[0]
            frecuencia_fija = self.info_cartera.FrecuenciaPasivo[0]
            frecuencia_variable = self.info_cartera.FrecuenciaActivo[0]

        nocional = self.info_cartera.NocionalActivo[0]

        frecuencia_fija = cast_frecuencia(frecuencia_fija)
        frecuencia_variable = cast_frecuencia(frecuencia_variable)

        id_key = self.info_cartera.ID_Key[0]

        fecha_aux = add_days(max(fecha, fecha_efectiva), -1)
        fecha_aux = add_days(ultimo_habil_pais(fecha_aux, "US", cn), 1)

        flujos_f = genera_flujos(fecha_aux, fecha_efectiva, fecha_venc, tasa,
                                 frecuencia_fija, "ACT360")

        arr_factor_descuento = curva_cero_swapUSD(fecha, hora,
                                                  frecuencia_variable,
                                                  "ACT360", cn)

        print("arr", arr_factor_descuento)

        flujos_v = genera_flujos(fecha_aux, fecha_efectiva, fecha_venc, 0,
                                 frecuencia_variable, "ACT360")

        flujos_v_DV01 = flujos_v

        flujos_f_ns = flujos_v

        for i in range(len(flujos_v)):
            fecha_anterior = delta_frecuencia(flujos_v[i][0],
                                              frecuencia_variable, -1)

            print(flujos_v[i][0])

            fecha_fijacion_libor = add_days(
                ultimo_habil_pais(add_days(fecha_anterior, -1), "UK", cn), -1)
            fecha_fijacion_libor = ultimo_habil_pais(fecha_fijacion_libor,
                                                     "UK", cn)

            fecha_fijacion_libor_siguiente = add_days(
                ultimo_habil_pais(add_days(flujos_v[i][0], -1), "UK", cn), -1)
            fecha_fijacion_libor_siguiente = ultimo_habil_pais(
                fecha_fijacion_libor_siguiente, "UK", cn)

            flujos_v[i][0] = siguiente_habil_pais(add_days(flujos_v[i][0], -1),
                                                  "US", cn)
            flujos_v_DV01[i][0] = flujos_v[i][0]
            flujos_f_ns[i][0] = flujos_v[i][0]

            max_fecha_libor = (
                "SELECT Max(T.Fecha) as FechaMax "
                "FROM dbAlgebra.dbo.TdInfoTasas I "
                "INNER JOIN "
                "dbAlgebra.dbo.TdTasas T "
                "ON I.TickerCorto = T.Tasa "
                "WHERE T.SiValida = 1 AND T.Hora = 'CIERRE' AND I.Plazo = '" +
                frecuencia_variable + "' "
                "AND I.TipoTasa = 'LIBOR' AND I.MonedaActiva = 'USD' "
                "AND T.Fecha <= " + fecha_str(fecha_fijacion_libor) + "")

            max_fecha_libor = pd.io.sql.read_sql(max_fecha_libor,
                                                 self.cn).FechaMax.iloc[0]

            if fecha_fijacion_libor <= fecha:
                libor = (
                    "SELECT T.Valor "
                    "FROM dbAlgebra.dbo.TdInfoTasas I "
                    "INNER JOIN "
                    "dbAlgebra.dbo.TdTasas T "
                    "ON I.TickerCorto = T.Tasa "
                    "WHERE T.SiValida = 1 AND T.Hora = 'CIERRE' AND I.Plazo = '"
                    + frecuencia_variable + "' "
                    "AND I.TipoTasa = 'LIBOR' AND I.MonedaActiva = 'USD' "
                    "AND T.Fecha = " + fecha_str(max_fecha_libor) +
                    " ORDER BY I.Plazo360")

                libor = pd.io.sql.read_sql(libor, self.cn).Valor.iloc[0]
                tasa = libor
                tasaDV01 = tasa

                if fecha_fijacion_libor_siguiente > fecha or len(
                        flujos_v) - 1 == i:
                    flujos_f_ns[i][1] = 100 + tasa * (
                        flujos_f_ns[i][0] - fecha_anterior).days / 360
                else:
                    flujos_f_ns[i][1] = tasa * (flujos_f_ns[i][0] -
                                                fecha_anterior).days / 360
                flujos_v[i][6] = tasa * (fecha - fecha_anterior).days / 360
            else:

                plazo_ini = (fecha_fijacion_libor - fecha).days
                plazo_fin = (fecha_fijacion_libor_siguiente - fecha).days

                tasa_arr = tasa_FRA_y_tasa_DV01(plazo_ini, plazo_fin, 0,
                                                arr_factor_descuento)
                tasa = tasa_arr[0]
                tasaDV01 = tasa_arr[1]

                flujos_f_ns[i][1] = 0
                flujos_v[i][6] = 0

            flujos_v[i][1] = flujos_v[i][1] + tasa * (
                flujos_v[i][0] - fecha_anterior).days / 360
            flujos_v[i][4] = tasa * (flujos_v[i][0] -
                                     fecha_anterior).days / 360
            flujos_v_DV01[i][1] = flujos_v_DV01[i][1] + tasaDV01 * (
                flujos_v_DV01[i][0] - fecha_anterior).days / 360

        insert = dict()
        insert["Fecha"] = fecha
        insert["Administradora"] = admin
        insert["Fondo"] = fondo
        insert["Contraparte"] = contraparte
        insert["Tipo"] = "SDL"
        insert["ID"] = id
        insert["Hora"] = hora
        insert["ActivoPasivo"] = -factor_recibo_fijo
        insert["Id_Key_Cartera"] = id_key

        for i in range(len(flujos_v)):

            insert["FechaFixing"] = flujos_v[i][0]
            insert["FechaFlujo"] = flujos_v[i][0]
            insert["FechaPago"] = siguiente_habil_paises(
                add_days(flujos_v[i][0], -1), paises_feriados, cn)
            insert["Moneda"] = moneda
            insert["Flujo"] = flujos_v[i][1] / 100 * nocional
            insert["Amortizacion"] = flujos_v[i][3] / 100 * nocional
            insert["Interes"] = flujos_v[i][4] / 100 * nocional
            insert["Sensibilidad"] = (flujos_v_DV01[i][1] -
                                      flujos_v[i][1]) / 100 * nocional
            insert["InteresDevengado"] = flujos_v[i][6] / 100 * nocional

            self.flujos_derivados = self.flujos_derivados.append(insert)

        insert_nosensible = dict()
        insert_nosensible["Fecha"] = fecha
        insert_nosensible["Administradora"] = admin
        insert_nosensible["Fondo"] = fondo
        insert_nosensible["Contraparte"] = contraparte
        insert_nosensible["Tipo"] = "SDL"
        insert_nosensible["ID"] = id
        insert_nosensible["Hora"] = hora
        insert_nosensible["ActivoPasivo"] = factor_recibo_fijo
        insert_nosensible["Id_Key_Cartera"] = id_key
        insert["ActivoPasivo"] = factor_recibo_fijo

        for i in flujos_f:
            insert["FechaFixing"] = i[0]
            insert["FechaFlujo"] = i[0]
            insert["FechaPago"] = siguiente_habil_paises(
                add_days(i[0], -1), paises_feriados, cn)
            insert["Moneda"] = moneda
            insert["Flujo"] = i[1] / 100 * nocional
            insert["Amortizacion"] = i[3] / 100 * nocional
            insert["Interes"] = i[4] / 100 * nocional
            insert["InteresDevengado"] = i[6] / 100 * nocional
            self.flujos_derivados = self.flujos_derivados.append(insert)

            insert_nosensible["FechaFlujoNoSensible"] = i[0]
            insert_nosensible["Moneda"] = moneda
            insert_nosensible["FlujoNoSensible"] = i[1] / 100 * nocional
            self.flujos_nosensibles = self.flujos_nosensibles.append(
                insert_nosensible)

        insert_nosensible["ActivoPasivo"] = -factor_recibo_fijo
        for i in flujos_f_ns:
            insert_nosensible["FechaFlujoNoSensible"] = i[0]
            insert_nosensible["FlujoNoSensible"] = i[1] / 100 * nocional
            self.flujos_nosensibles = self.flujos_nosensibles.append(
                insert_nosensible)

        self.set_status("INFO: Flujos generados para SDL con ID " +
                        str(self.info_cartera.ID.iloc[0]))
Beispiel #7
0
    def genera_flujos(self):
        hora = self.hora
        cn = self.cn
        fecha = self.fecha


        fondo = self.info_cartera.Fondo[0]
        
        id = self.info_cartera.ID[0]

        fecha_efectiva = pd.to_datetime(self.info_cartera.FechaEfectiva[0]).date()
        fecha_venc = pd.to_datetime(self.info_cartera.FechaVenc[0]).date()

        ajuste_feriados = self.info_cartera.AjusteFeriados[0]
        paises_feriados = ajuste_feriados.split(',')

        moneda = self.info_cartera.MonedaActivo[0]

        if self.info_cartera.TipoTasaActivo[0] == 'Fija':
            factor_recibo_fijo = 1
            tasa = self.info_cartera.TasaActivo[0]
        else:
            factor_recibo_fijo = -1
            tasa = self.info_cartera.TasaPasivo[0]

        nocional = self.info_cartera.NocionalActivo[0]

        frecuencia = self.info_cartera.FrecuenciaActivo[0]

        id_key = self.info_cartera.ID_Key[0]

        flujos_f = genera_flujos(max(fecha, fecha_efectiva), fecha_efectiva, fecha_venc, tasa, frecuencia, "LACT360")
        fecha_cupon = flujos_f[0][0]

        fecha_aux = delta_frecuencia(fecha_cupon, frecuencia, -1)
        fecha_aux = max(fecha_aux, fecha_efectiva)

        fecha_cupon_anterior = ultimo_habil_pais(fecha_aux, "CO", cn)

        fecha_aux1 = fecha_str(add_months(max(fecha_efectiva, fecha_cupon_anterior), -1))
        fecha_aux2 = fecha_str(add_days(ultimo_habil_pais(max(fecha_efectiva, fecha), "CO", cn), -1))
        fecha_aux3 = fecha_str(max(fecha_efectiva, fecha_cupon_anterior))
        fecha_aux4 = fecha_str(add_days(ultimo_habil_pais(max(fecha_efectiva, fecha), "CO", cn), -1))

        ibr_acum = ("SELECT COALESCE (EXP(SUM(LOG(1 + T.Valor / CAST(36000 as float)))), 1) AS IbrAcum "
                    "FROM ("
                        "SELECT MAX(T.Fecha) AS FechaMax, I.Fecha "
                        "FROM dbAlgebra.dbo.TdTasas T INNER JOIN dbAlgebra.dbo.TdIndicadores I "
                           "ON T.Fecha <= I.Fecha "
                        "WHERE T.SiValida = 1 AND T.Hora = 'CIERRE' AND T.Tasa = 'COOVIBR' "
                            "AND T.Fecha BETWEEN " + fecha_aux1 + " AND " + fecha_aux2 + ""
                            "AND I.Fecha BETWEEN " + fecha_aux3 + " AND " + fecha_aux4 + ""
                            "AND T.SiValida = 1 "
                        "GROUP BY I.Fecha) F "
                        "INNER JOIN dbAlgebra.dbo.TdTasas T "
                            "ON F.FechaMax = T.Fecha "
                    "WHERE T.SiValida = 1 AND T.Hora = 'CIERRE' AND T.Tasa = 'COOVIBR'")

        ibr_acum = pd.io.sql.read_sql(ibr_acum, cn)
        ibr_acum = ibr_acum.IbrAcum[0]
        flujos_v = proyectar_flujos_tabla(fecha, fecha, ibr_acum, hora, fecha_efectiva, fecha_venc, frecuencia, moneda,
                                          0, "Local", ajuste_feriados, cn)


        # Simulamos los insert a base de datos

        col_flujos_derivados = ['Fecha', 'Fondo', 'Tipo', 'ID', 'ActivoPasivo',
                                'FechaFixing', 'FechaFlujo', 'FechaPago', 'Moneda', 'Flujo', 'Amortizacion', 'Interes',
                                'Sensibilidad', 'InteresDevengado', 'Id_Key_Cartera']

        col_flujos_nosensibles = ['Fecha', 'Fondo', 'Tipo', 'ID', 'ActivoPasivo',
                                  'FechaFlujoNoSensible', 'Moneda', 'FlujoNoSensible', 'Id_Key_Cartera']

        flujos_derivados = pd.DataFrame(columns=col_flujos_derivados)

        flujos_nosensibles = pd.DataFrame(columns=col_flujos_nosensibles)
        c = 0
        for i in flujos_v:
            flujos_derivados = flujos_derivados.append(pd.DataFrame([[fecha, fondo, 'IBR', id,
                                                                     -factor_recibo_fijo, i[0], i[0],
                                                                     i[2], moneda, i[1]/100*nocional,
                                                                     i[3]/100 * nocional,
                                                                     i[4]/100*nocional, i[5] / 100 * nocional,
                                                                     i[6] / 100 * nocional, id_key]],
                                                                    columns=col_flujos_derivados))

        flujos_nosensibles = flujos_nosensibles.append(pd.DataFrame([[fecha, fondo, 'IBR', id,
                                                                     -factor_recibo_fijo, max(fecha, fecha_efectiva),
                                                                     moneda, ibr_acum*nocional, id_key]],
                                                                    columns=col_flujos_nosensibles))

        for i in flujos_f:
            flujo_fijo = i[1] / 100 * nocional
            amortizacion = i[3] / 100 * nocional
            interes_fijo = i[4] / 100 * nocional
            fecha_flujo_f = i[0]
            devengo = i[6] / 100 * nocional
            fecha_pago = siguiente_habil_paises(add_days(fecha_flujo_f, -1), paises_feriados, cn)

            flujos_derivados = flujos_derivados.append(pd.DataFrame([[fecha, fondo, 'IBR', id,
                                                                     factor_recibo_fijo, fecha_flujo_f, fecha_flujo_f,
                                                                     fecha_pago, moneda, flujo_fijo, amortizacion,
                                                                     interes_fijo, 0, devengo, id_key]],
                                                                    columns=col_flujos_derivados))

            flujos_nosensibles = flujos_nosensibles.append(pd.DataFrame([[fecha, fondo, 'IBR', id,
                                                                         factor_recibo_fijo, fecha_flujo_f, moneda,
                                                                         flujo_fijo, id_key]],
                                                                        columns=col_flujos_nosensibles))

        self.flujos_nosensibles = flujos_nosensibles
        self.flujos_derivados = flujos_derivados
        self.set_status("INFO: Flujos generados para IBR con ID " + str(self.info_cartera.ID.iloc[0]))
def duplica_fondos_habil_anterior(fecha, servidorApp, instrumentos, empresas,
                                  cn):
    """
    Duplica en sector real del servidor las filas con instrumento en el arreglo de instrumentos
    :param fecha: datetime.date del proceso
    :param servidorApp:  String nombre del servidor
    :param instrumentos: array de id's de instrumentos para duplicar
    :param cn: pyodbc.conection conexión a base de datos
    :return:  None
    """

    instrumentos_excluidos = [
        '939', '929', '930', '931', '932', '933', '934', '857', '864', '883',
        '884', '885', '886', '887', '891', '894', '896', '899', '919', '924',
        '927', '935', '936', '937', '938', '940', '941', '942', '943', '944',
        '945', '946', '947', '950', '982', '989', '1025', '1026', '1027',
        '1028', '993', '994', '995', '997', '998', '1000', '1001', '1063',
        '1047', '1108', '1109', '1110', '1111', '1112', '1113', '1115', '1138',
        '1216'
    ]

    instrumentos_excluidos = str(instrumentos_excluidos)[1:-1]

    instrumentos = str_condicion(instrumentos, "idInstrumento")

    empresas = str_condicion(empresas, "idEmpresa")

    sql_servidor = (
        "INSERT INTO [" + servidorApp + "].dbSectorReal.dbo.TdDerivadosFondo "
        "SELECT idInstrumento, idEmpresa, Visible, '" + fecha_str(fecha) + "' "
        "AS Fecha, Fondo, Nombre, Contraparte, Tipo, FechaTransaccion, FechaFixing, FechaEfectiva, FechaVenc, "
        "AjusteFeriados, Mercado, Nemotecnico, Referencia, NocionalActivo, MonedaActivo, FrecuenciaActivo, "
        "TipoTasaActivo, TasaActivo , SpreadActivo, NocionalPasivo, MonedaPasivo, FrecuenciaPasivo, TipotasaPasivo, "
        "TasaPasivo, SpreadPasivo, MonedaBase "
        "FROM [" + servidorApp + "].dbSectorReal.dbo.TdDerivadosFondo "
        "WHERE " + instrumentos + " OR " + empresas + " "
        "AND Fecha=" + fecha_str(ultimo_habil_pais(fecha, 'CL', cn)) +
        " AND FechaVenc > " + fecha_str(fecha) + " "
        "AND idInstrumento NOT IN (SELECT idInstrumento FROM [" + servidorApp +
        "].dbSectorReal.dbo.TdDerivadosFondo "
        "WHERE Fecha=" + fecha_str(fecha) + ") AND idInstrumento NOT IN (" +
        instrumentos_excluidos + ")")

    sql = (
        "INSERT INTO dbSectorReal.dbo.TdDerivadosFondo SELECT idInstrumento, idEmpresa, Visible, "
        + fecha_str(fecha) + " "
        "AS Fecha, Fondo, Nombre, Contraparte, Tipo, FechaTransaccion, FechaFixing, FechaEfectiva, FechaVenc, "
        "AjusteFeriados, Mercado, Nemotecnico, Referencia, NocionalActivo, MonedaActivo, FrecuenciaActivo, "
        "TipoTasaActivo, TasaActivo , SpreadActivo, NocionalPasivo, MonedaPasivo, FrecuenciaPasivo, TipotasaPasivo, "
        "TasaPasivo, SpreadPasivo, MonedaBase "
        "FROM [" + servidorApp + "].dbSectorReal.dbo.TdDerivadosFondo "
        "WHERE " + instrumentos + " OR " + empresas + " "
        "AND Fecha=" + fecha_str(ultimo_habil_pais(fecha, 'CL', cn)) + " "
        "AND FechaVenc > " + fecha_str(fecha) + " "
        "AND idInstrumento NOT IN (SELECT idInstrumento "
        "FROM [" + servidorApp + "].dbSectorReal.dbo.TdDerivadosFondo "
        "WHERE Fecha=" + fecha_str(fecha) + ") "
        "AND idInstrumento NOT IN (" + instrumentos_excluidos + ")")

    cursor = cn.cursor()
    cursor.execute(sql)

    cursor.execute(sql_servidor)
    send_msg("")  # todo
    def genera_flujos(self):
        hora = self.hora
        cn = self.cn
        fecha = self.fecha

        admin = self.info_cartera.Administradora[0]

        fondo = self.info_cartera.Fondo[0]
        contraparte = self.info_cartera.Contraparte[0]
        id = self.info_cartera.ID[0]

        fecha_efectiva = pd.to_datetime(self.info_cartera.FechaEfectiva[0]).date()
        fecha_venc = pd.to_datetime(self.info_cartera.FechaVenc[0]).date()

        ajuste_feriados = self.info_cartera.AjusteFeriados[0]
        paises_feriados = ajuste_feriados.split(',')

        moneda = self.info_cartera.MonedaActivo[0]

        if self.info_cartera.TipoTasaActivo[0] == 'Fija':
            factor_recibo_fijo = 1
            tasa = self.info_cartera.TasaActivo[0]
        else:
            factor_recibo_fijo = -1
            tasa = self.info_cartera.TasaPasivo[0]

        nocional = self.info_cartera.NocionalActivo[0]

        frecuencia = cast_frecuencia(self.info_cartera.FrecuenciaActivo[0])

        id_key = self.info_cartera.ID_Key[0]

        convencion = "LACT360"

        flujos_f = genera_flujos(max(fecha, fecha_efectiva), fecha_efectiva, fecha_venc, tasa, frecuencia, convencion)
        fecha_cupon = flujos_f[0][0]

        fecha_aux = delta_frecuencia(fecha_cupon, frecuencia, -1)
        fecha_aux = max(fecha_aux, fecha_efectiva)

        fecha_cupon_anterior = ultimo_habil_pais(fecha_aux, "CL", cn)

        if fecha < fecha_cupon_anterior:
            vpv = 1
        else:
            vpv = ("SELECT (ICP1.ICP / ICP0.ICP)/(ICP1.UF / ICP0.UF) AS Cupon FROM "
                   "(SELECT ICP, UF FROM dbAlgebra.dbo.TdIndicadores "
                   "WHERE (Fecha = " + fecha_str(fecha) + ")) ICP1 CROSS JOIN ("
                                                           "SELECT ICP, UF FROM dbAlgebra.dbo.TdIndicadores "
                                                           "WHERE (Fecha = " + fecha_str(fecha_cupon_anterior) + ")) "
                                                                                                                  "ICP0")
            vpv = pd.io.sql.read_sql(vpv, cn)
            vpv = vpv.Cupon[0]

        flujos_v = proyectar_flujos_tabla(fecha, fecha, vpv, hora, fecha_efectiva, fecha_venc, frecuencia, moneda, 0,
                                          "Local", ajuste_feriados, cn)
        # Simulamos los insert a base de datos

        col_flujos_derivados = ['Fecha', 'Administradora', 'Fondo', 'Contraparte', 'Tipo', 'ID', 'ActivoPasivo',
                                'FechaFixing', 'FechaFlujo', 'FechaPago', 'Moneda', 'Flujo', 'Amortizacion', 'Interes',
                                'Sensibilidad', 'InteresDevengado', 'Id_Key_Cartera']

        col_flujos_nosensibles = ['Fecha', 'Administradora', 'Fondo', 'Contraparte', 'Tipo', 'ID', 'ActivoPasivo',
                                  'FechaFlujoNoSensible', 'Moneda', 'FlujoNoSensible', 'Id_Key_Cartera']

        flujos_derivados = pd.DataFrame(columns=col_flujos_derivados)

        flujos_nosensibles = pd.DataFrame(columns=col_flujos_nosensibles)

        for i in flujos_v:
            flujos_derivados = flujos_derivados.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SUC', id,
                                                                      -factor_recibo_fijo, i[0], i[0],
                                                                      i[2], moneda, i[1] / 100 * nocional,
                                                                      i[3] / 100 * nocional,
                                                                      i[4] / 100 * nocional, i[5] / 100 * nocional,
                                                                      i[6] / 100 * nocional, id_key]],
                                                                    columns=col_flujos_derivados))

        flujos_nosensibles = flujos_nosensibles.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SUC', id,
                                                                      -factor_recibo_fijo, max(fecha, fecha_efectiva),
                                                                      moneda,
                                                                      vpv * nocional, id_key]],
                                                                    columns=col_flujos_nosensibles))

        for i in flujos_f:
            flujo_fijo = i[1] / 100 * nocional
            amortizacion = i[3] / 100 * nocional
            interes_fijo = i[4] / 100 * nocional
            fecha_flujo_f = i[0]
            devengo = i[6] / 100 * nocional
            fecha_pago = siguiente_habil_paises(add_days(fecha_flujo_f, -1), paises_feriados, cn)

            flujos_derivados = flujos_derivados.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SUC', id,
                                                                     factor_recibo_fijo, fecha_flujo_f, fecha_flujo_f,
                                                                     fecha_pago, moneda, flujo_fijo, amortizacion,
                                                                     interes_fijo, 0, devengo, id_key]],
                                                                    columns=col_flujos_derivados))

            flujos_nosensibles = flujos_nosensibles.append(pd.DataFrame([[fecha, admin, fondo, contraparte, 'SUC', id,
                                                                         factor_recibo_fijo, fecha_flujo_f, moneda,
                                                                         flujo_fijo, id_key]],
                                                                        columns=col_flujos_nosensibles))

        self.flujos_nosensibles = flujos_nosensibles
        self.flujos_derivados = flujos_derivados
        self.set_status("INFO: Flujos generados para SUC con ID " + str(self.info_cartera.ID.iloc[0]))