Exemplo n.º 1
0
def valor_moneda(moneda_inicio, moneda_fin, camino_monedas, valores):
    """

    :param moneda_inicio:
    :param moneda_fin:
    :param camino_monedas:
    :param valores:
    :return:
    """

    if moneda_inicio == moneda_fin:
        return 1

    df_camino = camino_monedas.loc[camino_monedas['MonedaActiva'] ==
                                   moneda_inicio]
    df_camino = df_camino.loc[df_camino['MonedaPasiva'] == moneda_fin]

    if len(df_camino) == 0 or len(df_camino) != df_camino.Total.iloc[0]:
        send_msg("ERROR: valor_moneda: No se encontró camino para",
                 moneda_inicio, moneda_fin)
        return

    cambios = df_camino[['MonedaActivaPuente', 'MonedaPasivaPuente']]
    cambios.columns = ['mAct', 'mPas']

    res = 1
    for i in range(len(cambios)):
        aux = valores[(valores.MonedaActiva == cambios.mAct.iloc[i])
                      & (valores.MonedaPasiva == cambios.mPas.iloc[i])]
        res = res * aux.Valor.iloc[0]
    return res
Exemplo n.º 2
0
    def revisar_input(self):
        info_cartera = self.info_cartera
        if not ('Fondo' in info_cartera.columns
                and isinstance(info_cartera.Fondo[0], str)):
            info_cartera["Fondo"] = "Fondo"

        if not ('ID' in info_cartera.columns
                and not isinstance(info_cartera.ID[0], str)
                and np.isnan(info_cartera.ID[0]) == False):
            send_msg("ERROR: Falta ingresar columna 'ID'", self.filename)

        if not ('FechaVenc' in info_cartera.columns
                and isinstance(info_cartera.FechaVenc[0], str)):
            send_msg("ERROR: Falta ingresar columna 'FechaVenc'",
                     self.filename)

        if not ('FechaFixing' in info_cartera.columns
                and isinstance(info_cartera.FechaFixing[0], str)):
            info_cartera["FechaFixing"] = info_cartera["FechaVenc"].iloc[0]

        if not ('NocionalActivo' in info_cartera.columns
                and not isinstance(info_cartera.NocionalActivo[0], str)
                and np.isnan(info_cartera.NocionalActivo[0]) == False):
            send_msg("ERROR: No viene la columna 'NocionalActivo'",
                     self.filename)

        if not ('NocionalPasivo' in info_cartera.columns
                and not isinstance(info_cartera.NocionalPasivo[0], str)
                and np.isnan(info_cartera.NocionalPasivo[0]) == False):
            send_msg("ERROR: No viene la columna 'NocionalPasivo'",
                     self.filename)

        if not ('MonedaActivo' in info_cartera.columns
                and isinstance(info_cartera.MonedaActivo[0], str)):
            send_msg("ERROR: No viene la columna 'MonedaActivo'",
                     self.filename)

        if not ('MonedaPasivo' in info_cartera.columns
                and isinstance(info_cartera.MonedaPasivo[0], str)):
            send_msg("ERROR: No viene la columna 'MonedaPasivo'",
                     self.filename)

        self.info_cartera = info_cartera
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
    def valoriza_flujos(self):
        """
        Valoriza los flujos y los guarda en el atributo flujos_valorizados
        Si no se ha llamado al método genera_flujos puede lanzar error
        :return: None
        """

        col_tabla_aux = ['Fecha', 'Fondo', 'Tipo', 'ID', 'Hora', 'Mercado',
                         'ActivoPasivo', 'FechaFixing', 'FechaFlujo', 'FechaPago', 'Moneda', 'Flujo', 'Amortizacion',
                         'Interes', 'MonedaBase', 'Sensibilidad']

        tabla_aux = pd.DataFrame(columns=col_tabla_aux)

        for i in range(len(self.flujos_derivados)):
            dic = dict()
            dic["Fecha"] = self.flujos_derivados.Fecha.iloc[i]
            dic["Fondo"] = self.flujos_derivados.Fondo.iloc[i]
            dic["Tipo"] = self.flujos_derivados.Tipo.iloc[i]
            dic["ID"] = self.flujos_derivados.ID.iloc[i]
            dic["Hora"] = self.hora
            dic["Mercado"] = self.info_cartera.Mercado.iloc[0]
            dic["ActivoPasivo"] = self.flujos_derivados.ActivoPasivo.iloc[i]
            dic["FechaFixing"] = self.flujos_derivados.FechaFixing.iloc[i]
            dic["FechaFlujo"] = self.flujos_derivados.FechaFlujo.iloc[i]
            dic["FechaPago"] = self.flujos_derivados.FechaPago.iloc[i]
            dic["Moneda"] = self.flujos_derivados.Moneda.iloc[i]
            dic["Flujo"] = self.flujos_derivados.Flujo.iloc[i]
            dic["Amortizacion"] = self.flujos_derivados.Amortizacion.iloc[i]
            dic["Interes"] = self.flujos_derivados.Interes.iloc[i]
            
            dic["MonedaBase"] = self.info_cartera.MonedaBase.iloc[0] 
            
            dic["Sensibilidad"] = self.flujos_derivados.Sensibilidad.iloc[i]

            tabla_aux = tabla_aux.append(dic, ignore_index=True)

        tabla_aux = tabla_aux.reset_index()
        cast_monedas = {'UF': 'CLF', 'CLN': 'COP'}

        plazos_monedas = pd.DataFrame(columns=['Moneda', 'Fecha', 'Plazo'])

        for i in range(len(tabla_aux)):
            insert = dict()
            insert["Fecha"] = tabla_aux.Fecha.iloc[i]
            insert["Plazo"] = (tabla_aux.FechaPago.iloc[i] - tabla_aux.Fecha.iloc[i]).days
            insert["Moneda"] = cast_monedas.get(tabla_aux.Moneda.iloc[i], tabla_aux.Moneda.iloc[i])
            plazos_monedas = plazos_monedas.append(insert, ignore_index=True)
            insert["Moneda"] = cast_monedas.get(tabla_aux.MonedaBase.iloc[i], tabla_aux.MonedaBase.iloc[i])
            plazos_monedas = plazos_monedas.append(insert, ignore_index=True)

        # Nos quedamos con el maximo plazo para cada par Moneda,Fecha
        plazos_monedas = plazos_monedas.sort_values('Plazo', ascending=False).drop_duplicates(
            ['Moneda', 'Fecha']).reset_index()

        # mercado_curvas = pd.DataFrame([['Ambos', '--'],
        #                                ['Ambos', 'Local'],
        #                                ['--', '--'],
        #                                ['Local', 'Local']], columns=['Mercados', 'Mercado'])

        curvas_monedas =  {}
        monedas_str = ""
        for moneda in plazos_monedas.Moneda.drop_duplicates():
            curvas_monedas[moneda] = ""
            monedas_str += "'" + moneda + "',"
        monedas_str = monedas_str[0:-1]
        

        # Se obtienen las curvas
        curvas = ("SELECT Curva, FechaMax, C.Hora, C.Moneda "
                  "FROM dbDerivados.dbo.TdCurvasDerivados A, dbDerivados.dbo.TdParidadMonedasCurvasDescuento B, "
                  "(SELECT MAX(Fecha) AS FechaMax, Hora, Moneda "
                  "FROM dbDerivados.dbo.TdCurvasDerivados A, dbDerivados.dbo.TdParidadMonedasCurvasDescuento B "
                  "WHERE A.Tipo = B.Tipo AND Fecha <= " + fecha_str(self.fechaValores) + " AND Hora = '" + self.hora + "' "
                  "AND Moneda IN (" + monedas_str + ") GROUP BY Hora, Moneda) C "
                  "WHERE A.Tipo = B.Tipo AND A.Fecha = C.FechaMax AND A.Hora = C.Hora AND B.Moneda = C.Moneda")


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

        for i in range(len(curvas)):
            curva = curvas.Curva.iloc[i]
            curvas_monedas[curvas.Moneda[i]] = parsear_curva(curva, self.fechaActual)
            if curvas.FechaMax.iloc[i].to_pydatetime().date() < self.fechaValores:
                self.set_status("ERROR: valoriza_flujos: Curva para la moneda " + str(curvas.Moneda[i]) +
                                " no encontrada para la fecha " + str(self.fechaValores) + ". Se utilizó curva de " + str(curvas.FechaMax[i].date()))
                send_msg("ERROR: valoriza_flujos: Curva para la moneda " + str(curvas.Moneda[i]) +
                                " no encontrada para la fecha " + str(self.fechaValores) + ". Se utilizó curva de " + str(curvas.FechaMax[i].date()), self.filename)

        error = False
        for i in curvas_monedas:
            if curvas_monedas[i] == "":
                self.set_status("ERROR: valoriza_flujos: No se encontró curva para la moneda " + i +
                                " en la fecha " + str(self.fechaValores) + " y hora " + self.hora)
                send_msg("ERROR: valoriza_flujos: No se encontró curva para la moneda " + i +
                         " en la fecha " + str(self.fechaValores) + " y hora " + self.hora, self.filename)
                error = True
        if error:
            return

        col_flujos_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', 'Sensibilidad',
                                  'TipoValorizacion']
        flujos_valorizados = pd.DataFrame(columns=col_flujos_valorizados)

        # Por cada flujo, valorizamos
        insert = dict()
        insert["Fecha"] = self.fechaActual
        insert["Tipo"] = self.info_cartera.Tipo.iloc[0]
        insert["Hora"] = self.hora
        for i in range(len(tabla_aux)):
            insert["Fondo"] = tabla_aux.Fondo.iloc[i]
            insert["ID"] = tabla_aux.ID.iloc[i]
            insert["Mercado"] = tabla_aux.Mercado.iloc[i]
            insert["ActivoPasivo"] = tabla_aux.ActivoPasivo.iloc[i]

            fecha_fixing = pd.to_datetime(tabla_aux.FechaFixing.iloc[i]).date()
            insert["FechaFixing"] = fecha_fixing

            fecha_flujo = pd.to_datetime(tabla_aux.FechaFlujo.iloc[i]).date()
            insert["FechaFlujo"] = fecha_flujo

            fecha_pago = pd.to_datetime(tabla_aux.FechaPago.iloc[i]).date()
            insert["FechaPago"] = fecha_pago

            moneda = tabla_aux.Moneda.iloc[i]
            insert["Moneda"] = moneda

            flujo = tabla_aux.Flujo.iloc[i]
            insert["Flujo"] = flujo

            moneda_base = tabla_aux.MonedaBase.iloc[i]
            insert["MonedaBase"] = moneda_base

            insert["Amortizacion"] = tabla_aux.Amortizacion.iloc[i]
            insert["Interes"] = tabla_aux.Interes.iloc[i]
            insert["Sensibilidad"] = tabla_aux.Sensibilidad.iloc[i]

            plazo_fixing = (fecha_fixing - self.fechaActual).days
            insert["PlazoTipoCambioFwd"] = plazo_fixing

            plazo_pago = (fecha_pago - self.fechaActual).days
            insert["PlazoDescuento"] = plazo_pago

            moneda_c = cast_monedas.get(moneda, moneda)
            base_c = cast_monedas.get(moneda_base, moneda_base)

            d1 = interpolacion_log_escalar(plazo_pago, curvas_monedas[base_c])
            insert["FactorDescMonBase"] = d1

            d2 = interpolacion_log_escalar(plazo_fixing, curvas_monedas[moneda_c])
            insert["FactorDescMonFlujoFix"] = d2

            d3 = interpolacion_log_escalar(plazo_fixing, curvas_monedas[base_c])
            insert["FactorDescMonBaseFix"] = d3

            insert["ValorPresenteMonFlujo"] = d1 * flujo * (d2 / d3)
            
            
            # d1/d3 mueve a valor presente desde la fecha pago a la fecha fixing
            # d2 trae a valor presente de la fecha fixing a hoy
            if plazo_fixing == plazo_pago:
                insert["FactorDescMonFlujo"] = d2
            else:
                insert["FactorDescMonFlujo"] = d2 * (d1 / d3)

            flujos_valorizados = flujos_valorizados.append(insert, ignore_index=True)

        self.flujos_valorizados = flujos_valorizados.reset_index()
        self.set_status("INFO: Valorización completada con éxito")
