rapina

package module
v0.0.0-...-4eee9bc Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 15, 2025 License: MIT Imports: 23 Imported by: 0

README

Crie Relatórios Financeiros de Empresas Listadas na B3

GitHub release License

Rapina

Rapina é um programa que cria relatórios financeiros de empresas listadas na B3, processando arquivos de demonstrações financeiras trimestrais (ITR) e anuais (DFP) do site da CVM e armazenando-os em um banco de dados local (sqlite). As informações são extraídas do balanço patrimonial, fluxo de caixa, DRE (demonstração de resultado) e DVA (demonstração de valor adicionado).

O programa coleta arquivos desde 2010. Como estes arquivos contém os dados do ano corrente e do ano anterior, foi possível também a extração de dados de 2009.

Com base nestes dados, são gerados relatórios das demonstrações financeiras por empresa.

Instalação

Baixe o executável da página de release e renomeie o executável para rapinav2.exe (no caso do Windows) ou rapinav2 (para o Linux ou macOS).

Uso

Criação/Atualização dos Dados

Antes de se criar um relatório pela primeira vez, é necessário baixar os dados do site da CVM. Para isso, execute o seguinte comando no terminal:

rapinav2 atualizar <--all | --ano <ano>>

Exemplos:

  • rapinav2 atualizar --all: baixar e atualizar dados de todos os anos.
  • rapinav2 atualizar --ano 2023: baixar e atualizar um ano específico.
Criação do Relatório

Para criar uma planilha com os dados financeiros trimestrais de um empresa, execute o seguinte comando:

rapinav2 relatorio [-d <DIRETORIO>] [--crescente|-c]

As empresas serão listadas em ordem alfabética. Basta navegar com as setas, ou use a tecla / para procurar uma empresa.

Exemplos:

  • rapinav2 relatorio: cria o relatório no diretório corrente.
  • rapinav2 relatorio -d ./relats: cria o relatório no diretório relats.
  • rapinav2 relatorio -d ./relats -c: cria o relatório no diretório relats, com os trimestres listados na ordem crescente.

Os relatório será gravado com o nome da empresa. Exemplos:

3R_PETROLEUM_ÓLEO_E_GÁS_S.A.xlsx
AES_BRASIL_ENERGIA_S.A.xlsx
CIA_SANEAMENTO_DO_PARANA_-_SANEPAR.xlsx
FLEURY_S.A.xlsx
LOCALIZA_RENT_A_CAR_S.A.xlsx
LOJAS_RENNER_S.A.xlsx
RAIA_DROGASIL_S.A.xlsx
Servidor Web

Para criar os relatório em uma interface web, execute o comando servidor:

$ ./rapinav2 servidor

[>] Iniciando servidor em :8080

E acesse a página através do endereço http://localhost:8080, onde é possível criar relatórios das empresas selecionadas e atualizar os dados (do ano corrente e do ano anterior).

webserver.png

Configuração

rapina.yaml

Personalize os parâmetros criando o arquivo rapina.yaml no mesmo diretório do executável (rapinav2 ou rapinav2.exe) usando os seguintes parâmetros:

Parâmetro Descrição
dataSrc Arquivo onde serão gravados os dados coletados
Default: ./.dados
tempDir Diretório onde os arquivos temporários serão armazernados
Default: ./.dados
reportDir Diretório onde os relatórios serão salvos
Default: ./

Exemplo:

dataSrc: "/home/user1/dados/rapinav2.db"
tempDir: "/home/user1/dados"
reportDir: "/home/user1/relatorios"

Build

Para compilar o código fonte, siga estas instruções:

  1. Instale o Go: https://go.dev/doc/install
  2. Instale o Git: https://git-scm.com/book/pt-br/v2/Come%C3%A7ando-Instalando-o-Git
  3. Abra o terminal (ou CMD no Windows) e execute os seguintes comandos:
git clone github.com/dude333/rapinav2
cd rapinav2
go build -o rapinav2 cmd/*

O arquivo rapinav2, ou rapinav2.exe no Windows, será criado.

Dados

  • Relação tickers x CNPJ:
    https://sistemaswebb3-listados.b3.com.br/isinPage
    https://sistemaswebb3-listados.b3.com.br/isinProxy/IsinCall/GetTextDownload/
    => obj.geralPt.id => btoa(JSON.stringify(obj.geralPt.id))
    https://sistemaswebb3-listados.b3.com.br/isinProxy/IsinCall/GetFileDownload/{id}
    

Nota Final

Os relatórios tem finalidade apenas informativa e podem conter informações incorretas.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrCabeçalhoCsv    = errors.New("cabeçalho")
	ErrFaltaItemCsv    = errors.New("itens faltando")
	ErrDataInválidaCsv = errors.New("data inválida")
)
View Source
var ErrDataInválida = errors.New("data inválida")

Functions

func Cleanup

func Cleanup(arqs []Arquivo) []string

Cleanup remove os arquivos

func DiaÚtil

func DiaÚtil(d Data) bool

DiaÚtil retorna true para dias úteis.

func MinMax

func MinMax(itr []InformeTrimestral) (int, int)

func NormalizeString

func NormalizeString(s string) string

func ProcessarArquivoDFP

func ProcessarArquivoDFP(ctx context.Context, arq Arquivo, dfp *DFP) error

func RangeAnos

func RangeAnos(itr []InformeTrimestral, reverse bool) []int

RangeAnos retorna a sequência de anos entre o mínimo e o máximo de anos presentes nos InformeTrimestral. Crescente se reverse for false, senão decrescente.

func RangeAnosVTs

func RangeAnosVTs(v1, v2 []ValoresTrimestrais) []int

func Similar

func Similar(s1, s2 string) bool

func TrimestresComDados

func TrimestresComDados(itr []InformeTrimestral) []bool

func Zerado

func Zerado(valores []ValoresTrimestrais) bool

func ÚltimoTrimestre

func ÚltimoTrimestre(ano int, valores []ValoresTrimestrais) int

ÚltimoTrimestre retorna o último trimestre com valor não nulo

func ÚltimoTrimestreReal

func ÚltimoTrimestreReal(itrs []InformeTrimestral) int

ÚltimoTrimestreReal retorna o último trimestre com valor não nulo usando o valor do Ativo Total como base.

Types

type Arquivo

type Arquivo struct {
	// contains filtered or unexported fields
}

func DownloadAndUnzip

func DownloadAndUnzip(urlString string, tempDir string, filtros []string) ([]Arquivo, string, error)

DownloadAndUnzip baixa e descompacta o arquivo e retorna a lista de arquivos descompactados, com o hash de cada arquivo; retorna também o hash do .zip e o erro, se houver.

type CVM

type CVM struct {
	// contains filtered or unexported fields
}

func NewCVM

func NewCVM(db *sqlx.DB, tempDir string, force bool) (*CVM, error)

func (*CVM) Importar

func (c *CVM) Importar(ctx context.Context, ano int) error

Importar importa dados da CVM para a base de dados local

type Conta

type Conta struct {
	Código       string   // 1, 1.01, 1.02...
	Descr        string   // Descrição
	Grupo        string   // BPA, BPP, DRE, DFC...
	DataIniExerc string   // AAAA-MM-DD
	DataFimExerc string   // AAAA-MM-DD
	OrdemExerc   string   // ÚLTIMO ou PENÚLTIMO
	Total        Dinheiro // $
	Meses        int      // Meses acumulados desde o início do período
	Consolidado  bool     // Individual ou Consolidado
}

Conta com os dados das Demonstrações Financeiras Padronizadas (DFP) ou com as Informações Trimestrais (ITR).

func (*Conta) Válida

func (c *Conta) Válida() bool

type Cotação

type Cotação struct {
	Código       string
	Data         Data
	Abertura     Dinheiro
	Máxima       Dinheiro
	Mínima       Dinheiro
	Encerramento Dinheiro
	Volume       float64
}

func (*Cotação) PreçoTípico

func (a *Cotação) PreçoTípico() Dinheiro

PreçoTípico é a média aritmética entre o preço máximo, o preço mínimo e o preço de fechamento

type CvmDataSource

type CvmDataSource interface {
	Salvar(ctx context.Context, db *sqlx.DB) error
}

type CvmType

type CvmType int
const (
	CvmDfp CvmType = iota
	CvmItr
	CvmFre
)

type DFP

type DFP map[string]*DFPEmpresa

func NewDFP

func NewDFP() *DFP

func (*DFP) AppendConta

func (dfp *DFP) AppendConta(e *DFPEmpresa) bool

AppendConta adiciona uma conta ao DFP

func (*DFP) Salvar

func (dfp *DFP) Salvar(ctx context.Context, db *sqlx.DB) error

Salvar salva o DFP no banco de dados

type DFPEmpresa

type DFPEmpresa struct {
	Empresa
	Ano          string
	DataIniExerc string
	Versão       string
	Contas       []Conta
}

type Data

type Data time.Time

Data ---------------------------------------------------

func DiaUtilAnterior

func DiaUtilAnterior(d Data) Data

DiaUtilAnterior retorna o dia útil anterior.

func Hoje

func Hoje() Data

Hoje retorna o dia de hoje ou o dia útil passado mais próximo.

func NovaData

func NovaData(s string) (Data, error)

NovaData converte uma string no formato "AAAA-MM-DD" em Data.

func ProxDiaUtil

func ProxDiaUtil(d Data) Data

ProxDiaUtil retorna o próximo dia útil.

func (Data) String

func (d Data) String() string

type Dinheiro

type Dinheiro struct {
	Moeda  string
	Valor  float64
	Escala int
}

Dinheiro -----------------------------------------------

func NovoDinheiro

func NovoDinheiro(moeda string, valor float64, escala int) Dinheiro

func VWAP

func VWAP(ativos []*Cotação) Dinheiro

VWAP é o preço ponderado médio SUM(PRECO_TÍPICO * VOLUME) / SUM(VOLUME)

func (Dinheiro) String

func (d Dinheiro) String() string

func (Dinheiro) Total

func (d Dinheiro) Total() float64

type Empresa

type Empresa struct {
	CNPJ string `json:"cnpj"`
	Nome string `json:"nome"`
}

Empresa ------------------------------------------------

func (Empresa) String

func (e Empresa) String() string

type InformeTrimestral

type InformeTrimestral struct {
	Codigo  string
	Descr   string
	Valores []ValoresTrimestrais
}

func UnificarContasSimilares

func UnificarContasSimilares(itr []InformeTrimestral) []InformeTrimestral

UnificarContasSimilares unifica as linhas similares do InformeTrimestral comparando o código, sem o último grupo (ex.: 1.02.05.01 => 1.02.05), com as próximas linhas. Cada linha (InformeTrimestral) possui o seguinte formato: Linha n => [Ano:ano Valor trimestre 1 | Valor T2 | Valor T3 | Valor T4] Exemplo: "Tributo a recuperar" => [2019 1|0|5|3; 2021 5|2|0|0] "Tributos a recuperar" => [2019 0|2|0|0; 2020 1|4|2|2; 2021 0|0|1|2] Resultado: "Tributo a recuperar" => [2019 1|2|5|3; 2020 1|4|2|2; 2021 5|2|1|2]

type ValoresTrimestrais

type ValoresTrimestrais struct {
	Ano int
	T1  float64
	T2  float64
	T3  float64
	T4  float64
}

ValoresTrimestrais armazena os valores ValoresTrimestrais de um determinado ano. Considera-se nulo o valor do trimestre se o valor for NaN.

func AddVTs

func AddVTs(v1, v2 []ValoresTrimestrais) []ValoresTrimestrais

func DivVTs

func DivVTs(v1, v2 []ValoresTrimestrais) []ValoresTrimestrais

func ManterÚltimoTrimestre

func ManterÚltimoTrimestre(vts []ValoresTrimestrais) []ValoresTrimestrais

ManterÚltimoTrimestre mantém apenas o último trimestre não nulo de cada ano

func MultVTs

func MultVTs(v1, v2 []ValoresTrimestrais) []ValoresTrimestrais

func OpVTs

func OpVTs(op rune, v1, v2 []ValoresTrimestrais) []ValoresTrimestrais

func SubVTs

func SubVTs(v1, v2 []ValoresTrimestrais) []ValoresTrimestrais

func TTM

TTM armazena a soma dos últimos 4 trimestres em cada um dos trimestres; usado em métricas que comparam como valores do balanço patrimonial. Exemplo: ROE = Lucro Líq. dos últimos 12 meses / Patrim.Líq.

func (ValoresTrimestrais) Add

func (ValoresTrimestrais) Div

func (ValoresTrimestrais) DivNum

func (v ValoresTrimestrais) DivNum(divisor float64) ValoresTrimestrais

func (ValoresTrimestrais) Mult

func (ValoresTrimestrais) MultNum

func (v ValoresTrimestrais) MultNum(factor float64) ValoresTrimestrais

func (*ValoresTrimestrais) SetT

func (v *ValoresTrimestrais) SetT(n int, val float64)

SetT salva o valor do trimestre pelo índice (1 <= n <= 4)

func (ValoresTrimestrais) Sub

func (*ValoresTrimestrais) T

func (v *ValoresTrimestrais) T(n int) float64

T retorna o valor do trimestre pelo índice (1 <= n <= 4)

Directories

Path Synopsis
pkg
progress
Package progress prints the program progress on screen.
Package progress prints the program progress on screen.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL