Exemplo n.º 1
0
def mtm_titpublico():

    import datetime
    import pandas as pd
    import numpy as np
    import pymysql as db
    import logging
    from findt import FinDt
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    logger = logging.getLogger(__name__)

    # Diretório de save de planilhas
    save_path = full_path_from_database('mtm_titpublico_output') + 'erro.xlsx'
    feriados_sheet = full_path_from_database('feriados_nacionais') + 'feriados_nacionais.csv'

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    #dtbase = ['2016','11','30']
    dt_base = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2]

    # Data formatada como Dia-Mes-Ano
    data_inicio = dtbase[2] + '-' + dtbase[1] + '-' + dtbase[0]

    # Conexão com Banco de Dados
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT a.* FROM projeto_inv.anbima_tpf a right join (select dt_referencia, max(dt_carga) as dt_carga from projeto_inv.anbima_tpf where dt_referencia="' + dt_base + '" group by 1) b on a.dt_referencia=b.dt_referencia and a.dt_carga=b.dt_carga;'
    basetaxa = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    basetaxa = basetaxa.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
    basetaxa1 = basetaxa[["titulo", "cod_selic", "dt_emissao", "dt_vencto", "dt_referencia", "tx_indicativa", "pu"]]

    query = 'SELECT a.* FROM projeto_inv.anbima_fluxo_tpf a right join (select titulo, cod_selic, dt_emissao, dt_vencto, max(data_bd) as data_bd from projeto_inv.anbima_fluxo_tpf group by 1,2,3,4) b on a.titulo=b.titulo and a.cod_selic=b.cod_selic and a.dt_emissao=b.dt_emissao and a.dt_vencto=b.dt_vencto and a.data_bd=b.data_bd;'
    baseref1 = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    logger.info("Tratando dados")

    baseref1 = pd.merge(baseref1, basetaxa1, left_on=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto'],
                        right_on=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto'], how='right')

    baseref2 = baseref1.reindex(
        columns=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto', 'dt_vencto2', 'tx_indicativa', 'dt_referencia', 'cupom',
                 'dt_ref', 'fv'])

    anbima_fluxomtm_tpf = baseref2[baseref2['dt_ref'] >= baseref2['dt_referencia']].copy()

    dt_max = max(anbima_fluxomtm_tpf['dt_ref'])
    dt_max = dt_max.strftime('%d-%m-%Y')
    per = FinDt.DatasFinanceiras(data_inicio, dt_max, path_arquivo = feriados_sheet)
    du = pd.DataFrame(columns=['dt_ref'])
    dc = pd.DataFrame(columns=['dt_ref'])
    dc['dt_ref'] = per.dias()
    du['dt_ref'] = per.dias(3)
    du['flag_du'] = 1
    controle_du = pd.merge(dc, du, left_on=['dt_ref'], right_on=['dt_ref'], how='left')
    controle_du = controle_du.fillna(0)
    controle_du['du'] = np.cumsum(controle_du['flag_du']).astype(float)

    anbima_fluxomtm_tpf = pd.merge(anbima_fluxomtm_tpf, controle_du, left_on=['dt_ref'], right_on=['dt_ref'], how='left')

    dt_base1 = dt_base + ' 00:00:00'
    query = 'select a.codigo_selic, a.titulo, a.vna from projeto_inv.anbima_vna a right join (select titulo, codigo_selic, data_referencia, max(data_bd) as data_bd from projeto_inv.anbima_vna where data_referencia="' + dt_base1 + '" group by 1,2,3) b on a.titulo=b.titulo and a.codigo_selic=b.codigo_selic and a.data_referencia=b.data_referencia and a.data_bd=b.data_bd;'
    vna = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'LFT', 'lft', anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'LTN', 'ltn', anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'NTN-F', 'ntnf',
                                             anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'NTN-C', 'ntnc',
                                             anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'NTN-B', 'ntnb',
                                             anbima_fluxomtm_tpf['titulo'])

    anbima_fluxomtm_tpf['cotacao'] = 0
    anbima_fluxomtm_tpf['fv1'] = 0
    anbima_fluxomtm_tpf['pv'] = 0

    anbima_fluxomtm_tpf = pd.merge(anbima_fluxomtm_tpf, vna, left_on=['cod_selic', 'titulo'],
                                   right_on=['codigo_selic', 'titulo'], how='left')
    del anbima_fluxomtm_tpf['codigo_selic']
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'ltn', 'vna'] = 1000
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'ntnf', 'vna'] = 1000

    anbima_fluxomtm_tpf1 = anbima_fluxomtm_tpf.copy()
    anbima_fluxomtm_tpf = anbima_fluxomtm_tpf1.copy()

    anbima_fluxomtm_tpf['dif'] = (pd.to_datetime(anbima_fluxomtm_tpf['dt_vencto2']) - pd.to_datetime(
        anbima_fluxomtm_tpf['dt_ref'])).astype('timedelta64[D]') * 1
    anbima_fluxomtm_tpf['fv'] = np.where(anbima_fluxomtm_tpf.dif <= 10.0, (1 + (anbima_fluxomtm_tpf['cupom'])) ** 0.5,
                                         (1 + (anbima_fluxomtm_tpf['cupom'])) ** 0.5 - 1)
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'ltn', 'fv'] = 1
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'lft', 'fv'] = 1
    del anbima_fluxomtm_tpf['dif']

    anbima_fluxomtm_tpf['du_ajustado'] = np.where(anbima_fluxomtm_tpf['dt_vencto2'] == anbima_fluxomtm_tpf['dt_ref'],
                                                  anbima_fluxomtm_tpf['du'],
                                                  anbima_fluxomtm_tpf['du'] + anbima_fluxomtm_tpf['flag_du'])

    titpublico = pd.DataFrame()

    ltn = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ltn'].copy()
    formcor = np.float64((ltn['vna'] * ltn['fv'] / ((1 + ltn['tx_indicativa'] / 100) ** (ltn['du'] / 252))))
    ltn['pv'] = np.trunc(formcor * (10 ** 6)) / (10 ** 6)
    titpublico = titpublico.append(ltn)

    lft = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'lft'].copy()
    lft['cotacao'] = np.trunc(1 / (1 + lft['tx_indicativa'] / 100) ** (lft['du'] / 252) * (10 ** 6)) / (10 ** 6)
    formcor = np.float64(lft['vna'] * lft['cotacao'] * (10 ** 6))
    lft['pv'] = np.trunc(formcor) / (10 ** 6)
    titpublico = titpublico.append(lft)

    ntnf = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ntnf'].copy()
    formcor = np.float64(ntnf['fv'] * ntnf['vna'] * (10 ** 9))
    ntnf['fv1'] = np.trunc(formcor) / (10 ** 9)
    ntnf['pv'] = np.trunc((ntnf['fv1'] / (1 + ntnf['tx_indicativa'] / 100) ** (ntnf['du'] / 252)) * (10 ** 7)) / (10 ** 7)
    titpublico = titpublico.append(ntnf)

    ntnc = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ntnc'].copy()
    formcor = np.float64(
        (np.trunc((ntnc['fv'] / (1 + ntnc['tx_indicativa'] / 100) ** (ntnc['du'] / 252)) * (10 ** 8)) / (10 ** 8)) * ntnc[
            'vna'] * (10 ** 6))
    ntnc['pv'] = np.trunc(formcor) / (10 ** 6)
    titpublico = titpublico.append(ntnc)

    ntnb = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ntnb'].copy()
    formcor = np.float64(
        (np.trunc((ntnb['fv'] / (1 + ntnb['tx_indicativa'] / 100) ** (ntnb['du'] / 252)) * (10 ** 8)) / (10 ** 8)) * ntnb[
            'vna'] * (10 ** 6))
    ntnb['pv'] = np.trunc(formcor) / (10 ** 6)
    titpublico = titpublico.append(ntnb)

    del titpublico['cotacao']
    del titpublico['fv1']

    mtm_sum_tpf = titpublico.groupby(["titulo", "dt_vencto"], as_index=False).sum()
    mtm_sum_tpf.rename(columns={'pv': 'pu_calc'}, inplace=True)
    anbima_mtm_sum_tpf = mtm_sum_tpf[["titulo", "dt_vencto", "pu_calc"]]
    anbima_fluxomtm_tpf = pd.merge(titpublico, anbima_mtm_sum_tpf, left_on=["titulo", "dt_vencto"],
                                   right_on=["titulo", "dt_vencto"], how='left')

    anbima_fluxomtm_tpf['perc_pu_fluxo'] = anbima_fluxomtm_tpf['pv'] / anbima_fluxomtm_tpf['pu_calc']

    anbima_fluxomtm_tpf['data_bd'] = datetime.datetime.today()

    # Salvar no MySQL
    logger.info("Salvando base de dados - anbima_fluxomtm_tpf")
    pd.io.sql.to_sql(anbima_fluxomtm_tpf, name='anbima_fluxomtm_tpf', con=connection, if_exists='append', flavor='mysql',
                     index=0)

    connection.close()

    # validacao
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'LFT', 'lft', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'LTN', 'ltn', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'NTN-F', 'ntnf', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'NTN-C', 'ntnc', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'NTN-B', 'ntnb', basetaxa1['titulo'])

    anbima_mtm_sum_tpf = anbima_mtm_sum_tpf.merge(basetaxa1, on=['titulo', 'dt_vencto'], how='left')
    anbima_mtm_sum_tpf['erro'] = anbima_mtm_sum_tpf['pu'] - anbima_mtm_sum_tpf['pu_calc']

    anbima_mtm_sum_tpf.to_excel(save_path, sheet_name='titpublico')
    logger.info("Arquivos salvos com sucesso")