def limpia_tablas(servidorApp, cn):
    """
    Se eliminan registros de instrumentos marcados como no visibles tanto de servidor como local
    :param servidorApp: String nombre del servidor al cual eliminar, además del local
    :param cn: pyodbc.connect conexión a base de datos
    :return: None
    """
    # Se crea un cursor para la conexión
    # así poder contar cantidad de elementos eliminados
    cursor = cn.cursor()

    # Limpia WEB
    sql = ("DELETE FROM [" + servidorApp +
           "].dbSectorReal.dbo.TdDerivadosFondo WHERE Visible=0")
    cursor.execute(sql)
    send_msg(("ValorizaDerivadosSectorReal: limpia_tablas: Se elimina de "
              "[" + servidorApp + "][dbSectorReal][TdDerivadosFondo] " +
              str(cursor.rowcount) + " registros"))

    sql = (
        "DELETE FROM [" + servidorApp +
        "].dbSectorReal.dbo.TdDerivadosFondoValorizacion WHERE idInstrumento NOT IN "
        "(SELECT DISTINCT(idInstrumento) FROM "
        "[" + servidorApp + "].dbSectorReal.dbo.TdDerivadosFondo "
        "WHERE Visible=1)")
    cursor.execute(sql)
    send_msg(
        ("ValorizaDerivadosSectorReal: limpia_tablas: Se elimina de "
         "[" + servidorApp + "][dbSectorReal][TdDerivadosFondoValorizacion] "
         "" + str(cursor.rowcount) + " registros"))

    sql = ("DELETE FROM [" + servidorApp +
           "].dbSectorReal.dbo.TdDerivadosFlujos WHERE Visible=0")
    cursor.execute(sql)

    sql = (
        "DELETE FROM [" + servidorApp +
        "].dbSectorReal.dbo.TdDerivadosFlujosValorizacion WHERE idInstrumento NOT IN "
        "(SELECT DISTINCT(idInstrumento) FROM "
        "[" + servidorApp + "].dbSectorReal.dbo.TdDerivadosFlujos "
        "WHERE Visible=1)")
    cursor.execute(sql)

    # Limpia datos

    sql = ("DELETE FROM dbSectorReal.dbo.TdDerivadosFondo WHERE Visible=0")
    cursor.execute(sql)

    sql = (
        "DELETE FROM dbSectorReal.dbo.TdDerivadosFondoValorizacion "
        "WHERE idInstrumento NOT IN "
        "(SELECT DISTINCT(idInstrumento) FROM dbSectorReal.dbo.TdDerivadosFondo WHERE Visible=1 )"
    )
    cursor.execute(sql)

    sql = ("DELETE FROM dbSectorReal.dbo.TdDerivadosFlujos WHERE Visible=0")
    cursor.execute(sql)

    sql = (
        "DELETE FROM dbSectorReal.dbo.TdDerivadosFlujosValorizacion "
        "WHERE idInstrumento NOT IN "
        "(SELECT DISTINCT(idInstrumento) FROM dbSectorReal.dbo.TdDerivadosFlujos WHERE Visible=1 )"
    )
    cursor.execute(sql)
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