def relatorio_risco_mercado(): import pandas as pd import pymysql as db import logging import datetime from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import get_global_var from var.scripts.relatorio_encadeado.relatorio_risco_mercado.relatorio import relatorio #Define Variáveis iniciais dt_base = get_data_ultimo_dia_util_mes_anterior() dt_base = dt_base[0] + '-' + dt_base[1] + '-' + dt_base[2] dt_base = '2016-11-30' logger = logging.getLogger(__name__) cnpj_hdi = get_global_var("cnpj_hdi") #Conecta DB 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") #Busca lista dos fundos de primeiro nivel na carteira da HDI query = 'select * from projeto_inv.xml_header where cnpjcpf="' + cnpj_hdi + '" and dtposicao=' + '"' + dt_base + '";' df = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") if len(df) == 0: query = 'select * from projeto_inv.xml_header where cnpj="' + cnpj_hdi + '" and dtposicao=' + '"' + dt_base + '";' df = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") 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'] #Utiliza o header da carteira da HDI como chave para a query da lista header_id_carteira_fundos = df.get_value(0, 'header_id').astype(str) lista_query = 'SELECT cnpj from projeto_inv.lista_fundos where data_bd=(select max(data_bd) from projeto_inv.lista_fundos where header_id="' + header_id_carteira_fundos + '");' lista_cnpj = pd.read_sql(lista_query, con=connection) lista = lista_cnpj['cnpj'].tolist() horario_bd = datetime.datetime.today() for cnpj in lista: relatorio(dt_base, cnpj, horario_bd)
def tabelas_xml_final(): import pandas as pd import pymysql as db import numpy as np import datetime import logging 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() dt_base = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2])) # Diretório de save de planilhas save_path_verificacao_xmls = full_path_from_database( 'get_output_quadro419') + 'verificacao_xmls.xlsx' # Diretório de dependencias depend_path_caracteristica_contratos = full_path_from_database( 'excels') + 'caracteristica_contratos.xlsx' # ----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("Salvando base de dados") # Seleção última carga com a data da posicao xml_header = xml_header[xml_header.dtposicao == dt_base] xml_header = xml_header[xml_header.data_bd == max(xml_header.data_bd)] horario_bd = datetime.datetime.today() xml_header = xml_header[['header_id']].copy() xml_header['marker'] = 1 # ----Preenchimento RENDA VARIÁVEL # Informações XML query = 'SELECT * FROM projeto_inv.xml_acoes_org' xml_acoes = pd.read_sql(query, con=connection) logger.info("Salvando base de dados") # Seleção última carga xml_acoes = xml_acoes.merge(xml_header, on=['header_id']) xml_acoes = xml_acoes[xml_acoes.marker == 1].copy() xml_acoes = xml_acoes[xml_acoes.data_bd == max(xml_acoes.data_bd)] del xml_acoes['id_xml_acoes'] del xml_acoes['data_bd'] del xml_acoes['pu_regra_xml'] del xml_acoes['mtm_regra_xml'] del xml_acoes['data_referencia'] del xml_acoes['marker'] # --MTM Mercado query = 'SELECT * FROM projeto_inv.bovespa_cotahist' base_bovespa_virgem = pd.read_sql(query, con=connection) logger.info("Salvando base de dados") base_bovespa = base_bovespa_virgem[ base_bovespa_virgem.data_pregao <= dt_base] base_bovespa = base_bovespa.sort(['codigo_isin', 'data_pregao', 'data_bd'], ascending=[True, False, False]) base_bovespa = base_bovespa.drop_duplicates(subset=['codigo_isin'], take_last=False) base_bovespa = base_bovespa[['codigo_isin', 'preco_medio', 'data_pregao']] base_bovespa = base_bovespa.rename( columns={ 'codigo_isin': 'isin', 'preco_medio': 'pu_regra_xml', 'data_pregao': 'data_referencia' }) xml_acoes = xml_acoes.merge(base_bovespa, on=['isin'], how='left') xml_acoes['mtm_regra_xml'] = xml_acoes['pu_regra_xml'] * ( xml_acoes['qtdisponivel'] + xml_acoes['qtgarantia']) xml_acoes['data_bd'] = horario_bd # Carrega na base logger.info("Salvando base de dados - xml_acoes") pd.io.sql.to_sql(xml_acoes, name='xml_acoes', con=connection, if_exists="append", flavor='mysql', index=0) # ----Preenchimento Futuros # ----TABELA XML query = 'select * from projeto_inv.xml_futuros_org' xml_futuros = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") xml_futuros = xml_futuros.merge(xml_header, on=['header_id']) xml_futuros = xml_futuros[xml_futuros.marker == 1].copy() xml_futuros = xml_futuros[xml_futuros.data_bd == max(xml_futuros.data_bd)] del xml_futuros['id_xml_futuros'] del xml_futuros['pu_regra_xml'] del xml_futuros['mtm_regra_xml'] del xml_futuros['data_referencia'] del xml_futuros['marker'] # Criação da coluna ref xml_futuros['ref'] = xml_futuros['ativo'] + xml_futuros['serie'] # Retira coluna de data da carga del xml_futuros['data_bd'] # -----\TABELA BMF query = 'SELECT * FROM projeto_inv.bmf_ajustes_pregao' bmf_ajustes_pregao = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") bmf_ajustes_pregao = bmf_ajustes_pregao.sort( ['mercadoria', 'data_referencia', 'data_bd'], ascending=[True, True, True]) # Seleciona data de referência igual ou menor à do relatório bmf_ajustes_pregao = bmf_ajustes_pregao[ bmf_ajustes_pregao.data_referencia <= dt_base] # Seleciona a última data para cada contrato bmf_ajustes_pregao = bmf_ajustes_pregao.drop_duplicates( subset=['mercadoria', 'vencimento'], take_last=True) # Seleciona a coluna ref - XXX referencia à mercadoria bmf_ajustes_pregao['ref'] = bmf_ajustes_pregao['mercadoria'].str[0:3] # Retira coluna de data da carga del bmf_ajustes_pregao['data_bd'] # ----TABELA TAMANHO DO CONTRATO tamanho_contrato = pd.read_excel(depend_path_caracteristica_contratos, header=0, skiprows=1) logger.info("Arquivos lidos com sucesso") tamanho_contrato.columns = ['ref', 'moeda', 'tamanho'] tamanho_contrato['ref'] = tamanho_contrato['ref'].str.replace(' ', '') base_input = bmf_ajustes_pregao.merge(tamanho_contrato, on=['ref'], how='left') base_input = base_input.where(base_input.notnull(), None) base_input['ref'] = base_input['ref'] + base_input['vencimento'] # ----UNIÃO DAS TABELAS xml_futuros = xml_futuros.merge(base_input, on=['ref'], how='left') xml_futuros = xml_futuros.sort(['ref']) # Criação da coluna pu_mercado - NÃO CONSIDERA O TAMANHO DO CONTRATO xml_futuros = xml_futuros.rename( columns={'preco_ajuste_atual': 'pu_regra_xml'}) # Criação da coluna mtm_mercado xml_futuros['mtm_regra_xml'] = xml_futuros['pu_regra_xml'] * xml_futuros[ 'quantidade'] * xml_futuros['tamanho'] # Retira colunas não necessárias del xml_futuros['ref'] del xml_futuros['id_bmf_ajustes_pregao'] del xml_futuros['mercadoria'] del xml_futuros['vencimento'] del xml_futuros['preco_ajuste_anterior'] del xml_futuros['variacao'] del xml_futuros['valor_ajuste_por_contrato'] del xml_futuros['moeda'] del xml_futuros['tamanho'] # Cria coluna com a data da carga xml_futuros['data_bd'] = datetime.datetime.today() # Carrega na base logger.info("Salvando base de dados - xml_futuros") pd.io.sql.to_sql(xml_futuros, name='xml_futuros', con=connection, if_exists="append", flavor='mysql', index=0) # ----Preenchimento Cotas # ----TABELA XML query = 'SELECT * FROM projeto_inv.xml_cotas_org' xml_cotas = pd.read_sql(query, con=connection) logger.info("Salvando base de dados") xml_cotas = xml_cotas.merge(xml_header, on=['header_id']) xml_cotas = xml_cotas[xml_cotas.marker == 1].copy() xml_cotas = xml_cotas[xml_cotas.data_bd == max(xml_cotas.data_bd)] xml_cotas['data_referencia'] = dt_base del xml_cotas['id_xml_cotas'] del xml_cotas['pu_regra_xml'] del xml_cotas['data_bd'] # ----TABELA CVM_COTAS query = 'SELECT * FROM projeto_inv.cvm_cotas' cvm_cotas = pd.read_sql(query, con=connection) logger.info("Salvando base de dados") cvm_cotas = cvm_cotas.sort(['cnpj_fundo', 'dt_ref', 'data_bd'], ascending=[True, True, False]) cvm_cotas = cvm_cotas.drop_duplicates(['cnpj_fundo', 'dt_ref'], take_last=False) # ----TABELA FIDCs query = 'SELECT * FROM projeto_inv.fidc_cotas' fidc_cotas = pd.read_sql(query, con=connection) logger.info("Salvando base de dados") fidc_cotas = fidc_cotas.sort(['codigo_isin', 'dt_ref', 'data_bd'], ascending=[True, True, False]) fidc_cotas = fidc_cotas.drop_duplicates(['codigo_isin', 'dt_ref'], take_last=False) # ----Preenchimento com as informações - CVM_COTAS # Seleção das colunas necessárias cvm_cotas = cvm_cotas[['cnpj_fundo', 'dt_ref', 'quota']].copy() # Renomeação da chave cnpj_fundos cvm_cotas = cvm_cotas.rename(columns={ 'cnpj_fundo': 'cnpjfundo', 'dt_ref': 'data_referencia' }) # União xml_cotas = xml_cotas.merge(cvm_cotas, on=['cnpjfundo', 'data_referencia'], how='left') # ----Preenchimento com as informações - CVM_FIDC # Seleção das colunas necessárias fidc_cotas = fidc_cotas[['codigo_isin', 'dt_ref', 'cota']].copy() # Renomeação da chave cnpj_fundos fidc_cotas = fidc_cotas.rename(columns={ 'codigo_isin': 'isin', 'dt_ref': 'data_referencia' }) # União xml_cotas = xml_cotas.merge(fidc_cotas, on=['isin', 'data_referencia'], how='left') # ----PREENCHIMENTO XML # Preenchimento do PU xml_cotas['pu_regra_xml'] = np.where(xml_cotas['quota'].notnull(), xml_cotas['quota'], xml_cotas['cota']) xml_cotas['pu_regra_xml'] = np.where(xml_cotas['pu_regra_xml'].isnull(), xml_cotas['puposicao'], xml_cotas['pu_regra_xml']) # Cálculo do MTM xml_cotas['mtm_regra_xml'] = xml_cotas['pu_regra_xml'] * ( xml_cotas['qtdisponivel'] + xml_cotas['qtgarantia']) # ----Carregamento na base xml_cotas['data_bd'] = horario_bd del xml_cotas['marker'] del xml_cotas['cota'] del xml_cotas['quota'] logger.info("Salvando base de dados - xml_cotas") pd.io.sql.to_sql(xml_cotas, name='xml_cotas', con=connection, if_exists="append", flavor='mysql', index=0) # ----Outras tabelas lista = [ 'outrasdespesas', 'caixa', 'corretagem', 'despesas', 'partplanprev', 'provisao', 'ima_geral', 'ima_imab', 'ima_imac', 'ima_imas', 'ima_irfm', 'opcoesacoes', 'opcoesderiv', 'opcoesflx', 'swap', 'termorv', 'termorf', 'header' ] horario_bd = datetime.datetime.today() for i in range(len(lista)): query = 'select * from projeto_inv.xml_' + lista[i] + '_org' tabela = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") if (len(tabela) != 0): print('xml_' + lista[i]) tabela = tabela.merge(xml_header, on=['header_id']) tabela = tabela[tabela.marker == 1].copy() if 'pu_regra_xml' in tabela.columns: tabela['pu_regra_xml'] = tabela['puposicao'] if 'mtm_regra_xml' in tabela.columns: tabela['mtm_regra_xml'] = tabela['puposicao'] if 'mtm_ativo_regra_xml' in tabela.columns: tabela['mtm_ativo_regra_xml'] = tabela['vlmercadoativo'] if 'mtm_passivo_regra_xml' in tabela.columns: tabela['mtm_passivo_regra_xml'] = tabela['vlmercadopassivo'] if ('data_referencia' in tabela.columns) & (len(tabela) != 0): tabela['data_referencia'] = dt_base tabela['data_bd'] = horario_bd id_xml = 'id_xml_' + lista[i] if id_xml in tabela.columns: del tabela[id_xml] del tabela['marker'] logger.info("Salvando base de dados") pd.io.sql.to_sql(tabela, name='xml_' + lista[i], con=connection, if_exists="append", flavor='mysql', index=0) writer = ExcelWriter(save_path_verificacao_xmls) lista = [ 'outrasdespesas', 'caixa', 'corretagem', 'despesas', 'partplanprev', 'provisao', 'ima_geral', 'ima_imab', 'ima_imac', 'ima_imas', 'ima_irfm', 'opcoesacoes', 'opcoesderiv', 'opcoesflx', 'swap', 'termorv', 'termorf', 'header', 'debenture', 'titpublico', 'titprivado', 'acoes', 'cotas', 'futuros' ] for i in range(len(lista)): query = 'select * from projeto_inv.xml_' + lista[i] tabela = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") if len(tabela) != 0: tabela = tabela[tabela.data_bd == max(tabela.data_bd)].copy() tabela.to_excel(writer, lista[i]) writer.save() logger.info("Arquivos salvos com sucesso") #Fecha conexão connection.close()
def resumo_var(): import pandas as pd import pymysql as db import openpyxl import logging from openpyxl.styles import Font, Color, Border, Side, PatternFill, Alignment from dependencias.Metodos.funcoes_auxiliares import full_path_from_database from dependencias.Metodos.funcoes_auxiliares import get_global_var from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior global header_id_carteira global header_id_carteira_fundos global header_nome global cnpj_fundo global id_relatorio_qo logger = logging.getLogger(__name__) end = full_path_from_database("get_output_var")+'Relatorios/' cnpj_hdi=get_global_var("cnpj_hdi") dt_base = get_data_ultimo_dia_util_mes_anterior() dt_base = dt_base[0]+'-'+dt_base[1]+'-'+dt_base[2] #dt_base = '2016-11-30' 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") tabela_resumo_var = pd.DataFrame(columns=['cnpj','nome','pl','var_normal','var_estressado','perc_var_norm','perc_var_stress']) tabela_resumo_credito = pd.DataFrame(columns=['cnpj','nome','pl','pl_cred','perc_esp','rtg_medio']) #Gera lista dos CNPJs na carteira HDI #Busca lista dos fundos de primeiro nivel na carteira da HDI query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";' df=pd.read_sql(query, con=connection) if len(df)==0: query='select * from projeto_inv.xml_header where cnpj="' + cnpj_hdi +'" 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_fundos=df.get_value(0,'header_id').astype(str) #Utiliza o header da carteira da HDI como chave para a query da lista lista_query='SELECT cnpj from projeto_inv.lista_fundos where data_bd=(select max(data_bd) from projeto_inv.lista_fundos where header_id="'+header_id_carteira_fundos+'");' lista_cnpj=pd.read_sql(lista_query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") lista=lista_cnpj['cnpj'].tolist() lista_query_fidc='SELECT * from projeto_inv.lista_fidc where data_bd=(select max(data_bd) from projeto_inv.lista_fidc where header_id="'+header_id_carteira_fundos+'");' lista_fidc=pd.read_sql(lista_query_fidc, con=connection) logger.info("Leitura do banco de dados executada com sucesso") lista_fidc=lista_fidc['cnpj'].tolist() for cnpj in lista: #Busca do id_relatorio_quaid419 query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj +'" and dtposicao='+'"'+dt_base+'";' df=pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") if len(df) == 0: query = 'select * from projeto_inv.xml_header where cnpj="' + cnpj +'" and dtposicao='+'"'+dt_base+'";' df = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") 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) header_nome=df.get_value(0,'nome') cnpj_fundo=cnpj #quadro de operaçoes 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;' qo=pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") id_relatorio_qo=str(qo['id_relatorio_qo'][0]) if cnpj==cnpj_hdi: id_relatorio_qo_hdi=id_relatorio_qo # id_relatorio_qo = "50" query='select a.* from projeto_inv.quaid_419 a right join (select id_relatorio_qo, tipo_relatorio, max(data_bd) as data_bd from projeto_inv.quaid_419 where id_relatorio_qo='+id_relatorio_qo+' and tipo_relatorio="G" group by 1,2) b on a.id_relatorio_qo=b.id_relatorio_qo and a.tipo_relatorio=b.tipo_relatorio and a.data_bd=b.data_bd;' quaid_419=pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") quaid_419=quaid_419[quaid_419.EMFMULTIPLOFATOR==0] #Se tem linha duplicada, mais de um fator de risco, pega apenas a referente ao indexador principal id_quaid_419_df=quaid_419[['id_relatorio_quaid419']] id_relatorio_quaid419=id_quaid_419_df.get_value(0,'id_relatorio_quaid419').astype(str) #print(cnpj,id_relatorio_qo,id_relatorio_quaid419) #Patrimônio líquido #Informações de PL pl_qo=qo[qo.produto!='Futuro'] pl_info=sum(pl_qo['mtm_info']) #Risco de Mercado - VaR query='select a.* from projeto_inv.var a right join (select id_relatorio_quaid419, tipo_var, vertice, tipo_alocacao, tipo_segmento, norm_stress, max(data_bd) as data_bd from projeto_inv.var where id_relatorio_quaid419='+str(id_relatorio_quaid419)+' and tipo_var="Total" and vertice="Total" and tipo_alocacao="Total" and tipo_segmento="Total" and norm_stress = "normal" group by 1,2,3,4,5,6) b on a.id_relatorio_quaid419=b.id_relatorio_quaid419 and a.tipo_var=b.tipo_var and a.tipo_alocacao=b.tipo_alocacao and a.tipo_segmento=b.tipo_segmento and a.norm_stress = b.norm_stress and a.data_bd=b.data_bd; ' resumo_var_normal=pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") resumo_var_normal = resumo_var_normal[['id_relatorio_quaid419','var']].copy() resumo_var_normal = resumo_var_normal.rename(columns={'var':'var_normal'}) query='select a.* from projeto_inv.var a right join (select id_relatorio_quaid419, tipo_var, vertice, tipo_alocacao, tipo_segmento, norm_stress, max(data_bd) as data_bd from projeto_inv.var where id_relatorio_quaid419='+str(id_relatorio_quaid419)+' and tipo_var="Total" and vertice="Total" and tipo_alocacao="Total" and tipo_segmento="Total" and norm_stress = "estressado" group by 1,2,3,4,5,6) b on a.id_relatorio_quaid419=b.id_relatorio_quaid419 and a.tipo_var=b.tipo_var and a.tipo_alocacao=b.tipo_alocacao and a.tipo_segmento=b.tipo_segmento and a.norm_stress = b.norm_stress and a.data_bd=b.data_bd; ' resumo_var_estressado=pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") resumo_var_estressado = resumo_var_estressado[['id_relatorio_quaid419','var']].copy() resumo_var_estressado = resumo_var_estressado.rename(columns={'var':'var_estressado'}) resumo_var = pd.merge(resumo_var_normal,resumo_var_estressado,left_on=['id_relatorio_quaid419'],right_on=['id_relatorio_quaid419'],how='left') resumo_var['cnpj'] = cnpj resumo_var['nome'] = header_nome resumo_var['pl'] = pl_info resumo_var['perc_var_norm'] = resumo_var['var_normal']/pl_info resumo_var['perc_var_stress'] = resumo_var['var_estressado']/pl_info del resumo_var['id_relatorio_quaid419'] #Risco de Crédito - Percentual de perda esperada e rating médio da carteira query='select a.* from projeto_inv.resumo_credito a right join (select cnpj, max(data_bd) as data_bd from projeto_inv.resumo_credito where cnpj='+cnpj+' group by 1) b on a.cnpj = b.cnpj and a.data_bd=b.data_bd; ' resumo_credito=pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") #União das tabelas tabela_resumo_var = tabela_resumo_var.append(resumo_var) if len(resumo_credito)>0: resumo_credito['pl'] = pl_info tabela_resumo_credito = tabela_resumo_credito.append(resumo_credito) #FIDCS e FIP #Cria dataframe com a exposicao dos FIDCs (busca a informação no quadro consolidado) tabela_fidc=pd.DataFrame() for cnpj in lista_fidc: quadro_fidc=pd.read_sql('select mtm_info, cnpjfundo_1nivel, fundo, isin from projeto_inv.xml_quadro_operacoes where data_bd=(select max(data_bd) from projeto_inv.xml_quadro_operacoes where header_id="'+header_id_carteira_fundos+'") and cnpjfundo_1nivel="'+cnpj+'" and header_id="'+header_id_carteira_fundos+'";', con=connection) logger.info("Leitura do banco de dados executada com sucesso") tabela_fidc=tabela_fidc.append(quadro_fidc) lista_isin=tabela_fidc['isin'].tolist() #Extrai o valor do id do quadro 419 da HDI id_quadro419=pd.read_sql('SELECT id_relatorio_quaid419 FROM projeto_inv.quaid_419 where data_bd=(select max(data_bd) from projeto_inv.quaid_419 where id_relatorio_qo="'+id_relatorio_qo_hdi+'" and tipo_relatorio="G") and id_relatorio_qo="'+id_relatorio_qo_hdi+'";', con=connection) id_quadro419=id_quadro419.get_value(0,'id_relatorio_quaid419').astype(str) #Extrai os valores de VaR de cada um dos ISINs presentes na lista_isin var_fidc=pd.DataFrame() for isin in lista_isin: var_fidc_bd=pd.read_sql('SELECT var, vertice from projeto_inv.var where data_bd=(select max(data_bd) from projeto_inv.var where id_relatorio_quaid419="'+id_quadro419+'" and norm_stress="normal") and vertice="'+isin+'" and id_relatorio_quaid419="'+id_quadro419+'" and tipo_var="Marginal" and tipo_alocacao="Total" and tipo_segmento="Total" and norm_stress="normal";', con=connection) logger.info("Leitura do banco de dados executada com sucesso") var_fidc=var_fidc.append(var_fidc_bd) #Fecha conexão connection.close() var_fidc=pd.merge(var_fidc, tabela_fidc, left_on=['vertice'], right_on=['isin'], how='inner') var_fidc['var']=var_fidc['var']*var_fidc['mtm_info'] var_fidc['VaR Estressado (R$)']=var_fidc['var']*1.14566452 var_fidc['VaR (%PL)']=var_fidc['var']/var_fidc['mtm_info'] var_fidc['VaR Estressado (%PL)']=var_fidc['VaR Estressado (R$)']/var_fidc['mtm_info'] var_fidc=var_fidc.rename(columns={'var':'VaR (R$)', 'mtm_info':'Patrimônio Líquido (R$)', 'fundo':'Nome do Fundo', 'cnpjfundo_1nivel':'CNPJ'}) var_fidc=var_fidc[['CNPJ', 'Nome do Fundo', 'Patrimônio Líquido (R$)', 'VaR (R$)', 'VaR Estressado (R$)', 'VaR (%PL)', 'VaR Estressado (%PL)']].copy() #Geração do relatorio writer = pd.ExcelWriter(end+'relatorio_risco_resumo_'+dt_base+'.xlsx', engine='xlsxwriter') workbook = writer.book numero_float = workbook.add_format({'num_format': '#,##0', 'bold': False}) percent = workbook.add_format({'num_format': '0.0000%', 'bold': False}) percent1 = workbook.add_format({'num_format': '0%', 'bold': False}) #VaR var = pd.DataFrame(columns=['CNPJ','Nome do Fundo','Patromônio Líquido (R$)','VaR (R$)','VaR Estressado (R$)','VaR (%PL)','VaR Estressado (%PL)']) var['CNPJ'] = tabela_resumo_var['cnpj'] var['Nome do Fundo'] = tabela_resumo_var['nome'] var['Patromônio Líquido (R$)'] = tabela_resumo_var['pl'] var['VaR (R$)'] = tabela_resumo_var['var_normal'] var['VaR Estressado (R$)'] = tabela_resumo_var['var_estressado'] var['VaR (%PL)'] = tabela_resumo_var['var_normal']/tabela_resumo_var['pl'] var['VaR Estressado (%PL)'] = tabela_resumo_var['var_estressado']/tabela_resumo_var['pl'] tabela_pl = tabela_resumo_var[['cnpj','pl']].copy() var.to_excel(writer,index=False, sheet_name='Resumo VaR', startrow =3, startcol=1) logger.info("Arquivo salvo com sucesso") tamanho=len(var) var_fidc.to_excel(writer,index=False, sheet_name='Resumo VaR', startrow =(7+tamanho), startcol=1) logger.info("Arquivo salvo com sucesso") worksheet = writer.sheets['Resumo VaR'] worksheet.set_column('D:D', 12, numero_float) worksheet.set_column('E:E', 12, numero_float) worksheet.set_column('F:F', 12, numero_float) worksheet.set_column('G:G', 12, percent) worksheet.set_column('H:H', 12, percent) #Credito credito = pd.DataFrame(columns=['CNPJ','Nome do Fundo','Patromônio Líquido Crédito (R$)','Perda Esperada (R$)','Perda Esperada (%PL - Crédito)','Rating Médio do Fundo']) credito['CNPJ'] = tabela_resumo_credito['cnpj'] credito['Nome do Fundo'] = tabela_resumo_credito['nome'] credito['Patromônio Líquido Crédito (R$)'] = tabela_resumo_credito['pl_cred'] credito['Perda Esperada (R$)'] = tabela_resumo_credito['pl']*tabela_resumo_credito['perc_esp'] credito['Perda Esperada (%PL - Crédito)'] = tabela_resumo_credito['pl']*tabela_resumo_credito['perc_esp']/tabela_resumo_credito['pl_cred'] credito['Rating Médio do Fundo'] = tabela_resumo_credito['rtg_medio'] credito.to_excel(writer,index=False, sheet_name='Resumo Crédito', startrow =3, startcol=1) logger.info("Arquivo salvo com sucesso") worksheet = writer.sheets['Resumo Crédito'] worksheet.set_column('D5:E30', 12, numero_float) worksheet.set_column('F5:F30', 12, percent1) writer.save() #Formatação resumo wb = openpyxl.load_workbook(end+'relatorio_risco_resumo_'+dt_base+'.xlsx') #####FORMATOS #Fonte fontObj1=Font(name='Calibri', bold=True, size =24,color='404040') fontObj2=Font(name='Calibri', bold=False, size =11,color='404040') #Borda borderObj1=Border(bottom=Side(border_style='double'),top=Side(border_style='thin')) borderObj2=Border() #Cor colorObj1=PatternFill(patternType='solid', fgColor=Color('FFE600')) #Alinhamento alinObj1=Alignment(vertical='center',horizontal='center') alinObj2=Alignment(vertical='center',horizontal='left') alinObj3=Alignment(vertical='center',horizontal='right') sheet1=wb.get_sheet_by_name('Resumo VaR') #Retira as gridlines sheet1.sheet_view.showGridLines = False #Formatação tamanho das linhas sheet1.row_dimensions[1].height = 90 #Formata cor da fonte de todas as células for row in sheet1.range('B2:H50'): for cell in row: cell.font=fontObj2 #Formata o título sheet1.merge_cells('B2:H2') sheet1['B2']='Resumo VaR' sheet1['B2'].font=fontObj1 sheet1['B2'].alignment=alinObj2 sheet1.merge_cells('B'+str(6+tamanho)+':H'+str(6+tamanho))#Tabela FIDC sheet1['B'+str(6+tamanho)]='Resumo VaR FIDCs' sheet1['B'+str(6+tamanho)].font=fontObj1 sheet1['B'+str(6+tamanho)].alignment=alinObj2 for row in sheet1.range('B2:H2'): for cell in row: cell.border=borderObj1 for row in sheet1.range('B'+str(6+tamanho)+':H'+str(6+tamanho)):#Tabela FIDC for cell in row: cell.border=borderObj1 #Formata os headers da tabela for row in sheet1.range('B4:H4'): for cell in row: cell.fill=colorObj1 cell.border=borderObj2 for row in sheet1.range('B'+str(8+tamanho)+':H'+str(8+tamanho)):#Tabela FIDC for cell in row: cell.fill=colorObj1 cell.border=borderObj2 #Formatação tamanho das colunas sheet1.column_dimensions['A'].width = 2 sheet1.column_dimensions['B'].width = 20 sheet1.column_dimensions['C'].width = 70 sheet1.column_dimensions['D'].width = 30 sheet1.column_dimensions['E'].width = 20 sheet1.column_dimensions['F'].width = 30 sheet1.column_dimensions['G'].width = 25 sheet1.column_dimensions['H'].width = 25 ##CRÉDTIO sheet1=wb.get_sheet_by_name('Resumo Crédito') #Retira as gridlines sheet1.sheet_view.showGridLines = False #Formatação tamanho das linhas sheet1.row_dimensions[1].height = 90 #Formata cor da fonte de todas as células for row in sheet1.range('B2:G30'): for cell in row: cell.font=fontObj2 #Formata o título sheet1.merge_cells('B2:G2') sheet1['B2']='Resumo Crédito' sheet1['B2'].font=fontObj1 sheet1['B2'].alignment=alinObj2 for row in sheet1.range('B2:G2'): for cell in row: cell.border=borderObj1 #Formata os headers da tabela for row in sheet1.range('B4:G4'): for cell in row: cell.fill=colorObj1 cell.border=borderObj2 #Formatação tamanho das colunas sheet1.column_dimensions['A'].width = 2 sheet1.column_dimensions['B'].width = 20 sheet1.column_dimensions['C'].width = 70 sheet1.column_dimensions['D'].width = 30 sheet1.column_dimensions['E'].width = 20 sheet1.column_dimensions['F'].width = 30 sheet1.column_dimensions['G'].width = 25 wb.save(end+dt_base+' relatorio_resumo.xlsx')
def xml_parser(): import pandas as pd import xmltodict import glob import pymysql as db import numpy as np import datetime#,time import logging from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import full_path_from_database from quadro90.scripts.xml_parser.dic_tabela import dic_tabela logger = logging.getLogger(__name__) # Retorna um array (ano, mes e dia) referente ao útimo dia útil do mês anterior configurado no banco de dados array_data = get_data_ultimo_dia_util_mes_anterior() #Diretório com os arquivos do cliente: full_path = full_path_from_database("xml_dir") xml_dir = full_path+'ano_'+array_data[0]+'/'+'XML_'+str(array_data[0])+str(array_data[1])+str(array_data[2]) #xml_dir = full_path_from_database("xml_dir") # Diretório de saída dos arquivos: output_path = full_path_from_database("get_output_quadro90") 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") logger.info("Tratando dados") # Função para transformar os dados para forma tabular query= 'select max(header_id) as header_id from projeto_inv.xml_header_org'; logger.info("Lendo DB") qtde=pd.read_sql(query, con=connection) if qtde['header_id'][0]==None: n_header_id=0 else: n_header_id=qtde.get_value(0,'header_id')+1 lista_tabelas=[ 'header', 'partplanprev', 'titpublico', 'titprivado', 'debenture', 'acoes', 'opcoesacoes', 'opcoesderiv', 'opcoesflx', 'termorv', 'termorf', 'futuros', 'swap', 'caixa', 'cotas', 'despesas', 'outrasdespesas', 'provisao', 'corretagem'] ## Criação das tabelas for x in lista_tabelas: globals()['tabela_%s' % x] = pd.DataFrame() #cria tabelas usando como nome tabela_+"string de lista_tabelas" ## Leitura XML horario_bd = datetime.datetime.now() horario_bd = horario_bd.strftime("%Y-%m-%d %H:%M:%S") lista_arquivos= glob.glob(xml_dir + '/*.*') for arquivo in lista_arquivos: xml=open(arquivo, "r") original_doc= xml.read() xmlFundo=xmltodict.parse(original_doc) #Encontra índice para separar o nome do arquivo start_string=arquivo.index('XML_'+str(array_data[0])+str(array_data[1])+str(array_data[2])) logger.info("Lendo XML "+arquivo[(start_string+13):]) header_id=len(tabela_header) try: endereco=xmlFundo['arquivoposicao_4_01']['fundo'] except: endereco=xmlFundo['arquivoposicao_4_01']['carteira'] for item in endereco: for x in range(len(lista_tabelas)):#utiliza range para x ser indice da lista, tornando o uso do if possivel if item == lista_tabelas[x]: y=x x=lista_tabelas[x]#x recebe a string em lista tabelas, para acessar os dataframes com os nomes contidos em lista tabelas globals()['tabela_%s' % x]=dic_tabela(endereco, lista_tabelas[y], globals()['tabela_%s' % x], header_id) #Trara os NaN for y in range(len(lista_tabelas)): x=lista_tabelas[y] globals()['tabela_%s' % x] = globals()['tabela_%s' % x].replace('', np.nan) globals()['tabela_%s' % x] = globals()['tabela_%s' % x].where((pd.notnull(globals()['tabela_%s' % x])), None) #Data do relatório dt_base = globals()['tabela_%s' % 'header']['dtposicao'] dt_base = dt_base.drop_duplicates() dt_base = dt_base.iloc[0] dt_base_str = str(dt_base).replace('-','') for y in range(len(lista_tabelas)): x=lista_tabelas[y] if len(globals()['tabela_%s' % x])!=0: #print(x,'###',globals()['tabela_%s' % x].columns) globals()['tabela_%s' % x].loc[len(x),'data_bd'] = None globals()['tabela_%s' % x]['data_bd'] = globals()['tabela_%s' % x]['data_bd'].fillna(horario_bd) try: globals()['tabela_%s' % x]['header_id'] = globals()['tabela_%s' % x]['header_id']+n_header_id globals()['tabela_%s' % x]['header_id'] = globals()['tabela_%s' % x]['header_id'].astype(int) except: pass #print(x) if ((x=='titpublico')|(x=='titprivado')|(x=='debenture')): try: globals()['tabela_%s' % x]['header_id_aux'] = globals()['tabela_%s' % x]['header_id'].astype(str) globals()['tabela_%s' % x]['index_col'] = globals()['tabela_%s' % x].index.values globals()['tabela_%s' % x]['index_col'] = globals()['tabela_%s' % x]['index_col'].astype(str) globals()['tabela_%s' % x]['id_papel'] = dt_base_str +'_'+globals()['tabela_%s' % x]['index_col']+'_'+globals()['tabela_%s' % x]['header_id_aux'] del globals()['tabela_%s' % x]['index_col'] del globals()['tabela_%s' % x]['header_id_aux'] except: pass #print(x) logger.info("Corrigindo tabela Título Privado") col='titprivado' if len(globals()['tabela_%s' % col]) != 0: aux = globals()['tabela_%s' % col][['id_papel', 'isin']][ globals()['tabela_%s' % col]['isin'].isin(['************', 'BR**********'])].copy() aux['idx'] = np.linspace(0, len(aux) - 1, len(aux)) aux['idx'] = aux['idx'].astype(int) aux['idx'] = aux['idx'].astype(str) aux['isin_novo'] = 'TIT000_BR' + aux['idx'] aux['isin_novo'] = aux['isin_novo'].str.zfill(13) aux['isin_novo'] = aux['isin_novo'].str.split('_') aux['isin_novo'] = aux['isin_novo'].str[1] + aux['isin_novo'].str[0] del aux['isin'] del aux['idx'] globals()['tabela_%s' % col] = globals()['tabela_%s' % col].merge(aux, on=['id_papel'], how='left') globals()['tabela_%s' % col]['isin'] = np.where(globals()['tabela_%s' % col]['isin_novo'].notnull(), globals()['tabela_%s' % col]['isin_novo'], globals()['tabela_%s' % col]['isin']) del globals()['tabela_%s' % col]['isin_novo'] logger.info("Corrigindo tabela debenture") col = 'debenture' if len(globals()['tabela_%s' % col]) != 0: aux = globals()['tabela_%s' % col][['id_papel', 'isin']][globals()['tabela_%s' % col]['isin'].isin(['************', 'BR**********'])].copy() aux['idx'] = np.linspace(0, len(aux) - 1, len(aux)) aux['idx'] = aux['idx'].astype(int) aux['idx'] = aux['idx'].astype(str) aux['isin_novo'] = 'TIT000_BR' + aux['idx'] aux['isin_novo'] = aux['isin_novo'].str.zfill(13) aux['isin_novo'] = aux['isin_novo'].str.split('_') aux['isin_novo'] = aux['isin_novo'].str[1] + aux['isin_novo'].str[0] del aux['isin'] del aux['idx'] globals()['tabela_%s' % col] = globals()['tabela_%s' % col].merge(aux, on=['id_papel'], how='left') globals()['tabela_%s' % col]['isin'] = np.where(globals()['tabela_%s' % col]['isin_novo'].notnull(),globals()['tabela_%s' % col]['isin_novo'],globals()['tabela_%s' % col]['isin']) del globals()['tabela_%s' % col]['isin_novo'] x = 'header' globals()['tabela_%s' % x]['cnpj'] = globals()['tabela_%s' % x]['cnpj'].fillna(0) globals()['tabela_%s' % x]['cnpj'] = globals()['tabela_%s' % x]['cnpj'].astype(str) globals()['tabela_%s' % x]['cnpj'] = globals()['tabela_%s' % x]['cnpj'].str.zfill(14) logger.info("Salvando fundos") globals()['tabela_%s' % x][['cnpj','nome']].to_excel(output_path+'fundos.xlsx') for y in range(len(lista_tabelas)): x = lista_tabelas[y] globals()['tabela_%s' % x].to_excel(output_path+'tabela_'+lista_tabelas[y]+'_'+dt_base_str+'.xlsx', encoding='utf-8', index=True, index_label="id") logger.info("Salvando tabela " + x + " no banco de dados") pd.io.sql.to_sql(globals()['tabela_%s' % x], name='xml_'+lista_tabelas[y]+'_org', con=connection,if_exists="append", flavor='mysql', index=0) logger.info("Base de dados salva com sucesso") connection.close()
def bmf_numeraca_ajustes_cadastro(): import pandas as pd import datetime import pymysql as db import logging 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__) # Diretório de dependencias depend_path_carat = full_path_from_database('excels') + 'caracteristicas.xlsx' depend_path_bullet_B0 = full_path_from_database('excels') + 'bullet_12meses.xlsx' depend_path_bullet_B1 = full_path_from_database('excels') + '12meses_bullet.xlsx' # Diretório de save de planilhas xlsx_path = full_path_from_database('get_output_quadro419') + 'controle_titprivado.xlsx' # 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'] dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2] manual = pd.read_excel(depend_path_carat) logger.info("Arquivos lidos com sucesso") horario_bd = datetime.datetime.now() writer = ExcelWriter(xlsx_path) #Leitura e tratamento das tabelas # ----Leitura da base numeraca 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 t.* FROM (SELECT codigo_isin, MAX(data_bd) AS max_data FROM bmf_numeraca GROUP BY codigo_isin ) AS m INNER JOIN bmf_numeraca AS t ON t.codigo_isin = m.codigo_isin AND t.data_bd = m.max_data' titprivado_bmf = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") # ----Tratamento da tabela bmf logger.info("Tratando dados") # Criação do flag 'O' - existe na numeraca titprivado_bmf['flag'] = 'O' # Remove duplicatas titprivado_bmf = titprivado_bmf.sort(['codigo_isin', 'data_bd'], ascending=[True, True]) titprivado_bmf = titprivado_bmf.drop_duplicates(subset=['codigo_isin'], take_last=True) # Deleta colunas não necessárias del titprivado_bmf['data_bd'] # ----Leitura da tabela xml query = 'SELECT * FROM projeto_inv.xml_titprivado_org ' titprivado_xml = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") # Seleciona última carga com dtposicao = data_base titprivado_xml['dtrel'] = titprivado_xml['id_papel'].str.split('_') titprivado_xml['dtrel'] = titprivado_xml['dtrel'].str[0] titprivado_xml = titprivado_xml[titprivado_xml.dtrel == dtbase_concat].copy() titprivado_xml = titprivado_xml[titprivado_xml.data_bd == max(titprivado_xml.data_bd)] query = 'SELECT * FROM projeto_inv.xml_header_org ' header_xml = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") # Seleciona última carga com dtposicao = data_base header_xml = header_xml[ header_xml.dtposicao == datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))].copy() header_xml = header_xml[header_xml.data_bd == max(header_xml.data_bd)] # ----Tratamento da tabela xml # Renomeação de colunas titprivado_xml = titprivado_xml.rename(columns={'isin': 'codigo_isin', 'indexador': 'indexador_xml'}) # Seleção das colunas necessárias titprivado_xml = titprivado_xml[['codigo_isin', 'codativo', 'dtemissao', 'dtoperacao', 'dtvencimento', 'puemissao', 'coupom', 'indexador_xml', 'percindex', 'id_papel']] # ----Criação da tabela xml + numeraca # Constrói base xml+numeraca titprivado = pd.merge(titprivado_xml, titprivado_bmf, left_on=['codigo_isin'], right_on=['codigo_isin'], how='left') # Cria a coluna com a data da carga titprivado['data_bd'] = horario_bd # Arruma os NaN titprivado = titprivado.where((pd.notnull(titprivado)), None) # Seleciona e salva na bd as características não alteradas titprivado_original_bmf = titprivado[titprivado.flag.notnull()].copy() # Reseta o indice do data_frame titprivado = titprivado.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') titprivado_original_bmf = titprivado_original_bmf.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') # Deleta columnas não existentes na bd bmf_numeraca del titprivado_original_bmf['puemissao'] del titprivado_original_bmf['percindex'] del titprivado_original_bmf['dtvencimento'] del titprivado_original_bmf['dtemissao'] del titprivado_original_bmf['coupom'] del titprivado_original_bmf['indexador_xml'] del titprivado_original_bmf['codativo'] # Contatena tabelas titprivado_original_bmf['id_papel'] = titprivado_original_bmf['id_papel'] + '_' + titprivado_original_bmf['flag'] logger.info("Salvando base de dados - titprivado_caracteristicas") pd.io.sql.to_sql(titprivado_original_bmf, name='titprivado_caracteristicas', con=connection, if_exists="append", flavor='mysql', index=False) logger.info("Salvando base de dados - titprivado_caracteristicas") #Fecha conexão connection.close() del titprivado_original_bmf #Manipulação das informações cadastrais # Verificação dos papéis não existentes na numeraca erros = titprivado[titprivado.flag.isnull()].copy() erros.to_excel(writer, 'fora_numeraca') # Criação de informações - fonte: xml - ASSUME BULLET, joga fora papéis já vencidos idx = titprivado[(titprivado.flag.isnull()) & (titprivado.dtvencimento >= datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2])))].index.tolist() titprivado['data_emissao'][idx] = titprivado['dtemissao'][idx] titprivado['data_expiracao'][idx] = titprivado['dtvencimento'][idx] titprivado['data_primeiro_pagamento_juros'][idx] = titprivado['data_expiracao'][idx] titprivado['valor_nominal'][idx] = titprivado['puemissao'][idx] titprivado['indexador'][idx] = titprivado['indexador_xml'][idx] titprivado['percentual_indexador'][idx] = titprivado['percindex'][idx] titprivado['taxa_juros'][idx] = titprivado['coupom'][idx] titprivado['ano_expiracao'][idx] = titprivado['data_expiracao'][idx].astype(str) titprivado['ano_expiracao'][idx] = titprivado['ano_expiracao'][idx].str.split('-') titprivado['ano_expiracao'][idx] = titprivado['ano_expiracao'][idx].str[0].astype(int) titprivado['flag'][idx] = 'C0' erros = titprivado[titprivado.flag == 'C0'].copy() erros.to_excel(writer, 'criados_0') # Criação de informações - fonte: fluxo manual manual['data_primeiro_pagamento_juros1'] = pd.to_datetime(manual['data_primeiro_pagamento_juros1']).dt.date titprivado = titprivado.merge(manual, on=['codigo_isin'], how='left') idx = titprivado[titprivado.taxa_juros1.notnull()].index.tolist() titprivado['cod_frequencia_juros'][idx] = titprivado['cod_frequencia_juros1'][idx] titprivado['data_primeiro_pagamento_juros'][idx] = titprivado['data_primeiro_pagamento_juros1'][idx] titprivado['valor_nominal'][idx] = titprivado['valor_nominal1'][idx] titprivado['indexador'][idx] = titprivado['indexador1'][idx] titprivado['percentual_indexador'][idx] = titprivado['percentual_indexador1'][idx] titprivado['taxa_juros'][idx] = titprivado['taxa_juros1'][idx] titprivado['tipo_ativo'][idx] = titprivado['tipo_ativo1'][idx] titprivado['flag'][idx] = 'C1' del titprivado['cod_frequencia_juros1'] del titprivado['data_primeiro_pagamento_juros1'] del titprivado['valor_nominal1'] del titprivado['indexador1'] del titprivado['percentual_indexador1'] del titprivado['taxa_juros1'] del titprivado['tipo_ativo1'] erros = titprivado[titprivado.flag == 'C1'].copy() erros.to_excel(writer, 'criados_1') # Manipulação V - Preenche valor nominal com info do xml # Papéis que tem informação diferente do xml titprivado['flag'][(titprivado.flag != 'C0') & (titprivado.flag != 'C1')] = 'V' titprivado['valor_nominal'][titprivado.flag == 'V'] = titprivado['puemissao'][titprivado.flag == 'V'] erros = titprivado[titprivado.flag == 'V'].copy() erros.to_excel(writer, 'valor_nominal') # Manipulação I - Preenche percentual indexador com info do xml # Caso o percentual_indexador seja missing, preenche com a inforção do xml titprivado['flag'][ (titprivado.flag != 'C0') & (titprivado.flag != 'C1') & (titprivado.percentual_indexador.isnull())] = 'I' titprivado['percentual_indexador'][titprivado.flag == 'I'] = titprivado['percindex'][titprivado.flag == 'I'] erros = titprivado[titprivado.flag == 'I'].copy() erros.to_excel(writer, 'percentual_indexador') # Manipulação J0 - Preenche taxa de juros com info do xml, quando percentual indexador = 100 # Caso o taxa_juros seja missing, preenche com a inforção do xml titprivado['flag'][(titprivado.flag != 'C0') & (titprivado.flag != 'C1') & ( titprivado.taxa_juros.isnull() & (titprivado.percentual_indexador == 100))] = 'J0' titprivado['taxa_juros'][(titprivado.flag == 'J0')] = titprivado['coupom'][(titprivado.flag == 'J0')] erros = titprivado[titprivado.flag == 'J0'].copy() erros.to_excel(writer, 'taxa_juros_0') # Manipulação J0 - Preenche taxa de juros com info do xml, quando percentual indexador != 100 # Caso o taxa_juros seja missing, preenche com a inforção do xml titprivado['flag'][(titprivado.flag != 'C0') & (titprivado.flag != 'C1') & ( titprivado.taxa_juros.isnull() & (titprivado.percentual_indexador != 100))] = 'J1' titprivado['taxa_juros'][titprivado.flag == 'J1'] = 0 erros = titprivado[titprivado.flag == 'J1'].copy() erros.to_excel(writer, 'taxa_juros_1') ############################################################################### # Missing data_primeiro_pagamento_juros # # No programa de fluxo, fiz uma modificação para os papéis que tinham código de frequência. # Coloquei a data de primeiro pagamento como sendo a próxima após a data de emissão depois de um período correspondente ao código de frequência de juros ############################################################################### # Caso o papel tenha um código de frequência de juros, preenche a primeira data de pagamento com a primeira data depois do periodo considerando o cod_frequencia_juros # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='B')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='B')] + pd.DateOffset(years=2) titprivado['flag'][(titprivado.flag != 'C') & ( (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'B'))] = 'D' # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='A')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='A')] + pd.DateOffset(years=1) titprivado['flag'][(titprivado.flag != 'C') & ( (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'A'))] = 'D' # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='S')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='S')] + pd.DateOffset(months=6) titprivado['flag'][(titprivado.flag != 'C') & ( (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'S'))] = 'D' # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='Q')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='Q')] + pd.DateOffset(months=3) titprivado['flag'][(titprivado.flag != 'C') & ( (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'Q'))] = 'D' # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='M')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='M')] + pd.DateOffset(months=1) titprivado['flag'][(titprivado.flag != 'C') & ( (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'M'))] = 'D' # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='W')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='W')] + pd.DateOffset(days=7) titprivado['flag'][(titprivado.flag != 'C') & ( (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'W'))] = 'D' erros = titprivado[titprivado.flag == 'D'].copy() erros.to_excel(writer, 'data_primeiro_pagamento_juros') # Faz substituição do código de frequência de juros para os isins especificados no excel # Lista de papéis na transformação: JUROS '' bullet -> 'A' anual isin_list = pd.read_excel(depend_path_bullet_B0) logger.info("Arquivos lidos com sucesso") titprivado = titprivado.merge(isin_list, on=['codigo_isin'], how='left') titprivado['cod_frequencia_juros'][titprivado.flag_err == 1] = 'A' titprivado['flag'][titprivado.flag_err == 1] = 'B0' del titprivado['flag_err'] erros = titprivado[titprivado.flag == 'B0'].copy() erros.to_excel(writer, 'cod_frequencia_juros_bullet') # Lista de papéis na transformação: JUROS '' bullet -> 'A' anual isin_list = pd.read_excel(depend_path_bullet_B1) logger.info("Arquivos lidos com sucesso") titprivado = titprivado.merge(isin_list, on=['codigo_isin'], how='left') titprivado['cod_frequencia_juros'][titprivado.flag_err == 1] = None titprivado['flag'][titprivado.flag_err == 1] = 'B1' del titprivado['flag_err'] erros = titprivado[titprivado.flag == 'B1'].copy() erros.to_excel(writer, 'cod_frequencia_juros_12meses') # Correção ultra-manual titprivado['valor_nominal'][titprivado.codigo_isin == 'BRBCXGDP00J9'] = 2062500.0 titprivado['flag'][titprivado.codigo_isin == 'BRBCXGDP00J9'] = 'M' titprivado['valor_nominal'][titprivado.codigo_isin == 'BRCSCSDP0075'] = 1000000.0 titprivado['flag'][titprivado.codigo_isin == 'BRCSCSDP0075'] = 'M' titprivado['percentual_indexador'][titprivado.codigo_isin == 'BRBCEFC01JQ9'] = 102.5 titprivado['flag'][titprivado.codigo_isin == 'BRBCEFC01JQ9'] = 'M' titprivado['percentual_indexador'][titprivado.codigo_isin == 'BRBITALFID01'] = 100.0 titprivado['flag'][titprivado.codigo_isin == 'BRBITALFID01'] = 'M' titprivado['ano_expiracao'][titprivado.codigo_isin == 'BRBPNMLFI0L5'] = 2018 titprivado['flag'][titprivado.codigo_isin == 'BRBPNMLFI0L5'] = 'M' titprivado['ano_expiracao'][titprivado.codigo_isin == 'BRFTORDP0045'] = 2017 titprivado['flag'][titprivado.codigo_isin == 'BRFTORDP0045'] = 'M' titprivado['ano_expiracao'][titprivado.codigo_isin == '************'] = 2017 titprivado['flag'][titprivado.codigo_isin == '************'] = 'M' titprivado['tipo_ativo'][titprivado.codigo_isin == 'BRMULTCC0016'] = 'C' titprivado['flag'][titprivado.codigo_isin == 'BRMULTCC0016'] = 'M' erros = titprivado[titprivado.flag == 'M'].copy() erros.to_excel(writer, 'manual') # Finalização # Retira papéis que estão fora da numeraca e que não foram criados titprivado = titprivado[titprivado.flag.notnull()].copy() # Coloca o flag bo id_papel titprivado['id_papel'] = titprivado['id_papel'] + '_' + titprivado['flag'] # Todos os papéis titprivado.to_excel(writer, 'todos') # Salva excel com todas as abas logger.info("Arquivos salvos com sucesso") writer.save() # Deleta columnas não existentes na bd bmf_numeraca del titprivado['puemissao'] del titprivado['percindex'] del titprivado['dtvencimento'] del titprivado['dtemissao'] del titprivado['coupom'] del titprivado['indexador_xml'] del titprivado['codativo'] # Salvar informacoes alteradas no 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") logger.info("Salvando base de dados - titprivado_caracteristicas") pd.io.sql.to_sql(titprivado, name='titprivado_caracteristicas', con=connection, if_exists="append", flavor='mysql', index=False) # Fecha conexão connection.close()
def matriz_gerencial_2(): import pymysql as db import datetime import numpy as np import pandas as pd import logging import pickle from dependencias.Metodos.funcoes_auxiliares import full_path_from_database from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import get_global_var from var.scripts.matriz_gerencial.definicao_lambda import definicao_lambda from var.scripts.matriz_gerencial.definicao_nome import definicao_nome #Define variáveis: logger = logging.getLogger(__name__) save_path = full_path_from_database("get_output_var") retornos_path = full_path_from_database("pickles") # data_final = '2016-11-30' # dt_base = '20161130' # data_inicial = "2010-03-31" dt_base = get_data_ultimo_dia_util_mes_anterior() data_final = str(dt_base[0]) + '-' + str(dt_base[1]) + '-' + str( dt_base[2]) dt_base = dt_base[0] + dt_base[1] + dt_base[2] data_inicial = get_global_var("dt_ini_matriz_gerencial_2") data_inicial = str(data_inicial[0:4]) + '-' + str( data_inicial[4:6]) + '-' + str(data_inicial[6:8]) lambda_geral = definicao_lambda('outro') #lambda_geral = 0.95 retornos = open(retornos_path + 'matriz_gerencial_retornos' + ".pkl", "w") # Conecta no DB 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("Tratando dados") ## Cálculo da matriz de correlação matriz_correlacao = retornos.corr() matriz_correlacao.fillna(0, inplace=True) variancias_manual = pd.read_excel( full_path_from_database("get_output_var") + 'variancias_' + dt_base + '.xlsx') #COMO QUE EU COLOCO NO FORMATO QUE ESTAVAM VINDO AS VARIANCIAS ANTES? variancias = variancias_manual.values desvio_padrao = np.sqrt(variancias) desvio_padrao = np.squeeze(desvio_padrao) ## Cálculo da matriz de covariância matriz_diagonal = np.diag(desvio_padrao) matriz_covariancias = np.dot(matriz_diagonal, np.dot(matriz_correlacao, matriz_diagonal)) ## Salvar no banco de dados base_final = pd.DataFrame() for linha in range(len(retornos.columns)): for coluna in range(linha + 1): resultado = {} if isinstance(retornos.columns[linha], tuple) and len(retornos.columns[linha]) > 2: resultado["linha"] = definicao_nome( retornos.columns[linha][1]) + "_" + str( retornos.columns[linha][2]) else: resultado["linha"] = definicao_nome(retornos.columns[linha]) if isinstance(retornos.columns[coluna], tuple) and len(retornos.columns[coluna]) > 2: resultado["coluna"] = definicao_nome( retornos.columns[coluna][1]) + "_" + str( retornos.columns[coluna][2]) else: resultado["coluna"] = definicao_nome(retornos.columns[coluna]) resultado["valor"] = matriz_covariancias[linha][coluna] base_final = base_final.append(resultado, ignore_index=True) max(base_final["valor"]) base_final["data_bd"] = datetime.datetime.now() base_final["data_inicial"] = data_inicial base_final["data_final"] = data_final base_final["horizonte"] = "dia" base_final["lambda"] = lambda_geral # TESTE SE VETOR VEM ZERADO ## Inserir "matriz_id" matriz_id = pd.read_sql_query( 'SELECT max(matriz_id) as matriz_id FROM matriz_gerencial', connection) if matriz_id['matriz_id'][0] == None: matriz_id_valor = 0 else: matriz_id_valor = matriz_id.get_value(0, 'matriz_id').astype(int) + 1 base_final["matriz_id"] = matriz_id_valor ### Salvar no BD logger.info("Salvando base de dados") pd.io.sql.to_sql(base_final, name='matriz_gerencial', con=connection, if_exists="append", flavor='mysql', index=0, chunksize=5000) new_matriz_id = pd.read_sql_query( 'select matriz_id from matriz_gerencial where data_bd = ( SELECT MAX(data_bd) from matriz_gerencial ) group by matriz_id', connection) new_matriz_id = new_matriz_id['matriz_id'].iloc[0] cur = connection.cursor(db.cursors.DictCursor) query = 'update generator_global_variables set variable_value = ' + str( new_matriz_id) + ' where variable_name = ' + '\'matriz_id\'' logger.info("Atualizando matriz_id na base de dados") cur.execute(query) connection.commit() logger.info("Base de dados atualizada com sucesso") connection.close() base_final.to_excel(save_path + 'matriz_gerencial_' + str(data_final) + '.xlsx') logger.info("Arquivo Matriz Gerencial salvo com sucesso") retornos.to_excel(save_path + 'retornos_mensal_' + str(data_final) + '.xlsx') logger.info("Arquivo Retornos mensais salvo com sucesso")
def fluxo_titprivado(): import pandas as pd import datetime import numpy as np import pymysql as db import logging from pandas.tseries.offsets import DateOffset 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 xlsx_path_fluxo_debenture = full_path_from_database( "get_output_quadro419") + 'controle_fluxo_debentures.xlsx' #Diretório de save de planilhas save_path_fluxo_A = full_path_from_database( "get_output_quadro419") + 'bmf_fluxo_titprivado_A.xlsx' save_path_fluxo_B = full_path_from_database( "get_output_quadro419") + 'bmf_fluxo_titprivado_B.xlsx' save_path_fluxo_M = full_path_from_database( "get_output_quadro419") + 'bmf_fluxo_titprivado_M.xlsx' save_path_fluxo_Q = full_path_from_database( "get_output_quadro419") + 'bmf_fluxo_titprivado_Q.xlsx' save_path_fluxo_S = full_path_from_database( "get_output_quadro419") + 'bmf_fluxo_titprivado_S.xlsx' save_path_fluxo_W = full_path_from_database( "get_output_quadro419") + 'bmf_fluxo_titprivado_W.xlsx' save_path_fluxo_titprivado = full_path_from_database( "get_output_quadro419") + 'fluxo_titprivado.xlsx' # 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'] dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2] #2 - Cria conexão e importação: base de dados fluxo_titprivado #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 * FROM projeto_inv.titprivado_caracteristicas WHERE data_expiracao > ' + '"' + dtbase_concat + '";' bmf_numeraca = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") #3 - Preparação da base logger.info("Tratando dados") #Seleciona dados da última carga da data de relatório bmf_numeraca['dtrel'] = bmf_numeraca['id_papel'].str.split('_') bmf_numeraca['dtrel'] = bmf_numeraca['dtrel'].str[0] bmf_numeraca = bmf_numeraca[bmf_numeraca.dtrel == dtbase_concat].copy() bmf_numeraca = bmf_numeraca[bmf_numeraca.data_bd == max( bmf_numeraca.data_bd)] del bmf_numeraca['dtrel'] bmf_numeraca = bmf_numeraca.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='').copy() titprivado = bmf_numeraca.copy() #Guarda lista de todos os papéis para verificar no final se há papel faltando no fluxo lista_all = bmf_numeraca[['id_papel', 'codigo_isin']].copy() lista_all = lista_all.drop_duplicates(subset=['id_papel']) #excluir debêntures titprivado = titprivado[titprivado.tipo_ativo != 'DBS'] #excluir debêntures conversíveis em ações ordinárias titprivado = titprivado[titprivado.tipo_ativo != 'DBO'] #excluir debêntures conversíveis em ações preferenciais titprivado = titprivado[titprivado.tipo_ativo != 'DBP'] #excluir debênures miscelâneas titprivado = titprivado[titprivado.tipo_ativo != 'DBM'] #excluir títulos puúblicos titprivado = titprivado[titprivado.tipo_ativo != 'NTB'] titprivado = titprivado[titprivado.tipo_ativo != 'NTC'] titprivado = titprivado[titprivado.tipo_ativo != 'NTF'] titprivado = titprivado[titprivado.tipo_ativo != 'LF'] titprivado = titprivado[titprivado.tipo_ativo != 'LTN'] titprivado = titprivado[titprivado.tipo_ativo != 'NI'] titprivado = titprivado[titprivado.tipo_ativo != 'NTP'] titprivado = titprivado[titprivado.tipo_ativo != 'NTA'] titprivado = titprivado[titprivado.tipo_ativo != 'NTD'] titprivado = titprivado[titprivado.tipo_ativo != 'NTE'] titprivado = titprivado[titprivado.tipo_ativo != 'NTH'] titprivado = titprivado[titprivado.tipo_ativo != 'NTJ'] titprivado = titprivado[titprivado.tipo_ativo != 'NTL'] titprivado = titprivado[titprivado.tipo_ativo != 'NT'] titprivado = titprivado[titprivado.tipo_ativo != 'NTM'] titprivado = titprivado[titprivado.tipo_ativo != 'NTR'] titprivado = titprivado[titprivado.tipo_ativo != 'NTS'] titprivado = titprivado[titprivado.tipo_ativo != 'NTT'] titprivado = titprivado[titprivado.tipo_ativo != 'NTU'] #existem sujeiras na base de dados em relação a data de vencimento (expiracao), os quais são acima de 2100 ano = datetime.datetime.now().year prazo_maximo = 80 + ano problema_cadastro = titprivado[ titprivado.ano_expiracao.astype(float) > prazo_maximo] titprivado = titprivado[ titprivado.ano_expiracao.astype(float) < prazo_maximo] titprivado = titprivado.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') titprivado = titprivado[[ 'codigo_isin', 'codigo_cetip', 'tipo_ativo', 'data_emissao', 'data_expiracao', 'valor_nominal', 'taxa_juros', 'indexador', 'percentual_indexador', 'cod_frequencia_juros', 'data_primeiro_pagamento_juros', 'id_bmf_numeraca', 'flag', 'id_papel', 'dtoperacao' ]].copy() #Caso o papel tenha um código de frequência de juros, preenche a primeira data de pagamento com a primeira data depois do periodo considerando o cod_frequencia_juros titprivado['data_emissao'] = pd.to_datetime(titprivado['data_emissao']) titprivado['data_primeiro_pagamento_juros'] = pd.to_datetime( titprivado['data_primeiro_pagamento_juros']) titprivado['data_expiracao'] = pd.to_datetime(titprivado['data_expiracao']) idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'B')].index.tolist() for i in idx: titprivado['data_primeiro_pagamento_juros'][ idx] = titprivado['data_emissao'][idx] + DateOffset(years=2) print(titprivado['data_primeiro_pagamento_juros'][idx]) idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'A')].index.tolist() for i in idx: titprivado['data_primeiro_pagamento_juros'][ idx] = titprivado['data_emissao'][idx] + DateOffset(years=1) print(titprivado['data_primeiro_pagamento_juros'][idx]) idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'S')].index.tolist() for i in idx: titprivado['data_primeiro_pagamento_juros'][ idx] = titprivado['data_emissao'][idx] + DateOffset(months=6) print(titprivado['data_primeiro_pagamento_juros'][idx]) idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'Q')].index.tolist() for i in idx: titprivado['data_primeiro_pagamento_juros'][ idx] = titprivado['data_emissao'][idx] + DateOffset(months=3) print(titprivado['data_primeiro_pagamento_juros'][idx]) idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'M')].index.tolist() for i in idx: titprivado['data_primeiro_pagamento_juros'][ idx] = titprivado['data_emissao'][idx] + DateOffset(months=1) print(titprivado['data_primeiro_pagamento_juros'][idx]) idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'W')].index.tolist() for i in idx: titprivado['data_primeiro_pagamento_juros'][ idx] = titprivado['data_emissao'][idx] + DateOffset(days=7) #A - ANUAL; B - BI-ANUAL; M – MENSAL; N - NÃO APLICÁVEL; Q – TRIMESTRAL; S – SEMESTRAL; W - SEMANAL X – OUTROS #Trasnforma papéis sem data de expiração em BULLET titprivado['data_primeiro_pagamento_juros'][ titprivado.data_primeiro_pagamento_juros.isnull( )] = titprivado['data_expiracao'][ titprivado.data_primeiro_pagamento_juros.isnull()] titprivado['data_primeiro_pagamento_juros'] = pd.to_datetime( titprivado['data_primeiro_pagamento_juros']).dt.date titprivado['data_emissao'] = pd.to_datetime( titprivado['data_emissao']).dt.date titprivado['data_expiracao'] = pd.to_datetime( titprivado['data_expiracao']).dt.date #Correção indexador titprivado['indexador'][titprivado.indexador == 'IAP'] = 'IPCA' titprivado['indexador'][titprivado.indexador == 'CDI'] = 'DI1' titprivado['cod_frequencia_juros'][titprivado.data_expiracao == titprivado. data_primeiro_pagamento_juros] = None bmf_fluxo_titprivado_A = pd.DataFrame(columns=[ 'codigo_isin', 'codigo_cetip', 'tipo_ativo', 'data_emissao', 'data_expiracao', 'valor_nominal', 'taxa_juros', 'indexador', 'percentual_indexador', 'cod_frequencia_juros', 'data_primeiro_pagamento_juros', 'id_bmf_numeraca', 'data_bd', 'dt_ref', 'flag', 'id_papel', 'dtoperacao' ]) bmf_fluxo_titprivado_B = bmf_fluxo_titprivado_A.copy() bmf_fluxo_titprivado_S = bmf_fluxo_titprivado_A.copy() bmf_fluxo_titprivado_Q = bmf_fluxo_titprivado_A.copy() bmf_fluxo_titprivado_M = bmf_fluxo_titprivado_A.copy() bmf_fluxo_titprivado_W = bmf_fluxo_titprivado_A.copy() data_bd = datetime.datetime.now() #4 - Gera fluxo de papéis cod_frequencia_juros = "A": ANUAL titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'A') & (titprivado.data_primeiro_pagamento_juros != titprivado.data_expiracao)].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') i1 = 0 for i in range(0, len(titprivado_aux)): qtde = 0 vencto = pd.to_datetime( titprivado_aux['data_primeiro_pagamento_juros'][i]) #Criar o intervalo de tempo fatormensal = 12 fatordiario = 0 #Preenche o fluxo bmf_fluxo_titprivado_A.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 temp = titprivado_aux['data_expiracao'][i] while (pd.to_datetime(temp) > vencto ): #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))): qtde = qtde + 1 temp = titprivado_aux['data_expiracao'][i] - DateOffset( months=fatormensal * qtde, days=fatordiario * qtde) temp = datetime.date(temp.year, temp.month, temp.day) bmf_fluxo_titprivado_A.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, temp, titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 bmf_fluxo_titprivado_A.to_excel(save_path_fluxo_A) #5 - Gera fluxo de papéis cod_frequencia_juros = "B": BIANUAL titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'B') & (titprivado.data_primeiro_pagamento_juros != titprivado.data_expiracao)].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') i1 = 0 for i in range(0, len(titprivado_aux)): qtde = 0 vencto = pd.to_datetime( titprivado_aux['data_primeiro_pagamento_juros'][i]) #Criar o intervalo de tempo fatormensal = 24 fatordiario = 0 #Preenche o fluxo bmf_fluxo_titprivado_B.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 temp = titprivado_aux['data_expiracao'][i] while (pd.to_datetime(temp) > vencto ): #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))): qtde = qtde + 1 temp = titprivado_aux['data_expiracao'][i] - DateOffset( months=fatormensal * qtde, days=fatordiario * qtde) temp = datetime.date(temp.year, temp.month, temp.day) bmf_fluxo_titprivado_B.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, temp, titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 bmf_fluxo_titprivado_B.to_excel(save_path_fluxo_B) #6 - Gera fluxo de papéis cod_frequencia_juros = "M": MENSAL titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'M') & (titprivado.data_primeiro_pagamento_juros != titprivado.data_expiracao)].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') i1 = 0 for i in range(0, len(titprivado_aux)): qtde = 0 vencto = pd.to_datetime( titprivado_aux['data_primeiro_pagamento_juros'][i]) #Criar o intervalo de tempo fatormensal = 1 fatordiario = 0 #Preenche o fluxo bmf_fluxo_titprivado_M.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 temp = titprivado_aux['data_expiracao'][i] while (pd.to_datetime(temp) > vencto ): #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))): qtde = qtde + 1 temp = titprivado_aux['data_expiracao'][i] - DateOffset( months=fatormensal * qtde, days=fatordiario * qtde) temp = datetime.date(temp.year, temp.month, temp.day) bmf_fluxo_titprivado_M.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, temp, titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 bmf_fluxo_titprivado_M.to_excel(save_path_fluxo_M) #7 - Gera fluxo de papéis cod_frequencia_juros = "Q": TRIMESTRAL titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'Q') & (titprivado.data_primeiro_pagamento_juros != titprivado.data_expiracao)].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') i1 = 0 for i in range(0, len(titprivado_aux)): qtde = 0 vencto = pd.to_datetime( titprivado_aux['data_primeiro_pagamento_juros'][i]) #Criar o intervalo de tempo fatormensal = 3 fatordiario = 0 #Preenche o fluxo bmf_fluxo_titprivado_Q.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 temp = titprivado_aux['data_expiracao'][i] while (pd.to_datetime(temp) > vencto ): #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))): qtde = qtde + 1 temp = titprivado_aux['data_expiracao'][i] - DateOffset( months=fatormensal * qtde, days=fatordiario * qtde) temp = datetime.date(temp.year, temp.month, temp.day) bmf_fluxo_titprivado_Q.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, temp, titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 bmf_fluxo_titprivado_Q.to_excel(save_path_fluxo_Q) #8 - Gera fluxo de papéis cod_frequencia_juros = "S": SEMESTRAL titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'S') & (titprivado.data_primeiro_pagamento_juros != titprivado.data_expiracao)].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') i1 = 0 for i in range(0, len(titprivado_aux)): qtde = 0 vencto = pd.to_datetime( titprivado_aux['data_primeiro_pagamento_juros'][i]) #Criar o intervalo de tempo fatormensal = 6 fatordiario = 0 #Preenche o fluxo bmf_fluxo_titprivado_S.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 temp = titprivado_aux['data_expiracao'][i] while (pd.to_datetime(temp) > vencto ): #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))): qtde = qtde + 1 temp = titprivado_aux['data_expiracao'][i] - DateOffset( months=fatormensal * qtde, days=fatordiario * qtde) temp = datetime.date(temp.year, temp.month, temp.day) bmf_fluxo_titprivado_S.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, temp, titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 bmf_fluxo_titprivado_S.to_excel(save_path_fluxo_S) #9 - Gera fluxo de papéis cod_frequencia_juros = "W": SEMANAL titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'W') & (titprivado.data_primeiro_pagamento_juros != titprivado.data_expiracao)].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') i1 = 0 for i in range(0, len(titprivado_aux)): qtde = 0 vencto = pd.to_datetime( titprivado_aux['data_primeiro_pagamento_juros'][i]) #Criar o intervalo de tempo fatormensal = 0 fatordiario = 7 #Preenche o fluxo bmf_fluxo_titprivado_W.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 temp = titprivado_aux['data_expiracao'][i] while (pd.to_datetime(temp) > vencto ): #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))): qtde = qtde + 1 temp = titprivado_aux['data_expiracao'][i] - DateOffset( months=fatormensal * qtde, days=fatordiario * qtde) temp = datetime.date(temp.year, temp.month, temp.day) bmf_fluxo_titprivado_W.loc[i + i1] = [ titprivado_aux['codigo_isin'][i], titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i], titprivado_aux['data_emissao'][i], titprivado_aux['data_expiracao'][i], titprivado_aux['valor_nominal'][i], titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i], titprivado_aux['percentual_indexador'][i], titprivado_aux['cod_frequencia_juros'][i], titprivado_aux['data_primeiro_pagamento_juros'][i], titprivado_aux['id_bmf_numeraca'][i], data_bd, temp, titprivado_aux['flag'][i], titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i] ] i1 = i1 + 1 bmf_fluxo_titprivado_W.to_excel(save_path_fluxo_W) #10 - Gera fluxo de papéis cod_frequencia_juros = OUTROS, NÃO APLICAVEIS, BULLET #cod_frequencia_juros #A - ANUAL; B - BI-ANUAL; M – MENSAL; N - NÃO APLICÁVEL; Q – TRIMESTRAL; S – SEMESTRAL; W - SEMANAL X – OUTROS del titprivado_aux titprivado_aux = titprivado[ titprivado['cod_frequencia_juros'] != 'A'].copy() titprivado_aux = titprivado_aux[ titprivado_aux['cod_frequencia_juros'] != 'B'].copy() titprivado_aux = titprivado_aux[ titprivado_aux['cod_frequencia_juros'] != 'M'].copy() titprivado_aux = titprivado_aux[ titprivado_aux['cod_frequencia_juros'] != 'Q'].copy() titprivado_aux = titprivado_aux[ titprivado_aux['cod_frequencia_juros'] != 'S'].copy() titprivado_aux = titprivado_aux[ titprivado_aux['cod_frequencia_juros'] != 'W'].copy() titprivado_aux = titprivado_aux.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') bmf_fluxo_titprivado_aux = pd.DataFrame(columns=[ 'codigo_isin', 'codigo_cetip', 'tipo_ativo', 'data_emissao', 'data_expiracao', 'valor_nominal', 'taxa_juros', 'indexador', 'percentual_indexador', 'cod_frequencia_juros', 'data_primeiro_pagamento_juros', 'id_bmf_numeraca', 'data_bd', 'dt_ref', 'flag', 'id_papel', 'dtoperacao' ]) bmf_fluxo_titprivado_aux['codigo_isin'] = titprivado_aux['codigo_isin'] bmf_fluxo_titprivado_aux['codigo_cetip'] = titprivado_aux['codigo_cetip'] bmf_fluxo_titprivado_aux['tipo_ativo'] = titprivado_aux['tipo_ativo'] bmf_fluxo_titprivado_aux['data_emissao'] = titprivado_aux['data_emissao'] bmf_fluxo_titprivado_aux['data_expiracao'] = titprivado_aux[ 'data_expiracao'] bmf_fluxo_titprivado_aux['valor_nominal'] = titprivado_aux['valor_nominal'] bmf_fluxo_titprivado_aux['taxa_juros'] = titprivado_aux['taxa_juros'] bmf_fluxo_titprivado_aux['indexador'] = titprivado_aux['indexador'] bmf_fluxo_titprivado_aux['percentual_indexador'] = titprivado_aux[ 'percentual_indexador'] bmf_fluxo_titprivado_aux['cod_frequencia_juros'] = titprivado_aux[ 'cod_frequencia_juros'] bmf_fluxo_titprivado_aux['data_primeiro_pagamento_juros'] = titprivado_aux[ 'data_expiracao'] bmf_fluxo_titprivado_aux['id_bmf_numeraca'] = titprivado_aux[ 'id_bmf_numeraca'] bmf_fluxo_titprivado_aux['data_bd'] = data_bd bmf_fluxo_titprivado_aux['dt_ref'] = titprivado_aux['data_expiracao'] bmf_fluxo_titprivado_aux['flag'] = titprivado_aux['flag'] bmf_fluxo_titprivado_aux['id_papel'] = titprivado_aux['id_papel'] bmf_fluxo_titprivado_aux['dtoperacao'] = titprivado_aux['dtoperacao'] bmf_fluxo_titprivado = bmf_fluxo_titprivado_aux.copy() bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_A) bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_B) bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_S) bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_Q) bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_M) bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_W) del bmf_fluxo_titprivado_aux bmf_fluxo_titprivado['dif'] = bmf_fluxo_titprivado[ 'dt_ref'] - bmf_fluxo_titprivado['data_primeiro_pagamento_juros'] bmf_fluxo_titprivado['dif'] = bmf_fluxo_titprivado['dif'] / np.timedelta64( 1, 'D') bmf_fluxo_titprivado['dif'] = bmf_fluxo_titprivado['dif'].astype(int) bmf_fluxo_titprivado = bmf_fluxo_titprivado[(bmf_fluxo_titprivado.dif > -6)] del bmf_fluxo_titprivado['dif'] bmf_fluxo_titprivado['juros_tipo'] = 'liquidate' bmf_fluxo_titprivado['percentual_juros'] = 1 bmf_fluxo_titprivado['index_tipo'] = 'liquidate' bmf_fluxo_titprivado['percentual_index'] = 1 bmf_fluxo_titprivado['tipo'] = 'vna' bmf_fluxo_titprivado['tipo_capitalizacao'] = 'Exponencial' bmf_fluxo_titprivado['dt_inicio_rentab'] = bmf_fluxo_titprivado[ 'data_emissao'] bmf_fluxo_titprivado['juros_cada'] = bmf_fluxo_titprivado['codigo_isin'] bmf_fluxo_titprivado['juros_cada'] = None bmf_fluxo_titprivado['juros_cada'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'A'] = 12 bmf_fluxo_titprivado['juros_cada'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'B'] = 24 bmf_fluxo_titprivado['juros_cada'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'S'] = 6 bmf_fluxo_titprivado['juros_cada'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'M'] = 1 bmf_fluxo_titprivado['juros_cada'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'Q'] = 3 bmf_fluxo_titprivado['juros_cada'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'W'] = 7 bmf_fluxo_titprivado['juros_cada'][ (bmf_fluxo_titprivado.cod_frequencia_juros != 'A') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'B') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'S') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'M') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'Q') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'W')] = 0 bmf_fluxo_titprivado['juros_unidade'] = bmf_fluxo_titprivado['codigo_isin'] bmf_fluxo_titprivado['juros_unidade'] = None bmf_fluxo_titprivado['juros_unidade'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'A'] = 'MES' bmf_fluxo_titprivado['juros_unidade'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'B'] = 'MES' bmf_fluxo_titprivado['juros_unidade'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'S'] = 'MES' bmf_fluxo_titprivado['juros_unidade'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'M'] = 'MES' bmf_fluxo_titprivado['juros_unidade'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'Q'] = 'MES' bmf_fluxo_titprivado['juros_unidade'][ bmf_fluxo_titprivado.cod_frequencia_juros == 'W'] = 'DIA' bmf_fluxo_titprivado['juros_cada'][ (bmf_fluxo_titprivado.cod_frequencia_juros != 'A') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'B') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'S') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'M') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'Q') & (bmf_fluxo_titprivado.cod_frequencia_juros != 'W')] = None bmf_fluxo_titprivado['juros_dc_du'] = 252 bmf_fluxo_titprivado['indexador_dc_du'] = 252 #Inverte a coluna codigo_isin pela id_papel bmf_fluxo_titprivado['codigo_isin_temp'] = bmf_fluxo_titprivado[ 'codigo_isin'] bmf_fluxo_titprivado['codigo_isin'] = bmf_fluxo_titprivado['id_papel'] bmf_fluxo_titprivado['id_papel'] = bmf_fluxo_titprivado['codigo_isin_temp'] #Premissa: toda vez que paga juros, paga principal bmf_fluxo_amort = bmf_fluxo_titprivado[bmf_fluxo_titprivado['juros_tipo'] == 'liquidate'].copy() quantidade = bmf_fluxo_amort[[ 'codigo_isin', 'data_emissao', 'data_expiracao', 'juros_tipo' ]].groupby(['codigo_isin', 'data_emissao', 'data_expiracao']).agg(['count']) quantidade = quantidade.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') qtde_amort = pd.DataFrame(columns=[ 'codigo_isin', 'data_emissao', 'data_expiracao', 'qtde_amortizacao' ]) qtde_amort['codigo_isin'] = quantidade['codigo_isin'] qtde_amort['data_emissao'] = quantidade['data_emissao'] qtde_amort['data_expiracao'] = quantidade['data_expiracao'] qtde_amort['qtde_amortizacao'] = quantidade['juros_tipo'] qtde_amort['juros_tipo'] = 'liquidate' qtde_amort['perc_amortizacao'] = 1 / qtde_amort['qtde_amortizacao'] * 100 del qtde_amort['qtde_amortizacao'] bmf_fluxo_titprivado = bmf_fluxo_titprivado.merge( qtde_amort, on=['codigo_isin', 'data_emissao', 'data_expiracao', 'juros_tipo'], how='left') bmf_fluxo_titprivado['perc_amortizacao'][ (bmf_fluxo_titprivado.tipo_ativo == 'LH') | (bmf_fluxo_titprivado.tipo_ativo == 'LFI') | (bmf_fluxo_titprivado.tipo_ativo == 'LFN') | (bmf_fluxo_titprivado.tipo_ativo == 'C') | (bmf_fluxo_titprivado.tipo_ativo == 'CDB') | (bmf_fluxo_titprivado.tipo_ativo == 'DP')] = 0 bmf_fluxo_titprivado['perc_amortizacao'][ (bmf_fluxo_titprivado.dt_ref == bmf_fluxo_titprivado.data_expiracao) & ((bmf_fluxo_titprivado.tipo_ativo == 'LH') | (bmf_fluxo_titprivado.tipo_ativo == 'LFI') | (bmf_fluxo_titprivado.tipo_ativo == 'LFN') | (bmf_fluxo_titprivado.tipo_ativo == 'C') | (bmf_fluxo_titprivado.tipo_ativo == 'CDB') | (bmf_fluxo_titprivado.tipo_ativo == 'DP'))] = 1 #Reinverte a coluna codigo_isin pela id_papel bmf_fluxo_titprivado['codigo_isin_temp'] = bmf_fluxo_titprivado[ 'codigo_isin'] bmf_fluxo_titprivado['codigo_isin'] = bmf_fluxo_titprivado['id_papel'] bmf_fluxo_titprivado['id_papel'] = bmf_fluxo_titprivado['codigo_isin_temp'] bmf_fluxo_titprivado = bmf_fluxo_titprivado.sort(['id_papel', 'dt_ref'], ascending=[True, True]) del bmf_fluxo_titprivado['codigo_isin_temp'] lista_final = bmf_fluxo_titprivado[['id_papel', 'codigo_isin']].copy() lista_final = lista_final.drop_duplicates(subset=['id_papel']) lista_final['marker'] = 1 lista = lista_all.merge(lista_final, on=['id_papel', 'codigo_isin'], how='left') #Salvar no MySQL logger.info("Salvando base de dados - fluxo_titprivado") pd.io.sql.to_sql(bmf_fluxo_titprivado, name='fluxo_titprivado', con=connection, if_exists='append', flavor='mysql', index=0) #Fecha conexão connection.close() bmf_fluxo_titprivado.to_excel(save_path_fluxo_titprivado)
def matriz_gerencial_1(): import pymysql as db import datetime import numpy as np import pandas as pd import logging import pickle from dependencias.Metodos.funcoes_auxiliares import full_path_from_database from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import get_global_var #Define variáveis: logger = logging.getLogger(__name__) save_path = full_path_from_database("get_output_var") dt_base = get_data_ultimo_dia_util_mes_anterior() data_final = str(dt_base[0]) + '-' + str(dt_base[1]) + '-' + str( dt_base[2]) #data_final = '2016-11-30' dt_base = dt_base[0] + dt_base[1] + dt_base[2] #dt_base = '20161130' data_inicial = "2010-03-31" retornos_path = full_path_from_database("pickles") ################################################################################################################# # VARIÁVEL PRECISA SER PARAMETRIZADA DE ACORDO COM O CÓDIGO GERADO NO SCRIPT 17-XML_QUADRO_OPERACOES_NAO_ORG.PY id_relatorio_quaid419 = get_global_var("id_qua419") #id_relatorio_quaid419 = '3650' # para novembro ################################################################################################################# #Cotas cujo histórico é ruim lista_fundos_excluidos = [ 'BRBVEPCTF002', 'BRFCLGCTF007', 'BRFCLGCTF015', 'BROLGSCTF005', 'BRSNGSCTF002', 'BRMBVACTF007', 'BRINSBCTF020', 'BRVCCDCTF000' ] #Definição Lambdas lista_lambdas = { 'PRE': 92, 'DIC': 94, 'DIM': 85, 'DP': 73, 'TP': 97, "TR": 97, "IPCA": 94, "IGPM": 86, "Dólar": 78, "Bovespa": 95, "ICB": 95 } #Ajuste datas data_inicial = datetime.datetime.strptime(data_inicial, "%Y-%m-%d").date() data_final = datetime.datetime.strptime(data_final, "%Y-%m-%d").date() #Conecta no DB 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") #start_time = time.time() #matriz_teste = pd.read_sql_query('SELECT t.* FROM ( SELECT codigo_isin, MAX(data_bd) AS max_data FROM bmf_numeraca GROUP BY codigo_isin ) AS m INNER JOIN bmf_numeraca AS t ON t.codigo_isin = m.codigo_isin AND t.data_bd = m.max_data', connection) #elapsed_time = time.time() - start_time #print (elapsed_time) logger.info("Tratando dados") # Consulta valores das séries dados_curvas = pd.read_sql_query( 'SELECT * FROM projeto_inv.curva_ettj_vertices_fixos', connection) dados_bacen = pd.read_sql_query('SELECT * FROM projeto_inv.bacen_series', connection) dados_cotas1 = pd.read_sql_query( 'SELECT * FROM projeto_inv.valoreconomico_cotas', connection) logger.info("Leitura do banco de dados executada com sucesso") #Remove duplicados dados_cotas1 = dados_cotas1.sort(['cota', 'dt_ref', 'data_bd'], ascending=[True, True, True]) dados_cotas1 = dados_cotas1.drop_duplicates(subset=['cota', 'dt_ref'], take_last=True) data_bd = dados_cotas1['data_bd'].iloc[0] #Remove duplicados dados_bacen = dados_bacen.sort(['data_referencia', 'codigo', 'data_bd'], ascending=[True, True, True]) dados_bacen = dados_bacen.drop_duplicates( subset=['codigo', 'data_referencia'], take_last=True) #Lê arquivo BRSND2CTF000.xlsx dados_cotas = pd.read_excel( full_path_from_database("excels") + 'BRSND2CTF000.xlsx') logger.info("Arquivos lidos com sucesso") logger.info("Tratando dados") dados_cotas['dt_ref'] = dados_cotas['dt_ref'].astype(str) dados_cotas['dt_ref'] = dados_cotas['dt_ref'].str.split('/') dados_cotas['ano'] = dados_cotas['dt_ref'].str[2] dados_cotas['mes'] = dados_cotas['dt_ref'].str[1] dados_cotas['dia'] = dados_cotas['dt_ref'].str[0] dados_cotas['dt_ref'] = pd.to_datetime('20' + dados_cotas['ano'] + dados_cotas['mes'] + dados_cotas['dia']).dt.date del dados_cotas['ano'] del dados_cotas['mes'] dados_cotas['data_bd'] = None dados_cotas['data_bd'] = dados_cotas['data_bd'].fillna(data_bd) dados_cotas = dados_cotas.append(dados_cotas1) dados_cotas = dados_cotas.drop_duplicates(subset=['isin_fundo', 'dt_ref']) ## Filtrar datas para estimativa dados_curvas = dados_curvas[(dados_curvas["dt_ref"] < data_final) & (dados_curvas["dt_ref"] > data_inicial)] dados_bacen = dados_bacen[(dados_bacen["data_referencia"] < data_final) & (dados_bacen["data_referencia"] > data_inicial)] dados_cotas = dados_cotas[(dados_cotas["dt_ref"] < data_final) & (dados_cotas["dt_ref"] > data_inicial)] #Ajusta o nome de duas colunas dados_bacen['nome'] = np.where(dados_bacen['codigo'] == 7, 'Bovespa - índice', dados_bacen['nome']) dados_bacen['nome'] = np.where(dados_bacen['codigo'] == 1, 'Dólar comercial (venda)', dados_bacen['nome']) #Tira os índices mensais dados_bacen = dados_bacen[dados_bacen['frequencia'] != "M"].copy() dados_cotas_chamber = dados_cotas[dados_cotas['isin_fundo'].isin( lista_fundos_excluidos)].copy() dados_cotas_chamber['codigo'] = 7 dados_cotas_chamber = dados_cotas_chamber[['isin_fundo', 'codigo']].copy() dados_cotas_chamber = dados_cotas_chamber.drop_duplicates() chamber_corr = dados_bacen[dados_bacen['codigo'] == 7].copy() dados_cotas_chamber = pd.merge(chamber_corr, dados_cotas_chamber, right_on=['codigo'], left_on=['codigo'], how='left') dados_cotas_chamber['nome'] = dados_cotas_chamber['isin_fundo'] for i in lista_fundos_excluidos: dados_cotas_chamber['codigo'] = np.where( dados_cotas_chamber['nome'].isin([i]), np.random.rand(), dados_cotas_chamber['codigo']) dados_cotas_chamber['codigo'] = dados_cotas_chamber['codigo'] * 100000 dados_cotas_chamber['codigo'] = dados_cotas_chamber['codigo'].astype(int) del dados_cotas_chamber['isin_fundo'] dados_bacen = dados_bacen.append(dados_cotas_chamber) dados_cotas = dados_cotas[~dados_cotas['isin_fundo']. isin(lista_fundos_excluidos)].copy() #Leitura e tratamento das variancias da bmfbovespa - seleciona apenas as ações da carteira dados_vol_bmf = pd.read_excel( full_path_from_database("bvmf") + 'volatilidade_bmf_' + dt_base + '.xlsx') logger.info("Arquivos lidos com sucesso") dados_vol_bmf.columns = [ 'codigo_negociacao', 'nome_empresa', 'preco_fechamento', 'ewma_anual' ] acoes_ibov = pd.read_excel( full_path_from_database("bvmf") + 'Composição_ibovespa_' + dt_base + '.xlsx') logger.info("Arquivos lidos com sucesso") acoes_ibov.columns = ['codigo', '1', '2', '3', '4'] acoes_ibov['codigo'] = acoes_ibov['codigo'] quaid_419 = pd.read_sql_query( 'SELECT * from projeto_inv.quaid_419 where id_relatorio_quaid419=' + str(id_relatorio_quaid419) + ' and FTRCODIGO = "AA1"', connection) logger.info("Leitura do banco de dados executada com sucesso") quaid_419 = quaid_419[quaid_419['data_bd'] == max(quaid_419['data_bd'])] quaid_419 = quaid_419.rename(columns={ 'EMFCODCUSTODIA': 'codigo', 'EMFCODISIN': '2' }) quaid_419 = quaid_419[['codigo', '2']].copy() acoes_ibov = acoes_ibov.append(quaid_419) lista_acoes = acoes_ibov['codigo'].unique() dados_vol_bmf = dados_vol_bmf[dados_vol_bmf.codigo_negociacao.isin( lista_acoes)].copy() dados_vol_bmf['codigo'] = 7 del dados_vol_bmf['nome_empresa'] del dados_vol_bmf['preco_fechamento'] del dados_vol_bmf['ewma_anual'] chamber_corr = dados_bacen[dados_bacen['codigo'] == 7].copy() dados_vol_bmf = pd.merge(chamber_corr, dados_vol_bmf, right_on=['codigo'], left_on=['codigo'], how='left') dados_vol_bmf['nome'] = dados_vol_bmf['codigo_negociacao'] + '_1' for i in lista_acoes: dados_vol_bmf['codigo'] = np.where( dados_vol_bmf['nome'].isin([i + '_1']), np.random.rand(), dados_vol_bmf['codigo']) dados_vol_bmf['codigo'] = dados_vol_bmf['codigo'] * 100000 dados_vol_bmf['codigo'] = dados_vol_bmf['codigo'].astype(int) del dados_vol_bmf['codigo_negociacao'] dados_bacen = dados_bacen.append(dados_vol_bmf) ## Lista de séries do Bacen a ser utlizada aux1 = dados_vol_bmf[['codigo', 'nome']].copy() aux1 = aux1.drop_duplicates() aux2 = dados_cotas_chamber[['codigo', 'nome']].copy() aux2 = aux2.drop_duplicates() aux2 = aux2.append(aux1) lista_series_bacen = aux2['codigo'].tolist() #lista_series_bacen = lista_series_bacen.tolist() n_len = len(lista_series_bacen) lista_series_bacen.insert(n_len, 1) n_len = len(lista_series_bacen) lista_series_bacen.insert(n_len, 7) ## Ajuste para variáveis virarem colunas tabela_ajustada = pd.pivot_table(dados_curvas, index=["dt_ref"], columns=["indexador_cod", "prazo"], values=["tx_spot_ano"]) ## Ajuste data Cupom Cambial (de 252 para 360) nova_lista = [] for i in range(len(tabela_ajustada.columns)): if tabela_ajustada.columns[i][1] == "DP": resultado = (tabela_ajustada.columns[i][0], "DP", int(tabela_ajustada.columns[i][2] * (360 / 252.))) else: resultado = tabela_ajustada.columns[i] nova_lista.append(resultado) tabela_ajustada.columns = nova_lista ## Ajuste data para PU tabela_pu = tabela_ajustada for coluna in tabela_ajustada.columns: periodo = coluna[2] taxa = coluna[1] if taxa == "DP": fator_data = (periodo / 360.) else: fator_data = (periodo / 252.) tabela_pu[coluna] = 100 / ((1 + tabela_ajustada[coluna])**fator_data) #Guarda valores para a proxy das cotas proxy_cotas = dados_bacen[['data_referencia', 'codigo', 'valor']][dados_bacen["codigo"] == 7].copy() teste = tabela_pu for serie in lista_series_bacen: try: dados_serie = dados_bacen[dados_bacen["codigo"] == serie] dados_serie = dados_serie.drop_duplicates( subset=['data_referencia', 'codigo']) teste = pd.merge(teste, dados_serie[["valor", "data_referencia"]], left_index=True, right_on=["data_referencia"], how="left") teste.rename(columns={'valor': dados_serie["nome"].iloc[0]}, inplace=True) teste.index = teste["data_referencia"] del teste["data_referencia"] except: pass #Ajustar a proxy das cotas - Ibovespa - serie historica que esta no bacen dados_cotas_proxy = pd.DataFrame(columns=['codigo', 'isin_fundo']) dados_cotas_proxy1 = [] lista_isin_fundo = dados_cotas['isin_fundo'].unique() for i in lista_isin_fundo: dados_cotas_proxy1.append(i) dados_cotas_proxy['isin_fundo'] = dados_cotas_proxy1 dados_cotas_proxy['codigo'] = 7 #Dropa duplicatas bacen proxy_cotas = proxy_cotas.drop_duplicates( subset=['data_referencia', 'codigo']) proxy_cotas.columns = ['dt_ref', 'codigo', 'cota'] dados_cotas_proxy = pd.merge(dados_cotas_proxy, proxy_cotas, left_on=['codigo'], right_on=['codigo'], how='left') dados_cotas = dados_cotas_proxy[['dt_ref', 'isin_fundo', 'cota']].copy() tabela_cotas = pd.pivot_table(dados_cotas, index=["dt_ref"], columns=["isin_fundo"], values=["cota"]) teste = teste.merge(tabela_cotas, left_index=True, right_index=True) ## Preencher datas vazias com o último valor disponível teste.fillna(method='pad', inplace=True) ## Preencher o histórico de nan com o primeiro valor da série teste.fillna(method='bfill', inplace=True) ## Cálculo do retorno diário retornos = teste.pct_change() ## Retirar primeira observação NaN retornos = retornos[1:] aux = retornos**2 aux.to_excel(save_path + 'retornos' + str(data_final) + '.xlsx') logger.info("Arquivos salvos com sucesso") connection.close() pickle_file = open(retornos_path + 'matriz_gerencial_retornos' + ".pkl", "w") pickle.dump(retornos, pickle_file) pickle_file.close()
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)
def mtm_curva_titprivado(): import datetime, time import pandas as pd import numpy as np import pymysql as db import logging 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 from dependencias.Metodos.funcoes_auxiliares import get_global_var 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 = full_path_from_database( 'get_output_quadro419') + 'puposicao_final.xlsx' save_path_titprivado_perc = full_path_from_database( 'get_output_quadro419') + 'titprivado_perc.xlsx' tol = float(get_global_var("tol")) writer = ExcelWriter(save_path_puposicao) # 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' #query = "SELECT * tipo_ativo FROM mtm_titprivado WHERE tipo_ativo <> 'DBS' AND tipo_ativo <> 'CTF'" mtm_titprivado0 = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") logger.info("Tratando dados") mtm_titprivado = mtm_titprivado0.copy() # Tira debentures mtm_titprivado = mtm_titprivado[(mtm_titprivado.tipo_ativo != 'DBS') & (mtm_titprivado.tipo_ativo != 'CTF')] 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)] del mtm_titprivado['dtrel'] mtm_titprivado = mtm_titprivado.rename(columns={ 'data_fim': 'dt_ref', 'dtoperacao': 'dtoperacao_mtm' }) 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] # Retuira papéis com valor nominal zerado ou vazio mtm_titprivado = mtm_titprivado[ (mtm_titprivado.valor_nominal.notnull()) & (mtm_titprivado.valor_nominal != 0)].copy() del mtm_titprivado['data_bd'] # Informações XML query = 'SELECT * FROM projeto_inv.xml_titprivado_org' xml_titprivado = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") #Fecha conexão connection.close() 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)] del xml_titprivado['data_bd'] del xml_titprivado['dtrel'] original = xml_titprivado.copy() del xml_titprivado['indexador'] # mtm_titprivado.to_excel(save_path+'checa_id.xlsx') titprivado1 = mtm_titprivado.copy() # 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 logger.info("Escolha do melhor mtm") # 2 - Escolha do melhor mtm titprivado_mercado = titprivado[(titprivado.caracteristica == 'N') & (titprivado.mtm.notnull()) & (titprivado.mtm != 0)] titprivado_mercado['dif_mtm'] = titprivado_mercado[ 'puposicao'] / titprivado_mercado['mtm'] - 1 titprivado_mercado['dif_mtm'] = titprivado_mercado['dif_mtm'].abs() titprivado_mercado = titprivado_mercado[ titprivado_mercado.dt_ref == titprivado_mercado.data_referencia].copy() titprivado_mercado = titprivado_mercado[[ 'id_papel_old', 'id_papel', 'codigo_isin', 'dif_mtm' ]].copy() titprivado_mercado = titprivado_mercado.sort(['dif_mtm'], ascending=[True]) titprivado_mercado = titprivado_mercado.drop_duplicates( subset=['id_papel'], take_last=False) titprivado = titprivado.merge( titprivado_mercado, on=['id_papel_old', 'id_papel', 'codigo_isin'], how='left') titprivado = titprivado[((titprivado.caracteristica == 'N') & (titprivado.dif_mtm.notnull())) | (titprivado.caracteristica == 'V')].copy() tp_aux = titprivado[['id_papel', 'isin', 'dtvencimento']][titprivado.dif_mtm.isnull()].copy() tp_aux = tp_aux.drop_duplicates(subset=['id_papel']) tp_aux.to_excel(writer, 'sem_mtm') titprivado = titprivado.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') logger.info("Cálculo marcação na curva") # 3 - Cálculo marcação na curva 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("Separação dos pu's que ficaram muito distantes do informado") # 4 - Separação dos pu's que ficaram muito distantes do informado titprivado['dif_curva'] = titprivado['dif_curva'].fillna(0) titprivado['dif_mtm'] = titprivado['dif_mtm'].fillna(0) titprivado['dif'] = titprivado['dif_curva'] + titprivado['dif_mtm'] # Retirar atualizar valores de papéis cujo dif é grande em apenas uma das observações x = titprivado[[ 'codigo_isin', 'id_papel' ]][titprivado.dt_ref == titprivado.data_referencia].groupby( ['codigo_isin']).count() x = x.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') x1 = pd.DataFrame(columns=['codigo_isin', 'count_all']) x1['codigo_isin'] = x['codigo_isin'] x1['count_all'] = x['id_papel'] titprivado = titprivado.merge(x1, on=['codigo_isin'], how='left') x = titprivado[[ 'codigo_isin', 'id_papel' ]][(titprivado.dt_ref == titprivado.data_referencia) & (titprivado.dif > tol) & (titprivado.caracteristica == 'N')].groupby( ['codigo_isin']).count() x = x.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') x1 = pd.DataFrame(columns=['codigo_isin', 'count_0']) x1['codigo_isin'] = x['codigo_isin'] x1['count_0'] = x['id_papel'] titprivado = titprivado.merge(x1, on=['codigo_isin'], how='left') titprivado['count_0'] = np.where(titprivado['dif'] < tol, titprivado['count_all'], titprivado['count_0']) titprivado['count_dif'] = titprivado['count_all'] - titprivado['count_0'] x = pd.DataFrame() x = titprivado[['id_papel' ]][(titprivado.count_dif != 0) & (titprivado.dt_ref == titprivado.data_referencia) & (titprivado.caracteristica == 'N')].copy() x['change'] = 1 titprivado = titprivado.merge(x, on=['id_papel'], how='left') x = pd.DataFrame() x = titprivado[['codigo_isin' ]][(titprivado.count_dif != 0) & (titprivado.dt_ref == titprivado.data_referencia) & (titprivado.caracteristica == 'N')].copy() x['change_basis'] = 2 x = x.drop_duplicates() titprivado = titprivado.merge(x, on=['codigo_isin'], how='left') x = titprivado[['codigo_isin', 'puposicao' ]][(titprivado.change_basis == 2) & (titprivado.change != 1)].groupby(['codigo_isin' ]).agg(['mean']) x = x.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') x1 = pd.DataFrame(columns=['codigo_isin', 'puposnew']) x1['codigo_isin'] = x['codigo_isin'] x1['puposnew'] = x['puposicao'] titprivado = titprivado.merge(x1, on=['codigo_isin'], how='left') titprivado['puposicao1'] = np.where(titprivado['change'] == 1, titprivado['puposnew'], titprivado['puposicao']) titprivado['change'] = titprivado['change'].fillna(0) del titprivado['change_basis'] titprivado['dif'] = titprivado['mtm'] / titprivado['puposicao1'] - 1 titprivado['dif'] = titprivado['dif'].abs() logger.info("Cálculo spread de crédito") # 4 - Cálculo spread de crédito titprivado_spread = \ titprivado[['id_papel', 'codigo_isin', 'data_referencia', 'puposicao1', 'dt_ref', 'prazo_du', 'pv']][ (titprivado.caracteristica == 'N')] # Tira a média dos puposicao para calcular spread único por isin x = titprivado_spread[['codigo_isin', 'puposicao1' ]].groupby(['codigo_isin']).agg(['mean']) x = x.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') x1 = pd.DataFrame(columns=['codigo_isin', 'pumedio']) x1['codigo_isin'] = x['codigo_isin'] x1['pumedio'] = x['puposicao1'] titprivado_spread = titprivado_spread.merge(x1, on=['codigo_isin'], how='left') titprivado_spread['puposicao1'] = titprivado_spread['pumedio'] del titprivado_spread['pumedio'] # Seleciona apenas o fluxo com prazo_du positivo titprivado_spread = titprivado_spread[ titprivado_spread.dt_ref >= titprivado_spread.data_referencia] titprivado_spread['pv_pv_fluxo'] = np.where( titprivado_spread['dt_ref'] == titprivado_spread['data_referencia'], -titprivado_spread['puposicao1'], titprivado_spread['pv']) tp_spread = titprivado_spread[[ 'id_papel', 'codigo_isin', 'dt_ref', 'prazo_du', 'pv_pv_fluxo' ]].copy() tp_spread['prazo_du'] = tp_spread['prazo_du'].astype(float) 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, 100000) t = tp_spread['prazo_du'][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') logger.info("Seleção dos papéis cuja marcação não ficou boa") # 5 - Seleção dos papéis cuja marcação não ficou boa tp_bigdif = titprivado[[ 'data_referencia', 'codigo_isin', 'id_papel', 'flag', 'caracteristica', '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', 'juros_per', 'saldo_dev_juros', 'pv', 'fv', 'mtm', 'puposicao', 'puposicao1', 'change', 'count_0', 'count_all', 'dif', 'spread' ]].copy() tp_bigdif['dif'] = tp_bigdif['mtm'] / tp_bigdif['puposicao1'] - 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 % de mtm com o spread e carregamento da tabela" ) # 6 - 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[titprivado_perc.prazo_du >= 0] # 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['puposicao1'] titprivado_perc['dif_new'] = titprivado_perc['dif_new'].abs() titprivado_perc[ 'dif_old'] = titprivado_perc['mtm_old'] - titprivado_perc['puposicao1'] 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']) # 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'] titprivado_perc['perc_mtm'] = np.where( titprivado_perc['caracteristica'] == 'V', titprivado_perc['pv_old'] / titprivado_perc['mtm'], titprivado_perc['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', 'puposicao1', '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', 'puposicao1', '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'] writer.save() # 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['dif_mtm'] del titprivado_perc['dif_curva'] del titprivado_perc['pupar'] del titprivado_perc['count_all'] del titprivado_perc['count_0'] del titprivado_perc['count_dif'] del titprivado_perc['change'] del titprivado_perc['puposnew'] del titprivado_perc['puposicao1'] 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'] # Tabelas não necessárias - XML del titprivado_perc['id_xml_titprivado'] del titprivado_perc['isin'] del titprivado_perc['codativo'] 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'] # 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.to_excel(save_path_titprivado_perc) 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") # 6 - Preenchimento tabela xml del original['id_xml_titprivado'] 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.rename(columns={'mtm': 'mtm_calculado'}) titprivado_xml['pu_mercado'] = np.where( titprivado_xml['caracteristica'] == 'N', titprivado_xml['mtm_calculado'], 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['pu_mercado'] = np.where( (final['pu_mercado'].isnull()) | (final['pu_mercado'] == 0), 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['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() 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_titprivado") pd.io.sql.to_sql(final, name='xml_titprivado', con=connection, if_exists='append', flavor='mysql', index=0) #Fecha conexão connection.close()
def interpolacao_curvas_bmf(): import pymysql as db import pandas as pd import datetime import logging from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior 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 = ['2016','11','30'] #dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2] #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") def interpolacao(tp_curva, dt_ref): global curva_ettj global curva_ettj_fim global list_of_values global amostra try: ano = str(dt_ref[0:4]) mes = str(dt_ref[5:7]) dia = str(dt_ref[8:10]) data = datetime.date(int(ano), int(mes), int(dia)) query = 'select * from projeto_inv.bmf_curvas_' + str(ano) + '_' + str(mes) + ' where data_ref='+'"'+dt_ref+'" and codigo='+'"'+tp_curva+'";' #query = "select * from projeto_inv.bmf_curvas where data_ref='2016-12-07' and codigo='PRE'" amostra = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") #amostra = amostra.rename(columns={'id_bmf_curva_' + str(ano) + '_' + str(mes): 'id_bmf_curva'}) if tp_curva=='DP': ref_data=360 ref_data_txt='360' else: ref_data=252 ref_data_txt='252' #listar as colunas da tabela: tp_mtm.columns.tolist() #amostra=curvas[curvas['Codigo']==tp_curva] amostra=amostra.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') amostra.index = amostra.index + 1 #prazo_max=max(amostra['Prazo']) if tp_curva=='DP': prazo_max=2520 list_of_values = [21, 63, 126, 252, 378, 504, 630 , 756, 1008, 1260, 2520] elif tp_curva=='DIM': prazo_max=12600 list_of_values = [63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780, 5040, 6300, 7560, 8820, 10080, 11340, 12600] elif tp_curva=='DIC': prazo_max=12600 list_of_values = [63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780, 5040, 6300, 7560, 8820, 10080, 11340, 12600] elif tp_curva=='TP': prazo_max=12600 list_of_values = [63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780, 5040, 6300, 7560, 8820, 10080, 11340, 12600] else: prazo_max=3780 list_of_values=[21, 63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780] #curva_ettj=pd.DataFrame(columns=['id_bmf_curva', 'prazo','tx_spot', 'tx_spot_ano']) curva_ettj=pd.DataFrame(columns=['id_bmf_curva', 'prazo','tx_spot']) curva_ettj1=pd.DataFrame(columns=['prazo','tx_spot']) max_vertice=max(amostra['Prazo']) i=1 i1=1 for i1 in range(1,min(prazo_max,max_vertice)+1): #for i1 in range(1, prazo_max): if i1==amostra['Prazo'][i]: curva_ettj.loc[i1]=[amostra['id_bmf_curva'][i], i1, (1+amostra[ref_data_txt][i]/100)**(i1/ref_data)-1] #curva_ettj['tx_spot_ano']=(1+curva_ettj['tx_spot'])**(ref_data/curva_ettj['prazo'])-1 i1=i1+1 i=i+1 elif i1<amostra['Prazo'][i]: curva_ettj.loc[i1]=[amostra['id_bmf_curva'][i], i1, (1+amostra[ref_data_txt][i]/100)**(i1/ref_data)-1] #curva_ettj['tx_spot_ano']=(1+curva_ettj['tx_spot'])**(ref_data/curva_ettj['prazo'])-1 i1=i1+1 #elif i1>max_vertice: else: #curva_ettj['tx_spot_ano'][i1]=curva_ettj['tx_spot_ano'][i1-1] #curva_ettj['tx_spot'][i]=((1+curva_ettj['tx_spot_ano'][i1])**(curva_ettj['prazo'][i1]/ref_data))-1 curva_ettj.loc[i1]=[amostra['id_bmf_curva'][i], i1, (1+curva_ettj['tx_spot'][i1-1])*(((1+amostra[ref_data_txt][i+1]/100)**(amostra['Prazo'][i+1]/ref_data))/(1+curva_ettj['tx_spot'][i1-1]))**((i1-curva_ettj['prazo'][i1-1])/(amostra['Prazo'][i+1]-curva_ettj['prazo'][i1-1]))-1] i1=i1+1 while i1<(prazo_max+1): #curva_ettj1['prazo'][0]=curva_ettj['prazo'][i1-1]+1 #curva_ettj1['tx_spot'][1]= (1+curva_ettj['tx_spot'][max_vertice])**(curva_ettj['prazo'][i1]/curva_ettj['prazo'][max_vertice]) curva_ettj1.loc[i1]= [i1, ((1+curva_ettj['tx_spot'][max_vertice])**(ref_data/curva_ettj['prazo'][max_vertice]))**(i1/ref_data)-1] i1=i1+1 curva_ettj=curva_ettj.append(curva_ettj1) curva_ettj['prazo']= curva_ettj['prazo'].astype(int) #curva_ettj['id_bmf_curva']= curva_ettj['id_bmf_curva'].astype(int) curva_ettj['tx_spot_ano']=(1+curva_ettj['tx_spot'])**(ref_data/curva_ettj['prazo'])-1 curva_ettj['tx_spot_shift']=curva_ettj['tx_spot'].shift() curva_ettj['tx_spot_shift']=curva_ettj['tx_spot_shift'].fillna(0) curva_ettj['tx_termo_dia']=(1+curva_ettj['tx_spot'])/(1+curva_ettj['tx_spot_shift'])-1 curva_ettj['indexador_cod']=tp_curva curva_ettj['dt_ref']=dt_ref del curva_ettj['tx_spot_shift'] curva_ettj['prazo']=curva_ettj['prazo'].astype(int) curva_ettj['data_bd'] = datetime.datetime.now() curva_ettj_fim=curva_ettj[curva_ettj['prazo'].isin(list_of_values)] #Salvar no MySQL logger.info("Salvando base de dados - curva_ettj_vertices_fixos") pd.io.sql.to_sql(curva_ettj_fim, name='curva_ettj_vertices_fixos', con=connection, if_exists='append', flavor='mysql', index=0) logger.info("Salvando base de dados - curva_ettj_interpol_"+str(ano)+'_'+str(mes)) pd.io.sql.to_sql(curva_ettj, name='curva_ettj_interpol_' + str(ano) + '_' + str(mes), con=connection, if_exists='append', flavor='mysql', index=0) except: logger.info("Interpolação não executada") return None dt_ref = pd.date_range (start=datetime.date(int(dtbase[0]),int(dtbase[1]),1), end=datetime.date(int(dtbase[0]),int(dtbase[1]),int(dtbase[2])), freq='D').date for dt in dt_ref: dt = str(dt) try: logger.info("Fazendo interpolacao para PRE, data --> " + str(dt)) interpolacao('PRE', dt) logger.info("Finalizado PRE") logger.info("Fazendo interpolacao para DIC, data --> " + str(dt)) interpolacao('DIC', dt) logger.info("Finalizado DIC") logger.info("Fazendo interpolacao para DIM, data --> " + str(dt)) interpolacao('DIM', dt) logger.info("Finalizado DIM") logger.info("Fazendo interpolacao para DP, data --> " + str(dt)) interpolacao('DP', dt) logger.info("Finalizado DP") logger.info("Fazendo interpolacao para TP, data --> " + str(dt)) interpolacao('TP', dt) logger.info("Finalizado TP") logger.info("Interpolações completas") except: logger.info(dt) connection.close()
def importacao_rating_bloomberg(): import pandas as pd import pymysql as db import logging 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() dt_ref = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2] data_bd = pd.datetime.today() # Define as variáveis de input e output dos arquivos worksheet_path = full_path_from_database( "bloomberg_ratings_input" ) + 'levantamento de contrapartes ' + dt_ref + '.xlsx' save_path = full_path_from_database("bloomberg_ratings_output") bancos = pd.read_excel(worksheet_path, sheetname='bancos_sem_Link', skiprows=1, header=0) logger.info("Leitura dos arquivos executada com sucesso") logger.info("Tratando dados") contraparte_rtg = pd.DataFrame(columns=[ 'cnpj', 'contraparte', 'id_bloomberg', 'issuer', 'agencia_tipo_rtg', 'rtg', 'dt_ref', 'data_bd' ]) n = len(bancos) i = 0 i1 = 0 for i in range(0, n): contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_ST_DEBT_LC', bancos['RTG_FITCH_ST_DEBT_LC'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_LT_ISSUER_DEFAULT', bancos['RTG_FITCH_LT_ISSUER_DEFAULT'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_OUTLOOK', bancos['RTG_FITCH_OUTLOOK'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_ST_LC_DEBT', bancos['RTG_MDY_ST_LC_DEBT'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_LC_CURR_ISSUER_RATING', bancos['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_OUTLOOK', bancos['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_SP', bancos['RTG_SP'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_SP_ST_LC_ISSUER_CREDIT', bancos['RTG_SP_ST_LC_ISSUER_CREDIT'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY', bancos['RTG_MOODY'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY_NO_WATCH', bancos['RTG_MOODY_NO_WATCH'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY_LONG_TERM', bancos['RTG_MOODY_LONG_TERM'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY_LONG_ISSUE_LEVEL', bancos['RTG_MOODY_LONG_ISSUE_LEVEL'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY_DES', bancos['RTG_MOODY_DES'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_OUTLOOK', bancos['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_SEN_UNSECURED_DEBT', bancos['RTG_MDY_SEN_UNSECURED_DEBT'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_INITIAL', bancos['RTG_MDY_INITIAL'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_LC_CURR_ISSUER_RATING', bancos['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_LT_CORP_FAMILY', bancos['RTG_MDY_LT_CORP_FAMILY'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_ISSUER', bancos['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR', bancos['RTG_MDY_NSR'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR', bancos['RTG_MDY_NSR'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_ISSUER', bancos['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_SHORT_TERM', bancos['RTG_MDY_NSR_SHORT_TERM'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_SR_UNSECURED', bancos['RTG_MDY_NSR_SR_UNSECURED'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_SUBORDINATED', bancos['RTG_MDY_NSR_SUBORDINATED'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_LT_CORP_FAMILY', bancos['RTG_MDY_NSR_LT_CORP_FAMILY'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_SP_NATIONAL', bancos['RTG_SP_NATIONAL'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_SP_NATIONAL_LT_ISSUER_CREDIT', bancos['RTG_SP_NATIONAL_LT_ISSUER_CREDIT'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_NATIONAL_LT', bancos['RTG_FITCH_NATIONAL_LT'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_NATIONAL', bancos['RTG_FITCH_NATIONAL'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_NATIONAL_ST', bancos['RTG_FITCH_NATIONAL_ST'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_NATL_SUBORDINATED', bancos['RTG_FITCH_NATL_SUBORDINATED'][i], dt_ref, data_bd ] i1 = i1 + 1 contraparte_rtg.loc[i1] = [ bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i], bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_NATIONAL_SR_UNSECURED', bancos['RTG_FITCH_NATIONAL_SR_UNSECURED'][i], dt_ref, data_bd ] i1 = i1 + 1 i = i + 1 base_contraparte = contraparte_rtg[(~contraparte_rtg['rtg'].isnull()) & ( contraparte_rtg['rtg'] != '#N/A Field Not Applicable')] # importar rating por isin isin = pd.read_excel(worksheet_path, sheetname='isin_sem_link', skiprows=1, header=0) logger.info("Leitura dos arquivos executada com sucesso") isin_rtg = pd.DataFrame(columns=[ 'cnpj', 'contraparte', 'isin', 'id_bloomberg', 'agencia_tipo_rtg', 'rtg', 'dt_ref', 'data_bd' ]) n = len(isin) i = 0 i1 = 0 for i in range(0, n): isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_ST_DEBT_LC', isin['RTG_FITCH_ST_DEBT_LC'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_LT_ISSUER_DEFAULT', isin['RTG_FITCH_LT_ISSUER_DEFAULT'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_OUTLOOK', isin['RTG_FITCH_OUTLOOK'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_ST_LC_DEBT', isin['RTG_MDY_ST_LC_DEBT'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_LC_CURR_ISSUER_RATING', isin['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_OUTLOOK', isin['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_SP', isin['RTG_SP'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_SP_ST_LC_ISSUER_CREDIT', isin['RTG_SP_ST_LC_ISSUER_CREDIT'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY', isin['RTG_MOODY'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_NO_WATCH', isin['RTG_MOODY_NO_WATCH'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_LONG_TERM', isin['RTG_MOODY_LONG_TERM'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_LONG_ISSUE_LEVEL', isin['RTG_MOODY_LONG_ISSUE_LEVEL'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_DES', isin['RTG_MOODY_DES'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_OUTLOOK', isin['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_SEN_UNSECURED_DEBT', isin['RTG_MDY_SEN_UNSECURED_DEBT'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_INITIAL', isin['RTG_MDY_INITIAL'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_LC_CURR_ISSUER_RATING', isin['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_LT_CORP_FAMILY', isin['RTG_MDY_LT_CORP_FAMILY'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_ISSUER', isin['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR', isin['RTG_MDY_NSR'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR', isin['RTG_MDY_NSR'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_ISSUER', isin['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_SHORT_TERM', isin['RTG_MDY_NSR_SHORT_TERM'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_SR_UNSECURED', isin['RTG_MDY_NSR_SR_UNSECURED'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_SUBORDINATED', isin['RTG_MDY_NSR_SUBORDINATED'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_LT_CORP_FAMILY', isin['RTG_MDY_NSR_LT_CORP_FAMILY'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_SP_NATIONAL', isin['RTG_SP_NATIONAL'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_SP_NATIONAL_LT_ISSUER_CREDIT', isin['RTG_SP_NATIONAL_LT_ISSUER_CREDIT'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL_LT', isin['RTG_FITCH_NATIONAL_LT'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL', isin['RTG_FITCH_NATIONAL'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL_ST', isin['RTG_FITCH_NATIONAL_ST'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATL_SUBORDINATED', isin['RTG_FITCH_NATL_SUBORDINATED'][i], dt_ref, data_bd ] i1 = i1 + 1 isin_rtg.loc[i1] = [ isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i], isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL_SR_UNSECURED', isin['RTG_FITCH_NATIONAL_SR_UNSECURED'][i], dt_ref, data_bd ] i1 = i1 + 1 i = i + 1 isin_rtg_fim = isin_rtg[(~isin_rtg['rtg'].isnull()) & (isin_rtg['rtg'] != '#N/A Field Not Applicable') & (isin_rtg['rtg'] != '#N/A Invalid Security')] issuer = isin_rtg_fim[isin_rtg_fim['agencia_tipo_rtg'].str.contains( 'ISSUER')] isin_final = isin_rtg_fim[~isin_rtg_fim['agencia_tipo_rtg'].str. contains('ISSUER')] del isin_final['cnpj'] del isin_final['contraparte'] del issuer['isin'] base_contraparte = base_contraparte.append(issuer) base_contraparte['cnpj'] = base_contraparte['cnpj'].str.split('.') base_contraparte['cnpj'] = base_contraparte['cnpj'].str[0] base_contraparte['rtg'] = base_contraparte['rtg'].replace( to_replace='#N/A Requesting Data...', value=None) 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 - Tabela rating_isin") pd.io.sql.to_sql(isin_final, name='rating_isin', con=connection, if_exists='append', flavor='mysql', index=0) logger.info("Salvando base de dados - Tabela rating_contraparte") pd.io.sql.to_sql(base_contraparte, name='rating_contraparte', con=connection, if_exists='append', flavor='mysql', index=0) connection.close() base_contraparte.to_excel(save_path + 'contrapartes.xlsx') logger.info("Arquivos salvos com sucesso")
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()
def relatorio_risco_credito(): import datetime import pandas as pd import pymysql as db import numpy as np import openpyxl import logging from openpyxl.styles import Font, Color, Border, Side, PatternFill, Alignment from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import get_global_var from dependencias.Metodos.funcoes_auxiliares import full_path_from_database global header_id_carteira_fundos logger = logging.getLogger(__name__) dt_base = get_data_ultimo_dia_util_mes_anterior() dt_base = dt_base[0]+'-'+dt_base[1]+'-'+dt_base[2] nivel_confianca=int(get_global_var("nivel_confianca_relatorio_credito")) end = full_path_from_database("get_output_var")+'relatorios/' cnpj_hdi=get_global_var("cnpj_hdi") def relatorio_credito(dt_base,cnpj,nivel_confianca,horario_bd): global percentil global header_id_carteira global header_nome global cnpj_fundo global administrador global gestor global quadro_oper global pl_info global tp global id_relatorio_qo global pl_credito global perc_credito global pe global duration_carteira global rtg_lp # Create a Pandas Excel writer using XlsxWriter as the engine. writer = pd.ExcelWriter(end+cnpj+"_"+dt_base+' relatorio_credito.xlsx', engine='xlsxwriter') workbook = writer.book numero_float = workbook.add_format({'num_format': '#,##0', 'bold': False}) percent = workbook.add_format({'num_format': '0.0%', 'bold': False}) percentil=nivel_confianca 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 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 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) header_nome=df.get_value(0,'nome') cnpj_fundo=cnpj administrador=df.get_value(0, 'nomeadm') gestor=df.get_value(0, 'nomegestor') 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) pl=quadro_oper[quadro_oper['produto']!='Futuro'] pl_info=sum(pl['mtm_info']) #selecionar crédito tp=quadro_oper.loc[quadro_oper['produto'].isin(['título privado','debênture'])] #id_relatorio_qo id_relatorio_qo=quadro_oper['id_relatorio_qo'].iloc[0] id_relatorio_qo_str=str(id_relatorio_qo) if len(tp)>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) pl_credito=sum(tp['mtm_info']) perc_credito=pl_credito/pl_info # incluir 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'] tp=pd.merge(tp, caracteristica, left_on='isin', right_on='codigo_isin', how='left') tp.ix[tp.tipo_ativo == 'CC', 'tipo_prod']='CCB' tp.ix[tp.tipo_ativo == 'CCC', 'tipo_prod']='CCCB' tp.ix[tp.tipo_ativo =='DBS', 'tipo_prod']='Debênture' tp.ix[tp.tipo_ativo =='C', 'tipo_prod']='CDB' tp.ix[tp.tipo_ativo =='LFI', 'tipo_prod']='LF' tp.ix[tp.tipo_ativo =='LFN', 'tipo_prod']='LF' tp.ix[tp.tipo_ativo =='DP', 'tipo_prod']='DPGE' tp.ix[tp.produto =='fundo', 'tipo_prod']='FIDC' tp['tipo_prod']=tp['tipo_prod'].fillna('Outros') 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) del tp['codigo_isin'] #informação de emissor (contraparte) 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) 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) emissor2=emissor1[['cnpj', 'nome_emissor']] tp=pd.merge(tp, emissor2, left_on='cnpj', right_on='cnpj', how='left') tp['contraparte']=tp['contraparte'].fillna(tp['nome_emissor']) del tp['nome_emissor'] tp['contraparte']=tp['contraparte'].fillna('a') # selecionar simulação de perda de crédito #query='select a.* from projeto_inv.simulacao_credito a right join (select id_relatorio_qo, max(data_bd) as data_bd from projeto_inv.simulacao_credito where id_relatorio_qo = "51" group by 1) b on a.id_relatorio_qo=b.id_relatorio_qo and a.data_bd=b.data_bd;' query ='SELECT contraparte, isin, pv, perda_perc, pv_perda, duration, dt_base FROM projeto_inv.simulacao_credito_consolidado;' sim=pd.read_sql(query,con=connection) sim['perda_perc']=sim['perda_perc'].fillna(0) # perda esperada por isin perda_isin=sim[['isin', 'perda_perc']].copy() #perda_isin=perda_isin.groupby(['isin'], as_index=False).mean() perda_isin=perda_isin.rename(columns={'perda_perc':'perc_pe'}) tp_isin_mtm=tp[['cnpj','contraparte','isin','tipo_prod', 'mtm_info']].copy() tp_isin_mtm=tp_isin_mtm.groupby(['cnpj','contraparte','isin','tipo_prod'],as_index=False).sum() tp_isin_mtm=pd.merge(tp_isin_mtm, perda_isin, left_on='isin', right_on='isin', how='left') tp_isin_mtm['perda_esperada'] = tp_isin_mtm['perc_pe']*tp_isin_mtm['mtm_info'] tp_isin_mtm['perda_esperada']=tp_isin_mtm['perda_esperada'].fillna(0) # perda esperada da carteira perda=sum(tp_isin_mtm['perda_esperada']) pe=perda/pl_credito pe_carteira=pe*pl_credito/pl_info #composiçao da carteira - por tipo de produto prod=tp_isin_mtm[['tipo_prod', 'mtm_info', 'perda_esperada']] prod=prod.groupby(['tipo_prod'], as_index=False).sum() prod['perc_credito']=prod['mtm_info']/pl_credito prod['perc_pl']=prod['mtm_info']/pl_info prod['perc_pe']=prod['perda_esperada']/prod['mtm_info'] del prod['perda_esperada'] df_aux = pd.DataFrame(columns=['Dados Institucionais']) df_aux.to_excel(writer,index=False, sheet_name='Dados Institucionais', startrow =1, startcol=1, header =['Dados Institucionais']) prod.to_excel(writer,index=False, sheet_name='Resumo', startrow =14, startcol=1, header =['Tipo de produto', 'Exposição (R$)', '% PL de crédito', '% PL total', '% Perda Esperada']) # perda inesperada sim1=sim[['isin', 'pv_perda', 'pv']] isin_mtm=tp[['isin','mtm_info']].copy() isin_mtm=isin_mtm.groupby(['isin'],as_index=False).sum() sim2=pd.merge(sim1,isin_mtm, left_on='isin', right_on='isin', how='left' ) sim2['perc_perda']=sim2['pv_perda']/sim2['pv'] sim2['perda']=sim2['perc_perda']*sim2['mtm_info'] del sim2['perc_perda'] del sim2['pv'] del sim2['pv_perda'] sim_agr = sim2 sim_agr['perda']=sim_agr['perda'].fillna(0) sim_agr['perc_perda']=sim_agr['perda']/sim_agr['mtm_info'] sim_agr=sim_agr.sort(columns=['perc_perda'], ascending=True ) sim_agr=sim_agr.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') n_conf= np.floor(len(sim_agr)*percentil) percentil_conf=sim_agr['perc_perda'][n_conf-1] # Relatório só a MERCADO - cálculo de duration query='select a.* from projeto_inv.quaid_419 a right join (select id_relatorio_qo, tipo_relatorio, max(data_bd) as data_bd from projeto_inv.quaid_419 where id_relatorio_qo='+id_relatorio_qo_str+' and tipo_relatorio="R" group by 1,2) b on a.id_relatorio_qo=b.id_relatorio_qo and a.tipo_relatorio=b.tipo_relatorio and a.data_bd=b.data_bd;' quaid_419_r=pd.read_sql(query, con=connection) quaid_419_r['expo']=np.where(quaid_419_r['TPFOPERADOR']=='-',-1*quaid_419_r['EMFVLREXPRISCO'],quaid_419_r['EMFVLREXPRISCO'] ) quaid_419_r['prazo_ponderado']=quaid_419_r['expo']*quaid_419_r['EMFPRAZOFLUXO'] isin_credito=tp[['isin']].copy() isin_credito=isin_credito.drop_duplicates(subset=['isin'], take_last=True) quaid_419_credito=pd.merge(isin_credito,quaid_419_r, left_on=['isin'], right_on=['EMFCODISIN'], how='left' ) duration=quaid_419_credito[['EMFCODISIN','expo','prazo_ponderado']].copy() duration_ativa=duration[duration.expo>=0].copy() duration_ativa_papel=duration_ativa.groupby('EMFCODISIN', as_index=False).sum() duration_ativa_papel['duration']=duration_ativa_papel['prazo_ponderado']/duration_ativa_papel['expo'] #duration carteira duration_c=quaid_419_credito[['EMFPRAZOFLUXO','expo']].copy() duration_c1=duration_c.groupby(['EMFPRAZOFLUXO'], as_index=False).sum() duration_c1['prazo_ponderado']=duration_c1['expo']*duration_c1['EMFPRAZOFLUXO'] duration_carteira=sum(duration_c1['prazo_ponderado'])/sum(duration_c1['expo']) #rating da carteira query='select a.rtg, a.prazo, a.pd_acum from projeto_inv.pd_acum a right join (select max(data_bd) as data_bd from projeto_inv.pd_acum) b on a.data_bd=b.data_bd;' regua_unica=pd.read_sql(query, con=connection) regua_unica['pd_acum_shift']=regua_unica['pd_acum'].shift() regua_unica['prazo_shift']=regua_unica['prazo'].shift() regua_unica['pd_acum_min']=np.where(regua_unica['prazo_shift']==regua_unica['prazo'],regua_unica['pd_acum_shift'],0) del regua_unica['prazo_shift'] del regua_unica['pd_acum_shift'] duration_mes=np.floor(duration_carteira/22) if duration_mes>60: duration_carteira_temp=60 else: duration_carteira_temp=np.floor(duration_mes) rtg_carteira=regua_unica[regua_unica['prazo']==duration_carteira_temp].copy() rtg_carteira1=rtg_carteira[rtg_carteira['pd_acum_min']<=pe_carteira] rtg_carteira2=rtg_carteira1[rtg_carteira1['pd_acum']>pe_carteira] rtg_carteira2=rtg_carteira2.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') rtg_lp=rtg_carteira2.get_value(0,'rtg') # rating por produto 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 tp_cnpj=pd.merge(tp_isin_mtm, rtg_pior, left_on='isin', right_on='isin', how='left') tp_cnpj=tp_cnpj.rename(columns={'cod_rtg':'cod_rtg_isin', 'rtg':'rtg_isin'}) tp_cnpj=pd.merge(tp_cnpj, rtg_c_pior, left_on='cnpj', right_on='cnpj', how='left') tp_cnpj=tp_cnpj.rename(columns={'cod_rtg':'cod_rtg_cnpj', 'rtg':'rtg_cnpj'}) tp_cnpj['cod_rtg']=np.where(tp_cnpj['cod_rtg_isin'].isnull(),tp_cnpj.cod_rtg_cnpj,tp_cnpj.cod_rtg_isin) del tp_cnpj['cod_rtg_isin'] del tp_cnpj['cod_rtg_cnpj'] del tp_cnpj['rtg_isin'] del tp_cnpj['rtg_cnpj'] tp_cnpj=pd.merge(tp_cnpj, regua_rtg, left_on='cod_rtg', right_on='cod_rtg', how='left') ##assumir rtg padrão missing: 'Aa3' e cod_rtg=4 tp_cnpj['cod_rtg']=tp_cnpj['cod_rtg'].fillna(3) tp_cnpj['rtg']=tp_cnpj['rtg'].fillna('Aa2') sumario_rtg=tp_cnpj[['cod_rtg','rtg', 'mtm_info', 'perda_esperada']] sumario_rtg['mtm_info']=sumario_rtg['mtm_info'].fillna(0) sumario_rtg['perda_esperada']=sumario_rtg['perda_esperada'].fillna(0) sumario=sumario_rtg.groupby(['cod_rtg','rtg'], as_index=False).sum() sumario['perc_credito']= sumario['mtm_info']/pl_credito sumario['perc_tot']= sumario['mtm_info']/pl_info sumario['perc_pe']=sumario['perda_esperada']/sumario['mtm_info'] del sumario['cod_rtg'] del sumario['perda_esperada'] sumario.to_excel(writer,index=False, sheet_name='Resumo', startrow =25, startcol=1, header =['Rating', 'Exposição (R$)', '% PL de crédito', '% PL total', '% Perda Esperada']) worksheet = writer.sheets['Resumo'] worksheet.set_column('D:F', 12, percent) worksheet.set_column('C:C', 12, numero_float) # 20 maiores exposiçoes por contraparte contraparte=tp_cnpj[['cnpj', 'contraparte', 'mtm_info', 'perda_esperada']].copy() contraparte=contraparte.groupby(['cnpj', 'contraparte'], as_index=False).sum() contraparte['perc_exposicao']=contraparte['mtm_info']/pl_credito del contraparte['cnpj'] contraparte=contraparte.sort(['mtm_info'], ascending=False) contraparte=contraparte.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') contraparte['perc_pe']=contraparte['perda_esperada']/contraparte['mtm_info'] del contraparte['perda_esperada'] del contraparte['index'] contraparte1=contraparte[0:20] contraparte1.to_excel(writer,index=False, sheet_name='Maiores Exposições', startrow =3, startcol=1, header =['Contraparte', 'Exposição', '% PL de crédito', '% Perda Esperada']) worksheet = writer.sheets['Maiores Exposições'] worksheet.set_column('D5:E24', 12, percent) worksheet.set_column('C5:C24', 12, numero_float) # 20 maiores exposiçoes por produto prod=tp_isin_mtm[['contraparte','isin' , 'tipo_prod', 'mtm_info', 'perda_esperada']] prod=prod.groupby(['contraparte', 'isin', 'tipo_prod'], as_index=False).sum() prod['perc_credito']=prod['mtm_info']/pl_credito prod['perc_pe']=prod['perda_esperada']/prod['mtm_info'] prod=prod.sort(['mtm_info'], ascending=False) prod=prod.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='') del prod['perda_esperada'] del prod['index'] prod2=prod[0:20] prod2.to_excel(writer,index=False, sheet_name='Maiores Exposições', startrow =28, startcol=1, header =['Contraparte','Isin', 'Tipo de Produto','Exposição', '% PL de crédito', '% Perda Esperada']) worksheet = writer.sheets['Maiores Exposições'] worksheet.set_column('F32:G51', 12, percent) worksheet.set_column('E32:E51', 12, numero_float) writer.save() # inserir caracteristicas wb = openpyxl.load_workbook(end+cnpj+"_"+dt_base+' relatorio_credito.xlsx') #####FORMATOS #Fonte fontObj1=Font(name='Calibri', bold=True, size =24,color='404040') fontObj2=Font(name='Calibri', bold=False, size =11,color='404040') #Borda borderObj1=Border(bottom=Side(border_style='double'),top=Side(border_style='thin')) borderObj2=Border() #Cor colorObj1=PatternFill(patternType='solid', fgColor=Color('FFE600')) #Alinhamento alinObj1=Alignment(vertical='center',horizontal='center') alinObj2=Alignment(vertical='center',horizontal='left') alinObj3=Alignment(vertical='center',horizontal='right') #####Dados institucionais # #####Resumo sheet1=wb.get_sheet_by_name('Dados Institucionais') #Retira as gridlines sheet1.sheet_view.showGridLines = False #Formatação tamanho das linhas sheet1.row_dimensions[1].height = 90 #Formata cor da fonte de todas as células for row in sheet1.range('B2:C20'): for cell in row: cell.font=fontObj2 #Formata o título sheet1.merge_cells('B2:C2') sheet1['B2']='Dados Institucionais' sheet1['B2'].font=fontObj1 sheet1['B2'].alignment=alinObj2 for row in sheet1.range('B2:C2'): for cell in row: cell.border=borderObj1 #Cria a parte de informações institucionais e resumo do relatório de crédito sheet1['B4']='Nome' sheet1['C4']=header_nome sheet1['B5']='CNPJ' sheet1['C5']=cnpj_fundo sheet1['B6']='Administrador' sheet1['C6']=administrador sheet1['B7']='Gestor' sheet1['C7']=gestor #Formatação tamanho das colunas sheet1.column_dimensions['A'].width = 2 sheet1.column_dimensions['B'].width = 15 sheet1.column_dimensions['C'].width = 100 ####Resumo sheet1=wb.get_sheet_by_name('Resumo') #Retira as gridlines sheet1.sheet_view.showGridLines = False #Formatação tamanho das linhas sheet1.row_dimensions[1].height = 90 #Formata cor da fonte de todas as células for row in sheet1.range('B2:F100'): for cell in row: cell.font=fontObj2 #Formata o título sheet1.merge_cells('B2:F2') sheet1['B2']='Relatório Quantitativo de Risco de Crédito' sheet1['B2'].font=fontObj1 for row in sheet1.range('B2:F2'): for cell in row: cell.border=borderObj1 sheet1['B4']='Nível de Confiança' sheet1['C4']=percentil sheet1['B5']='PL do fundo (R$)' sheet1['C5']=pl_info sheet1['B6']='PL de crédito (R$)' sheet1['C6']=pl_credito sheet1['B7']='Duration - Crédito (DU)' sheet1['C7']=duration_carteira sheet1['B8']='% de crédito privado' sheet1['C8']=pl_credito/pl_info sheet1['B9']='Perda Esperada (em relação ao PL crédito)' sheet1['C9']=pe sheet1['B10']='Percentil da Perda ('+str(percentil)+')' sheet1['C10']=percentil_conf sheet1['B11']='Rating médio da carteira' sheet1['C11']=rtg_lp sheet1['B12']='Perda Esperada (em relação ao PL)' sheet1['C12']=pe_carteira #Formata os headers da tabela for row in sheet1.range('B15:F15'): for cell in row: cell.fill=colorObj1 cell.border=borderObj2 #Formata os headers da tabela for row in sheet1.range('B26:F26'): for cell in row: cell.fill=colorObj1 cell.border=borderObj2 #Formata os formatos de número for row in sheet1.range('C8:C10'): for cell in row: cell.number_format = "0.0%" cell.alignment=alinObj3 sheet1['C4'].number_format = "0.00" #Formatação tamanho das colunas sheet1.column_dimensions['A'].width = 2 sheet1.column_dimensions['B'].width = 40 sheet1.column_dimensions['C'].width = 25 sheet1.column_dimensions['D'].width = 25 sheet1.column_dimensions['E'].width = 25 sheet1.column_dimensions['F'].width = 25 ####Maiores exposições sheet1=wb.get_sheet_by_name('Maiores Exposições') #Retira as gridlines sheet1.sheet_view.showGridLines = False #Formatação tamanho das linhas sheet1.row_dimensions[1].height = 90 #Formata cor da fonte de todas as células for row in sheet1.range('B2:G100'): for cell in row: cell.font=fontObj2 #Formata o título sheet1.merge_cells('B2:G2') sheet1['B2']='20 Maiores Exposições por Contraparte' sheet1['B2'].font=fontObj1 for row in sheet1.range('B2:G2'): for cell in row: cell.border=borderObj1 #Formata os headers da tabela for row in sheet1.range('B4:G4'): for cell in row: cell.fill=colorObj1 cell.border=borderObj2 #Formata os headers da tabela for row in sheet1.range('B29:G29'): for cell in row: cell.fill=colorObj1 cell.border=borderObj2 #Formata os formatos de número for row in sheet1.range('E5:E24'): for cell in row: cell.number_format = "0.0%" #Formatação tamanho das colunas sheet1.column_dimensions['A'].width = 2 sheet1.column_dimensions['B'].width = 100 sheet1.column_dimensions['C'].width = 20 sheet1.column_dimensions['D'].width = 20 sheet1.column_dimensions['E'].width = 20 sheet1.column_dimensions['F'].width = 20 sheet1.column_dimensions['G'].width = 20 wb.save(end+cnpj+"_"+dt_base+' relatorio_credito.xlsx') else: cnpj_sem_credito = pd.DataFrame(columns=['cnpj','id_relatorio_qo','data_bd']) cnpj_sem_credito['cnpj'] = cnpj cnpj_sem_credito['id_relatorio_qo'] = id_relatorio_qo_str cnpj_sem_credito['data_bd'] = horario_bd pd.io.sql.to_sql(cnpj_sem_credito, name='rel_credito_log', con=connection,if_exists="append", flavor='mysql', index=0, chunksize=5000) 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") #Busca lista dos fundos de primeiro nivel na carteira da HDI query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";' df=pd.read_sql(query, con=connection) if len(df)==0: x='select * from projeto_inv.xml_header where cnpj="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";' df=pd.read_sql(x, 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_fundos=df.get_value(0,'header_id').astype(str) #Utiliza o header da carteira da HDI como chave para a query da lista lista_query='SELECT cnpj from projeto_inv.lista_fundos where data_bd=(select max(data_bd) from projeto_inv.lista_fundos where header_id="'+header_id_carteira_fundos+'");' lista_cnpj=pd.read_sql(lista_query, con=connection) lista=lista_cnpj['cnpj'].tolist() horario_bd = datetime.datetime.today() for cnpj in lista: relatorio_credito(dt_base,cnpj,nivel_confianca,horario_bd)
def finalizacao_fidc(): import datetime import pandas as pd import numpy as np import pymysql as db import logging 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] horario_bd = datetime.datetime.today() #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 = 'CTF'" mtm_titprivado0 = pd.read_sql(query, con=connection) logger.info("Salvando base de dados") connection.close() mtm_titprivado = mtm_titprivado0.copy() #Seleciona debentures #mtm_titprivado = mtm_titprivado[mtm_titprivado.tipo_ativo.isin(['CTF'])].copy() #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)] mtm_titprivado = mtm_titprivado.rename(columns={'data_fim':'dt_ref'}) #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 #Segura apenas fluxos positivos mtm_titprivado = mtm_titprivado[mtm_titprivado.prazo_du>=0].copy() del mtm_titprivado['data_bd'] del mtm_titprivado['dtrel'] logger.info("Cálculo de DV100 e Duration") #2 - Calculo de DV100 e Duration mtm_titprivado['DV100'] = (mtm_titprivado['mtm'] - mtm_titprivado['mtm_DV100'])/(mtm_titprivado['mtm']) #Duration mtm_titprivado['duration'] = mtm_titprivado['perc_mtm']*mtm_titprivado['prazo_du'] logger.info("Finalização e upload na base") #3 - Finalização e upload na base mtm_titprivado['mtm'] = None mtm_titprivado['data_bd'] = horario_bd mtm_titprivado['ano_mtm'] = mtm_titprivado['ano_mtm'].astype(str) mtm_titprivado['mes_mtm'] = mtm_titprivado['mes_mtm'].astype(str) mtm_titprivado['mes_mtm'] = mtm_titprivado['mes_mtm'].str.zfill(2) mtm_titprivado['dia_mtm'] = mtm_titprivado['dia_mtm'].astype(str) mtm_titprivado['dia_mtm'] = mtm_titprivado['dia_mtm'].str.zfill(2) mtm_titprivado['data_mtm'] = mtm_titprivado['ano_mtm'].astype(str) + mtm_titprivado['mes_mtm'].astype(str) + mtm_titprivado['dia_mtm'].astype(str) mtm_titprivado['data_mtm'] = pd.to_datetime(mtm_titprivado['data_mtm']).dt.date #Tabelas não necessárias - MTM del mtm_titprivado['indice_du_mtm'] del mtm_titprivado['indice_dc_mtm'] del mtm_titprivado['ano_dt_ref2'] del mtm_titprivado['mes_dt_ref2'] del mtm_titprivado['dia_dt_ref2'] del mtm_titprivado['vertices_positivo'] del mtm_titprivado['indice_dc_dt_ref2'] del mtm_titprivado['indice_du_dt_ref2'] del mtm_titprivado['prazo_dc'] del mtm_titprivado['ano_inicio'] del mtm_titprivado['mes_inicio'] del mtm_titprivado['dia_inicio'] del mtm_titprivado['indice_du_inicio'] del mtm_titprivado['indice_dc_inicio'] del mtm_titprivado['ano_fim'] del mtm_titprivado['mes_fim'] del mtm_titprivado['dia_fim'] del mtm_titprivado['indice_du_fim'] del mtm_titprivado['indice_dc_fim'] del mtm_titprivado['dt_ref'] del mtm_titprivado['dtoperacao'] 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(mtm_titprivado, name='mtm_renda_fixa', con=connection, if_exists='append', flavor='mysql', index=0) #Fecha conexão connection.close()
def processo_quaid_expo_var(): import pymysql as db import pandas as pd import datetime import logging from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import get_global_var from var.scripts.relatorio_encadeado.quaid419.quaid419 import quaid419 from var.scripts.relatorio_encadeado.exposicoes.exposicoes_conso import exposicoes_conso from var.scripts.relatorio_encadeado.exposicoes.exposicoes_sep import exposicoes_sep from var.scripts.relatorio_encadeado.var_gerencial.var_gerencial import var_gerencial #Definitions: logger = logging.getLogger(__name__) dtbase = get_data_ultimo_dia_util_mes_anterior() dtbase = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2] #dtbase = '2016-11-30' #Caso seja necessário forçar uma data horario_inicio= datetime.datetime.now() #Parametros gerados pelo arquivo 17-xml_quadro_operacoes_nao_org.py ao final da função parametrização inicio_hdi = int(get_global_var("inicio_hdi_quaid_expo_var")) fim_hdi = int(get_global_var("fim_hdi_quaid_expo_var")) inicio_gerling = int(fim_hdi)+1 fim_gerling = int(get_global_var("fim_gerling_quaid_expo_var")) coent_hdi = get_global_var("coent_hdi") coent_gerling = get_global_var("coent_gerling") #HDI horario_processo = datetime.datetime.today() for i in range(inicio_hdi, fim_hdi+1): quaid419(i, dtbase, coent_hdi, "G", horario_processo) quaid419(i, dtbase, coent_hdi, "R", horario_processo) 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 count_quadros where ENTCODIGO = "'+coent_hdi+'" and tipo_relatorio = "G" and data_bd = (SELECT max(data_bd) from count_quadros where ENTCODIGO = "'+coent_hdi+'" and tipo_relatorio = "G" )' lista = pd.read_sql(query, connection) logger.info("Leitura do banco de dados executada com sucesso") #Fecha conexão connection.close() for j in lista['id_relatorio_quaid419']: logger.info("Executando Relatório para HDI - ID: "+j) print("Executando Relatório para HDI - ID: " + j) exposicoes_conso(j) exposicoes_sep(j) var_gerencial(j, "normal", dtbase) var_gerencial(j, "estressado", dtbase) #Gerling horario_processo = datetime.datetime.today() for i in range(inicio_gerling, fim_gerling+1): quaid419(i, dtbase, coent_gerling, "G", horario_processo) quaid419(i, dtbase, coent_gerling, "R", horario_processo) 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 count_quadros where ENTCODIGO = "'+coent_gerling+'" and tipo_relatorio = "G" and data_bd = (SELECT max(data_bd) from count_quadros where ENTCODIGO = "'+coent_gerling+'" and tipo_relatorio = "G" )' lista = pd.read_sql(query, connection) logger.info("Leitura do banco de dados executada com sucesso") #Fecha conexão connection.close() for j in lista['id_relatorio_quaid419']: exposicoes_conso(j) exposicoes_sep(j) var_gerencial(j, "normal", dtbase) var_gerencial(j, "estressado", dtbase) horario_fim = datetime.datetime.now() tempo=horario_fim-horario_inicio print(tempo)
def get_bmf_curvas_historico(): import pandas as pd import pymysql as db import datetime import logging from dependencias.Metodos.funcoes_auxiliares import get_global_var from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior logger = logging.getLogger(__name__) # Retorna um array (ano, mes e dia) referente ao útimo dia útil do mês anterior configurado no banco de dados dtbase = get_data_ultimo_dia_util_mes_anterior() logger.info("Tratando dados") # Retorna um range de datas do mes anterior dt_ref = pd.date_range(start=datetime.date(int(dtbase[0]), int(dtbase[1]), 1), end=datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2])), freq='D').date # Para cada dia de referência do mês anterior, puxa as informações do site da bolsa e inseri no banco for i in dt_ref: print("Executando para o dia: " + str(i)) dia = str(i.day) mes = str(i.month) ano = str(i.year) if len(mes) == 1: mes = "0" + mes if len(dia) == 1: dia = "0" + dia lista_curvas = [ "ACC", "ALD", "AN", "ANP", "APR", "BRP", "CBD", "DCO", "DIC", "DIM", "DOC", "DOL", "DP", "EUC", "EUR", "IAP", "INP", "IPR", "JPY", "LIB", "NID", "PBD", "PDN", "PRE", "PTX", "SDE", "SLP", "SND", "TFP", "TP", "TR", "ZND" ] # Cria gabarito da tabela definitiva das curvas e também tabela aux2 que é pré-gabarito matriz_curvas = pd.DataFrame() aux2 = pd.DataFrame() for j in range(0, 5): matriz_curvas[j] = 0 aux2[j] = 0 matriz_curvas.columns = ['Prazo', '252', '360', 'Valor', 'Codigo'] aux2.columns = ['Prazo', '252', '360', 'Valor', 'Codigo'] # Acesso aos dados da página try: for curva in lista_curvas: # curva = lista_curvas[0] endereco_curvas = get_global_var( endereco_curvas ) + dia + "/" + mes + "/" + ano + "&slcTaxa=" + curva dados_curvas = pd.read_html(endereco_curvas, thousands=".") if not ( len(dados_curvas) ) <= 2: # checa se essa curva tem dados, por meio do numero de linhas do dataframe, se <2, nao tem dados # Copia o dataframe para a tabela auxiliar aux = dados_curvas[2] # Na tabela auxiliar, verifica-se se possui os 2 campos '252', '360', ou apenas 1 campo # Faz-se uma copia das colunas de 'aux' para 'aux2', que é será adicionado (append) a matriz_curvas if (len(aux.columns)) < 3: if "252" in aux[0][1]: aux = aux.drop( [0, 1] ) # Elimina as 2 primeiras linhas (nao utilizaveis) aux2['Prazo'] = aux[0] aux2['252'] = aux[1] elif "360" in aux[0][1]: aux = aux.drop( [0, 1] ) # Elimina as 2 primeiras linhas (nao utilizaveis) aux2['Prazo'] = aux[0] aux2['360'] = aux[1] else: aux = aux.drop( [0, 1] ) # Elimina as 2 primeiras linhas (nao utilizaveis) aux2['Prazo'] = aux[0] aux2['Valor'] = aux[1] else: aux = aux.iloc[2:len( aux ), :] # Elimina as 2 primeiras linhas (nao utilizaveis) aux2['Prazo'] = aux[0] aux2['252'] = aux[1] aux2['360'] = aux[2] aux2['Codigo'] = curva matriz_curvas = matriz_curvas.append(aux2) for i in range(2, len(aux2) + 2): aux2 = aux2.drop(i) except: pass horario_bd = datetime.datetime.now() matriz_curvas["data_bd"] = horario_bd ano = int(ano) mes = int(mes) dia = int(dia) matriz_curvas["data_ref"] = datetime.date(ano, mes, dia) # troca , . matriz_curvas = matriz_curvas.replace({',': '.'}, regex=True) # troca NaN por None matriz_curvas = matriz_curvas.where((pd.notnull(matriz_curvas)), None) 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 - Tabela bmf_curvas") pd.io.sql.to_sql(matriz_curvas, name='bmf_curvas_' + str(ano) + '_' + str(mes), con=connection, if_exists="append", flavor='mysql', index=0) connection.close()
def fluxo_titpublico(): import datetime import pandas as pd import numpy as np import pymysql as db import logging from pandas.tseries.offsets import DateOffset from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior #Variables: 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_datetime = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2])) #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 * FROM projeto_inv.anbima_tpf' baseref1 = pd.read_sql(query, con=connection) logger.info("Leitura do banco de dados executada com sucesso") #1 - ALTERACAO DO CODIGO POR MUDANCA DA QUERY #1.1 - Joga fora sujeira da base antiga baseref1 = baseref1[baseref1['dt_vencto2'].notnull()] #1.2 - Ordena pela data da carga baseref1 = baseref1.sort_values(by=[ 'dt_referencia', 'titulo', 'cod_selic', 'dt_emissao', 'dt_vencto', 'dt_carga' ], ascending=True) #1.3 - Pega para cada um dos titulos publicos apenas a ultima informacao baixada da anbima baseref1 = baseref1.drop_duplicates( subset=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto'], keep='last') #1.4 - Joga fora titulos que ja venceram baseref1 = baseref1[baseref1['dt_vencto2'] >= dtbase_datetime] #1.5 - Reseta o index do dataframe baseref1 = baseref1.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='') ############################################################################### anbima_fluxo_tpf = pd.DataFrame(columns=[ 'titulo', 'cod_selic', 'dt_emissao', 'dt_vencto', 'dt_vencto2', 'dt_referencia', 'dt_carga', 'dt_ref', 'fv' ]) n = len(baseref1) i1 = 0 for i in range(0, n): qtde = 1 vencto = pd.to_datetime(baseref1['dt_vencto2'][i]) temp = pd.to_datetime(baseref1['dt_vencto2'][i]) anbima_fluxo_tpf.loc[i1] = [ baseref1['titulo'][i], baseref1['cod_selic'][i], baseref1['dt_emissao'][i], baseref1['dt_vencto'][i], baseref1['dt_vencto2'][i], baseref1['dt_referencia'][i], baseref1['dt_carga'][i], temp, 0 ] if (baseref1['titulo'][i] in ('NTN-B', 'NTN-C', 'NTN-F')): #print(anbima_fluxo_tpf) temp = temp - DateOffset(months=6, days=0) while temp > pd.to_datetime(baseref1['dt_emissao'])[i]: i1 = i1 + 1 qtde = qtde + 1 anbima_fluxo_tpf.loc[i1] = [ baseref1['titulo'][i], baseref1['cod_selic'][i], baseref1['dt_emissao'][i], baseref1['dt_vencto'][i], baseref1['dt_vencto2'][i], baseref1['dt_referencia'][i], baseref1['dt_carga'][i], temp, 0 ] temp = vencto - DateOffset(months=(6 * qtde), days=0) i = i + 1 i1 = i1 + 1 del anbima_fluxo_tpf['dt_referencia'] del anbima_fluxo_tpf['dt_carga'] anbima_fluxo_tpf['dt_ref'] = pd.to_datetime(anbima_fluxo_tpf['dt_ref'], format='%d-%m-%Y') anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LFT', 'cupom'] = 0 anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LTN', 'cupom'] = 0 anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'NTN-C', 'cupom'] = 0.06 anbima_fluxo_tpf.ix[(anbima_fluxo_tpf['titulo'] == 'NTN-C') & (pd.to_datetime(anbima_fluxo_tpf['dt_vencto']).dt. date == datetime.date(2031, 1, 1)), 'cupom'] = 0.12 anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'NTN-B', 'cupom'] = 0.06 anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'NTN-F', 'cupom'] = 0.10 anbima_fluxo_tpf['dif'] = (pd.to_datetime(anbima_fluxo_tpf['dt_vencto2']) - pd.to_datetime(anbima_fluxo_tpf['dt_ref']) ).astype('timedelta64[D]') * 1 anbima_fluxo_tpf['fv'] = np.where( anbima_fluxo_tpf.dif <= 10.0, (1 + (anbima_fluxo_tpf['cupom']))**0.5, (1 + (anbima_fluxo_tpf['cupom']))**0.5 - 1) anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LTN', 'fv'] = 1 anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LFT', 'fv'] = 1 del anbima_fluxo_tpf['dif'] anbima_fluxo_tpf['data_bd'] = pd.datetime.today() anbima_fluxo_tpf1 = anbima_fluxo_tpf.copy() anbima_fluxo_tpf1['dt_ref'] = anbima_fluxo_tpf1['dt_ref'].dt.date # Salvar no MySQL if len(anbima_fluxo_tpf1) > 0: logger.info("Salvando base de dados - anbima_fluxo_tpf") pd.io.sql.to_sql(anbima_fluxo_tpf1, name='anbima_fluxo_tpf', con=connection, if_exists='append', flavor='mysql', index=0) connection.close()
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")
import datetime import numpy as np import pandas as pd import pymysql as db from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior from dependencias.Metodos.funcoes_auxiliares import full_path_from_database id_relatorio_quaid419 = 3528 # Diretório de save de planilhas save_path = full_path_from_database("matriz_gerencial_retornos") # 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() dt_base = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2] dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2] data_inicial = "2010-03-31" data_final = dt_base lambda_geral = 0.95 #definir lambdas específicos na linha 60 # Ajuste datas data_inicial = datetime.datetime.strptime(data_inicial, "%Y-%m-%d").date() data_final = datetime.datetime.strptime(data_final, "%Y-%m-%d").date() # Consulta valores das séries connection = db.connect('localhost', user = '******', passwd = "root", db = 'projeto_inv') # Substituir dados do excel pelas informações do MySQL dados_curvas = pd.read_sql_query('SELECT * FROM curva_ettj_vertices_fixos', connection) dados_bacen = pd.read_sql_query('SELECT * FROM bacen_series', connection)
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)
def get_bmf_cotacoes_hist(): import pandas as pd import pymysql as db import datetime import zipfile import logging 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__) # Retorna um array (ano, mes e dia) referente ao útimo dia útil do mês anterior configurado no banco de dados array_data = get_data_ultimo_dia_util_mes_anterior() # Retorna o path utilizado para acesso aos dados baixados full_path = full_path_from_database("cotacoes") full_path = full_path + "COTAHIST_D" + str(array_data[2]) + str( array_data[1]) + str(array_data[0]) # Acesso ao arquivo zip z = zipfile.ZipFile(full_path + ".zip", "r") z.extractall(path=full_path) logger.info("Arquivos extraidos com sucesso em :" + full_path) # Fechamento diário tamanho_campos = [ 2, 8, 2, 12, 3, 12, 10, 3, 4, 13, 13, 13, 13, 13, 13, 13, 5, 18, 18, 13, 1, 8, 7, 13, 12, 3 ] arquivo_bovespa = full_path + "/COTAHIST_D" + str(array_data[2]) + str( array_data[1]) + str(array_data[0]) + ".txt" dados_acoes = pd.read_fwf(arquivo_bovespa, widths=tamanho_campos, header=0) logger.info("Leitura da página executada com sucesso") logger.info("Tratando dados") #Padronizar nomes das colunas dados_acoes.columns = [ "tipo_registro", "data_pregao", "cod_bdi", "cod_negociacao", "tipo_mercado", "noma_empresa", "especificacao_papel", "prazo_dias_merc_termo", "moeda_referencia", "preco_abertura", "preco_maximo", "preco_minimo", "preco_medio", "preco_ultimo_negocio", "preco_melhor_oferta_compra", "preco_melhor_oferta_venda", "numero_negocios", "quantidade_papeis_negociados", "volume_total_negociado", "preco_exercicio", "ìndicador_correcao_precos", "data_vencimento", "fator_cotacao", "preco_exercicio_pontos", "codigo_isin", "num_distribuicao_papel" ] # Eliminar a última linha () linha = len(dados_acoes["data_pregao"]) dados_acoes = dados_acoes.drop(linha - 1) # Colocar valores com virgula (divir por 100) lista_virgula = [ "preco_abertura", "preco_maximo", "preco_minimo", "preco_medio", "preco_ultimo_negocio", "preco_melhor_oferta_compra", "preco_melhor_oferta_venda", "volume_total_negociado", "preco_exercicio", "preco_exercicio_pontos" ] for coluna in lista_virgula: dados_acoes[coluna] = [i / 100. for i in dados_acoes[coluna]] # Warnings tamanho #warnings.simplefilter(action = "ignore", category = RuntimeWarning) horario_bd = datetime.datetime.now() horario_bd = horario_bd.strftime("%Y-%m-%d %H:%M:%S") dados_acoes['data_bd'] = horario_bd 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") logger.info("Salvando base de dados") pd.io.sql.to_sql(dados_acoes, name='bovespa_cotahist', con=connection, if_exists="append", flavor='mysql', index=0, chunksize=5000) logger.info("Dados salvos no DB com sucesso") connection.close()