Exemplo n.º 2
0
def simulacao_credito():

    import pandas as pd
    import pymysql as db
    import numpy as np
    import math
    import logging
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from findt import FinDt

    feriados_sheet = full_path_from_database(
        'feriados_nacionais') + 'feriados_nacionais.csv'

    cnpj_hdi = get_global_var("cnpj_hdi")
    logger = logging.getLogger(__name__)
    dt_base = get_data_ultimo_dia_util_mes_anterior()
    dt_base = dt_base[0] + '-' + dt_base[1] + '-' + dt_base[2]
    #qtde_simulacao = 3000
    qtde_simulacao = 1

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'select distinct nome_emissor, cnpj_emissor, data_criacao_emissor from projeto_inv.bmf_emissor where cnpj_emissor>0;'
    emissor = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    emissor = emissor.sort(['cnpj_emissor', 'data_criacao_emissor'],
                           ascending=[True, False])
    emissor1 = emissor.drop_duplicates(subset=['cnpj_emissor'],
                                       take_last=False)
    emissor1['cnpj'] = emissor1['cnpj_emissor'].astype(float)
    emissor1 = emissor1.rename(columns={'nome_emissor': 'contraparte'})
    emissor2 = emissor1[['cnpj', 'contraparte']]

    #seleção da carteira
    def quadro_oper(dt_base, cnpj):

        #Global Variables:
        global start
        global header_id_carteira
        global quadro_oper
        global tp
        global tp_expo
        global tp_fluxo
        global id_relatorio_qo

        start = dt_base

        logger.info("Conectando no Bancode dados")
        connection = db.connect('localhost',
                                user='******',
                                passwd='root',
                                db='projeto_inv',
                                use_unicode=True,
                                charset="utf8")
        logger.info("Conexão com DB executada com sucesso")

        query = 'select * from projeto_inv.xml_header_org where cnpjcpf="' + cnpj + '" and dtposicao=' + '"' + dt_base + '";'
        df = pd.read_sql(query, con=connection)

        if len(df) == 0:
            query = 'select * from projeto_inv.xml_header_org where cnpj="' + cnpj + '" and dtposicao=' + '"' + dt_base + '";'
            df = pd.read_sql(query, con=connection)

        df = df.sort(['cnpj', 'cnpjcpf', 'data_bd'],
                     ascending=[True, True, False])
        df = df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
        df = df.reset_index(level=None,
                            drop=False,
                            inplace=False,
                            col_level=0,
                            col_fill='')
        del df['index']

        header_id_carteira = df.get_value(0, 'header_id').astype(str)

        # quadro de operaçao
        query = 'select a.* from projeto_inv.xml_quadro_operacoes a right join (select header_id, max(data_bd) as data_bd from projeto_inv.xml_quadro_operacoes where header_id=' + header_id_carteira + ' group by 1) b on a.header_id=b.header_id and a.data_bd=b.data_bd;'
        quadro_oper = pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")

        tp = quadro_oper.loc[quadro_oper['produto'].isin(
            ['título privado', 'debênture'])]
        id_relatorio_qo = tp['id_relatorio_qo'][0]

        # fidc
        fundos = quadro_oper.loc[quadro_oper['produto'].isin(['fundo'])].copy()
        fundos['fundo_final'] = np.where(fundos['fundo_ult_nivel'].isnull(),
                                         fundos['fundo'],
                                         fundos['fundo_ult_nivel'])

        #INCLUIR FIDCS
        fidc = fundos[fundos['fundo_final'].str.contains(
            'FIDC|DIREITOS|CREDITÓRIO|CREDITORIOS|DIREITOS')]

        tp = tp.append(fidc)
        tp['contraparte'] = np.where(tp.produto == 'fundo', tp.fundo_final,
                                     tp.contraparte)
        tp['cnpj_fundo_final'] = np.where(
            (tp.produto == 'fundo') & (tp.cnpjfundo_outros.isnull()),
            tp.cnpjfundo_1nivel, tp.cnpjfundo_outros)
        tp['cnpj'] = np.where(tp.produto == 'fundo', tp.cnpj_fundo_final,
                              tp.cnpj)

        # pegar exposicao mercado
        tp['expo_final'] = np.where(tp['caracteristica'] != 'N',
                                    tp['pu_mercado'] * tp['quantidade'],
                                    tp['mtm_info'])
        tp['expo_final'] = np.where(tp['expo_final'] == 0, tp['mtm_info'],
                                    tp['expo_final'])
        tp['expo_final'] = np.where(tp.produto == 'fundo', tp['mtm_info'],
                                    tp['expo_final'])

        # incluir data de vencimento de fidc
        query = 'select distinct codigo_isin, dtvencimento, data_bd, max(data_ref) as dt_ref from projeto_inv.mtm_renda_fixa group by 1,2,3;   '
        dfvencto = pd.read_sql(query, con=connection)
        dfvencto = dfvencto.sort_values(by=['codigo_isin', 'data_bd'],
                                        ascending=[True, False])
        dfvencto1 = dfvencto.drop_duplicates(subset=['codigo_isin'],
                                             take_last=False)
        dfvencto1['dt_vencto_fim'] = np.where(dfvencto1.dtvencimento.isnull(),
                                              dfvencto1.dt_ref,
                                              dfvencto1.dtvencimento)

        base_vencto = dfvencto1[['codigo_isin', 'dt_vencto_fim']].copy()

        tp = pd.merge(tp,
                      base_vencto,
                      left_on='isin',
                      right_on='codigo_isin',
                      how='left')
        tp['dt_vencto_1'] = np.where(tp.dt_vencto.isnull(), tp.dt_vencto_fim,
                                     tp.dt_vencto)

        del tp['codigo_isin']
        del tp['dt_vencto']
        del tp['dt_vencto_fim']

        tp = tp.rename(columns={'dt_vencto_1': 'dt_vencto'})

        tp_mtm = tp[[
            'expo_final', 'quantidade', 'isin', 'cnpj', 'produto', 'dt_vencto',
            'fundo_final'
        ]].copy()

        tp_mtm = pd.merge(tp_mtm,
                          emissor2,
                          left_on='cnpj',
                          right_on='cnpj',
                          how='left')
        tp_mtm['contraparte'] = tp_mtm['contraparte'].fillna(
            tp_mtm['fundo_final'])

        del tp_mtm['fundo_final']

        tp_expo = tp_mtm.groupby(
            ['isin', 'cnpj', 'contraparte', 'produto', 'dt_vencto'],
            as_index=False).sum()
        tp_expo = tp_expo.reset_index(level=None,
                                      drop=False,
                                      inplace=False,
                                      col_level=0,
                                      col_fill='')
        tp_expo['cnpj'] = tp_expo['cnpj'].astype(float)
        tp_expo['cnpj1'] = ""

        for i in range(0, len(tp_expo)):
            if tp_expo['cnpj'][i] > 0:
                tp_expo['cnpj1'][i] = math.floor(tp_expo['cnpj'][i])
            #i=i+1
        tp_expo['cnpj2'] = tp_expo['cnpj1'].astype(str).str.zfill(14)
        del tp_expo['cnpj']
        del tp_expo['cnpj1']
        tp_expo = tp_expo.rename(columns={'cnpj2': 'cnpj'})

        # fluxos
        query = 'select a.codigo_isin, a.fv, a.data_ref, a.indexador, a.data_mtm, a.data_bd from projeto_inv.mtm_renda_fixa a right join (select codigo_isin, data_mtm, max(data_bd) as data_bd from projeto_inv.mtm_renda_fixa where data_mtm="' + dt_base + '" group by 1,2) b on a.codigo_isin=b.codigo_isin and a.data_mtm=b.data_mtm and a.data_bd=b.data_bd;'
        fluxos = pd.read_sql(query, con=connection)

        tp_fluxo = pd.merge(tp_expo,
                            fluxos,
                            left_on='isin',
                            right_on='codigo_isin')
        del tp_fluxo['data_bd']
        tp_fluxo['fv1'] = abs(tp_fluxo['fv'] * tp_fluxo['quantidade'])
        del tp_fluxo['fv']
        tp_fluxo = tp_fluxo.rename(columns={'fv1': 'fv'})
        del tp_fluxo['codigo_isin']
        tp_fluxo = tp_fluxo.reindex(
            columns=['isin', 'data_ref', 'indexador', 'fv'])

        #Fecha conexão
        connection.close()

    quadro_oper(dt_base, cnpj_hdi)

    fluxo_original = tp_fluxo.copy()

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    # LGD
    query = 'select a.produto, a.lgd from projeto_inv.lgd a right join (select produto, max(data_bd) as data_bd from projeto_inv.lgd group by 1) b on a.produto=b.produto and a.data_bd=b.data_bd;'
    lgd = pd.read_sql(query, con=connection)

    #simulação de cenário____________________________________________________________________________
    query = 'SELECT n.* FROM projeto_inv.curva_ettj_interpol n INNER JOIN (  SELECT indexador_cod, month(dt_ref ) as mes, year (dt_ref) as ano, max(dt_ref) as max  FROM projeto_inv.curva_ettj_interpol  GROUP BY 1,2,3) a on a.indexador_cod=n.indexador_cod and a.max=n.dt_ref;'

    cen = pd.read_sql(query, con=connection)
    cen = cen.sort(['indexador_cod', 'prazo', 'dt_ref', 'data_bd'],
                   ascending=[True, True, True, False])
    cen1 = cen.drop_duplicates(subset=['indexador_cod', 'prazo', 'dt_ref'],
                               take_last=False)

    cen1['indexador_shift'] = cen1['indexador_cod'].shift()
    cen1['prazo_shift'] = cen1['prazo'].shift()
    cen1['tx_spot_shift'] = cen1['tx_spot'].shift()
    cen1['dif'] = np.where((cen1.indexador_cod == cen1.indexador_shift) &
                           (cen1.prazo == cen1.prazo_shift),
                           cen1.tx_spot - cen1.tx_spot_shift, 'NaN')
    cen2 = cen1[cen1.dif != 'NaN']

    #________________________________________________________________________________________________________
    # GERACAO DE SERIE DE DIAS ÚTEIS E DIAS CORRIDOS
    ano = start[0:4]
    mes = start[5:7]
    dia = start[8:10]

    dt_inicio = dia + '-' + mes + '-' + ano

    dt_max = max(tp_expo['dt_vencto'])

    per = FinDt.DatasFinanceiras(dt_inicio,
                                 dt_max,
                                 path_arquivo=feriados_sheet)
    du = pd.DataFrame(columns=['data_ref'])
    dc = pd.DataFrame(columns=['data_ref'])
    dc['data_ref'] = per.dias()
    dc['flag_dc'] = 1
    du['data_ref'] = per.dias(3)
    du['flag_du'] = 1
    serie_dias = pd.merge(dc,
                          du,
                          left_on=['data_ref'],
                          right_on=['data_ref'],
                          how='left')
    serie_dias['flag_du'] = serie_dias['flag_du'].fillna(0)
    serie_dias['indice_dc'] = np.cumsum(serie_dias['flag_dc'])
    serie_dias['indice_du'] = np.cumsum(serie_dias['flag_du'])
    del serie_dias['flag_du']
    del serie_dias['flag_dc']

    # OBS: a contagem de dias é o valor do índice menos um

    #PD e matriz de  migracao________________________________
    query = "select * from projeto_inv.pd_mes;"
    pd_mes = pd.read_sql(query, con=connection)
    pd_mes = pd_mes.sort(['rtg', 'produto', 'prazo', 'data_bd'],
                         ascending=[True, True, True, False])
    pd_mes = pd_mes.drop_duplicates(subset=['rtg', 'produto', 'prazo'],
                                    take_last=False)

    query = "select * from projeto_inv.matriz_migr_mes;"
    matriz_mes = pd.read_sql(query, con=connection)
    matriz_mes = matriz_mes.sort(['cod_rtg_de', 'cod_rtg_para', 'data_bd'],
                                 ascending=[True, True, False])
    matriz_mes = matriz_mes.drop_duplicates(
        subset=['cod_rtg_de', 'cod_rtg_para'], take_last=False)

    #TIPO DE PAPEL

    query = "select distinct codigo_isin, data_bd, tipo_ativo from projeto_inv.bmf_numeraca where tipo_ativo in ('DBS', 'LFI', 'LFN', 'DP', 'C', 'CC','CCC', 'CRI');"
    caracteristica = pd.read_sql(query, con=connection)
    caracteristica = caracteristica.sort(['codigo_isin', 'data_bd'],
                                         ascending=[True, False])
    caracteristica = caracteristica.drop_duplicates(subset=['codigo_isin'],
                                                    take_last=False)
    del caracteristica['data_bd']

    df_original = pd.merge(tp_expo,
                           caracteristica,
                           left_on='isin',
                           right_on='codigo_isin',
                           how='left')
    df_original.ix[df_original.tipo_ativo == 'CC', 'tipo_pd'] = 'ccb'
    df_original.ix[df_original.tipo_ativo == 'CCC', 'tipo_pd'] = 'ccb'
    df_original.ix[df_original.tipo_ativo == 'DBS', 'tipo_pd'] = 'deb'
    df_original.ix[df_original.tipo_ativo == 'C', 'tipo_pd'] = 'cdb'
    df_original.ix[df_original.tipo_ativo == 'LFI', 'tipo_pd'] = 'cdb'
    df_original.ix[df_original.tipo_ativo == 'LFN', 'tipo_pd'] = 'cdb'
    df_original.ix[df_original.tipo_ativo == 'DP', 'tipo_pd'] = 'cdb'
    df_original['tipo_pd'] = df_original['tipo_pd'].fillna('fidc')

    del df_original['codigo_isin']

    #RATING________________________________
    query = 'select cod_rtg, rtg from projeto_inv.de_para_rtg a right join (select max(data_bd) as data_bd from projeto_inv.de_para_rtg) b on a.data_bd = b.data_bd;'
    depara = pd.read_sql(query, con=connection)

    #regua mestra
    query = 'select distinct a.cod_rtg, a.agencia_rtg, a.rtg from projeto_inv.de_para_rtg a right join (select agencia_rtg, max(data_bd) as data_bd from projeto_inv.de_para_rtg where agencia_rtg="regua" group by 1) b on a.agencia_rtg=b.agencia_rtg and a.data_bd = b.data_bd;'
    regua_rtg = pd.read_sql(query, con=connection)
    del regua_rtg['agencia_rtg']

    #rating por isin
    query = 'select distinct a.isin, a.agencia_tipo_rtg, a.rtg from projeto_inv.rating_isin as a right join (select max(data_bd) as data_bd from projeto_inv.rating_isin where dt_ref= "' + dt_base + '" ) as b on a.data_bd=b.data_bd;'
    rtg_isin = pd.read_sql(query, con=connection)

    rtg_local = rtg_isin.loc[rtg_isin['agencia_tipo_rtg'].isin([
        'RTG_MDY_NSR', 'RTG_MDY_NSR_SR_UNSECURED', 'RTG_MDY_NSR_SUBORDINATED',
        'RTG_SP_NATIONAL', 'RTG_FITCH_NATIONAL_LT', 'RTG_FITCH_NATIONAL',
        'RTG_FITCH_NATIONAL_SR_UNSECURED', 'RTG_FITCH_NATL_SUBORDINATED'
    ])]
    rtg_local = pd.merge(rtg_local,
                         depara,
                         left_on='rtg',
                         right_on='rtg',
                         how='left')

    rtg_pior = rtg_local[['isin', 'cod_rtg']].copy()
    rtg_pior = rtg_pior.groupby(['isin'], as_index=False).max()
    rtg_pior = pd.merge(rtg_pior,
                        regua_rtg,
                        left_on='cod_rtg',
                        right_on='cod_rtg',
                        how='left')

    #rating por contraparte
    query = 'select distinct a.cnpj, a.agencia_tipo_rtg, a.rtg from projeto_inv.rating_contraparte as a right join (select max(data_bd) as data_bd from projeto_inv.rating_contraparte where dt_ref= "' + dt_base + '" ) as b on a.data_bd=b.data_bd;'
    rtg_c = pd.read_sql(query, con=connection)
    rtg_c_local = rtg_c.loc[rtg_c['agencia_tipo_rtg'].isin([
        'RTG_MDY_NSR_ISSUER', 'RTG_SP_NATIONAL_LT_ISSUER_CREDIT',
        'RTG_FITCH_NATIONAL_LT', 'RTG_FITCH_NATIONAL_SR_UNSECURED'
    ])]
    rtg_c_local = pd.merge(rtg_c_local,
                           depara,
                           left_on='rtg',
                           right_on='rtg',
                           how='left')
    rtg_c_pior = rtg_c_local[['cnpj', 'cod_rtg']].copy()
    rtg_c_pior = rtg_c_pior.groupby(['cnpj'], as_index=False).max()
    rtg_c_pior = pd.merge(rtg_c_pior,
                          regua_rtg,
                          left_on='cod_rtg',
                          right_on='cod_rtg',
                          how='left')

    #agregar o rtg na base
    df_original = pd.merge(df_original,
                           rtg_pior,
                           left_on='isin',
                           right_on='isin',
                           how='left')
    df_original = df_original.rename(columns={
        'cod_rtg': 'cod_rtg_isin',
        'rtg': 'rtg_isin'
    })
    df_original = pd.merge(df_original,
                           rtg_c_pior,
                           left_on='cnpj',
                           right_on='cnpj',
                           how='left')
    df_original = df_original.rename(columns={
        'cod_rtg': 'cod_rtg_cnpj',
        'rtg': 'rtg_cnpj'
    })
    df_original['cod_rtg'] = np.where(df_original['cod_rtg_isin'].isnull(),
                                      df_original.cod_rtg_cnpj,
                                      df_original.cod_rtg_isin)

    del df_original['cod_rtg_isin']
    del df_original['cod_rtg_cnpj']
    del df_original['rtg_isin']
    del df_original['rtg_cnpj']

    df_original = pd.merge(df_original,
                           regua_rtg,
                           left_on='cod_rtg',
                           right_on='cod_rtg',
                           how='left')

    #assumir rtg padrão missing: 'Aa3' e cod_rtg=4
    df_original['cod_rtg'] = df_original['cod_rtg'].fillna(3)
    df_original['rtg'] = df_original['rtg'].fillna('Aa2')
    df_original = df_original.rename(columns={'rtg': 'rating'})

    #Fecha conexão
    connection.close()

    #inicio da simulacao
    def simulacao(id_simulacao):

        global df
        global fluxo
        global df_resultado
        global i_tempo

        df = df_original.copy()
        fluxo = fluxo_original.copy()

        #criar a serie de tempo mensal - para simulacao
        end = max(df['dt_vencto'])
        end = end + pd.DateOffset(months=2)
        inicio = pd.to_datetime(start) + pd.DateOffset(months=1)
        tempo = pd.DataFrame()
        tempo['serie'] = pd.date_range(inicio, end, freq='M')
        tempo['serie'] = tempo['serie'].dt.date

        df = df.reset_index(level=None,
                            drop=False,
                            inplace=False,
                            col_level=0,
                            col_fill='')
        df['dt_base'] = start

        #primeira rodada
        df['rtg'] = df['rating']
        fim = pd.DataFrame()

        #### simulacao
        i_tempo = 0

        while len(df) > 0:

            np.random.seed(1234 + i_tempo + id_simulacao)
            df['aleat_matriz'] = np.random.uniform(0, 1, len(df))
            df['aleat_pd'] = np.random.uniform(0, 1, len(df))
            df_matriz = pd.merge(df,
                                 matriz_mes,
                                 left_on=['rtg'],
                                 right_on=['rtg_de'],
                                 how='left')
            df_rtg = df_matriz[
                (df_matriz['prob_ini'] < df_matriz['aleat_matriz'])
                & (df_matriz['aleat_matriz'] <= df_matriz['prob_fim'])]
            df_rtg['rtg'] = df_rtg['rtg_para']
            df_rtg['dt_ref'] = tempo['serie'][i_tempo]

            #  prazo=1 -> simulação mensal
            df_rtg['prazo'] = 1
            df_rtg1 = pd.merge(df_rtg,
                               pd_mes,
                               left_on=['tipo_pd', 'prazo', 'rtg'],
                               right_on=['produto', 'prazo', 'rtg'],
                               how='left')
            df_rtg1['default'] = np.where(df_rtg1.pd_mensal > df_rtg1.aleat_pd,
                                          1, 0)
            df_rtg_mes = df_rtg1[[
                'isin', 'cnpj', 'contraparte', 'dt_vencto', 'tipo_ativo',
                'tipo_pd', 'rating', 'rtg', 'dt_ref', 'prazo', 'dt_base',
                'pd_mensal', 'default'
            ]].copy()
            df_rtg_mes['break'] = np.where(
                (df_rtg_mes['default'] == 1) |
                (pd.to_datetime(df_rtg_mes['dt_vencto']) <= pd.to_datetime(
                    df_rtg_mes['dt_ref'])), 1, 0)

            default_break = df_rtg_mes[df_rtg_mes['break'] == 1].copy()
            nao_default = df_rtg_mes[~(df_rtg_mes['break'] == 1)].copy()

            fim = fim.append(default_break)
            df = nao_default[[
                'isin', 'cnpj', 'contraparte', 'dt_vencto', 'tipo_ativo',
                'tipo_pd', 'rating', 'rtg', 'dt_base'
            ]].copy()

            i_tempo = i_tempo + 1

        fim = fim.rename(columns={'dt_ref': 'dt_default'})
        fim['lgd'] = 0
        base_default = fim[fim['default'] == 1].copy()
        base_nao_default = fim[fim['default'] == 0].copy()
        base_default = base_default.reset_index(level=None,
                                                drop=False,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')
        del base_default['index']

        for i_lgd in range(0, len(base_default)):
            np.random.seed(123 + i_lgd + id_simulacao)
            lgd_base_0 = lgd[lgd['produto'] == base_default['tipo_pd'][i_lgd]]
            lgd_base = lgd_base_0.copy()
            lgd_base['aleat_lgd'] = np.random.uniform(0, 1, len(lgd_base))
            lgd_base = lgd_base.sort(['aleat_lgd'])
            lgd_base = lgd_base.reset_index(level=None,
                                            drop=False,
                                            inplace=False,
                                            col_level=0,
                                            col_fill='')
            lgd_perc = lgd_base.get_value(0, 'lgd')
            base_default.loc[i_lgd, 'lgd'] = lgd_perc
            ##VALIDAR ESTA ITERAÇÃO:
            #i_lgd=i_lgd+1

        df_fim = base_nao_default.append(base_default)
        df_fluxo = pd.merge(df_fim,
                            fluxo,
                            left_on=['isin'],
                            right_on=['isin'],
                            how='left')
        df_fluxo = pd.merge(df_fluxo,
                            serie_dias,
                            left_on=['data_ref'],
                            right_on=['data_ref'],
                            how='left')
        df_fluxo = df_fluxo.rename(columns={
            'indice_du': 'du_ref',
            'indice_dc': 'dc_ref'
        })
        df_fluxo = pd.merge(df_fluxo,
                            serie_dias,
                            left_on=['dt_default'],
                            right_on=['data_ref'],
                            how='left')
        del df_fluxo['data_ref_y']
        df_fluxo = df_fluxo.rename(
            columns={
                'indice_du': 'du_default',
                'indice_dc': 'dc_default',
                'data_ref_x': 'data_ref'
            })

        #___________________________CENARIO_______________________________________________
        base_dt = pd.DataFrame(columns=['dt', 'aleat'])
        base_dt['dt'] = cen2['dt_ref'].unique()
        base_dt['aleat'] = np.random.uniform(0, 1, len(base_dt))
        base_dt = base_dt.sort(['aleat'])
        base_dt = base_dt.reset_index(level=None,
                                      drop=False,
                                      inplace=False,
                                      col_level=0,
                                      col_fill='')
        base_dt = base_dt[['dt', 'aleat']]
        dt_max = max(base_dt.dt)

        base_ref_0 = cen2[cen2.dt_ref == dt_max]
        base_ref = base_ref_0.copy()
        del base_ref['dif']

        dt = base_dt.get_value(0, 'dt')

        #erro
        erro_0 = cen2[cen2.dt_ref == dt]
        erro = erro_0.copy()
        erro = erro[['indexador_cod', 'prazo', 'dt_ref', 'dif']]
        del erro['dt_ref']

        base_ref = pd.merge(base_ref,
                            erro,
                            how='left',
                            left_on=['indexador_cod', 'prazo'],
                            right_on=['indexador_cod', 'prazo'])
        base_ref['tx_spot_sim'] = base_ref['tx_spot'].astype(
            float) + base_ref['dif'].astype(float)

        del base_ref['indexador_shift']
        del base_ref['prazo_shift']
        del base_ref['tx_spot_shift']
        del base_ref['dif']

        #--fluxo e cenário
        df_fluxo['indexador_cod'] = ""
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'DI1',
                                             'CDI', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'CDI',
                                             'CDI', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IAP',
                                             'DIC', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IPC',
                                             'DIC', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IGM',
                                             'DIM', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'PRE',
                                             'PRE', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'TR', 'TP',
                                             df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IGP',
                                             'DIM', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IPCA',
                                             'DIC', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IGPM',
                                             'DIM', df_fluxo['indexador_cod'])

        cenario = base_ref[['prazo', 'indexador_cod', 'tx_spot_sim']].copy()

        df_fluxo_sim = pd.merge(df_fluxo,
                                cenario,
                                left_on=['du_ref', 'indexador_cod'],
                                right_on=['prazo', 'indexador_cod'],
                                how='left')
        df_fluxo_sim['tx_spot_sim'] = df_fluxo_sim['tx_spot_sim'].fillna(0)
        df_fluxo_sim['pv'] = df_fluxo_sim['fv'] / (1 +
                                                   df_fluxo_sim['tx_spot_sim'])

        df_pv = df_fluxo_sim[['isin', 'pv']]
        df_pv['pv'] = df_pv['pv'].fillna(0)
        df_tot = df_pv.groupby(['isin'], as_index=False).sum()

        df_fluxo_perda = df_fluxo_sim[
            (pd.to_datetime(df_fluxo_sim['data_ref']) >= pd.to_datetime(
                df_fluxo_sim['dt_default'])) & (df_fluxo_sim['default'] == 1)]
        df_perda = df_fluxo_perda[['isin', 'tipo_ativo', 'lgd', 'pv']].copy()
        df_perda['pv'] = df_perda['pv'].fillna(0)
        df_perda_tot = df_perda.groupby(['isin', 'tipo_ativo', 'lgd'],
                                        as_index=False).sum()
        df_perda_tot['recuperacao'] = np.where(df_perda_tot.tipo_ativo == 'DP',
                                               20000000, 0)
        df_perda_tot['pv_perda'] = (df_perda_tot['pv'] * df_perda_tot['lgd'] -
                                    df_perda_tot['recuperacao']).clip(0, None)
        df_perda_tot1 = df_perda_tot[['isin', 'pv_perda']].copy()

        df_resultado = pd.merge(df_tot,
                                df_perda_tot1,
                                left_on=['isin'],
                                right_on=['isin'],
                                how='left')
        df_resultado['pv_perda'] = df_resultado['pv_perda'].fillna(0)
        df_resultado[
            'perda_perc'] = df_resultado['pv_perda'] / df_resultado['pv']
        df_resultado['perda_perc'] = df_resultado['perda_perc'].fillna(0)
        df_resultado['dt_base_sim'] = start

        df_resultado['numero_simulacao'] = id_simulacao
        df_resultado['data_bd'] = hoje
        df_resultado['id_relatorio_qo'] = id_relatorio_qo

        df_resultado['pv_perda'] = df_resultado['pv_perda'].fillna(0)

        #Salvar no MySQL
        logger.info("Conectando no Banco de dados")
        connection = db.connect('localhost',
                                user='******',
                                passwd='root',
                                db='projeto_inv',
                                use_unicode=True,
                                charset="utf8")
        logger.info("Conexão com DB executada com sucesso")

        logger.info("Salvando base de dados")
        pd.io.sql.to_sql(df_resultado,
                         name='simulacao_credito',
                         con=connection,
                         if_exists='append',
                         flavor='mysql',
                         index=0)

        #Fecha conexão
        connection.close()

    hoje = pd.datetime.today()

    for numero_sim in range(0, qtde_simulacao):
        simulacao(numero_sim)
