Potuz
New Member
Posts: 3,392
|
Post by Potuz on Oct 27, 2015 5:38:00 GMT -3.5
Olá, em vista do projeto em clubinvest.boards.net/post/1548/thread estou precisando de uma base de dados de empresas listadas junto com seus códigos. A CVM fornece uma base de dados com a situação cadastral de todas as empresas listadas na CVM, mas os códigos de negociação e o setor de governança corporativa não estão (estão na Bovespa por exemplo). Gostaria de ter uma base de dados completa para automatizar a procura de preços das ações por exemplo no momento de fechamento do exercício. Em principio não é muito problema de agregar na mão esses dados para as empresas, mas gostaria de me evitar esse trabalho. Alguém sabe onde posso conseguir? Cabe notar que os códigos negociados não se encontram nos balanços apresentados na CVM (ITR, DFP, etc).
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Oct 27, 2015 18:29:40 GMT -3.5
|
|
Potuz
New Member
Posts: 3,392
|
Post by Potuz on Oct 27, 2015 19:20:41 GMT -3.5
Fala Mojo, quase que isso funciona. O que acontece é que a CVM fornece uma boa base de dados com todos os dados cadastrais das companhias que você diretamente pode agregar a uma base dados. Por exemplo os dados da EZTC são Porém os 3 campos em vermelho são os código das ON, código das PN e setor de mercado que eu gostaria de ter na mesma base de dados e eu tive que agregar na mão no caso da EZTC (vou finalizar fazendo todas assim imagino). Como você indicou estaria legal ter alguma lista (por exemplo como as cotas históricas) que tenham uma coluna com esses três dados faltantes (codigos ON, PN e setor de mercado) e alguma outra coluna igual que na CVM (por exemplo seria ótimo se fosse código CVM para ter certeza que são iguais). Naquele caso eu poderia rápidamente juntar as listas, mas como não achei assim rápido, decidi fazer na mão alguns exemplos e continuar programando o parser para agregar ITRs e automatizar o download da CVM (porém estou tendo problemas com a CVM que os links que está fornecendo para download automático não parecem funcionar). A lista das cotas históricas que você postou não tem uma coluna com igual denominação que na CVM como para poder juntar as tabelas.
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Oct 27, 2015 19:45:01 GMT -3.5
Acho que agora entendi... O único meio de fazer isso que eu conheço seria importar as informações da planilha de classificação setorial da Bovespa: www.bmfbovespa.com.br/pt-br/download/ClassifSetorial.zipA planilha vem em um formato não normalizado então seria preciso fazer uma macro para colocá-la em um formato mais conveniente. Após isso seria só cruzar a informação do nome da empresa que vem na planilha com o arquivo de cotações históricas, pois o nome abreviado é o mesmo. Outra possibilidade seria usar o campo código da planilha que é o tick sem o número no final e fazer um consulta que colocasse os números (3, 4, 5, etc) no final e testasse a existência do código checando sua cotação por exemplo, aí nem precisaria do arquivo de cotações históricas. Não é simples mas dá pra fazer, quem sabe existe outra maneira mais direta...
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Oct 27, 2015 19:56:21 GMT -3.5
Tenho também um código de uma função que me ajuda muito no meu trabalho pois permite localizar uma string mesmo que coincidência não seja exata, na verdade ele retorna um 'índice de semelhança' entre duas strings, sei que existem algumas proposições para esse algorítimo mas esse código veio da minha cabeça porque ele é focado em nomes próprios, acho que um matemático como vc vai achar um tanto impreciso, hehe, mas aqui vai o algorítimo da função em VBA, pode ser convertido para outra linguagem pois é bem portável:
(no copiar/colar perdeu a identação...)
Public Function IndSimil(A, B)
Dim C, Buf, aux, La, Lb, leng, seed, posi, i, j, cont, divi
A = UCase(A)
B = UCase(B)
If Len(A) < Len(B) Then 'A é sempre a maior string
aux = A
A = B
B = aux
End If
Buf = A
C = Space(Len(A))
i = 1
Do While Int(Len(B) / i) >= 2 'menor tamanho de substring a ser pesquisada
leng = Int(Len(B) / i)
For j = 1 To i
If j = i Then 'para pegar a sobra da última divisão, se houver
seed = Mid(B, (1 + leng * (j - 1)))
Else
seed = Mid(B, (1 + leng * (j - 1)), leng)
End If
posi = InStr(A, seed)
If posi > 0 Then
C = Overlay(C, seed, posi)
B = Overlay(B, Replicate("@", leng), (1 + leng * (j - 1)))
If C = Buf Then Exit Do
End If
Next
i = i + 1 'divide string original por 1, 2, 3, 4, 5...
Loop
'* apuração do indice de similaridade
cont = 0
For i = 1 To Len(Buf)
Select Case i
Case 1 '1a letra peso = 5
If Mid(Buf, i, 1) = Mid(C, i, 1) Then cont = cont + 5
Case Else 'outras letras peso = 1
If Mid(Buf, i, 1) = Mid(C, i, 1) Then cont = cont + 1
End Select
Next
IndSimil = cont / (Len(Buf) + 4)
End Function '******************************************************************************
Public Function Overlay(Stringue, SubStringue, pos)
'******************************************************************************
'/* emula a função de mesmo nome no clipper
Overlay = Mid(Stringue, 1, pos - 1) & SubStringue & Mid(Stringue, pos + Len(SubStringue))
End Function
|
|
Potuz
New Member
Posts: 3,392
|
Post by Potuz on Oct 27, 2015 20:05:47 GMT -3.5
Valeu Mojo, a planilha de classificação setorial da Bovespa quase quase que pode dar, eu posso fazer um simple script para tentar encontrar matches na lista da CVM, mas o problema é que temos que codificar o código certo (ou seja, a PETR3/PETR4 aparece como PETR só, temos que olhar as regras cuidadosamente para diferenciar o porqué 3 e 4 são as ações em lugar do caso da VALE3/VALE5)... ou coisas piores como a ALEF3B.
|
|