Post by Potuz on Oct 25, 2015 11:45:27 GMT -3.5
Estou num projeto novo, assim que tenha algum (in)sucesso postarei neste fórum. Por enquanto só trago alguns posts velhos como referência, daqui a pouco postarei também um parser velho em C para converter os DFP da CVM em formato gnumeric. Por favor só postem em caso que seja para compartilhar código, caso contrário eu pedirei autorização á moderação para apagar os posts. O projeto visa fazer
Quase todo do que segue não serve para nada excepto para minha referência pois alguns documentos de informação sumiram da CVM. Assim que tenha o código base em C com o parser (que esse eu já tinha feito essencialmente faz anos) postarei em github para ver se alguém quer ajudar. Repito por favor não postar neste thread á menos que você tenha código concreto em C para aportar.
Olá Galera, estou criando esse tópico para documentar um método para planilhar automaticamente no excel os balanços das empresas em bolsa. A ideia é ter os balanços directamente com os dados oficiais da Bovespa e não ter que recorrer a sites como o fund...tus que destilam alguns dados mas não todo o balanço.
O objectivo é
1) Dado um código de negociação/ empresa/ código cvm ---> Obter links para todos os ITR/DFP dessa empresa. Com esses links obter os balanços em formato .zip fornecidos pela CVM.
2) Dado o balanço em formato .zip obter uma planilha com todos as demonstrações financeiras e os indicadores fundamentalistas. O importante é que esse processo deve ser completamente automático, o usuário deve fornecer um mínimo de informação necessária
3) Dados todos os balanços obtidos como spreadsheets em 2) combiná-los em uma única planilha com os balanços históricos.
4) Dadas todos os balanços históricos obtidos em 3) para todas as empresas, combiná-los em uma única planilha para obter um histórico de indicadores de todas as empresas da bolsa... para poder fazer estatística e comparar com outras empresas do sector e/ou em outro momento histórico.
Eu vou a começar documentando como obter 2). Começamos com um archivo .zip obtido no site da Bovespa ou da CVM e automáticamente queremos obter uma planilha. No link drive.google.com/file/d/0B8XrKHpnRcF1QjNnRS1zU3hIQTA/edit?usp=sharing eu deixei a planilha em formato openfile e pode ser aberta com open-office ou libreoffice. Exportei uma planilha em formato Excel, mas eu não tenho ele como para confirmar que funciona drive.google.com/file/d/0B8XrKHpnRcF1ZWEyRW95dGk3TTQ/edit?usp=sharing. As duas planilhas tem 7 abas com os balanços "Ativo", "Passivo" e as demonstrações "Resultado", "Resultado Abrangente", "Fluxo de Caixa" e "Valor Adicionado" e finalmente uma aba com indicadores fundamentalistas. Olhem que as planilhas são simples, só tem a informação dos balanços e os indicadores (também tem a informação de periodos anteriores obtida dos balanços). O importante não é o formato da planilha (isso cada um pode mudar) o importante é que a planilha foi feita automáticamente sem nenhuma interação com o usuário.
O preço indicado é o preço de fechamento do trimestre e também foi obtido automáticamente.
O código principal para fazer a importação está em drive.google.com/file/d/0B8XrKHpnRcF1MHgzRnhySzVNelE/edit?usp=sharing
Nos próximos posts dependendo da disponibilidade de tempo eu vou a indicar um pouco o processo e como obter 1)-4) acima para quem esteja interessado.
Primeiramente vamos a explicar a estrutura dos archivos do balanço. Estou me referindo aos balanços completos como encontrados na CVM. A modo de exemplo, o link para o último balanço da EZTC está em www.rad.cvm.gov.br/ENETCONSULTA/frmDownloadDocumento.aspx?CodigoInstituicao=1&NumeroSequencialDocumento=32649
Quando você puxa esse archivo você obtem um archivo .zip. O nome do archivo está formado pelo código cvm da empresa (nesse caso 020770) seguido pelo exercício (20130930) e logo um código que significa que o archivo é um ITR e versão 1. O layout completo do archivo assim como todas as explicações de cada um dos archivos que estão dentro de esse .zip se encontra em www.cvm.gov.br/port/ciasabertas/Manual%20XML%20Informa%C3%A7%C3%B5es%20Trimestrais_V2_publicacao_setembro_2011.xls
Nós precisaremos só de alguns desses dados. Quando expandimos o archivo .zip encontramos
O único archivo que a gente precisa é o .itr. Esse é um outro .zip então podemos renomear ele e extrair de novo com unzip
De todos esses archivos o mais importante é o InfoFinaDFin.xml que possui todas as demonstrações financeiras que estamos interessados (Ativos, Passivos, DRE, etc). Além desse archivo, para poder calcular alguns outros indicadores e para poder formatar um pouco melhor a planilha precisamos do archivo Documento.xml (de onde tiraremos o nome da empresa, a data do balanço e a escala da métrica de quantidade de ações) e o archivo ComposicaoCapitalSocialDemonstracaoFinanceiraNegocios.xml (de onde tiraremos o número total de ações). Todos os outros archivos são irrelevantes para nosso projeto e podem ser apagados (porém, eles contém as notas explicativas e os textos da diretoria por exemplo). Para poder calcular indicadores de preço como P/L, DY, etc. devemos conseguir o preço no fechamento. Para isso a bovespa vem a nosso auxílio (isso pode ser feito de muitas outras formas via yahoo, google e demais, mas acho que o método de ter as cotações localmente é mais seguro, preciso e oficial). Podem fazer download das cotações históricas em www.bmfbovespa.com.br/shared/iframe.aspx?idioma=pt-br&url=http://www.bmfbovespa.com.br/pt-br/cotacoes-historicas/FormSeriesHistoricas.asp O archivo texto de cada ano, por exemplo COTAHIST_A2012.TXT, ocupa uns 70MB no rígido. O layout desse archivo pode ser encontrado no link mencionado acima do site da Bovespa. Nós só precisamos o preço do fechamento desse archivo.
OK, continuemos, agora a estratégia para cumprir 2) acima. A ideia e começar com o archivo InfoFinaDFin.xml e importar ele no calc ou Excel como uma planilha. Isso se consegue com um xslt que é um xml com uma série de regras de transformação, para transformar o xml do balanço num arquivo que o Calc possa ler. Informação ao respeito podem encontrar em forum.openoffice.org/en/forum/viewtopic.php?f=45&t=3490&sid=d006261236e2557544498f06c2ee90b7. O xslt é chamado de Filtro de importação. Como nós queremos importar não só a informação do InfoFinaDFin.xml mas também dos outros documentos, temos várias formas de fazer isso. Poderíamos programar isso no xslt mesmo, mas eu optei por modificar o InfoFinaDFin.xml agregando a informação mencionada acima. Para que fique claro, no ITR da EZTC mencionado acima, a parte do Documento.xml que precisamos é
A parte do documento ComposicaoCapitalSocialDemonstracaoFinanceiraNegocios.xml que precisamos é
E finalmente, o dia de fechamento do trimestre foi um dia de pregão. Segundo o layout do archivo COTAHIST_A2013.TXT devemos procurar por um string único (o 02 é um código) 2013093002BBAS3:
O preço de fechamento se obtém das posições 109-121, nós obtemos ele com um simples awk:
Ou seja EZTC3 fechou em 30.41 no dia 30/09/2013.
Agora o que vamos a fazer é agregar essas últimas informações no arquivo InfoFinaDFin.xml... para que ele mude no final de:
para o nosso archivo final chamado eztc3t13.xml
Notar as informações que agregamos. Podem fazer isso de muitas maneiras, eu optei por utilizar um outro filtro xslt que eu chamei de prepare-info.xslt
E para gerar o arquivo precio.xml que esse último filtro precisa, eu simplesmente fiz um script simples:
Que produz um simples xml pequeno:
Finalmente, para obter o .xml final fazemos
- Um parser dos xml da CVM para uma base de dados SQLITE
- Um cliente da base de dados para obter indicadores fundamentalistas das empresas
- Um servidor para fazer widgets a colocar no topo dos threads das empresas neste fórum
Quase todo do que segue não serve para nada excepto para minha referência pois alguns documentos de informação sumiram da CVM. Assim que tenha o código base em C com o parser (que esse eu já tinha feito essencialmente faz anos) postarei em github para ver se alguém quer ajudar. Repito por favor não postar neste thread á menos que você tenha código concreto em C para aportar.
Olá Galera, estou criando esse tópico para documentar um método para planilhar automaticamente no excel os balanços das empresas em bolsa. A ideia é ter os balanços directamente com os dados oficiais da Bovespa e não ter que recorrer a sites como o fund...tus que destilam alguns dados mas não todo o balanço.
O objectivo é
1) Dado um código de negociação/ empresa/ código cvm ---> Obter links para todos os ITR/DFP dessa empresa. Com esses links obter os balanços em formato .zip fornecidos pela CVM.
2) Dado o balanço em formato .zip obter uma planilha com todos as demonstrações financeiras e os indicadores fundamentalistas. O importante é que esse processo deve ser completamente automático, o usuário deve fornecer um mínimo de informação necessária
3) Dados todos os balanços obtidos como spreadsheets em 2) combiná-los em uma única planilha com os balanços históricos.
4) Dadas todos os balanços históricos obtidos em 3) para todas as empresas, combiná-los em uma única planilha para obter um histórico de indicadores de todas as empresas da bolsa... para poder fazer estatística e comparar com outras empresas do sector e/ou em outro momento histórico.
Eu vou a começar documentando como obter 2). Começamos com um archivo .zip obtido no site da Bovespa ou da CVM e automáticamente queremos obter uma planilha. No link drive.google.com/file/d/0B8XrKHpnRcF1QjNnRS1zU3hIQTA/edit?usp=sharing eu deixei a planilha em formato openfile e pode ser aberta com open-office ou libreoffice. Exportei uma planilha em formato Excel, mas eu não tenho ele como para confirmar que funciona drive.google.com/file/d/0B8XrKHpnRcF1ZWEyRW95dGk3TTQ/edit?usp=sharing. As duas planilhas tem 7 abas com os balanços "Ativo", "Passivo" e as demonstrações "Resultado", "Resultado Abrangente", "Fluxo de Caixa" e "Valor Adicionado" e finalmente uma aba com indicadores fundamentalistas. Olhem que as planilhas são simples, só tem a informação dos balanços e os indicadores (também tem a informação de periodos anteriores obtida dos balanços). O importante não é o formato da planilha (isso cada um pode mudar) o importante é que a planilha foi feita automáticamente sem nenhuma interação com o usuário.
O preço indicado é o preço de fechamento do trimestre e também foi obtido automáticamente.
O código principal para fazer a importação está em drive.google.com/file/d/0B8XrKHpnRcF1MHgzRnhySzVNelE/edit?usp=sharing
Nos próximos posts dependendo da disponibilidade de tempo eu vou a indicar um pouco o processo e como obter 1)-4) acima para quem esteja interessado.
Primeiramente vamos a explicar a estrutura dos archivos do balanço. Estou me referindo aos balanços completos como encontrados na CVM. A modo de exemplo, o link para o último balanço da EZTC está em www.rad.cvm.gov.br/ENETCONSULTA/frmDownloadDocumento.aspx?CodigoInstituicao=1&NumeroSequencialDocumento=32649
Quando você puxa esse archivo você obtem um archivo .zip. O nome do archivo está formado pelo código cvm da empresa (nesse caso 020770) seguido pelo exercício (20130930) e logo um código que significa que o archivo é um ITR e versão 1. O layout completo do archivo assim como todas as explicações de cada um dos archivos que estão dentro de esse .zip se encontra em www.cvm.gov.br/port/ciasabertas/Manual%20XML%20Informa%C3%A7%C3%B5es%20Trimestrais_V2_publicacao_setembro_2011.xls
Nós precisaremos só de alguns desses dados. Quando expandimos o archivo .zip encontramos
$ unzip 02077020130930301.zip
Archive: 02077020130930301.zip
inflating: 020770201301010102.fca
inflating: 020770201309300301.itr
inflating: FormularioCadastral.xml
inflating: FormularioDemonstracaoFinanceiraITR.xml
O único archivo que a gente precisa é o .itr. Esse é um outro .zip então podemos renomear ele e extrair de novo com unzip
$ mv 020770201309300301.itr{,.zip} -v
‘020770201309300301.itr’ -> ‘020770201309300301.itr.zip’
$ unzip 020770201309300301.itr.zip
Archive: 020770201309300301.itr.zip
inflating: AnexoDocumento.xml
inflating: AnexoTexto.xml
inflating: ComposicaoCapitalSocialDemonstracaoFinanceiraNegocios.xml
inflating: Documento.xml
inflating: FormularioDemonstracaoFinanceiraITR.xml
inflating: InfoFinaDFin.xml
inflating: InformacaoFinanceiraDemonstracaoFinanceira.xml
inflating: JustificativaFaltaDocumento.xml
inflating: PagamentoProventoDinheiroDemonstracaoFinanceiraNegocios.xml
inflating: PeriodoDemonstracaoFinanceira.xml
inflating: ResponsavelEsclarecimentoDuvidas.xml
inflating: ResumoInformacaoFinanceiraDemonstracaoFinanceira.xml
De todos esses archivos o mais importante é o InfoFinaDFin.xml que possui todas as demonstrações financeiras que estamos interessados (Ativos, Passivos, DRE, etc). Além desse archivo, para poder calcular alguns outros indicadores e para poder formatar um pouco melhor a planilha precisamos do archivo Documento.xml (de onde tiraremos o nome da empresa, a data do balanço e a escala da métrica de quantidade de ações) e o archivo ComposicaoCapitalSocialDemonstracaoFinanceiraNegocios.xml (de onde tiraremos o número total de ações). Todos os outros archivos são irrelevantes para nosso projeto e podem ser apagados (porém, eles contém as notas explicativas e os textos da diretoria por exemplo). Para poder calcular indicadores de preço como P/L, DY, etc. devemos conseguir o preço no fechamento. Para isso a bovespa vem a nosso auxílio (isso pode ser feito de muitas outras formas via yahoo, google e demais, mas acho que o método de ter as cotações localmente é mais seguro, preciso e oficial). Podem fazer download das cotações históricas em www.bmfbovespa.com.br/shared/iframe.aspx?idioma=pt-br&url=http://www.bmfbovespa.com.br/pt-br/cotacoes-historicas/FormSeriesHistoricas.asp O archivo texto de cada ano, por exemplo COTAHIST_A2012.TXT, ocupa uns 70MB no rígido. O layout desse archivo pode ser encontrado no link mencionado acima do site da Bovespa. Nós só precisamos o preço do fechamento desse archivo.
OK, continuemos, agora a estratégia para cumprir 2) acima. A ideia e começar com o archivo InfoFinaDFin.xml e importar ele no calc ou Excel como uma planilha. Isso se consegue com um xslt que é um xml com uma série de regras de transformação, para transformar o xml do balanço num arquivo que o Calc possa ler. Informação ao respeito podem encontrar em forum.openoffice.org/en/forum/viewtopic.php?f=45&t=3490&sid=d006261236e2557544498f06c2ee90b7. O xslt é chamado de Filtro de importação. Como nós queremos importar não só a informação do InfoFinaDFin.xml mas também dos outros documentos, temos várias formas de fazer isso. Poderíamos programar isso no xslt mesmo, mas eu optei por modificar o InfoFinaDFin.xml agregando a informação mencionada acima. Para que fique claro, no ITR da EZTC mencionado acima, a parte do Documento.xml que precisamos é
....
<IndicadorSociedadeAnonimaAtiva>true</IndicadorSociedadeAnonimaAtiva>
<NomeRazaoSocialCompanhiaAberta>EZ TEC EMPREEND. E PARTICIPAÇÕES S/A</NomeRazaoSocialCompanhiaAberta>
<NumeroCnpjCompanhiaAberta>08312229000173</NumeroCnpjCompanhiaAberta>
...
<CodigoEscalaMoeda>2</CodigoEscalaMoeda>
<CodigoEscalaQuantidade>1</CodigoEscalaQuantidade>
<DataGeracaoArquivo>0001-01-01T00:00:00</DataGeracaoArquivo>
.....
<CodigoTipoDocumento>3</CodigoTipoDocumento>
<DataReferenciaDocumento>2013-09-30T00:00:00</DataReferenciaDocumento>
<NumeroVersaoDocumento>1</NumeroVersaoDocumento>
A parte do documento ComposicaoCapitalSocialDemonstracaoFinanceiraNegocios.xml que precisamos é
<QuantidadeAcaoPreferencialCapitalIntegralizado>0</QuantidadeAcaoPreferencialCapitalIntegralizado>
<QuantidadeTotalAcaoCapitalIntegralizado>146724120</QuantidadeTotalAcaoCapitalIntegralizado>
<QuantidadeAcaoOrdinariaTesouraria>0</QuantidadeAcaoOrdinariaTesouraria>
E finalmente, o dia de fechamento do trimestre foi um dia de pregão. Segundo o layout do archivo COTAHIST_A2013.TXT devemos procurar por um string único (o 02 é um código) 2013093002BBAS3:
$ grep 2013093002EZTC3 COTAHIST_A2013.TXT
012013093002EZTC3 010EZTEC ON NM R$ 000000000305400000000030920000000002976000000000302800000000030410000000003041000000000304902140000000000000461600000000001398129800000000000000009999123100000010000000000000BREZTCACNOR0106
O preço de fechamento se obtém das posições 109-121, nós obtemos ele com um simples awk:
$ grep 012013093002EZTC3 COTAHIST_A2013.TXT | awk '{print substr($0,109,11) "." substr($0,120,2)}'
00000000030.41
Ou seja EZTC3 fechou em 30.41 no dia 30/09/2013.
Agora o que vamos a fazer é agregar essas últimas informações no arquivo InfoFinaDFin.xml... para que ele mude no final de:
...
<ValorConta11>0.0000000000</ValorConta11>
<ValorConta12>0.0000000000</ValorConta12>
</InfoFinaDFin>
</ArrayOfInfoFinaDFin>
para o nosso archivo final chamado eztc3t13.xml
....
....
<ValorConta11>0.0000000000</ValorConta11>
<ValorConta12>0.0000000000</ValorConta12>
</InfoFinaDFin>
<NomeRazaoSocialCompanhiaAberta>EZ TEC EMPREEND. E PARTICIPAÇÕES S/A</NomeRazaoSocialCompanhiaAberta>
<DataReferenciaDocumento>2013-09-30T00:00:00</DataReferenciaDocumento>
<CodigoEscalaQuantidade>1</CodigoEscalaQuantidade>
<QuantidadeTotalAcaoCapitalIntegralizado>146724120</QuantidadeTotalAcaoCapitalIntegralizado>
<Fechamento>00000000030.41</Fechamento></ArrayOfInfoFinaDFin>
Notar as informações que agregamos. Podem fazer isso de muitas maneiras, eu optei por utilizar um outro filtro xslt que eu chamei de prepare-info.xslt
$ cat prepare-info.xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="file-documento" select="'Documento.xml'" />
<xsl:param name="datos-documento" select="document($file-documento)" />
<xsl:variable name="nombre-empresa" select="$datos-documento/Documento/CompanhiaAberta/NomeRazaoSocialCompanhiaAberta" />
<xsl:variable name="escala-acoes" select="$datos-documento/Documento/CodigoEscalaQuantidade" />
<xsl:variable name="data-referencia" select="$datos-documento/Documento/DataReferenciaDocumento" />
<xsl:param name="file-composicao" select="'ComposicaoCapitalSocialDemonstracaoFinanceiraNegocios.xml'" />
<xsl:param name="datos-composicao" select="document($file-composicao)" />
<xsl:variable name="total-acoes" select="$datos-composicao/ArrayOfComposicaoCapitalSocialDemonstracaoFinanceira/ComposicaoCapitalSocialDemonstracaoFinanceira/QuantidadeTotalAcaoCapitalIntegralizado" />
<xsl:param name="file-precio" select="'precio.xml'" />
<xsl:param name="datos-precio" select="document($file-precio)" />
<xsl:variable name="precio" select="$datos-precio/Fechamento" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="ArrayOfInfoFinaDFin">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
<xsl:text>
</xsl:text>
<xsl:apply-templates select="$nombre-empresa"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="$data-referencia"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="$escala-acoes"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="$total-acoes"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="$precio"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
E para gerar o arquivo precio.xml que esse último filtro precisa, eu simplesmente fiz um script simples:
$ cat get-historical-price
#!/bin/bash
# usage $0 yyyymmdd CACA3
filewithprices=/home/heluani/Documents/code/xslt/data/COTAHIST_A2013.TXT
echo "<?xml version=\"1.0\"?>"
precio=$(grep 01"$1"02"$2" $filewithprices | awk '{print substr('\$'0,109,11) '\"'.'\"' substr('\$'0,120,2) }')
echo "<Fechamento>$precio</Fechamento>"
Que produz um simples xml pequeno:
$ cat precio.xml
<?xml version="1.0"?>
<Fechamento>00000000030.41</Fechamento>
Finalmente, para obter o .xml final fazemos
$ xsltproc prepare-info.xslt InfoFinaDFin.xml >> eztc3t13.xml