Exemplo n.º 3
0
def get_bacen_indices():

    import pandas as pd
    import pymysql as db
    import datetime
    import logging

    from pandas import DateOffset
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from findt import FinDt
    from pandas import ExcelWriter

    logger = logging.getLogger(__name__)

    #----Declaração de constantes
    logger.info("Conectando no Banco de dados")

    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv')

    logger.info("Conexão com DB executada com sucesso")

    var_path = full_path_from_database(
        "feriados_nacionais") + "feriados_nacionais.csv"
    save_path = full_path_from_database("get_bacen_indices")

    #----Input incremental baixado robos_diarios_bacen

    # Fazer a query do que foi baixado pelo robo_diario_bacen
    query = 'SELECT * FROM projeto_inv.bacen_series;'
    bacen_series = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    logger.info("Tratando dados")

    # Retira duplicatas
    bacen_series = bacen_series.sort(['codigo', 'data_referencia', 'data_bd'],
                                     ascending=[True, True, False])
    bacen_series = bacen_series.drop_duplicates(
        subset=['codigo', 'data_referencia'], take_last=False)

    # Separa em dataframes de dias e meses
    bacen_series_mensal = bacen_series[bacen_series.frequencia.isin(
        ['M'])].copy()
    bacen_series_diario = bacen_series[bacen_series.frequencia.isin(
        ['D'])].copy()

    # Retira duplicatas
    bacen_series_mensal = bacen_series_mensal.drop_duplicates(
        subset=['codigo'], take_last=True)

    # Apenda com o dataframe diário
    bacen_series = bacen_series_mensal.append(bacen_series_diario)

    #Seleciona apenas IPCA, IGPM, CDI e TR
    bacen_series = bacen_series[(bacen_series.codigo == 256) |
                                (bacen_series.codigo == 433) |
                                (bacen_series.codigo == 189) |
                                (bacen_series.codigo == 4389) |
                                (bacen_series.codigo == 7811)]

    bacen_series['indice'] = None
    #IPCA - Periodocidade Mensal; Composição Mensal
    bacen_series['indice'][bacen_series.codigo == 433] = 'IPCA'
    #IGPM - - Periodocidade Mensal; Composição Mensal
    bacen_series['indice'][bacen_series.codigo == 189] = 'IGP'
    #CDI - - Periodocidade Diária; Composição Anual
    bacen_series['indice'][bacen_series.codigo == 4389] = 'DI1'
    #TR - - Periodocidade Diária; Composição Mensal
    bacen_series['indice'][bacen_series.codigo == 7811] = 'TR'
    #TJLP - - Periodocidade Diária; Composição Mensal
    bacen_series['indice'][bacen_series.codigo == 256] = 'TJLP'

    bacen_series['data_referencia'] = bacen_series['data_referencia'].astype(
        str)

    bacen_series['ano'] = bacen_series['data_referencia'].str[0:4].astype(int)
    bacen_series['mes'] = bacen_series['data_referencia'].str[5:7].astype(int)
    bacen_series['dia'] = bacen_series['data_referencia'].str[8:10].astype(int)

    bacen_series['dt_ref'] = pd.to_datetime(
        bacen_series['data_referencia']).dt.date

    del bacen_series['codigo']
    del bacen_series['frequencia']
    del bacen_series['nome']
    del bacen_series['data_bd']
    del bacen_series['id_bacen_series']
    del bacen_series['data_referencia']

    #----ATUALIZAÇÃO ÍNDICES - CARREGAMENTO HISTÓRICO
    logger.info("Atualizando índices")

    #Fazer a query do que foi baixado pelo robo_diario_anbima_projecoes
    query = 'SELECT * FROM projeto_inv.bacen_series_hist;'
    bacen_series_hist = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    bacen_series_hist = bacen_series_hist.sort(['indice', 'dt_ref', 'data_bd'],
                                               ascending=[True, True, False])
    bacen_series_hist = bacen_series_hist.drop_duplicates(
        subset=['indice', 'dt_ref'], take_last=False)

    del bacen_series_hist['id_bc_series_hist']
    del bacen_series_hist['data_bd']

    horario_bd = datetime.datetime.now()

    #----ATUALIZAÇÃO ÍNDICES - APPEND DAS INFO NOVAS DAS SERIES BACEN

    bacen_series_hist = bacen_series_hist.append(bacen_series)

    bacen_series_hist = bacen_series_hist.sort(['indice', 'dt_ref'],
                                               ascending=[True, True])
    bacen_series_hist = bacen_series_hist.drop_duplicates(
        subset=['indice', 'dt_ref'], take_last=False)

    #----------CRIAÇÃO SÉRIE DIÁRIA
    logger.info("Criando séries diária")

    #Seleciona o última dia do mês vigente
    mesfim = datetime.date.today().month + 1
    fim = datetime.date(datetime.date.today().year, mesfim, 1) - DateOffset(
        months=0, days=1)

    dt_ref = pd.date_range(start='01/01/1996', end=fim, freq='D').date
    ano = pd.date_range(start='01/01/1996', end=fim, freq='D').year
    mes = pd.date_range(start='01/01/1996', end=fim, freq='D').month
    dias = pd.date_range(start='01/01/1996', end=fim, freq='D').day
    serie_dias = pd.DataFrame(columns=['dt_ref', 'ano', 'mes', 'dia'])
    serie_dias['dt_ref'] = dt_ref
    serie_dias['ano'] = ano
    serie_dias['mes'] = mes
    serie_dias['dia'] = dias

    #identificar se é dia útil

    dt_max = max(serie_dias['dt_ref'])
    dt_min = min(serie_dias['dt_ref'])
    per = FinDt.DatasFinanceiras(dt_min, dt_max, path_arquivo=var_path)

    du = pd.DataFrame(columns=['dt_ref'])
    du['dt_ref'] = per.dias(3)
    du['du_1'] = 1

    serie_dias = serie_dias.merge(du, on=['dt_ref'], how='left')
    serie_dias['du_1'] = serie_dias['du_1'].fillna(0)
    serie_dias['dc_1'] = 1

    #calculo de dias corridos por mes
    serie_dias_group_count = serie_dias[['dt_ref', 'ano',
                                         'mes']].groupby(['ano', 'mes'
                                                          ]).agg(['count'])
    serie_dias_group_count = serie_dias_group_count.reset_index(level=None,
                                                                drop=False,
                                                                inplace=False,
                                                                col_level=0,
                                                                col_fill='')
    serie_dias_group_count_filter = pd.DataFrame(columns=['ano', 'mes', 'dc'])

    serie_dias_group_count_filter['ano'] = serie_dias_group_count['ano']
    serie_dias_group_count_filter['mes'] = serie_dias_group_count['mes']
    serie_dias_group_count_filter['dc'] = serie_dias_group_count['dt_ref']

    serie_dias = serie_dias.merge(serie_dias_group_count_filter,
                                  on=['ano', 'mes'],
                                  how='left')

    #calculo de dias uteis por mes
    serie_dias_group_sum = serie_dias[['du_1', 'ano',
                                       'mes']].groupby(['ano',
                                                        'mes']).agg(['sum'])
    serie_dias_group_sum = serie_dias_group_sum.reset_index(level=None,
                                                            drop=False,
                                                            inplace=False,
                                                            col_level=0,
                                                            col_fill='')
    serie_dias_group_sum_filter = pd.DataFrame(columns=['ano', 'mes', 'du'])

    serie_dias_group_sum_filter['ano'] = serie_dias_group_sum['ano']
    serie_dias_group_sum_filter['mes'] = serie_dias_group_sum['mes']
    serie_dias_group_sum_filter['du'] = serie_dias_group_sum['du_1']

    serie_dias = serie_dias.merge(serie_dias_group_sum_filter,
                                  on=['ano', 'mes'],
                                  how='left')

    #----------CRIAÇÃO BASE DIÁRIA
    logger.info("Criando bases diárias")

    #----IPCA
    ipca = bacen_series_hist[['mes', 'ano', 'valor', 'indice'
                              ]][bacen_series_hist.indice == 'IPCA'].copy()
    serie_dias_ipca = serie_dias.merge(ipca, on=['mes', 'ano'], how='left')

    #Taxas acumuladas
    serie_dias_ipca['fator_dia_du'] = (
        1 + serie_dias_ipca['du_1'] * serie_dias_ipca['valor'] / 100)**(
            1 / serie_dias_ipca['du'])
    serie_dias_ipca['fator_dia_dc'] = (
        1 + serie_dias_ipca['dc_1'] * serie_dias_ipca['valor'] / 100)**(
            1 / serie_dias_ipca['dc'])
    serie_dias_ipca['fator_acum_du'] = serie_dias_ipca[[
        'indice', 'fator_dia_du'
    ]].groupby(['indice']).agg(['cumprod'])
    serie_dias_ipca['fator_acum_dc'] = serie_dias_ipca[[
        'indice', 'fator_dia_dc'
    ]].groupby(['indice']).agg(['cumprod'])

    #----IGPM
    igpm = bacen_series_hist[['mes', 'ano', 'valor', 'indice'
                              ]][bacen_series_hist.indice == 'IGP'].copy()
    serie_dias_igpm = serie_dias.merge(igpm, on=['mes', 'ano'], how='left')

    #Taxas acumuladas
    serie_dias_igpm['fator_dia_du'] = (
        1 + serie_dias_igpm['du_1'] * serie_dias_igpm['valor'] / 100)**(
            1 / serie_dias_igpm['du'])
    serie_dias_igpm['fator_dia_dc'] = (
        1 + serie_dias_igpm['dc_1'] * serie_dias_igpm['valor'] / 100)**(
            1 / serie_dias_igpm['dc'])
    serie_dias_igpm['fator_acum_du'] = serie_dias_igpm[[
        'indice', 'fator_dia_du'
    ]].groupby(['indice']).agg(['cumprod'])
    serie_dias_igpm['fator_acum_dc'] = serie_dias_igpm[[
        'indice', 'fator_dia_dc'
    ]].groupby(['indice']).agg(['cumprod'])

    #----CDI
    cdi = bacen_series_hist[['dia', 'mes', 'ano', 'valor', 'indice'
                             ]][bacen_series_hist.indice == 'DI1'].copy()
    serie_dias_cdi = serie_dias.merge(cdi,
                                      on=['dia', 'mes', 'ano'],
                                      how='left')
    serie_dias_cdi['indice'] = serie_dias_cdi['indice'].fillna('DI1')
    serie_dias_cdi['valor'] = serie_dias_cdi['valor'].fillna(0)

    #Taxas acumuladas
    serie_dias_cdi['fator_dia_du'] = (
        1 + serie_dias_cdi['du_1'] * serie_dias_cdi['valor'] / 100)**(1 / 252)
    serie_dias_cdi['fator_dia_dc'] = None
    serie_dias_cdi['fator_acum_du'] = serie_dias_cdi[[
        'indice', 'fator_dia_du'
    ]].groupby(['indice']).agg(['cumprod'])
    serie_dias_cdi['fator_acum_dc'] = None

    #----TR
    tr = bacen_series_hist[['mes', 'ano', 'valor', 'indice'
                            ]][bacen_series_hist.indice == 'TR'].copy()
    serie_dias_tr = serie_dias.merge(tr, on=['mes', 'ano'], how='left')

    #----TJLP
    tjlp = bacen_series_hist[['mes', 'ano', 'valor', 'indice'
                              ]][bacen_series_hist.indice == 'TJLP'].copy()
    serie_dias_tjlp = serie_dias.merge(tjlp, on=['mes', 'ano'], how='left')

    #Taxas acumuladas
    serie_dias_tr['fator_dia_du'] = (
        1 + serie_dias_tr['du_1'] * serie_dias_tr['valor'] / 100)**(
            1 / serie_dias_tr['du'])
    serie_dias_tr['fator_dia_dc'] = (
        1 + serie_dias_tr['dc_1'] * serie_dias_tr['valor'] / 100)**(
            1 / serie_dias_tr['dc'])
    serie_dias_tr['fator_acum_du'] = serie_dias_tr[['indice',
                                                    'fator_dia_du']].groupby([
                                                        'indice'
                                                    ]).agg(['cumprod'])
    serie_dias_tr['fator_acum_dc'] = serie_dias_tr[['indice',
                                                    'fator_dia_dc']].groupby([
                                                        'indice'
                                                    ]).agg(['cumprod'])

    serie_dias_indices = serie_dias_ipca.copy()
    serie_dias_indices = serie_dias_indices.append(serie_dias_igpm)
    serie_dias_indices = serie_dias_indices.append(serie_dias_cdi)
    serie_dias_indices = serie_dias_indices.append(serie_dias_tr)
    serie_dias_indices = serie_dias_indices.append(serie_dias_tjlp)

    serie_dias_indices = serie_dias_indices[
        serie_dias_indices.fator_dia_du.notnull()]

    serie_dias_indices = serie_dias_indices.reset_index(level=None,
                                                        drop=True,
                                                        inplace=False,
                                                        col_level=0,
                                                        col_fill='')

    writer = ExcelWriter(save_path + 'serie_dias_indices.xlsx')
    serie_dias_indices.to_excel(writer, 'Todos')
    serie_dias_ipca.to_excel(writer, 'IPCA')
    serie_dias_igpm.to_excel(writer, 'IGPM')
    serie_dias_cdi.to_excel(writer, 'DI')
    serie_dias_tr.to_excel(writer, 'TR')
    serie_dias_tjlp.to_excel(writer, 'TJLP')
    writer.save()

    serie_dias_indices['data_bd'] = horario_bd

    #----------VERIFICAÇÃO PARA CRIAR A TABELA INCREMENTAL

    query = 'SELECT * FROM projeto_inv.bacen_series_fatores;'
    bc_series = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    bc_series = bc_series[['indice', 'dt_ref']].copy()
    bc_series['marker'] = 1

    serie_dias_indices = serie_dias_indices.merge(bc_series,
                                                  on=['indice', 'dt_ref'],
                                                  how='left')
    serie_dias_indices = serie_dias_indices[
        serie_dias_indices.marker.isnull()].copy()

    del serie_dias_indices['marker']

    logger.info("Salvando base de dados -  Tabela bacen_series_fatores")
    #Salvar no MySQL
    pd.io.sql.to_sql(serie_dias_indices,
                     name='bacen_series_fatores',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexao
    connection.close()
Exemplo n.º 4
0
def titpublico_final_pv_ettj():

    import pandas as pd
    import pymysql as db
    import numpy as np
    import datetime
    import logging
    from findt import FinDt
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_global_var

    logger = logging.getLogger(__name__)

    #----Declaração de constantes

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()

    # Auxiliar para pegar vna existente na base - versão dummie
    dt_vna = get_global_var(dt_vna)
    dt_vna = datetime.date(int(dt_vna[0:4]), int(dt_vna[4:6]), int(dt_vna[6:8]))
    # Quando tiver vna da data de posicao
    # dt_vna = dt_base

    dt_base = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))

    # Diretório de save de planilhas
    save_path_tpf_fluxo_final = full_path_from_database('get_output_quadro419') + 'tpf_fluxo_final.xlsx'

    feriados_sheet = full_path_from_database('feriados_nacionais') + 'feriados_nacionais.csv'

    #----Leitura do HEADER para pegar a data de referencia do relatório

    #Informações XML
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'select * from projeto_inv.xml_header_org'
    xml_header = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    xml_header = xml_header[xml_header.dtposicao == dt_base].copy()
    xml_header = xml_header[xml_header.data_bd == max(xml_header.data_bd)].copy()

    horario_bd = datetime.datetime.today()

    #----Seleção da tabela xml_titpublico

    # Seleção da tabela de TITPUBLICO
    query = 'SELECT * FROM projeto_inv.xml_titpublico_org'
    tpf_xml = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    aux = xml_header[['dtposicao','header_id']].copy()
    aux['marcador'] = 1

    #Seleção da carga mais recente referente à data base do relatório
    tpf_xml = tpf_xml.merge(aux,on=['header_id'],how='left')
    tpf_xml = tpf_xml[tpf_xml.marcador==1]
    tpf_xml = tpf_xml[tpf_xml.data_bd==max(tpf_xml.data_bd)]

    #Mudança de formato
    tpf_xml['codativo'] = tpf_xml['codativo'].fillna(0)
    tpf_xml['codativo'] = tpf_xml['codativo'].astype(int)

    del tpf_xml['data_bd']
    del tpf_xml['marcador']
    del tpf_xml['pu_mercado']
    del tpf_xml['mtm_mercado']
    del tpf_xml['pu_curva']
    del tpf_xml['mtm_curva']
    del tpf_xml['pu_regra_xml']
    del tpf_xml['mtm_regra_xml']
    del tpf_xml['data_referencia']

    #----Marcação na curva

    #Seleção dos inputs e chaves
    tpf_curva = tpf_xml[['codativo','dtvencimento','dtposicao','dtoperacao','coupom','id_papel']].copy()

    #Mudanças necessárias de formato
    tpf_curva['coupom'] = tpf_curva['coupom'].astype(float)

    #Data de referência da posição
    tpf_curva['data_posicao_curva'] = dt_base

    fluxo = pd.read_sql('select * from projeto_inv.anbima_fluxo_tpf;', con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    fluxo = fluxo.sort(['titulo','dt_vencto', 'dt_ref', 'data_bd'], ascending=[True, True, True, False])
    fluxo = fluxo.drop_duplicates(subset=['titulo', 'dt_vencto', 'dt_ref'], take_last=False)
    fluxo = fluxo.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='')
    fluxo = fluxo.rename(columns={'dt_vencto':'dtvencimento','cod_selic':'codativo'})

    #Retirada de colunas não utilizadas
    del fluxo['titulo']
    del fluxo['dt_emissao']
    del fluxo['cupom']
    del fluxo['dt_vencto2']
    del fluxo['data_bd']

    #Seleção do fluxo futuro à data da posição
    fluxo = fluxo[fluxo.dt_ref>=dt_base].copy()

    #Chamada de valores de VNA
    query = 'SELECT * FROM projeto_inv.anbima_vna'
    vna_virgem = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    vna = vna_virgem.sort(['codigo_selic','data_referencia','data_bd'], ascending=[True, False, False])
    vna = vna.drop_duplicates(subset=['codigo_selic','data_referencia'], take_last=False)
    vna = vna.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='')
    vna = vna.rename(columns={'codigo_selic':'codativo'})

    #Mudança de formato

    #Seleção vna na data da posição
    vna = vna[vna.data_referencia==dt_vna].copy()

    #Retirada de colunas não utilizadas
    del vna['id_anbima_vna']
    del vna['titulo']
    del vna['data_referencia']
    del vna['data_bd']

    #Agregação do vna à tabela fluxo
    fluxo = fluxo.merge(vna,on=['codativo'],how='left')
    fluxo['vna'] = fluxo['vna'].fillna(1000.0)

    #Agregaçào do fluxo à tabela tpf_curva
    tpf_curva = pd.merge(tpf_curva,fluxo,right_on=['codativo','dtvencimento'], left_on=['codativo','dtvencimento'], how='left')

    #Criação da lista de datas para trazer o fv a vp
    #Começa a contar a partir da data da posição
    dt_min = dt_base
    tpf_curva['dt_ref']=pd.to_datetime(tpf_curva['dt_ref'])
    dt_max = max(tpf_curva['dt_ref'])
    dt_max = dt_max.to_datetime()
    dt_max=dt_max.date()

    dt_ref = pd.date_range(start=dt_min, end=dt_max, freq='D').date
    serie_dias = pd.DataFrame(columns=['dt_ref'])
    serie_dias['dt_ref'] = dt_ref

    per = FinDt.DatasFinanceiras(dt_min, dt_max, path_arquivo=feriados_sheet)
    du = pd.DataFrame(columns=['dt_ref'])
    du['dt_ref'] = per.dias(3)
    du['du_flag'] = 1

    serie_dias = serie_dias.merge(du,on=['dt_ref'],how='left')
    serie_dias['du_flag'] = serie_dias['du_flag'].fillna(0)
    serie_dias['prazo_du'] = np.cumsum(serie_dias['du_flag']) - 1

    del serie_dias['du_flag']

    #Agregação da tabela serie_dias à tpf_curva
    tpf_curva['dt_ref'] = tpf_curva['dt_ref'].dt.date
    tpf_curva = tpf_curva.merge(serie_dias,on=['dt_ref'],how='left')

    #Cálculo do pv
    tpf_curva['pv'] = tpf_curva['fv']*tpf_curva['vna']/(1+tpf_curva['coupom']/100)**(tpf_curva['prazo_du']/252)
    tpf_curva['pv'] = np.where(tpf_curva['codativo']==210100,tpf_curva['fv']*tpf_curva['vna'],tpf_curva['pv'])

    #Cálculo da marcação na curva
    y = tpf_curva[['id_papel','pv']].groupby(['id_papel']).agg(['sum'])
    y = y.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
    y1 = pd.DataFrame(columns=['id_papel','pu_curva'])
    y1['id_papel'] = y['id_papel']
    y1['pu_curva'] = y['pv']

    tpf_curva = tpf_curva.merge(y1,on=['id_papel'],how='left')

    #Seleção das colunas necessárias
    tpf_curva = tpf_curva[['id_anbima_fluxo_tpf','id_papel','codativo','dtvencimento','dtoperacao','data_posicao_curva','pu_curva','fv','prazo_du']].copy()

    #----Informações de mercado
    #--Cria a base de valores marcados a mercado
    query = 'SELECT * FROM projeto_inv.anbima_tpf'
    base_anbima_virgem = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    base_anbima = base_anbima_virgem[base_anbima_virgem.dt_referencia<=dt_base]
    base_anbima = base_anbima[['cod_selic','dt_vencto','pu','dt_referencia','dt_carga','tx_indicativa']].copy()
    base_anbima = base_anbima.sort(['cod_selic','dt_vencto','dt_referencia','dt_carga'],ascending=[True,True,False,False])
    base_anbima = base_anbima.drop_duplicates(subset=['cod_selic','dt_vencto'],take_last=False)
    base_anbima = base_anbima[base_anbima.dt_referencia==dt_base].copy()
    base_anbima = base_anbima.rename(columns = {'cod_selic':'codativo','dt_vencto':'dtvencimento','dt_referencia':'data_referencia','pu':'pu_mercado'})

    del base_anbima['dt_carga']

    #----União das colunas de marcação a mercado e marcação na curva

    tpf = tpf_curva.merge(base_anbima,on=['codativo','dtvencimento'],how='left')

    del tpf['codativo']
    del tpf['dtvencimento']
    del tpf['dtoperacao']

    tpf_xml = tpf_xml.merge(tpf,on=['id_papel'],how='left')

    tpf_full = tpf_xml.copy()

    tpf_xml = tpf_xml.drop_duplicates(subset=['id_papel'])

    #Seção Compromisso
    tpf_xml['pu_mercado'] = np.where(tpf_xml['dtretorno'].notnull(),tpf_xml['puposicao'],tpf_xml['pu_mercado'])
    tpf_xml['pu_curva'] = np.where(tpf_xml['dtretorno'].notnull(),tpf_xml['puposicao'],tpf_xml['pu_curva'])

    tpf_xml['mtm_curva'] = tpf_xml['pu_curva']*(tpf_xml['qtdisponivel'] + tpf_xml['qtgarantia'])
    tpf_xml['mtm_mercado'] = tpf_xml['pu_mercado']*(tpf_xml['qtdisponivel'] + tpf_xml['qtgarantia'])

    tpf_xml['pu_regra_xml'] = np.where(tpf_xml['caracteristica']=='V',tpf_xml['pu_curva'],tpf_xml['pu_mercado'])
    tpf_xml['mtm_regra_xml'] = np.where(tpf_xml['caracteristica']=='V',tpf_xml['mtm_curva'],tpf_xml['mtm_mercado'])

    tpf_xml['data_bd'] = horario_bd

    del tpf_xml['id_xml_titpublico']
    del tpf_xml['dtposicao']
    del tpf_xml['data_posicao_curva']
    del tpf_xml['fv']
    del tpf_xml['prazo_du']
    del tpf_xml['id_anbima_fluxo_tpf']
    del tpf_xml['tx_indicativa']

    logger.info("Salvando base de dados - xml_titpublico")
    pd.io.sql.to_sql(tpf_xml, name='xml_titpublico', con=connection, if_exists='append', flavor='mysql', index=0)

    #----Trazer fv das LTN a vp, calcular o perc_mtm , DV100 e Duration
    #Fator de desconto
    dia = str(dt_base.day)
    if len(dia) == 1:
        dia = '0'+dia
    mes = str(dt_base.month)
    if len(mes) == 1:
        mes = '0'+mes
    ano = str(dt_base.year)

    #dt_base_str = ano + '-' + mes + '-' + dia

    tpf_full['indexador'] = np.where(tpf_full['indexador']=='IAP','IPCA',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['indexador']=='IGP','IGP',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['codativo'].isin([760100,760199]),'IPCA',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['codativo'].isin([770100]),'IGP',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['codativo'].isin([210100]),'PRE',tpf_full['indexador'])

    tpf_pv = tpf_full.copy()

    #Cálculo dos fatores de desconto, normal e estressado
    dt_base = str(dt_base)
    query = 'SELECT * FROM projeto_inv.curva_ettj_interpol_' + ano + '_' + mes + ' where day(dt_ref) = ' + dia + ' AND indexador_cod in("PRE","DIM","DIC");'
    ettj = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Seleciona a última carga
    ettj = ettj.sort(['indexador_cod','dt_ref', 'data_bd'], ascending = [True,False,False])
    ettj = ettj.drop_duplicates(subset=['prazo','tx_spot', 'tx_spot_ano','tx_termo_dia','indexador_cod'], take_last=False)
    ettj['indexador']=np.where(ettj['indexador_cod']=='DIC','IPCA',np.where(ettj['indexador_cod']=='DIM', 'IGP',np.where(ettj['indexador_cod']=='SLP','SEL','PRE')))
    ettj=ettj.rename(columns={'prazo': 'prazo_du'})
    ettj_filtro=ettj[['prazo_du', 'tx_spot', 'tx_spot_ano', 'indexador']]

    tpf_pv = tpf_pv[tpf_pv.prazo_du>=0].copy()
    tpf_pv = tpf_pv.merge(ettj_filtro,on=['indexador','prazo_du'],how='left')
    tpf_pv['tx_spot'] =  tpf_pv['tx_spot'].fillna(0)
    tpf_pv['tx_spot_ano'] =  tpf_pv['tx_spot_ano'].fillna(0)
    tpf_pv['fator_desconto'] = 1/(1+tpf_pv['tx_spot'])
    tpf_pv['fator_desconto_DV100'] = 1/(1+tpf_pv['tx_spot_ano']+0.01)**(tpf_pv['prazo_du']/252)
    tpf_pv['pv'] = tpf_pv['fv']*tpf_pv['fator_desconto']
    tpf_pv['pv_DV100'] = tpf_pv['fv']*tpf_pv['fator_desconto_DV100']

    total_pv = tpf_pv[['id_papel', 'pv','fv']].copy()
    total_pv = total_pv.groupby(['id_papel']).sum().reset_index()
    total_pv = total_pv.rename(columns={'pv': 'pv_sum','fv':'fv_sum'})

    tpf_pv = tpf_pv.merge(total_pv, on=['id_papel'], how='left')
    tpf_pv['perc_mtm'] = tpf_pv['pv']/tpf_pv['pv_sum']
    tpf_pv['perc_mtm_DV100'] = tpf_pv['pv_DV100']/tpf_pv['pv_sum']

    #Cálculo do DV100
    tpf_pv['DV100_fluxo'] = (tpf_pv['perc_mtm'] - tpf_pv['perc_mtm_DV100'])*tpf_pv['pu_mercado']

    DV100 = tpf_pv[['id_papel', 'DV100_fluxo']].copy()
    DV100 = DV100.groupby(['id_papel']).sum().reset_index()
    DV100 = DV100.rename(columns={'DV100_fluxo':'DV100'})
    tpf_pv = tpf_pv.merge(DV100, on=['id_papel'], how='left')

    #Cálculo da Duration
    tpf_pv['fluxo_ponderado'] = tpf_pv['perc_mtm']*tpf_pv['prazo_du']

    duration = tpf_pv[['id_papel', 'fluxo_ponderado']].copy()
    duration = duration.groupby(['id_papel']).sum().reset_index()
    duration = duration.rename(columns={'fluxo_ponderado':'duration'})
    tpf_pv = tpf_pv.merge(duration, on=['id_papel'], how='left')

    #Normalizando para encaixar com as colunas de titprivado
    tpf_pv['fluxo_ponderado'] = tpf_pv['fluxo_ponderado']*tpf_pv['pu_mercado']
    tpf_pv['fv'] = tpf_pv['fv']*tpf_pv['pu_mercado']/tpf_pv['fv_sum']

    del tpf_pv['pv_sum']
    del tpf_pv['fv_sum']
    del tpf_pv['DV100_fluxo']
    del tpf_pv['perc_mtm_DV100']
    del tpf_pv['tx_indicativa']

    tpf_pv = tpf_pv.rename(columns={'isin':'codigo_isin','pu_mercado':'mtm','data_fim':'dt_ref'})
    tpf_pv['data_mtm'] = dt_base
    tpf_pv['data_negociacao'] = tpf_pv['data_referencia']
    tpf_pv['ano_mtm'] = dt_base[0:4]
    tpf_pv['mes_mtm'] = dt_base[5:7]
    tpf_pv['dia_mtm'] = dt_base[8:10]
    tpf_pv['indexador'] = np.where(tpf_pv['codativo'].isin([210100]),'SEL',tpf_pv['indexador'])

    #Seleção das colunas finais
    tpf_pv = tpf_pv[['id_anbima_fluxo_tpf',
                     'id_papel',
                     'codigo_isin',
                     'codativo',
                     'dtvencimento',
                     'prazo_du',
                     'fv',
                     'indexador',
                     'tx_spot',
                     'fator_desconto',
                     'fator_desconto_DV100',
                     'pv',
                     'pv_DV100',
                     'perc_mtm',
                     'DV100',
                     'fluxo_ponderado',
                     'duration',
                     'mtm',
                     'data_mtm',
                     'ano_mtm',
                     'mes_mtm',
                     'dia_mtm',
                     'data_negociacao']].copy()


    #Cria o flag de tipo_ativo T(ítulo) P(úblico) F(eferal)
    tpf_pv['tipo_ativo'] = 'TPF'
    tpf_pv['data_bd'] = horario_bd
    tpf_pv = tpf_pv.sort(['codigo_isin','codativo','prazo_du'],ascending=[True,True,True])
    tpf_pv = tpf_pv.drop_duplicates(subset=['codigo_isin','codativo','dtvencimento','prazo_du'],take_last=True)

    #Coloca na base mtmt_renda_fixa

    logger.info("Salvando base de dados - mtm_renda_fixa")
    pd.io.sql.to_sql(tpf_pv, name='mtm_renda_fixa', con=connection,if_exists="append", flavor='mysql', index=0)

    #Fecha conexão
    connection.close()

    tpf_pv.to_excel(save_path_tpf_fluxo_final)
