pyield 0.56.1__tar.gz → 0.57.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyield-0.57.2/PKG-INFO +131 -0
- pyield-0.57.2/README.md +106 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/.DS_Store +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/__init__.py +10 -2
- {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/boletim.py +1 -1
- {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/di_over.py +3 -2
- {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/sgs.py +6 -4
- {pyield-0.56.1/pyield/selic → pyield-0.57.2/pyield}/compromissada.py +1 -1
- pyield-0.57.2/pyield/copom/__init__.py +4 -0
- pyield-0.57.2/pyield/copom/_calendario.py +205 -0
- pyield-0.56.1/pyield/selic/cpm.py → pyield-0.57.2/pyield/cpm/__init__.py +8 -8
- pyield-0.56.1/pyield/selic/probabilities.py → pyield-0.57.2/pyield/cpm/probabilidades.py +7 -6
- {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/di1.py +21 -17
- {pyield-0.56.1 → pyield-0.57.2}/pyield/fwd.py +14 -13
- {pyield-0.56.1 → pyield-0.57.2}/pyield/interpolador.py +6 -4
- {pyield-0.56.1 → pyield-0.57.2}/pyield/ipca/historico.py +3 -2
- pyield-0.57.2/pyield/selic/__init__.py +20 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/__init__.py +0 -10
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/__init__.py +2 -2
- pyield-0.57.2/pyield/tpf/titulos/_ntnb_bootstrap.py +340 -0
- pyield-0.57.2/pyield/tpf/titulos/_ntnf_bootstrap.py +193 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/_utils.py +11 -19
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/lft.py +11 -9
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ltn.py +26 -19
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnb.py +47 -247
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnbp.py +5 -8
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnc.py +8 -10
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnf.py +33 -27
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/pre.py +15 -12
- pyield-0.57.2/pyield/vna/__init__.py +13 -0
- pyield-0.57.2/pyield/vna/_consulta.py +184 -0
- pyield-0.56.1/pyield/bc/lft.py → pyield-0.57.2/pyield/vna/_lft.py +2 -2
- pyield-0.56.1/pyield/tpf/vna/ntnb.py → pyield-0.57.2/pyield/vna/_ntnb.py +36 -14
- pyield-0.56.1/pyield/tpf/vna/ntnc.py → pyield-0.57.2/pyield/vna/_ntnc.py +34 -12
- {pyield-0.56.1 → pyield-0.57.2}/pyproject.toml +3 -5
- {pyield-0.56.1 → pyield-0.57.2}/pyproject.toml.orig +3 -5
- pyield-0.56.1/PKG-INFO +0 -352
- pyield-0.56.1/README.md +0 -327
- pyield-0.56.1/pyield/selic/__init__.py +0 -33
- pyield-0.56.1/pyield/selic/copom.py +0 -201
- pyield-0.56.1/pyield/tpf/titulos/_bootstrap_forwards.py +0 -295
- pyield-0.56.1/pyield/tpf/vna/__init__.py +0 -5
- {pyield-0.56.1 → pyield-0.57.2}/LICENSE +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/br_numbers.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/cache.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/converters.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/data_cache.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/excel.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/numbers.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/retry.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/types.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/anbima/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/anbima/imaq.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/anbima/taxas.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/_contratos.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/_validar_pregao.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/derivativos_intradia.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/_olinda.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/leiloes.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/du/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/du/core.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/du/feriados_br/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/du/feriados_br/anteriores.txt +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/du/feriados_br/atuais.txt +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/contratos.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/historico.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/intradia.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/ipca/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/ipca/projetado.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/py.typed +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/relogio.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/_taxas.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/benchmark.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/dealers.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/leiloes.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_aba_1_3.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_aba_2_1.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_common.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_download.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/secundario/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/secundario/_intradia.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/secundario/_mensal.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/__init__.py +0 -0
- {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnb1.py +0 -0
- /pyield-0.56.1/pyield/tpf/vna/calculo.py → /pyield-0.57.2/pyield/vna/_calculo.py +0 -0
- {pyield-0.56.1/pyield/tpf → pyield-0.57.2/pyield}/vna/_download.py +0 -0
pyield-0.57.2/PKG-INFO
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyield
|
|
3
|
+
Version: 0.57.2
|
|
4
|
+
Summary: Polars-powered toolkit for Brazilian fixed income analysis
|
|
5
|
+
Keywords: fixed-income,brazil,finance,analysis,bonds
|
|
6
|
+
Author: Carlos Carvalho
|
|
7
|
+
Author-email: Carlos Carvalho <carlos.carvalho.jr@gmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
13
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
14
|
+
Requires-Dist: polars>=1.39.0
|
|
15
|
+
Requires-Dist: lxml>=6.0.0
|
|
16
|
+
Requires-Dist: requests>=2.31.0
|
|
17
|
+
Requires-Dist: fastexcel>=0.19.0
|
|
18
|
+
Requires-Dist: tzdata>=2024.1 ; sys_platform == 'win32'
|
|
19
|
+
Requires-Python: >=3.12
|
|
20
|
+
Project-URL: Homepage, https://github.com/crdcj/PYield
|
|
21
|
+
Project-URL: Documentation, https://crdcj.github.io/PYield
|
|
22
|
+
Project-URL: Source, https://github.com/crdcj/PYield
|
|
23
|
+
Project-URL: Bug Tracker, https://github.com/crdcj/PYield/issues
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
[](https://pypi.python.org/pypi/pyield)
|
|
27
|
+
[](https://python.org "Go to Python homepage")
|
|
28
|
+
[](https://pola.rs/)
|
|
29
|
+
[](https://github.com/crdcj/PYield/blob/main/LICENSE)
|
|
30
|
+
[](https://crdcj.github.io/PYield/)
|
|
31
|
+
|
|
32
|
+
# PYield: Toolkit de Renda Fixa Brasileira
|
|
33
|
+
|
|
34
|
+
Português | [English](https://github.com/crdcj/PYield/blob/main/README.en.md)
|
|
35
|
+
|
|
36
|
+
PYield é uma biblioteca Python voltada para análise de títulos públicos
|
|
37
|
+
brasileiros. Ela busca e processa dados da ANBIMA, BCB, IBGE, B3 e Tesouro
|
|
38
|
+
Nacional, retornando tipos nativos do Python, `polars.Series` ou
|
|
39
|
+
`polars.DataFrame`, conforme a operação.
|
|
40
|
+
|
|
41
|
+
Embora inclua dados e ferramentas de outros mercados, como DI1, DAP e PTAX,
|
|
42
|
+
esses recursos apoiam o objetivo central da biblioteca: análise, precificação e
|
|
43
|
+
acompanhamento de títulos públicos brasileiros.
|
|
44
|
+
|
|
45
|
+
## Instalação
|
|
46
|
+
|
|
47
|
+
Com `pip`:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
pip install pyield
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Em um projeto gerenciado pelo `uv`:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
uv add pyield
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Próximos passos
|
|
60
|
+
|
|
61
|
+
- [Quickstart](https://crdcj.github.io/PYield/quickstart/): primeiros usos da biblioteca.
|
|
62
|
+
- [Documentação completa](https://crdcj.github.io/PYield/): conceitos e referência por módulo.
|
|
63
|
+
- [Mapa da API](https://crdcj.github.io/PYield/api-map/): namespaces e funções públicas.
|
|
64
|
+
- [Desenvolvimento e publicação](https://crdcj.github.io/PYield/desenvolvimento/): ambiente, verificações, build e PyPI.
|
|
65
|
+
- [Notebook no Colab](https://colab.research.google.com/github/crdcj/PYield/blob/main/examples/pyield_quickstart.ipynb): exploração interativa.
|
|
66
|
+
- [Pacote no PyPI](https://pypi.org/project/pyield/).
|
|
67
|
+
|
|
68
|
+
## Mapa da API
|
|
69
|
+
|
|
70
|
+
| Componente | Tipo | Finalidade | Funções públicas |
|
|
71
|
+
|---|---|---|---|
|
|
72
|
+
| `yd.du` | módulo | Dias úteis e calendário brasileiro | `contar`, `deslocar`, `eh_dia_util`, `gerar`, `ultimo_dia_util`, `contar_expr`, `deslocar_expr`, `eh_dia_util_expr` |
|
|
73
|
+
| `yd.Interpolador` | classe | Interpolação escalar e em pipelines Polars | `interpolar`, `interpolar_expr`, `linear`, `flat_forward` |
|
|
74
|
+
| `yd.interpolar(...)` | função | Interpolação vetorizada flat-forward, curva única ou multi-curva | |
|
|
75
|
+
| `yd.forward(...)` | função | Taxa a termo entre dois vértices | |
|
|
76
|
+
| `yd.forwards(...)` | função | Curva de taxas a termo | |
|
|
77
|
+
| `yd.futuro` | módulo | Contratos futuros da B3 | `di1`, `historico`, `intradia`, `datas_disponiveis`, `vencimento`, `enriquecer`, `vencimento_expr` |
|
|
78
|
+
| `yd.di1` | módulo | Curva DI1 e interpolação | `dados`, `interpolar_taxas`, `interpolar_taxa`, `datas_disponiveis` |
|
|
79
|
+
| `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `taxas_historicas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premios_pre`, `secundario` |
|
|
80
|
+
| `yd.rmd(aba)` | função | Relatório Mensal da Dívida do Tesouro Nacional | |
|
|
81
|
+
| `yd.lft` | módulo | LFT | `dados`, `vencimentos`, `cotacao`, `pu`, `taxa`, `vna`, `rentabilidade`, `rentabilidade_expr` |
|
|
82
|
+
| `yd.ltn` | módulo | LTN | `dados`, `vencimentos`, `pu`, `taxa`, `duration_expr`, `dv01`, `dv01_expr`, `rentabilidade`, `rentabilidade_expr`, `taxas_forward` |
|
|
83
|
+
| `yd.ntnb` | módulo | NTN-B | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `taxas_zero`, `duration`, `dv01`, `dv01_expr`, `implicitas`, `curva` |
|
|
84
|
+
| `yd.ntnb1` | módulo | NTN-B1 (Educa+ e Renda+) | `NomeComercial`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `cotacao_curva_zero`, `taxa_curva_zero`, `pu`, `duration`, `dv01` |
|
|
85
|
+
| `yd.ntnbp` | módulo | NTN-B Principal | `cotacao`, `taxa`, `pu`, `dv01` |
|
|
86
|
+
| `yd.ntnc` | módulo | NTN-C | `dados`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
|
|
87
|
+
| `yd.ntnf` | módulo | NTN-F | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `pu`, `taxa`, `taxas_zero`, `premio`, `premio_limpo`, `premio_limpo_expr`, `rentabilidade`, `rentabilidade_expr`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
|
|
88
|
+
| `yd.vna` | módulo | Valores nominais atualizados dos títulos públicos | `valor`, `historico`, `projetado`, `vigencia` |
|
|
89
|
+
| `yd.copom` | módulo | Calendário automático do Copom | `calendario`, `proxima_reuniao` |
|
|
90
|
+
| `yd.compromissadas(...)` | função | Leilões de operações compromissadas do BCB | `inicio`, `fim` |
|
|
91
|
+
| `yd.selic` | módulo | Selic e política monetária | `over`, `over_serie`, `meta`, `meta_serie` |
|
|
92
|
+
| `yd.cpm` | módulo | Opções digitais do COPOM e análises derivadas | `data`, `probabilidades` |
|
|
93
|
+
| `yd.ipca` | módulo | IPCA histórico e projetado | `indice`, `indices`, `indices_ultimos`, `taxa`, `taxas`, `taxas_ultimas`, `taxa_projetada` |
|
|
94
|
+
| `yd.ptax(data)` | função | PTAX para uma data | |
|
|
95
|
+
| `yd.ptax_serie(inicio, fim)` | função | Série histórica da PTAX | |
|
|
96
|
+
| `yd.di_over(data)` | função | Taxa DI Over | |
|
|
97
|
+
| `yd.hoje()` | função | Data atual no Brasil | |
|
|
98
|
+
| `yd.agora()` | função | Data e hora atual no Brasil | |
|
|
99
|
+
|
|
100
|
+
O [mapa completo da API](https://crdcj.github.io/PYield/api-map/) inclui a
|
|
101
|
+
documentação detalhada e as assinaturas públicas.
|
|
102
|
+
|
|
103
|
+
## Compatibilidade da API
|
|
104
|
+
|
|
105
|
+
Este resumo parte da API da `0.56.0`. Mudanças que já faziam parte dessa versão
|
|
106
|
+
ou de versões anteriores estão no histórico das
|
|
107
|
+
[releases do GitHub](https://github.com/crdcj/PYield/releases).
|
|
108
|
+
|
|
109
|
+
| Antes | Agora |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `ntnbp.taxas_zero(...)` | `ntnb.taxas_zero(...)`, sem `incluir_vertices` |
|
|
112
|
+
| `ntnb.taxas_zero(..., incluir_cupons=...)` | `ntnb.taxas_zero(...)`, sem `incluir_cupons` |
|
|
113
|
+
| `ntnb.taxas_zero(..., percentual=...)` | `ntnb.taxas_zero(...)`, com taxas em formato decimal |
|
|
114
|
+
| `yd.tpf.ntnb` | `yd.ntnb` ou `from pyield import ntnb` |
|
|
115
|
+
| `yd.tpf.rmd(aba)` | `yd.rmd(aba)` ou `from pyield import rmd` |
|
|
116
|
+
| `pyield.tpf.vna.calcular_vna(...)` | `yd.vna.calcular_vna(...)` |
|
|
117
|
+
| `yd.ntnb.vna(data)` | `yd.vna.valor("NTN-B", data)` |
|
|
118
|
+
| `yd.ntnb.vnas()` | `yd.vna.historico("NTN-B")` |
|
|
119
|
+
| `vna_projetado(...)` nos módulos de títulos | `yd.vna.projetado(titulo, data, vna_base, inflacao)` |
|
|
120
|
+
| `vigencia(data)` nos módulos de títulos | `yd.vna.vigencia(titulo, data)` |
|
|
121
|
+
|
|
122
|
+
Os módulos públicos de títulos ficam disponíveis na raiz, enquanto as
|
|
123
|
+
implementações continuam organizadas internamente em `pyield/tpf/titulos/`.
|
|
124
|
+
Consulte as [releases](https://github.com/crdcj/PYield/releases) para o
|
|
125
|
+
histórico completo.
|
|
126
|
+
|
|
127
|
+
## Projeto
|
|
128
|
+
|
|
129
|
+
- [Código-fonte](https://github.com/crdcj/PYield)
|
|
130
|
+
- [Issues](https://github.com/crdcj/PYield/issues)
|
|
131
|
+
- [Licença MIT](LICENSE)
|
pyield-0.57.2/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
[](https://pypi.python.org/pypi/pyield)
|
|
2
|
+
[](https://python.org "Go to Python homepage")
|
|
3
|
+
[](https://pola.rs/)
|
|
4
|
+
[](https://github.com/crdcj/PYield/blob/main/LICENSE)
|
|
5
|
+
[](https://crdcj.github.io/PYield/)
|
|
6
|
+
|
|
7
|
+
# PYield: Toolkit de Renda Fixa Brasileira
|
|
8
|
+
|
|
9
|
+
Português | [English](https://github.com/crdcj/PYield/blob/main/README.en.md)
|
|
10
|
+
|
|
11
|
+
PYield é uma biblioteca Python voltada para análise de títulos públicos
|
|
12
|
+
brasileiros. Ela busca e processa dados da ANBIMA, BCB, IBGE, B3 e Tesouro
|
|
13
|
+
Nacional, retornando tipos nativos do Python, `polars.Series` ou
|
|
14
|
+
`polars.DataFrame`, conforme a operação.
|
|
15
|
+
|
|
16
|
+
Embora inclua dados e ferramentas de outros mercados, como DI1, DAP e PTAX,
|
|
17
|
+
esses recursos apoiam o objetivo central da biblioteca: análise, precificação e
|
|
18
|
+
acompanhamento de títulos públicos brasileiros.
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
Com `pip`:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
pip install pyield
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Em um projeto gerenciado pelo `uv`:
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
uv add pyield
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Próximos passos
|
|
35
|
+
|
|
36
|
+
- [Quickstart](https://crdcj.github.io/PYield/quickstart/): primeiros usos da biblioteca.
|
|
37
|
+
- [Documentação completa](https://crdcj.github.io/PYield/): conceitos e referência por módulo.
|
|
38
|
+
- [Mapa da API](https://crdcj.github.io/PYield/api-map/): namespaces e funções públicas.
|
|
39
|
+
- [Desenvolvimento e publicação](https://crdcj.github.io/PYield/desenvolvimento/): ambiente, verificações, build e PyPI.
|
|
40
|
+
- [Notebook no Colab](https://colab.research.google.com/github/crdcj/PYield/blob/main/examples/pyield_quickstart.ipynb): exploração interativa.
|
|
41
|
+
- [Pacote no PyPI](https://pypi.org/project/pyield/).
|
|
42
|
+
|
|
43
|
+
## Mapa da API
|
|
44
|
+
|
|
45
|
+
| Componente | Tipo | Finalidade | Funções públicas |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| `yd.du` | módulo | Dias úteis e calendário brasileiro | `contar`, `deslocar`, `eh_dia_util`, `gerar`, `ultimo_dia_util`, `contar_expr`, `deslocar_expr`, `eh_dia_util_expr` |
|
|
48
|
+
| `yd.Interpolador` | classe | Interpolação escalar e em pipelines Polars | `interpolar`, `interpolar_expr`, `linear`, `flat_forward` |
|
|
49
|
+
| `yd.interpolar(...)` | função | Interpolação vetorizada flat-forward, curva única ou multi-curva | |
|
|
50
|
+
| `yd.forward(...)` | função | Taxa a termo entre dois vértices | |
|
|
51
|
+
| `yd.forwards(...)` | função | Curva de taxas a termo | |
|
|
52
|
+
| `yd.futuro` | módulo | Contratos futuros da B3 | `di1`, `historico`, `intradia`, `datas_disponiveis`, `vencimento`, `enriquecer`, `vencimento_expr` |
|
|
53
|
+
| `yd.di1` | módulo | Curva DI1 e interpolação | `dados`, `interpolar_taxas`, `interpolar_taxa`, `datas_disponiveis` |
|
|
54
|
+
| `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `taxas_historicas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premios_pre`, `secundario` |
|
|
55
|
+
| `yd.rmd(aba)` | função | Relatório Mensal da Dívida do Tesouro Nacional | |
|
|
56
|
+
| `yd.lft` | módulo | LFT | `dados`, `vencimentos`, `cotacao`, `pu`, `taxa`, `vna`, `rentabilidade`, `rentabilidade_expr` |
|
|
57
|
+
| `yd.ltn` | módulo | LTN | `dados`, `vencimentos`, `pu`, `taxa`, `duration_expr`, `dv01`, `dv01_expr`, `rentabilidade`, `rentabilidade_expr`, `taxas_forward` |
|
|
58
|
+
| `yd.ntnb` | módulo | NTN-B | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `taxas_zero`, `duration`, `dv01`, `dv01_expr`, `implicitas`, `curva` |
|
|
59
|
+
| `yd.ntnb1` | módulo | NTN-B1 (Educa+ e Renda+) | `NomeComercial`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `cotacao_curva_zero`, `taxa_curva_zero`, `pu`, `duration`, `dv01` |
|
|
60
|
+
| `yd.ntnbp` | módulo | NTN-B Principal | `cotacao`, `taxa`, `pu`, `dv01` |
|
|
61
|
+
| `yd.ntnc` | módulo | NTN-C | `dados`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
|
|
62
|
+
| `yd.ntnf` | módulo | NTN-F | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `pu`, `taxa`, `taxas_zero`, `premio`, `premio_limpo`, `premio_limpo_expr`, `rentabilidade`, `rentabilidade_expr`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
|
|
63
|
+
| `yd.vna` | módulo | Valores nominais atualizados dos títulos públicos | `valor`, `historico`, `projetado`, `vigencia` |
|
|
64
|
+
| `yd.copom` | módulo | Calendário automático do Copom | `calendario`, `proxima_reuniao` |
|
|
65
|
+
| `yd.compromissadas(...)` | função | Leilões de operações compromissadas do BCB | `inicio`, `fim` |
|
|
66
|
+
| `yd.selic` | módulo | Selic e política monetária | `over`, `over_serie`, `meta`, `meta_serie` |
|
|
67
|
+
| `yd.cpm` | módulo | Opções digitais do COPOM e análises derivadas | `data`, `probabilidades` |
|
|
68
|
+
| `yd.ipca` | módulo | IPCA histórico e projetado | `indice`, `indices`, `indices_ultimos`, `taxa`, `taxas`, `taxas_ultimas`, `taxa_projetada` |
|
|
69
|
+
| `yd.ptax(data)` | função | PTAX para uma data | |
|
|
70
|
+
| `yd.ptax_serie(inicio, fim)` | função | Série histórica da PTAX | |
|
|
71
|
+
| `yd.di_over(data)` | função | Taxa DI Over | |
|
|
72
|
+
| `yd.hoje()` | função | Data atual no Brasil | |
|
|
73
|
+
| `yd.agora()` | função | Data e hora atual no Brasil | |
|
|
74
|
+
|
|
75
|
+
O [mapa completo da API](https://crdcj.github.io/PYield/api-map/) inclui a
|
|
76
|
+
documentação detalhada e as assinaturas públicas.
|
|
77
|
+
|
|
78
|
+
## Compatibilidade da API
|
|
79
|
+
|
|
80
|
+
Este resumo parte da API da `0.56.0`. Mudanças que já faziam parte dessa versão
|
|
81
|
+
ou de versões anteriores estão no histórico das
|
|
82
|
+
[releases do GitHub](https://github.com/crdcj/PYield/releases).
|
|
83
|
+
|
|
84
|
+
| Antes | Agora |
|
|
85
|
+
|---|---|
|
|
86
|
+
| `ntnbp.taxas_zero(...)` | `ntnb.taxas_zero(...)`, sem `incluir_vertices` |
|
|
87
|
+
| `ntnb.taxas_zero(..., incluir_cupons=...)` | `ntnb.taxas_zero(...)`, sem `incluir_cupons` |
|
|
88
|
+
| `ntnb.taxas_zero(..., percentual=...)` | `ntnb.taxas_zero(...)`, com taxas em formato decimal |
|
|
89
|
+
| `yd.tpf.ntnb` | `yd.ntnb` ou `from pyield import ntnb` |
|
|
90
|
+
| `yd.tpf.rmd(aba)` | `yd.rmd(aba)` ou `from pyield import rmd` |
|
|
91
|
+
| `pyield.tpf.vna.calcular_vna(...)` | `yd.vna.calcular_vna(...)` |
|
|
92
|
+
| `yd.ntnb.vna(data)` | `yd.vna.valor("NTN-B", data)` |
|
|
93
|
+
| `yd.ntnb.vnas()` | `yd.vna.historico("NTN-B")` |
|
|
94
|
+
| `vna_projetado(...)` nos módulos de títulos | `yd.vna.projetado(titulo, data, vna_base, inflacao)` |
|
|
95
|
+
| `vigencia(data)` nos módulos de títulos | `yd.vna.vigencia(titulo, data)` |
|
|
96
|
+
|
|
97
|
+
Os módulos públicos de títulos ficam disponíveis na raiz, enquanto as
|
|
98
|
+
implementações continuam organizadas internamente em `pyield/tpf/titulos/`.
|
|
99
|
+
Consulte as [releases](https://github.com/crdcj/PYield/releases) para o
|
|
100
|
+
histórico completo.
|
|
101
|
+
|
|
102
|
+
## Projeto
|
|
103
|
+
|
|
104
|
+
- [Código-fonte](https://github.com/crdcj/PYield)
|
|
105
|
+
- [Issues](https://github.com/crdcj/PYield/issues)
|
|
106
|
+
- [Licença MIT](LICENSE)
|
|
Binary file
|
|
@@ -10,12 +10,15 @@ from pyield.futuro import di1
|
|
|
10
10
|
|
|
11
11
|
# Ordem intencional: alguns módulos importam `di1` a partir de `pyield`
|
|
12
12
|
# durante a inicialização do pacote.
|
|
13
|
-
from pyield import selic, tpf
|
|
13
|
+
from pyield import cpm, copom, selic, tpf, vna
|
|
14
|
+
from pyield.cpm import probabilidades as _cpm_probabilidades # noqa: F401
|
|
14
15
|
from pyield.bc.sgs import ptax, ptax_serie
|
|
16
|
+
from pyield.compromissada import compromissadas
|
|
15
17
|
from pyield.fwd import forward, forwards, forwards_expr
|
|
16
18
|
from pyield.interpolador import Interpolador, interpolar
|
|
17
19
|
from pyield.relogio import agora, hoje
|
|
18
|
-
from pyield.tpf import
|
|
20
|
+
from pyield.tpf.rmd import rmd
|
|
21
|
+
from pyield.tpf.titulos import lft, ltn, ntnb, ntnb1, ntnbp, ntnc, ntnf
|
|
19
22
|
|
|
20
23
|
try:
|
|
21
24
|
__version__ = version("pyield")
|
|
@@ -26,6 +29,9 @@ __all__ = [
|
|
|
26
29
|
"__version__",
|
|
27
30
|
"agora",
|
|
28
31
|
"b3",
|
|
32
|
+
"compromissadas",
|
|
33
|
+
"cpm",
|
|
34
|
+
"copom",
|
|
29
35
|
"di1",
|
|
30
36
|
"di_over",
|
|
31
37
|
"du",
|
|
@@ -46,8 +52,10 @@ __all__ = [
|
|
|
46
52
|
"ntnf",
|
|
47
53
|
"ptax",
|
|
48
54
|
"ptax_serie",
|
|
55
|
+
"rmd",
|
|
49
56
|
"selic",
|
|
50
57
|
"tpf",
|
|
58
|
+
"vna",
|
|
51
59
|
]
|
|
52
60
|
|
|
53
61
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Este módulo expõe helpers técnicos para buscar e ler o Price Report da B3.
|
|
4
4
|
As funções preservam o schema bruto da fonte e servem como base para
|
|
5
|
-
camadas públicas enriquecidas, como ``futuro`` e ``
|
|
5
|
+
camadas públicas enriquecidas, como ``futuro`` e ``cpm``.
|
|
6
6
|
|
|
7
7
|
Estrutura resumida de um registro do XML bruto da B3::
|
|
8
8
|
|
|
@@ -79,8 +79,9 @@ def di_over(data: DateLike) -> float:
|
|
|
79
79
|
|
|
80
80
|
Examples:
|
|
81
81
|
>>> import pyield as yd
|
|
82
|
-
>>> yd.di_over("28/02/2025") # decimal (0.1315 = 13,15% a.a.)
|
|
83
|
-
|
|
82
|
+
>>> taxa = yd.di_over("28/02/2025") # decimal (0.1315 = 13,15% a.a.)
|
|
83
|
+
>>> f"{taxa:.2%}"
|
|
84
|
+
'13.15%'
|
|
84
85
|
>>> yd.di_over("01/01/2025") # Feriado
|
|
85
86
|
nan
|
|
86
87
|
"""
|
|
@@ -237,8 +237,9 @@ def selic_over(data: DateLike) -> float:
|
|
|
237
237
|
|
|
238
238
|
Examples:
|
|
239
239
|
>>> import pyield as yd
|
|
240
|
-
>>> yd.selic.over("31-05-2024") # decimal (0.104 = 10,4% a.a.)
|
|
241
|
-
|
|
240
|
+
>>> taxa = yd.selic.over("31-05-2024") # decimal (0.104 = 10,4% a.a.)
|
|
241
|
+
>>> f"{taxa:.1%}"
|
|
242
|
+
'10.4%'
|
|
242
243
|
"""
|
|
243
244
|
if any_is_empty(data):
|
|
244
245
|
return float("nan")
|
|
@@ -310,8 +311,9 @@ def selic_meta(data: DateLike) -> float:
|
|
|
310
311
|
|
|
311
312
|
Examples:
|
|
312
313
|
>>> import pyield as yd
|
|
313
|
-
>>> yd.selic.meta("31-05-2024") # decimal (0.105 = 10,5% a.a.)
|
|
314
|
-
|
|
314
|
+
>>> taxa = yd.selic.meta("31-05-2024") # decimal (0.105 = 10,5% a.a.)
|
|
315
|
+
>>> f"{taxa:.1%}"
|
|
316
|
+
'10.5%'
|
|
315
317
|
"""
|
|
316
318
|
if any_is_empty(data):
|
|
317
319
|
return float("nan")
|
|
@@ -99,7 +99,7 @@ def compromissadas(
|
|
|
99
99
|
>>> _ = pl.Config.set_tbl_width_chars(210)
|
|
100
100
|
>>> _ = pl.Config.set_tbl_cols(-1)
|
|
101
101
|
>>> import pyield as yd
|
|
102
|
-
>>> yd.
|
|
102
|
+
>>> yd.compromissadas(inicio="21-08-2025", fim="21-08-2025")
|
|
103
103
|
shape: (2, 12)
|
|
104
104
|
┌─────────────┬─────────────────┬──────────────┬─────────────┬──────────┬──────────┬────────────┬────────────────────┬───────────────┬───────────────────┬────────────┬────────────┐
|
|
105
105
|
│ data_leilao ┆ data_liquidacao ┆ data_retorno ┆ hora_inicio ┆ prazo_dc ┆ prazo_du ┆ comunicado ┆ tipo_oferta ┆ publico ┆ financeiro_aceito ┆ taxa_corte ┆ pct_aceito │
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""Calendário automático do Copom a partir das atas e da agenda ICS do BCB."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
import polars as pl
|
|
7
|
+
import requests
|
|
8
|
+
|
|
9
|
+
from pyield import du, relogio
|
|
10
|
+
from pyield._internal.cache import ttl_cache
|
|
11
|
+
from pyield._internal.converters import converter_datas
|
|
12
|
+
from pyield._internal.retry import retry_padrao
|
|
13
|
+
from pyield._internal.types import DateLike
|
|
14
|
+
|
|
15
|
+
_URL_ATAS = "https://www.bcb.gov.br/api/servico/sitebcb/copom/atas"
|
|
16
|
+
_URL_ICS = (
|
|
17
|
+
"https://www.bcb.gov.br/api/exportarics/sitebcb/agendaics"
|
|
18
|
+
"?lista=Reuni%C3%B5es%20do%20Copom"
|
|
19
|
+
)
|
|
20
|
+
_DIAS_POR_REUNIAO = 2
|
|
21
|
+
_SCHEMA = {
|
|
22
|
+
"nro_reuniao": pl.Int64,
|
|
23
|
+
"data_inicio": pl.Date,
|
|
24
|
+
"data_decisao": pl.Date,
|
|
25
|
+
"data_publicacao": pl.Date,
|
|
26
|
+
"data_efetividade": pl.Date,
|
|
27
|
+
"status": pl.String,
|
|
28
|
+
"titulo": pl.String,
|
|
29
|
+
"fonte": pl.String,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@ttl_cache(ttl=8 * 60 * 60)
|
|
34
|
+
@retry_padrao
|
|
35
|
+
def _buscar_atas() -> bytes:
|
|
36
|
+
resposta = requests.get(_URL_ATAS, params={"quantidade": 500}, timeout=30)
|
|
37
|
+
resposta.raise_for_status()
|
|
38
|
+
return resposta.content
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@ttl_cache(ttl=8 * 60 * 60)
|
|
42
|
+
@retry_padrao
|
|
43
|
+
def _buscar_calendario() -> bytes:
|
|
44
|
+
resposta = requests.get(_URL_ICS, timeout=30)
|
|
45
|
+
resposta.raise_for_status()
|
|
46
|
+
return resposta.content
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _parsear_atas(conteudo: bytes) -> pl.DataFrame:
|
|
50
|
+
return pl.from_dicts(
|
|
51
|
+
json.loads(conteudo)["conteudo"],
|
|
52
|
+
schema={
|
|
53
|
+
"nroReuniao": pl.Int64,
|
|
54
|
+
"dataReferencia": pl.String,
|
|
55
|
+
"dataPublicacao": pl.String,
|
|
56
|
+
"titulo": pl.String,
|
|
57
|
+
},
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _parsear_calendario(conteudo: bytes) -> pl.DataFrame:
|
|
62
|
+
texto = re.sub(r"\r?\n[ \t]", "", conteudo.decode("utf-8-sig"))
|
|
63
|
+
if not texto.startswith("BEGIN:VCALENDAR") or "END:VCALENDAR" not in texto:
|
|
64
|
+
raise ValueError("Calendário ICS inválido: VCALENDAR ausente.")
|
|
65
|
+
datas = []
|
|
66
|
+
for evento in re.findall(r"BEGIN:VEVENT\r?\n(.*?)END:VEVENT", texto, re.S):
|
|
67
|
+
inicio = re.search(
|
|
68
|
+
r"^DTSTART(?:;[^:]+)?:(\d{8})(?:T\d{6}Z?)?\r?$", evento, re.M
|
|
69
|
+
)
|
|
70
|
+
if inicio is None:
|
|
71
|
+
raise ValueError("Evento do calendário ICS sem DTSTART válido.")
|
|
72
|
+
datas.append(inicio[1])
|
|
73
|
+
return pl.DataFrame({"data": datas}, schema={"data": pl.String})
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _processar_atas(dados: pl.DataFrame) -> pl.DataFrame:
|
|
77
|
+
return dados.select(
|
|
78
|
+
nro_reuniao=pl.col("nroReuniao"),
|
|
79
|
+
data_decisao=pl.col("dataReferencia").str.to_date("%Y-%m-%d"),
|
|
80
|
+
data_publicacao=pl.col("dataPublicacao").str.to_date("%Y-%m-%d"),
|
|
81
|
+
titulo=pl.col("titulo"),
|
|
82
|
+
).unique("data_decisao", keep="first")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _processar_calendario(dados: pl.DataFrame) -> pl.DataFrame:
|
|
86
|
+
reunioes = (
|
|
87
|
+
dados.with_columns(data=pl.col("data").str.to_date("%Y%m%d"))
|
|
88
|
+
.unique()
|
|
89
|
+
.sort("data")
|
|
90
|
+
.with_columns(
|
|
91
|
+
grupo=(pl.col("data").diff().dt.total_days() != 1).fill_null(True).cum_sum()
|
|
92
|
+
)
|
|
93
|
+
.group_by("grupo")
|
|
94
|
+
.agg(
|
|
95
|
+
data_inicio=pl.col("data").first(),
|
|
96
|
+
data_decisao=pl.col("data").last(),
|
|
97
|
+
dias=pl.len(),
|
|
98
|
+
)
|
|
99
|
+
)
|
|
100
|
+
if reunioes.filter(pl.col("dias") != _DIAS_POR_REUNIAO).height:
|
|
101
|
+
raise ValueError("Calendário ICS contém reunião sem dois dias consecutivos.")
|
|
102
|
+
return reunioes.select("data_inicio", "data_decisao")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def calendario(
|
|
106
|
+
inicio: DateLike | None = None,
|
|
107
|
+
fim: DateLike | None = None,
|
|
108
|
+
) -> pl.DataFrame:
|
|
109
|
+
"""Consulta reuniões históricas e agendadas do Copom nas fontes do BCB.
|
|
110
|
+
|
|
111
|
+
Combina a API de atas históricas com o calendário ICS de reuniões do BCB,
|
|
112
|
+
sem datas anuais fixas. As atas têm prioridade na data de decisão; o ICS
|
|
113
|
+
complementa o início e mantém reuniões ainda sem ata, inclusive passadas.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
inicio: Limite inicial inclusivo para a data de decisão. Sem limite
|
|
117
|
+
quando None. Aceita DD-MM-YYYY, DD/MM/YYYY, YYYY-MM-DD e date.
|
|
118
|
+
fim: Limite final inclusivo para a data de decisão, nos mesmos formatos.
|
|
119
|
+
Sem limite quando None.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
DataFrame ordenado por data_decisao, sem duplicatas nessa coluna.
|
|
123
|
+
Consultas sem registros retornam DataFrame vazio com o mesmo esquema.
|
|
124
|
+
|
|
125
|
+
Output Columns:
|
|
126
|
+
nro_reuniao (Int64): Número sequencial informado na ata; nulo sem ata.
|
|
127
|
+
data_inicio (Date): Primeiro dia informado no ICS; nulo fora da agenda.
|
|
128
|
+
data_decisao (Date): Último dia da reunião, dataReferencia nas atas.
|
|
129
|
+
data_publicacao (Date): Publicação da ata; nula quando não disponível.
|
|
130
|
+
data_efetividade (Date): Próximo dia útil após a decisão, calculado pelo
|
|
131
|
+
calendário brasileiro de yd.du; data de vencimento/liquidação CPM.
|
|
132
|
+
status (String): "Realizada" se a decisão for até hoje no Brasil;
|
|
133
|
+
"A realizar" caso contrário. Classificação por data, não por ata.
|
|
134
|
+
titulo (String): Título original da ata; nulo quando não disponível.
|
|
135
|
+
fonte (String): "Ata" ou "Calendário", conforme a origem da decisão.
|
|
136
|
+
|
|
137
|
+
Notes:
|
|
138
|
+
O horizonte depende das datas publicadas pelo BCB. A consulta às atas
|
|
139
|
+
solicita até 500 registros. O conteúdo bruto fica em cache por oito
|
|
140
|
+
horas; o status é recalculado a cada chamada. Erros de rede e payload
|
|
141
|
+
inválido são propagados. O ICS publica um evento por dia: dias únicos
|
|
142
|
+
consecutivos devem formar pares; grupos incompletos geram ValueError.
|
|
143
|
+
O início histórico não é inferido subtraindo um dia da decisão.
|
|
144
|
+
|
|
145
|
+
Examples:
|
|
146
|
+
>>> cal = yd.copom.calendario(inicio="01-01-2026") # doctest: +SKIP
|
|
147
|
+
>>> cal["data_decisao"].is_sorted() # doctest: +SKIP
|
|
148
|
+
True
|
|
149
|
+
"""
|
|
150
|
+
inicio = converter_datas(inicio)
|
|
151
|
+
fim = converter_datas(fim)
|
|
152
|
+
if inicio is not None and fim is not None and inicio > fim:
|
|
153
|
+
raise ValueError("inicio deve ser anterior ou igual a fim.")
|
|
154
|
+
atas = _processar_atas(_parsear_atas(_buscar_atas()))
|
|
155
|
+
agenda = _processar_calendario(_parsear_calendario(_buscar_calendario()))
|
|
156
|
+
df = (
|
|
157
|
+
atas.join(agenda, on="data_decisao", how="full", coalesce=True)
|
|
158
|
+
.with_columns(
|
|
159
|
+
data_efetividade=du.deslocar_expr("data_decisao", 1),
|
|
160
|
+
status=pl.when(pl.col("data_decisao") <= relogio.hoje())
|
|
161
|
+
.then(pl.lit("Realizada"))
|
|
162
|
+
.otherwise(pl.lit("A realizar")),
|
|
163
|
+
fonte=pl.when(pl.col("nro_reuniao").is_not_null())
|
|
164
|
+
.then(pl.lit("Ata"))
|
|
165
|
+
.otherwise(pl.lit("Calendário")),
|
|
166
|
+
)
|
|
167
|
+
.select(tuple(_SCHEMA))
|
|
168
|
+
.sort("data_decisao")
|
|
169
|
+
)
|
|
170
|
+
if inicio is not None:
|
|
171
|
+
df = df.filter(pl.col("data_decisao") >= inicio)
|
|
172
|
+
if fim is not None:
|
|
173
|
+
df = df.filter(pl.col("data_decisao") <= fim)
|
|
174
|
+
return df
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def proxima_reuniao(referencia: DateLike | None = None) -> pl.DataFrame:
|
|
178
|
+
"""Consulta a primeira reunião com decisão em ou após a referência.
|
|
179
|
+
|
|
180
|
+
Usa a API de atas e o calendário ICS do BCB, através de calendario.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
referencia: Data inclusiva nos formatos DD-MM-YYYY, DD/MM/YYYY,
|
|
184
|
+
YYYY-MM-DD ou date. None usa a data atual no Brasil.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
DataFrame com até uma linha, com o mesmo esquema de calendario.
|
|
188
|
+
Retorna vazio quando não há reunião publicada a partir da referência.
|
|
189
|
+
|
|
190
|
+
Output Columns:
|
|
191
|
+
nro_reuniao (Int64): Número sequencial da ata, quando disponível.
|
|
192
|
+
data_inicio (Date): Primeiro dia no ICS, quando disponível.
|
|
193
|
+
data_decisao (Date): Último dia da reunião.
|
|
194
|
+
data_publicacao (Date): Publicação da ata, quando disponível.
|
|
195
|
+
data_efetividade (Date): Próximo dia útil após a decisão.
|
|
196
|
+
status (String): "Realizada" ou "A realizar", conforme a data atual.
|
|
197
|
+
titulo (String): Título da ata, quando disponível.
|
|
198
|
+
fonte (String): "Ata" ou "Calendário".
|
|
199
|
+
|
|
200
|
+
Examples:
|
|
201
|
+
>>> yd.copom.proxima_reuniao("01-01-2026").height # doctest: +SKIP
|
|
202
|
+
1
|
|
203
|
+
"""
|
|
204
|
+
referencia = relogio.hoje() if referencia is None else converter_datas(referencia)
|
|
205
|
+
return calendario(inicio=referencia).head(1)
|
|
@@ -26,7 +26,7 @@ ticker filter and a DaysToExp > 0 filter, both incorrect for CPM) and
|
|
|
26
26
|
calls the lower-level price-report helpers directly.
|
|
27
27
|
|
|
28
28
|
ExpiryDate and MeetingEndDate are resolved by joining against the COPOM
|
|
29
|
-
calendar (
|
|
29
|
+
calendar (copom.calendario()) on meeting month + year extracted from
|
|
30
30
|
the ticker. The join is a left join so CPM rows are never dropped even
|
|
31
31
|
if the calendar has gaps for very recently announced future meetings.
|
|
32
32
|
"""
|
|
@@ -254,7 +254,7 @@ def data(date: DateLike) -> pl.DataFrame:
|
|
|
254
254
|
|
|
255
255
|
Examples:
|
|
256
256
|
>>> import pyield as yd
|
|
257
|
-
>>> df = yd.
|
|
257
|
+
>>> df = yd.cpm.data("29-01-2025") # doctest: +SKIP
|
|
258
258
|
>>> df.is_empty() or set(df.schema.keys()) >= { # doctest: +SKIP
|
|
259
259
|
... "data_referencia",
|
|
260
260
|
... "codigo_negociacao",
|
|
@@ -313,13 +313,13 @@ def data(date: DateLike) -> pl.DataFrame:
|
|
|
313
313
|
|
|
314
314
|
# Join with COPOM calendar to get MeetingEndDate and the correct ExpiryDate.
|
|
315
315
|
# Import is deferred to avoid a module-level circular dependency risk.
|
|
316
|
-
from pyield
|
|
316
|
+
from pyield import copom # noqa: PLC0415
|
|
317
317
|
|
|
318
|
-
cal = copom.
|
|
319
|
-
_mes_reuniao=pl.col("
|
|
320
|
-
_ano_reuniao=pl.col("
|
|
321
|
-
data_fim_reuniao=pl.col("
|
|
322
|
-
data_expiracao=pl.col("
|
|
318
|
+
cal = copom.calendario().select(
|
|
319
|
+
_mes_reuniao=pl.col("data_decisao").dt.month().cast(pl.Int32),
|
|
320
|
+
_ano_reuniao=pl.col("data_decisao").dt.year().cast(pl.Int32),
|
|
321
|
+
data_fim_reuniao=pl.col("data_decisao"),
|
|
322
|
+
data_expiracao=pl.col("data_efetividade"),
|
|
323
323
|
)
|
|
324
324
|
|
|
325
325
|
df = df.join(cal, on=["_mes_reuniao", "_ano_reuniao"], how="left").drop(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
2
|
+
probabilidades — Probabilidades implícitas das reuniões do COPOM a partir dos
|
|
3
|
+
preços das opções CPM.
|
|
3
4
|
|
|
4
5
|
The CPM contract is a cash-or-nothing European option. Under risk-neutral
|
|
5
6
|
pricing, the B3 settlement price in points (0–100) encodes the market-implied
|
|
@@ -67,10 +68,10 @@ import logging
|
|
|
67
68
|
|
|
68
69
|
import polars as pl
|
|
69
70
|
|
|
71
|
+
from pyield import cpm
|
|
70
72
|
from pyield._internal.converters import converter_datas
|
|
71
73
|
from pyield._internal.types import DateLike
|
|
72
74
|
from pyield.futuro import di1
|
|
73
|
-
from pyield.selic import cpm
|
|
74
75
|
|
|
75
76
|
logger = logging.getLogger(__name__)
|
|
76
77
|
|
|
@@ -193,7 +194,7 @@ def _add_probabilities(df: pl.DataFrame) -> pl.DataFrame:
|
|
|
193
194
|
df = _add_discount_factors(df)
|
|
194
195
|
|
|
195
196
|
return (
|
|
196
|
-
df.sort(
|
|
197
|
+
df.sort("data_expiracao", "variacao_strike_bps")
|
|
197
198
|
.with_columns(
|
|
198
199
|
prob_bruta=(pl.col("preco_ajuste") * pl.col("fator_desconto") / 100),
|
|
199
200
|
)
|
|
@@ -253,7 +254,7 @@ def all_meetings(
|
|
|
253
254
|
Examples:
|
|
254
255
|
>>> import pyield as yd
|
|
255
256
|
>>> import polars as pl
|
|
256
|
-
>>> df = yd.
|
|
257
|
+
>>> df = yd.cpm.probabilidades.all_meetings("29-01-2025") # doctest: +SKIP
|
|
257
258
|
>>> df.is_empty() or df["ranking_reuniao"].min() == 1 # doctest: +SKIP
|
|
258
259
|
True
|
|
259
260
|
>>> sums = df.group_by("data_expiracao").agg(
|
|
@@ -286,7 +287,7 @@ def all_meetings(
|
|
|
286
287
|
"prob",
|
|
287
288
|
"prob_acumulada",
|
|
288
289
|
)
|
|
289
|
-
.sort(
|
|
290
|
+
.sort("ranking_reuniao", "variacao_strike_bps")
|
|
290
291
|
)
|
|
291
292
|
|
|
292
293
|
return df if not df.is_empty() else _empty_schema()
|
|
@@ -320,7 +321,7 @@ def meeting(
|
|
|
320
321
|
|
|
321
322
|
Examples:
|
|
322
323
|
>>> import pyield as yd
|
|
323
|
-
>>> df = yd.
|
|
324
|
+
>>> df = yd.cpm.probabilidades.meeting("29-01-2025") # doctest: +SKIP
|
|
324
325
|
>>> df.is_empty() or abs(df["prob"].sum() - 1.0) < 1e-9 # doctest: +SKIP
|
|
325
326
|
True
|
|
326
327
|
>>> df.is_empty() or df["prob_acumulada"].tail(
|