Exemplo n.º 5
0
def mtm_curva_debenture():

    import datetime, time
    import pandas as pd
    import pymysql as db
    import numpy as np
    import logging
    from findt import FinDt
    from pandas import ExcelWriter
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

    # Diretório de save de planilhas
    save_path_puposicao_final = full_path_from_database(
        'get_output_quadro419') + 'puposicao_final_deb.xlsx'
    save_path_teste_dif_deb = full_path_from_database(
        'get_output_quadro419') + 'teste_dif_deb.xlsx'
    feriados_sheet = full_path_from_database(
        'feriados_nacionais') + 'feriados_nacionais.csv'

    tol = 0.20

    writer = ExcelWriter(save_path_puposicao_final)

    dt_base_rel = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))

    # 1 - Leitura e criação de tabelas
    # Informações do cálculo de MTM
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = "SELECT * FROM projeto_inv.mtm_titprivado WHERE tipo_ativo = 'DBS'"
    #query = "SELECT * FROM projeto_inv.mtm_titprivado"
    mtm_titprivado0 = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    mtm_titprivado = mtm_titprivado0.copy()

    # Seleciona debentures

    # Seleciona a última carga de debentures da data da posicao
    mtm_titprivado['dtrel'] = mtm_titprivado['id_papel'].str.split('_')
    mtm_titprivado['dtrel'] = mtm_titprivado['dtrel'].str[0]

    mtm_titprivado = mtm_titprivado[mtm_titprivado.dtrel ==
                                    dtbase_concat].copy()
    mtm_titprivado = mtm_titprivado[mtm_titprivado.data_bd == max(
        mtm_titprivado.data_bd)]

    # Renomeia columnas
    mtm_titprivado = mtm_titprivado.rename(columns={
        'data_fim': 'dt_ref',
        'dtoperacao': 'dtoperacao_mtm'
    })

    # Reajusta papéis indesaxos a DI
    mtm_titprivado['dt_ref'] = pd.to_datetime(mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = np.where(
        mtm_titprivado['indexador'] == 'DI1',
        mtm_titprivado['dt_ref'] + pd.DateOffset(months=0, days=1),
        mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = mtm_titprivado['dt_ref'].dt.date

    # Altera o nome do id_papel para levar em consideração o flag
    mtm_titprivado['id_papel_old'] = mtm_titprivado['id_papel']
    mtm_titprivado['id_papel'] = mtm_titprivado['id_papel_old'].str.split('_')
    mtm_titprivado['id_papel'] = mtm_titprivado['id_papel'].str[0] + '_' + mtm_titprivado['id_papel'].str[1] + '_' + \
                                 mtm_titprivado['id_papel'].str[2]

    del mtm_titprivado['data_bd']
    del mtm_titprivado['dtrel']

    query = 'SELECT * FROM projeto_inv.xml_debenture_org'
    xml_titprivado = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    # Seleciona a última carga de debentures da data da posicao
    xml_titprivado['dtrel'] = xml_titprivado['id_papel'].str.split('_')
    xml_titprivado['dtrel'] = xml_titprivado['dtrel'].str[0]

    xml_titprivado = xml_titprivado[xml_titprivado.dtrel ==
                                    dtbase_concat].copy()
    xml_titprivado = xml_titprivado[xml_titprivado.data_bd == max(
        xml_titprivado.data_bd)]

    original = xml_titprivado.copy()

    del xml_titprivado['data_bd']
    del xml_titprivado['indexador']
    del xml_titprivado['dtrel']

    # Puxa as informações de negociação em mercado secuindário da Anbima para debentures -> linha dtspread
    query = 'SELECT * FROM projeto_inv.anbima_debentures'
    anbima_deb = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    anbima_deb = anbima_deb[anbima_deb.data_referencia <= dt_base_rel]
    anbima_deb = anbima_deb.sort(['codigo', 'data_referencia', 'data_bd'],
                                 ascending=[True, True, True])
    anbima_deb = anbima_deb.drop_duplicates(subset=['codigo'], take_last=True)
    anbima_deb = anbima_deb[['codigo', 'data_referencia', 'pu']].copy()
    anbima_deb['codigo'] = anbima_deb['codigo'].astype(str)
    anbima_deb = anbima_deb.rename(columns={
        'codigo': 'coddeb',
        'data_referencia': 'data_spread'
    })
    anbima_deb.coddeb.unique().tolist()
    xml_titprivado.coddeb.unique().tolist()

    # Criação da tabela xml + anbima
    xml_titprivado = xml_titprivado.merge(anbima_deb,
                                          on=['coddeb'],
                                          how='left')

    # Para os papéis que não tiveram negociação, assume data_spread = data_relatorio
    xml_titprivado['data_spread'] = np.where(
        xml_titprivado['data_spread'].isnull(), dt_base_rel,
        xml_titprivado['data_spread'])

    # Preenchimento com puposicao do xml no pu vindo da anbima quando não tem pu
    # Tira o valor médio de todos os pu's posicao
    x = xml_titprivado[['isin', 'puposicao']].groupby(['isin']).agg(['mean'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['isin', 'pumedio'])
    x1['isin'] = x['isin']
    x1['pumedio'] = x['puposicao']
    xml_titprivado = xml_titprivado.merge(x1, on=['isin'], how='left')

    xml_titprivado['pu'] = np.where(xml_titprivado['pu'].isnull(),
                                    xml_titprivado['pumedio'],
                                    xml_titprivado['pu'])

    del xml_titprivado['pumedio']

    # Criação da tabela mtm + xml
    titprivado = xml_titprivado.merge(mtm_titprivado,
                                      on=['id_papel'],
                                      how='left')

    # Criação da coluna de data de referencia da posição
    titprivado['data_referencia'] = titprivado['id_papel'].str[0:8]
    titprivado['data_referencia'] = pd.to_datetime(
        titprivado['data_referencia']).dt.date

    titprivado.caracteristica.unique()

    logger.info("Cálculo marcação na curva")
    # 2 - Cálculo marcação na curva

    ###### AQUI ZERA!!################# Verificar
    titprivado_curva = titprivado[titprivado.caracteristica == 'V'].copy()

    del titprivado_curva['vne']

    # Seleciona a parte do fluxo entre a data da compra e a data da posição
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref >= titprivado_curva.dtoperacao_mtm].copy()
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref <= titprivado_curva.data_referencia].copy()

    # Preenchimento do VNE na data da compra
    tp_curva_dtop = titprivado_curva[[
        'id_papel_old', 'saldo_dev_juros_perc', 'pucompra'
    ]][titprivado_curva.dt_ref == titprivado_curva.dtoperacao_mtm].copy()

    tp_curva_dtop['vne'] = tp_curva_dtop['pucompra'] * (
        1 - tp_curva_dtop['saldo_dev_juros_perc'])

    del tp_curva_dtop['saldo_dev_juros_perc']
    del tp_curva_dtop['pucompra']

    titprivado_curva = titprivado_curva.merge(tp_curva_dtop,
                                              on=['id_papel_old'],
                                              how='left')

    titprivado_curva[
        'principal_perc_acum'] = 1 - titprivado_curva['principal_perc']
    titprivado_curva['principal_perc_acum'] = titprivado_curva[[
        'id_papel_old', 'principal_perc_acum'
    ]].groupby(['id_papel_old']).agg(['cumprod'])
    titprivado_curva['vne'] = titprivado_curva['vne'] * titprivado_curva[
        'principal_perc_acum']
    titprivado_curva['pagto_juros'] = titprivado_curva[
        'vne'] * titprivado_curva['pagto_juros_perc']
    titprivado_curva[
        'vna'] = titprivado_curva['vne'] * titprivado_curva['fator_index_per']
    titprivado_curva['vna'][titprivado_curva.indexador ==
                            'DI1'] = titprivado_curva['vne'][
                                titprivado_curva.indexador == 'DI1']
    titprivado_curva['saldo_dev_juros'] = titprivado_curva[
        'vna'] * titprivado_curva['saldo_dev_juros_perc']
    titprivado_curva['pupar'] = titprivado_curva['vna'] + titprivado_curva[
        'saldo_dev_juros'] + titprivado_curva['pagto_juros']
    titprivado_curva['dif_curva'] = titprivado_curva[
        'pupar'] / titprivado_curva['puposicao'] - 1
    titprivado_curva['dif_curva'] = titprivado_curva['dif_curva'].abs()
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref == titprivado_curva.data_referencia].copy()
    titprivado_curva = titprivado_curva[[
        'id_papel_old', 'id_papel', 'codigo_isin', 'dif_curva', 'pupar'
    ]].copy()
    titprivado_curva = titprivado_curva.sort(['dif_curva'], ascending=[True])
    titprivado_curva = titprivado_curva.drop_duplicates(subset=['id_papel'],
                                                        take_last=False)

    titprivado = titprivado.merge(
        titprivado_curva,
        on=['id_papel_old', 'id_papel', 'codigo_isin'],
        how='left')
    titprivado = titprivado[((titprivado.caracteristica == 'V') &
                             (titprivado.dif_curva.notnull())) |
                            (titprivado.caracteristica == 'N')].copy()
    titprivado = titprivado.reset_index(level=None,
                                        drop=True,
                                        inplace=False,
                                        col_level=0,
                                        col_fill='')

    logger.info("Cálculo do mtm na data_spread; a)prazo_du_spread")
    # 3 - Cálculo do mtm na data_spread; a) prazo_du_spread

    # Verificação de papéis sem a data de referência
    titprivado[titprivado.dt_ref.isnull()].to_excel(writer, 'dt_ref_NaN')

    # Retira papéis sem data de referência
    titprivado = titprivado[titprivado.dt_ref.notnull()].copy()

    # Cria vetor das datas
    dt_min = min(titprivado['dt_ref'])
    dt_min = dt_min.replace(day=1)
    dt_min = datetime.date(dt_min.year, dt_min.month, dt_min.day)

    dt_max = max(titprivado['dt_ref'])
    dt_max = dt_max.replace(day=1, month=dt_max.month)
    dt_max = dt_max + pd.DateOffset(months=1)
    dt_max = dt_max - pd.DateOffset(days=1)
    dt_max = datetime.date(dt_max.year, dt_max.month, dt_max.day)

    dt_ref = pd.date_range(start=dt_min, end=dt_max, freq='D').date

    serie_dias = pd.DataFrame(columns=['dt_ref', 'aux'])
    serie_dias['dt_ref'] = dt_ref

    # Cria vetor das datas úteis
    per = FinDt.DatasFinanceiras(dt_min, dt_max, path_arquivo=feriados_sheet)

    du = pd.DataFrame(columns=['dt_ref'])
    du['dt_ref'] = per.dias(3)
    du['du_1'] = 1

    serie_dias = serie_dias.merge(du, on=['dt_ref'], how='left')

    serie_dias['du_1'] = serie_dias['du_1'].fillna(0)

    serie_dias['indice_du'] = np.cumsum(serie_dias['du_1'])

    del serie_dias['aux']
    del serie_dias['du_1']

    fim = serie_dias.copy()
    fim = fim.rename(columns={'indice_du': 'indice_du_fim_spread'})

    inicio = serie_dias.copy()
    inicio = inicio.rename(columns={
        'dt_ref': 'data_spread',
        'indice_du': 'indice_du_inicio_spread'
    })

    # Une as séries dias à tabela titprivado
    titprivado = titprivado.merge(fim, on=['dt_ref'], how='left')
    titprivado = titprivado.merge(inicio, on=['data_spread'], how='left')

    # Calcula o prazo_du_spread
    titprivado['prazo_du_spread'] = titprivado[
        'indice_du_fim_spread'] - titprivado['indice_du_inicio_spread']

    logger.info("Cálculo do mtm na data_spread; b) taxa_spot")
    # 4 - Cálculo do mtm na data_spread; b) taxa_spot

    if len(titprivado[titprivado.indexador == 'PRE']) != 0:
        maximo_tp_PRE = max(
            titprivado['prazo_du_spread'][titprivado.indexador == 'PRE'])

    if len(titprivado[titprivado.indexador == 'IGP']) != 0:
        maximo_tp_IGPM = max(
            titprivado['prazo_du_spread'][titprivado.indexador == 'IGP'])

    if len(titprivado[titprivado.indexador == 'IPCA']) != 0:
        maximo_tp_IPCA = max(
            titprivado['prazo_du_spread'][titprivado.indexador == 'IPCA'])

    # ----Base de interpolações para cálculo do spread
    dt_min_interpol = str(min(titprivado['data_spread']))

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    # Data de 2020 limite para a criacao das tabelas
    dt_ref = pd.date_range(start=datetime.date(int(dt_min_interpol[0:4]),
                                               int(dt_min_interpol[5:7]), 1),
                           end=datetime.date(int(2020), int(10), 31),
                           freq='M').date

    # Uniao das tabelas criadas com union all
    query = ''
    for dt in dt_ref:
        month = '0' + str(dt.month) if len(str(dt.month)) == 1 else str(
            dt.month)
        year = '0' + str(dt.year) if len(str(dt.year)) == 1 else str(dt.year)
        query = query + 'SELECT * FROM projeto_inv.curva_ettj_interpol_' + year + "_" + month + " UNION ALL "
    query = query[:-11]

    query = 'select * from (' + query + ') AS a where dt_ref<=' + '"' + dtbase_concat + '" and dt_ref>=' + '"' + dt_min_interpol + '" and indexador_cod in("PRE","DIM","DIC");'

    ettj = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    # Seleciona a última carga
    ettj = ettj.sort(['indexador_cod', 'dt_ref', 'data_bd'],
                     ascending=[True, False, False])
    ettj = ettj.drop_duplicates(subset=[
        'prazo', 'tx_spot', 'tx_spot_ano', 'tx_termo_dia', 'indexador_cod'
    ],
                                take_last=False)
    ettj['indexador'] = np.where(
        ettj['indexador_cod'] == 'DIC', 'IPCA',
        np.where(ettj['indexador_cod'] == 'DIM', 'IGP', 'PRE'))
    ettj = ettj.rename(columns={'prazo': 'prazo_du'})
    ettj_filtro = ettj[['prazo_du', 'tx_spot', 'tx_spot_ano', 'indexador']]
    ettj_filtro = ettj_filtro.rename(columns={'prazo_du': 'prazo_du_spread'})

    # Extrapolação PRE, se necessário
    if len(titprivado[titprivado.indexador == 'PRE']) != 0:
        maximo_ettj = max(
            ettj_filtro['prazo_du_spread'][ettj_filtro.indexador == 'PRE'])
        # del ettj_fluxo
        if maximo_ettj < max(
                titprivado['prazo_du_spread'][titprivado.indexador == 'PRE']):
            ettj_filtro_PRE = ettj_filtro[[
                'prazo_du_spread', 'tx_spot_ano', 'indexador'
            ]][ettj_filtro.indexador == 'PRE'].copy()
            ettj_filtro_PRE = ettj_filtro_PRE.reset_index(level=None,
                                                          drop=True,
                                                          inplace=False,
                                                          col_level=0,
                                                          col_fill='')
            ettj_filtro_PRE = ettj_filtro_PRE[0:maximo_ettj - 1].copy()

            tx_max = ettj_filtro_PRE['tx_spot_ano'].loc[len(ettj_filtro_PRE) -
                                                        1]

            ettj_aux = pd.DataFrame(columns=['prazo_du_spread', 'indexador'])
            ettj_aux['prazo_du_spread'] = np.linspace(1, maximo_tp_PRE,
                                                      maximo_tp_PRE)
            ettj_aux['indexador'] = 'PRE'
            ettj_aux = ettj_aux.merge(ettj_filtro_PRE,
                                      on=['prazo_du_spread', 'indexador'],
                                      how='left')
            ettj_aux['tx_spot_ano'] = ettj_aux['tx_spot_ano'].fillna(tx_max)
            ettj_aux['tx_spot'] = (1 + ettj_aux['tx_spot_ano'])**(
                ettj_aux['prazo_du_spread'] / 252) - 1
            ettj_fluxo = ettj_fluxo.append(ettj_aux)
        else:
            ettj_aux = ettj_filtro.copy()
            ettj_fluxo = ettj_aux.copy()
    else:
        ettj_fluxo = ettj_filtro.copy()

    # Extrapolação IGPM, se necessário
    if len(titprivado[titprivado.indexador == 'IGP']) != 0:
        maximo_ettj = max(
            ettj_filtro['prazo_du_spread'][ettj_filtro.indexador == 'IGP'])
        # del ettj_fluxo
        if maximo_ettj < max(
                titprivado['prazo_du_spread'][titprivado.indexador == 'IGP']):
            ettj_filtro_IGPM = ettj_filtro[[
                'prazo_du_spread', 'tx_spot_ano', 'indexador'
            ]][ettj_filtro.indexador == 'IGP'].copy()
            ettj_filtro_IGPM = ettj_filtro_IGPM.reset_index(level=None,
                                                            drop=True,
                                                            inplace=False,
                                                            col_level=0,
                                                            col_fill='')
            ettj_filtro_IGPM = ettj_filtro_IGPM[0:maximo_ettj - 1].copy()

            tx_max = ettj_filtro_IGPM['tx_spot_ano'].loc[len(ettj_filtro_IGPM)
                                                         - 1]

            ettj_aux = pd.DataFrame(columns=['prazo_du_spread', 'indexador'])
            ettj_aux['prazo_du_spread'] = np.linspace(1, maximo_tp_IGPM,
                                                      maximo_tp_IGPM)
            ettj_aux['indexador'] = 'IGP'
            ettj_aux = ettj_aux.merge(ettj_filtro_IGPM,
                                      on=['prazo_du_spread', 'indexador'],
                                      how='left')
            ettj_aux['tx_spot_ano'] = ettj_aux['tx_spot_ano'].fillna(tx_max)
            ettj_aux['tx_spot'] = (1 + ettj_aux['tx_spot_ano'])**(
                ettj_aux['prazo_du_spread'] / 252) - 1
            ettj_fluxo = ettj_fluxo.append(ettj_aux)
        else:
            ettj_aux = ettj_filtro.copy()
            ettj_fluxo = ettj_aux.copy()
    else:
        ettj_fluxo = ettj_filtro.copy()

    # Extrapolação IPCA, se necessário
    if len(titprivado[titprivado.indexador == 'IPCA']) != 0:
        maximo_ettj = max(
            ettj_filtro['prazo_du_spread'][ettj_filtro.indexador == 'IPCA'])
        # del ettj_fluxo
        if maximo_ettj < max(
                titprivado['prazo_du_spread'][titprivado.indexador == 'IPCA']):
            ettj_filtro_IPCA = ettj_filtro[[
                'prazo_du_spread', 'tx_spot_ano', 'indexador'
            ]][ettj_filtro.indexador == 'IPCA'].copy()
            ettj_filtro_IPCA = ettj_filtro_IPCA.reset_index(level=None,
                                                            drop=True,
                                                            inplace=False,
                                                            col_level=0,
                                                            col_fill='')
            ettj_filtro_IPCA = ettj_filtro_IPCA[0:maximo_ettj - 1].copy()

            tx_max = ettj_filtro_IPCA['tx_spot_ano'].loc[len(ettj_filtro_IPCA)
                                                         - 1]

            ettj_aux = pd.DataFrame(columns=['prazo_du_spread', 'indexador'])
            ettj_aux['prazo_du_spread'] = np.linspace(1, maximo_tp_IPCA,
                                                      maximo_tp_IPCA)
            ettj_aux['indexador'] = 'IPCA'
            ettj_aux = ettj_aux.merge(ettj_filtro_IPCA,
                                      on=['prazo_du_spread', 'indexador'],
                                      how='left')
            ettj_aux['tx_spot_ano'] = ettj_aux['tx_spot_ano'].fillna(tx_max)
            ettj_aux['tx_spot'] = (1 + ettj_aux['tx_spot_ano'])**(
                ettj_aux['prazo_du_spread'] / 252) - 1
            ettj_fluxo = ettj_fluxo.append(ettj_aux)
        else:
            ettj_aux = ettj_filtro.copy()
            ettj_fluxo = ettj_aux.copy()
    else:
        ettj_fluxo = ettj_filtro.copy()

    # Une a ETTJ à tabela titprivado
    ettj_fluxo = ettj_fluxo.rename(columns={
        'tx_spot': 'tx_spot_spread',
        'tx_spot_ano': 'tx_spot_ano_spread'
    })
    titprivado = titprivado.merge(ettj_fluxo,
                                  on=['prazo_du_spread', 'indexador'],
                                  how='left')

    # Preenche com 0 onde não tem taxa spot (prazo_su_spread<0, indexador=DI1)
    titprivado['tx_spot_spread'] = titprivado['tx_spot_spread'].fillna(0)
    titprivado['tx_spot_ano_spread'] = titprivado['tx_spot_ano_spread'].fillna(
        0)

    logger.info("Cálculo do mtm na data_spread; b) valor presente e mtm")
    # 5 - Cálculo do mtm na data_spread; c) valor presente e mtm

    titprivado['fator_desconto_spread'] = 1 / (1 +
                                               titprivado['tx_spot_spread'])
    titprivado[
        'pv_spread'] = titprivado['fv'] * titprivado['fator_desconto_spread']
    titprivado['pv_spread'] = np.where(titprivado['prazo_du_spread'] < 0, 0,
                                       titprivado['pv_spread'])

    x = titprivado[['id_papel',
                    'pv_spread']].groupby(['id_papel']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['id_papel', 'mtm_spread'])
    x1['id_papel'] = x['id_papel']
    x1['mtm_spread'] = x['pv_spread']
    titprivado = titprivado.merge(x1, on=['id_papel'], how='left')
    titprivado['dif'] = titprivado['mtm_spread'] / titprivado['pu'] - 1

    writer = ExcelWriter(save_path_puposicao_final)

    aux = titprivado.drop_duplicates(subset=['codigo_isin'])
    aux[[
        'id_papel_old', 'codigo_isin', 'flag', 'indexador', 'puemissao',
        'data_emissao', 'data_expiracao', 'puposicao', 'percentual_indexador',
        'taxa_juros', 'pu', 'mtm_spread', 'dif'
    ]].to_excel(writer, 'dif')

    logger.info("Cálculo spread de crédito")
    # 6 - Cálculo spread de crédito

    titprivado_spread = \
    titprivado[['id_papel', 'codigo_isin', 'data_spread', 'pu', 'dt_ref', 'prazo_du_spread', 'pv_spread']][
        (titprivado.caracteristica == 'N') & (titprivado.dif != 1)]

    # Seleciona apenas o fluxo com prazo_du positivo
    titprivado_spread = titprivado_spread[
        titprivado_spread.dt_ref >= titprivado_spread.data_spread]
    titprivado_spread = titprivado_spread.drop_duplicates(
        subset=['id_papel', 'prazo_du_spread'])
    titprivado_spread['pv_pv_fluxo'] = np.where(
        titprivado_spread['dt_ref'] == titprivado_spread['data_spread'],
        -titprivado_spread['pu'], titprivado_spread['pv_spread'])
    tp_spread = titprivado_spread[[
        'id_papel', 'dt_ref', 'prazo_du_spread', 'pv_pv_fluxo'
    ]].copy()
    tp_spread['prazo_du'] = tp_spread['prazo_du_spread'].astype(float)
    tp_spread = tp_spread.drop_duplicates(
        subset=['id_papel', 'prazo_du_spread'], take_last=True)

    id_papel = titprivado_spread['id_papel'].unique()
    spread = np.zeros((len(id_papel)))

    spread_aux = pd.DataFrame(columns=['id_papel', 'spread'])
    spread_aux['id_papel'] = id_papel

    start_time = time.time()
    for i in range(0, len(id_papel)):
        v = tp_spread['pv_pv_fluxo'][tp_spread.id_papel == id_papel[i]].values
        v = np.meshgrid(v, sparse=True)

        s = np.linspace(-0.9999, 0.9999, 10000)
        t = tp_spread['prazo_du_spread'][tp_spread.id_papel ==
                                         id_papel[i]].values
        t, s = np.meshgrid(t, s, sparse=True)
        f_ts = 1. / (1 + s)**(t / 252)

        f_spread = v * f_ts

        f_sum = f_spread.sum(axis=1, dtype='float')

        min_index = abs(f_sum).argmin()

        spread[i] = s[min_index]

        print(time.time() - start_time, i, id_papel[i], spread[i])

        spread_aux['spread'].iloc[i] = spread[i]

    titprivado = titprivado.merge(spread_aux, on=['id_papel'], how='left')

    aux = titprivado.drop_duplicates(subset=['id_papel'])

    aux[[
        'id_papel_old', 'codigo_isin', 'valor_nominal', 'puposicao',
        'mtm_spread', 'pu', 'spread'
    ]].to_excel(save_path_teste_dif_deb)

    logger.info("Seleção dos papéis cuja marcação não ficou boa")
    # 7 - Seleção dos papéis cuja marcação não ficou boa

    tp_bigdif = titprivado[[
        'data_spread', 'codigo_isin', 'id_papel', 'flag', 'indexador',
        'dtemissao', 'data_emissao', 'dtvencimento', 'data_expiracao',
        'valor_nominal', 'puemissao', 'juros_cada', 'coupom', 'taxa_juros',
        'percentual_indexador', 'percindex', 'perc_amortizacao', 'dt_ref',
        'vne', 'du_per', 'prazo_du', 'fator_index_per', 'fator_juros_per',
        'pv', 'fv', 'mtm', 'puposicao', 'pu', 'dif', 'spread'
    ]].copy()

    tp_bigdif['dif'] = tp_bigdif['mtm'] / tp_bigdif['pu'] - 1

    tp_bigdif[(tp_bigdif.dif > tol) | (tp_bigdif.dif < -tol) |
              (tp_bigdif.spread > tol) | (tp_bigdif.spread < -tol)].to_excel(
                  writer, 'bigdif')

    logger.info(
        "Atualização do fluxo de percentual de mtm com o spread e carregamento da tabela"
    )
    # 8 - Atualização do fluxo de percentual de mtm com o spread e carregamento da tabela para preenchimento do quadro 419

    titprivado_perc = titprivado.copy()

    titprivado_perc = titprivado_perc.rename(
        columns={
            'mtm': 'mtm_old',
            'pv': 'pv_old',
            'pv_DV100': 'pv_DV100_old',
            'fator_desconto': 'fator_desconto_old',
            'fator_desconto_DV100': 'fator_desconto_DV100_old',
            'DV100': 'DV100_old'
        })

    # Escolhe o melhor spread - SIGNIFICA O MELHOR FLUXO
    titprivado_perc['spread'] = titprivado_perc['spread'].fillna(0)

    # Pega penas uma linha para não ter problemas
    x = titprivado_perc[[
        'id_papel', 'codigo_isin', 'spread'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()

    x = x.sort(['codigo_isin', 'spread'], ascending=[True, True])
    x = x.drop_duplicates(subset=['codigo_isin'], take_last=False)

    x['marker'] = 1

    titprivado_perc = titprivado_perc.merge(
        x, on=['codigo_isin', 'id_papel', 'spread'], how='left')

    titprivado_perc = titprivado_perc[titprivado_perc.marker == 1].copy()
    del titprivado_perc['marker']

    titprivado_perc = titprivado_perc.drop_duplicates(
        subset=['codigo_isin', 'dt_ref'], take_last=True)

    # titprivado_perc['puposicao_final'] = np.where(titprivado_perc['caracteristica']=='N',titprivado_perc['pu'],titprivado_perc['mtm_old'])

    titprivado_perc = titprivado_perc[titprivado_perc.prazo_du >= 0]

    aux = titprivado_perc[[
        'id_papel', 'codigo_isin'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()
    aux = aux.drop_duplicates(subset=['codigo_isin'], take_last=True)
    aux['marker'] = 1

    titprivado_perc = titprivado_perc.merge(aux,
                                            on=['id_papel', 'codigo_isin'],
                                            how='left')
    titprivado_perc = titprivado_perc[titprivado_perc.marker == 1].copy()
    del titprivado_perc['marker']

    # Recalcula apenas para que está marcado a mercado
    aux = titprivado_perc[titprivado_perc.caracteristica == 'V'].copy()
    aux['mtm_DV100_N'] = 0.0
    aux = aux.rename(columns={'mtm_old': 'mtm'})

    titprivado_perc = titprivado_perc[titprivado_perc.caracteristica ==
                                      'N'].copy()

    # Cálculo do fator de desconto atualizado pelo spread
    titprivado_perc[
        'fator_desconto'] = titprivado_perc['fator_desconto_old'] / (
            1 + titprivado_perc['spread'])**(titprivado_perc['prazo_du'] / 252)
    titprivado_perc['fator_desconto_DV100'] = titprivado_perc[
        'fator_desconto_DV100_old'] / (1 + titprivado_perc['spread'])**(
            titprivado_perc['prazo_du'] / 252)

    # Calculo do pv
    titprivado_perc[
        'pv'] = titprivado_perc['fv'] * titprivado_perc['fator_desconto']
    titprivado_perc['pv_DV100'] = titprivado_perc['fv'] * titprivado_perc[
        'fator_desconto_DV100']

    # Calculo do MTM
    x = titprivado_perc[['codigo_isin', 'pv',
                         'pv_DV100']].groupby(['codigo_isin']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'mtm', 'mtm_DV100_N'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['mtm'] = x['pv']
    x1['mtm_DV100_N'] = x['pv_DV100']
    titprivado_perc = titprivado_perc.merge(x1, on=['codigo_isin'], how='left')

    titprivado_perc['mtm_DV100'] = 0.0

    # Escolhe o melhor fluxo
    titprivado_perc['dif_new'] = titprivado_perc['mtm'] - titprivado_perc['pu']
    titprivado_perc['dif_new'] = titprivado_perc['dif_new'].abs()
    titprivado_perc[
        'dif_old'] = titprivado_perc['mtm_old'] - titprivado_perc['pu']
    titprivado_perc['dif_old'] = titprivado_perc['dif_old'].abs()

    titprivado_perc['mtm'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['mtm_old'], titprivado_perc['mtm'])
    titprivado_perc['mtm_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['mtm_DV100'], titprivado_perc['mtm_DV100_N'])
    titprivado_perc['pv'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['pv_old'], titprivado_perc['pv'])
    titprivado_perc['pv_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['pv_DV100_old'], titprivado_perc['pv_DV100'])
    titprivado_perc['fator_desconto'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['fator_desconto_old'],
        titprivado_perc['fator_desconto'])
    titprivado_perc['fator_desconto_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['fator_desconto_DV100_old'],
        titprivado_perc['fator_desconto_DV100'])

    titprivado_perc[
        'dif_perc'] = titprivado_perc['dif_new'] / titprivado_perc['pu']

    # titprivado_perc['mtm'] = np.where(titprivado_perc['dif_perc']>0.10,titprivado_perc['pu'],titprivado_perc['mtm'])

    # Cálculo do DV100
    titprivado_perc = titprivado_perc.append(aux)

    titprivado_perc[
        'DV100'] = titprivado_perc['mtm'] - titprivado_perc['mtm_DV100']

    # Cálculo do perc_mtm
    titprivado_perc[
        'perc_mtm'] = titprivado_perc['pv'] / titprivado_perc['mtm']

    # Cálculo da duration
    titprivado_perc[
        'duration'] = titprivado_perc['perc_mtm'] * titprivado_perc['prazo_du']
    x = titprivado_perc[['codigo_isin',
                         'duration']].groupby(['codigo_isin']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'duration'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['duration'] = x['duration']
    del titprivado_perc['duration']
    titprivado_perc = titprivado_perc.merge(x1, on=['codigo_isin'], how='left')

    titprivado_perc[[
        'codigo_isin', 'pu', 'mtm', 'dt_ref', 'mtm_old', 'dif_new', 'dif_old',
        'duration', 'spread'
    ]].to_excel(writer, 'conclusao_fluxo')
    titprivado_perc[
        titprivado_perc.dt_ref == titprivado_perc.data_referencia][[
            'codigo_isin', 'pu', 'mtm', 'dt_ref', 'mtm_old', 'dif_new',
            'dif_old', 'duration', 'spread'
        ]].to_excel(writer, 'conclusao_resumido')

    finalizacao = titprivado_perc[[
        'codigo_isin', 'mtm'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()

    del titprivado_perc['fator_desconto_DV100_old']
    del titprivado_perc['fator_desconto_old']
    del titprivado_perc['mtm_old']
    del titprivado_perc['mtm_DV100_N']
    del titprivado_perc['pv_DV100_old']
    del titprivado_perc['pv_old']
    del titprivado_perc['DV100_old']
    del titprivado_perc['dif_new']
    del titprivado_perc['dif_old']
    del titprivado_perc['dif_perc']

    writer.save()

    #    Alteração de formato das colunas que são int e foram lidas como float (sabe lá pq...)

    # id_mtm_titprivado
    titprivado_perc['id_mtm_titprivado'] = titprivado_perc[
        'id_mtm_titprivado'].astype(int)

    # id_bmf_numeraca
    aux = titprivado_perc[[
        'id_papel', 'id_bmf_numeraca'
    ]][titprivado_perc.id_bmf_numeraca.notnull()].copy()
    aux['id_bmf_numeraca'] = aux['id_bmf_numeraca'].astype(int)
    del titprivado_perc['id_bmf_numeraca']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'], how='left')

    # pagto_amortizacao
    aux = titprivado_perc[[
        'id_papel', 'indexador_dc_du'
    ]][titprivado_perc.indexador_dc_du.notnull()].copy()
    aux['indexador_dc_du'] = aux['indexador_dc_du'].astype(int)
    del titprivado_perc['indexador_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # juros_cada
    aux = titprivado_perc[['id_papel', 'juros_cada'
                           ]][titprivado_perc.juros_cada.notnull()].copy()
    aux['juros_cada'] = aux['juros_cada'].astype(int)
    del titprivado_perc['juros_cada']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'], how='left')

    # indexador_dc_du
    aux = titprivado_perc[[
        'id_papel', 'indexador_dc_du'
    ]][titprivado_perc.indexador_dc_du.notnull()].copy()
    aux['indexador_dc_du'] = aux['indexador_dc_du'].astype(int)
    del titprivado_perc['indexador_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # juros_dc_du
    aux = titprivado_perc[['id_papel', 'juros_dc_du'
                           ]][titprivado_perc.juros_dc_du.notnull()].copy()
    aux['juros_dc_du'] = aux['juros_dc_du'].astype(int)
    del titprivado_perc['juros_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # flag_inclusao
    titprivado_perc['flag_inclusao'] = titprivado_perc['flag_inclusao'].astype(
        int)

    # du_per
    titprivado_perc['du_per'] = titprivado_perc['du_per'].astype(int)

    # dc_per
    titprivado_perc['dc_per'] = titprivado_perc['dc_per'].astype(int)

    # dt_ref -> data_fim
    titprivado_perc['dt_ref'] = pd.to_datetime(titprivado_perc['dt_ref'])
    titprivado_perc['data_fim'] = np.where(
        titprivado_perc['indexador'] == 'DI1',
        titprivado_perc['dt_ref'] - pd.DateOffset(months=0, days=1),
        titprivado_perc['dt_ref'])

    titprivado_perc['id_papel'] = titprivado_perc['id_papel_old']

    titprivado_perc['data_mtm'] = titprivado_perc['data_referencia']
    titprivado_perc['data_negociacao'] = titprivado_perc['data_referencia']

    # Tabelas não necessárias - MTM
    del titprivado_perc['data_referencia']
    del titprivado_perc['id_papel_old']
    del titprivado_perc['indice_du_mtm']
    del titprivado_perc['indice_dc_mtm']
    del titprivado_perc['ano_dt_ref2']
    del titprivado_perc['mes_dt_ref2']
    del titprivado_perc['dia_dt_ref2']
    del titprivado_perc['vertices_positivo']
    del titprivado_perc['indice_dc_dt_ref2']
    del titprivado_perc['indice_du_dt_ref2']
    del titprivado_perc['prazo_dc']
    del titprivado_perc['ano_inicio']
    del titprivado_perc['mes_inicio']
    del titprivado_perc['dia_inicio']
    del titprivado_perc['indice_du_inicio']
    del titprivado_perc['indice_dc_inicio']
    del titprivado_perc['ano_fim']
    del titprivado_perc['mes_fim']
    del titprivado_perc['dia_fim']
    del titprivado_perc['indice_du_fim']
    del titprivado_perc['indice_dc_fim']
    del titprivado_perc['dt_ref']
    del titprivado_perc['dtoperacao_mtm']
    del titprivado_perc['dif']
    del titprivado_perc['pu_mercado']
    del titprivado_perc['pu_curva']
    del titprivado_perc['mtm_mercado']
    del titprivado_perc['mtm_curva']
    del titprivado_perc['pu_regra_xml']
    del titprivado_perc['mtm_regra_xml']
    del titprivado_perc['data_spread']
    del titprivado_perc['pu']
    del titprivado_perc['dif_curva']
    del titprivado_perc['pupar']
    del titprivado_perc['indice_du_fim_spread']
    del titprivado_perc['indice_du_inicio_spread']
    del titprivado_perc['prazo_du_spread']
    del titprivado_perc['mtm_spread']
    del titprivado_perc['pv_spread']
    del titprivado_perc['tx_spot_spread']
    del titprivado_perc['tx_spot_ano_spread']
    del titprivado_perc['fator_desconto_spread']

    # Tabelas não necessárias - XML
    del titprivado_perc['id_xml_debenture']
    del titprivado_perc['isin']
    del titprivado_perc['coddeb']
    del titprivado_perc['dtemissao']
    del titprivado_perc['dtoperacao']
    del titprivado_perc['dtvencimento']
    del titprivado_perc['cnpjemissor']
    del titprivado_perc['qtdisponivel']
    del titprivado_perc['qtgarantia']
    del titprivado_perc['pucompra']
    del titprivado_perc['puvencimento']
    del titprivado_perc['puposicao']
    del titprivado_perc['puemissao']
    del titprivado_perc['principal']
    del titprivado_perc['tributos']
    del titprivado_perc['valorfindisp']
    del titprivado_perc['valorfinemgar']
    del titprivado_perc['coupom']
    del titprivado_perc['percindex']
    del titprivado_perc['caracteristica']
    del titprivado_perc['percprovcred']
    del titprivado_perc['classeoperacao']
    del titprivado_perc['idinternoativo']
    del titprivado_perc['nivelrsc']
    del titprivado_perc['header_id']
    del titprivado_perc['cusip']
    del titprivado_perc['depgar']
    del titprivado_perc['debconv']
    del titprivado_perc['debpartlucro']
    del titprivado_perc['SPE']
    del titprivado_perc['dtretorno']
    del titprivado_perc['puretorno']
    del titprivado_perc['indexadorcomp']
    del titprivado_perc['perindexcomp']
    del titprivado_perc['txoperacao']
    del titprivado_perc['classecomp']

    # Remove as duplicatas de isin
    titprivado_perc = titprivado_perc.sort(
        ['codigo_isin', 'id_papel', 'data_fim'], ascending=[True, True, True])
    titprivado_perc = titprivado_perc.drop_duplicates(
        subset=['codigo_isin', 'data_fim'])

    # titprivado_perc['data_bd'] = horario_bd
    titprivado_perc['data_bd'] = datetime.datetime.today()

    titprivado_perc = titprivado_perc.where((pd.notnull(titprivado_perc)),
                                            None)

    titprivado_perc['flag1'] = titprivado_perc['flag'].str[0:2]
    del titprivado_perc['flag']
    titprivado_perc = titprivado_perc.rename(columns={'flag1': 'flag'})

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - mtm_renda_fixa")
    pd.io.sql.to_sql(titprivado_perc,
                     name='mtm_renda_fixa',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()

    logger.info("Preenchimento tabela xml")
    # 9 - Preenchimento tabela xml

    del original['id_xml_debenture']
    del original['pu_mercado']
    del original['mtm_mercado']
    del original['pu_curva']
    del original['mtm_curva']
    del original['pu_regra_xml']
    del original['mtm_regra_xml']
    del original['data_referencia']

    del titprivado['mtm']

    titprivado = titprivado.merge(finalizacao, on=['codigo_isin'], how='left')

    titprivado_xml = titprivado[titprivado.dt_ref ==
                                titprivado.data_referencia].copy()
    titprivado_xml = titprivado_xml.drop_duplicates(subset=['id_papel'],
                                                    take_last=True)
    titprivado_xml = titprivado_xml.rename(columns={'mtm': 'mtm_calculado'})

    anbima_deb = anbima_deb.rename(columns={'pu': 'pu_n'})

    titprivado_xml = titprivado_xml.merge(anbima_deb,
                                          on=['coddeb', 'data_spread'],
                                          how='left')
    titprivado_xml['pu'] = np.where(titprivado_xml['pu_n'].notnull(),
                                    titprivado_xml['pu_n'],
                                    titprivado_xml['mtm_calculado'])
    titprivado_xml['pu_mercado'] = np.where(
        titprivado_xml['caracteristica'] == 'N', titprivado_xml['pu'], 0)
    titprivado_xml['pu_curva'] = np.where(
        titprivado_xml['caracteristica'] == 'V', titprivado_xml['pupar'], 0)
    titprivado_xml = titprivado_xml[[
        'id_papel', 'pu_mercado', 'pu_curva', 'data_referencia'
    ]].copy()

    final = original.merge(titprivado_xml, on=['id_papel'], how='left')
    final['data_referencia'] = dt_base_rel
    final['pu_mercado'] = np.where(
        (final['pu_mercado'].isnull()) | (final['pu_mercado'] == 0),
        final['puposicao'], final['pu_mercado'])
    final['pu_mercado'] = np.where(final['dtretorno'].notnull(),
                                   final['puposicao'], final['pu_mercado'])
    final['mtm_mercado'] = final['pu_mercado'] * (final['qtdisponivel'] +
                                                  final['qtgarantia'])
    final['pu_curva'] = np.where(final['pu_curva'].isnull(),
                                 final['puposicao'], final['pu_curva'])
    final['pu_curva'] = np.where(final['dtretorno'].notnull(),
                                 final['puposicao'], final['pu_curva'])
    final['mtm_curva'] = final['pu_curva'] * (final['qtdisponivel'] +
                                              final['qtgarantia'])
    final['pu_regra_xml'] = np.where(final['caracteristica'] == 'N',
                                     final['pu_mercado'], final['pu_curva'])
    final['mtm_regra_xml'] = np.where(final['caracteristica'] == 'N',
                                      final['mtm_mercado'], final['mtm_curva'])
    final['data_bd'] = datetime.datetime.today()

    del final['dtrel']

    final['indexador'] = final['indexador'].str.replace('IGPM', 'IGP')
    final['indexador'] = final['indexador'].str.replace('IAP', 'IPC')
    final['indexador'] = final['indexador'].str.replace('SEM-ÍNDICE', 'PRE')
    final['indexador'] = final['indexador'].str.replace('ANB', 'DI1')
    final['indexador'] = final['indexador'].str.replace('ANBID', 'DI1')
    final['indexador'] = final['indexador'].str.replace('CDI', 'DI1')
    final['indexador'] = final['indexador'].str.replace('IPCA', 'IPC')

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - xml_debenture")
    pd.io.sql.to_sql(final,
                     name='xml_debenture',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()
Exemplo n.º 6
0
def upload_manual_cotas(query, columns, table):

    import os
    import pandas as pd
    import pymysql as db
    import datetime
    import numpy as np
    import logging

    from findt import FinDt
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Definindo os paths
    path_feriados = full_path_from_database(
        "feriados_nacionais") + "feriados_nacionais.csv"
    path_cotas = full_path_from_database("bloomberg_cotas")

    #Criação série diária
    logger.info("Tratando dados")

    #Seleciona o última dia do mês vigente
    mesfim = datetime.date.today().month
    fim = datetime.date(datetime.date.today().year, mesfim, 1) - pd.DateOffset(
        months=0, days=1)

    dt_ref = pd.date_range(start='01/01/1996', end=fim, freq='D').date
    ano = pd.date_range(start='01/01/1996', end=fim, freq='D').year
    mes = pd.date_range(start='01/01/1996', end=fim, freq='D').month
    dias = pd.date_range(start='01/01/1996', end=fim, freq='D').day
    serie_dias = pd.DataFrame(columns=['dt_ref', 'ano', 'mes', 'dia'])
    serie_dias['dt_ref'] = dt_ref
    serie_dias['ano'] = ano
    serie_dias['mes'] = mes
    serie_dias['dia'] = dias

    # Identificar se é dia útil
    dt_max = max(serie_dias['dt_ref'])
    dt_min = min(serie_dias['dt_ref'])
    per = FinDt.DatasFinanceiras(dt_min, dt_max, path_arquivo=path_feriados)

    du = pd.DataFrame(columns=['dt_ref'])
    du['dt_ref'] = per.dias(3)
    du['du_1'] = 1

    serie_dias = serie_dias.merge(du, on=['dt_ref'], how='left')
    serie_dias['du_1'] = serie_dias['du_1'].fillna(0)
    serie_dias['dc_1'] = 1

    # Calculo de dias corridos por mes
    serie_dias_group_count = serie_dias[['dt_ref', 'ano',
                                         'mes']].groupby(['ano', 'mes'
                                                          ]).agg(['count'])
    serie_dias_group_count = serie_dias_group_count.reset_index(level=None,
                                                                drop=False,
                                                                inplace=False,
                                                                col_level=0,
                                                                col_fill='')
    serie_dias_group_count_filter = pd.DataFrame(columns=['ano', 'mes', 'dc'])

    serie_dias_group_count_filter['ano'] = serie_dias_group_count['ano']
    serie_dias_group_count_filter['mes'] = serie_dias_group_count['mes']
    serie_dias_group_count_filter['dc'] = serie_dias_group_count['dt_ref']

    serie_dias = serie_dias.merge(serie_dias_group_count_filter,
                                  on=['ano', 'mes'],
                                  how='left')

    #calculo de dias uteis por mes
    serie_dias_group_sum = serie_dias[['du_1', 'ano',
                                       'mes']].groupby(['ano',
                                                        'mes']).agg(['sum'])
    serie_dias_group_sum = serie_dias_group_sum.reset_index(level=None,
                                                            drop=False,
                                                            inplace=False,
                                                            col_level=0,
                                                            col_fill='')
    serie_dias_group_sum_filter = pd.DataFrame(columns=['ano', 'mes', 'du'])

    serie_dias_group_sum_filter['ano'] = serie_dias_group_sum['ano']
    serie_dias_group_sum_filter['mes'] = serie_dias_group_sum['mes']
    serie_dias_group_sum_filter['du'] = serie_dias_group_sum['du_1']

    serie_dias = serie_dias.merge(serie_dias_group_sum_filter,
                                  on=['ano', 'mes'],
                                  how='left')

    #Criação da série de cotas

    lista_cotas = os.listdir(path_cotas)

    lista_cotas = [x for x in lista_cotas if "~" not in x]

    cotasdf = pd.DataFrame()

    for i in lista_cotas:
        leitura = pd.read_excel(path_cotas + '/' + i)
        leitura = leitura.rename(
            columns={
                'Date': 'dt_ref',
                'FUND_NET_ASSET_VAL': 'cota',
                'FUND_TOTAL_ASSETS': 'pl'
            })
        leitura['isin_fundo'] = i
        cotasdf = cotasdf.append(leitura)

    cotasdf['isin_fundo'] = cotasdf['isin_fundo'].str.split('.')
    cotasdf['isin_fundo'] = cotasdf['isin_fundo'].str[0]

    cotasdf['dt_ref'] = cotasdf['dt_ref'].astype(str)
    cotasdf['dt_ref'] = cotasdf['dt_ref'].str.split('-')
    cotasdf['ano'] = cotasdf['dt_ref'].str[0]
    cotasdf['mes'] = cotasdf['dt_ref'].str[1]
    cotasdf['dia'] = cotasdf['dt_ref'].str[2]
    cotasdf['dt_ref'] = pd.to_datetime(cotasdf['ano'] + cotasdf['mes'] +
                                       cotasdf['dia']).dt.date
    del cotasdf['ano']
    del cotasdf['mes']
    del cotasdf['dia']

    logger.info("Conectando no Banco de dados")

    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv')

    logger.info("Conexão com DB executada com sucesso")

    cnpj = pd.read_sql_query(query, connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    cnpj['cnpjfundo_outros'] = np.where(cnpj['cnpjfundo_outros'].isnull(),
                                        cnpj['cnpjfundo_1nivel'],
                                        cnpj['cnpjfundo_outros'])
    cnpj['cnpj'] = cnpj['cnpjfundo_outros']
    del cnpj['cnpjfundo_1nivel']
    del cnpj['cnpjfundo_outros']

    cnpj = cnpj.drop_duplicates()

    cotasdf = pd.merge(cotasdf,
                       cnpj,
                       left_on='isin_fundo',
                       right_on='isin',
                       how='left')
    del cotasdf['isin']

    cotasdf = cotasdf.rename(columns=columns)
    cotasdf['data_bd'] = datetime.datetime.today()

    logger.info("Salvando base de dados")
    pd.io.sql.to_sql(cotasdf,
                     name=table,
                     con=connection,
                     if_exists="append",
                     flavor='mysql',
                     index=0,
                     chunksize=5000)

    connection.close()
                           take_last=False)
cen1['indexador_shift'] = cen1['indexador_cod'].shift()
cen1['prazo_shift'] = cen1['prazo'].shift()
cen1['tx_spot_shift'] = cen1['tx_spot'].shift()
cen1['dif'] = np.where((cen1.indexador_cod == cen1.indexador_shift) &
                       (cen1.prazo == cen1.prazo_shift),
                       cen1.tx_spot - cen1.tx_spot_shift, 'NaN')
cen2 = cen1[cen1.dif != 'NaN']
#________________________________________________________________________________________________________
# GERACAO DE SERIE DE DIAS ÚTEIS E DIAS CORRIDOS
ano = start[0:4]
mes = start[5:7]
dia = start[8:10]
dt_inicio = dia + '-' + mes + '-' + ano
dt_max = max(tp_expo['dt_vencto'])
per = FinDt.DatasFinanceiras(dt_inicio, dt_max, path_arquivo=feriados_sheet)
du = pd.DataFrame(columns=['data_ref'])
dc = pd.DataFrame(columns=['data_ref'])
dc['data_ref'] = per.dias()
dc['flag_dc'] = 1
du['data_ref'] = per.dias(3)
du['flag_du'] = 1
serie_dias = pd.merge(dc,
                      du,
                      left_on=['data_ref'],
                      right_on=['data_ref'],
                      how='left')
serie_dias['flag_du'] = serie_dias['flag_du'].fillna(0)
serie_dias['indice_dc'] = np.cumsum(serie_dias['flag_dc'])
serie_dias['indice_du'] = np.cumsum(serie_dias['flag_du'])
del serie_dias['flag_du']