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.
Files changed (90) hide show
  1. pyield-0.57.2/PKG-INFO +131 -0
  2. pyield-0.57.2/README.md +106 -0
  3. {pyield-0.56.1 → pyield-0.57.2}/pyield/.DS_Store +0 -0
  4. {pyield-0.56.1 → pyield-0.57.2}/pyield/__init__.py +10 -2
  5. {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/boletim.py +1 -1
  6. {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/di_over.py +3 -2
  7. {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/sgs.py +6 -4
  8. {pyield-0.56.1/pyield/selic → pyield-0.57.2/pyield}/compromissada.py +1 -1
  9. pyield-0.57.2/pyield/copom/__init__.py +4 -0
  10. pyield-0.57.2/pyield/copom/_calendario.py +205 -0
  11. pyield-0.56.1/pyield/selic/cpm.py → pyield-0.57.2/pyield/cpm/__init__.py +8 -8
  12. pyield-0.56.1/pyield/selic/probabilities.py → pyield-0.57.2/pyield/cpm/probabilidades.py +7 -6
  13. {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/di1.py +21 -17
  14. {pyield-0.56.1 → pyield-0.57.2}/pyield/fwd.py +14 -13
  15. {pyield-0.56.1 → pyield-0.57.2}/pyield/interpolador.py +6 -4
  16. {pyield-0.56.1 → pyield-0.57.2}/pyield/ipca/historico.py +3 -2
  17. pyield-0.57.2/pyield/selic/__init__.py +20 -0
  18. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/__init__.py +0 -10
  19. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/__init__.py +2 -2
  20. pyield-0.57.2/pyield/tpf/titulos/_ntnb_bootstrap.py +340 -0
  21. pyield-0.57.2/pyield/tpf/titulos/_ntnf_bootstrap.py +193 -0
  22. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/_utils.py +11 -19
  23. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/lft.py +11 -9
  24. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ltn.py +26 -19
  25. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnb.py +47 -247
  26. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnbp.py +5 -8
  27. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnc.py +8 -10
  28. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnf.py +33 -27
  29. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/pre.py +15 -12
  30. pyield-0.57.2/pyield/vna/__init__.py +13 -0
  31. pyield-0.57.2/pyield/vna/_consulta.py +184 -0
  32. pyield-0.56.1/pyield/bc/lft.py → pyield-0.57.2/pyield/vna/_lft.py +2 -2
  33. pyield-0.56.1/pyield/tpf/vna/ntnb.py → pyield-0.57.2/pyield/vna/_ntnb.py +36 -14
  34. pyield-0.56.1/pyield/tpf/vna/ntnc.py → pyield-0.57.2/pyield/vna/_ntnc.py +34 -12
  35. {pyield-0.56.1 → pyield-0.57.2}/pyproject.toml +3 -5
  36. {pyield-0.56.1 → pyield-0.57.2}/pyproject.toml.orig +3 -5
  37. pyield-0.56.1/PKG-INFO +0 -352
  38. pyield-0.56.1/README.md +0 -327
  39. pyield-0.56.1/pyield/selic/__init__.py +0 -33
  40. pyield-0.56.1/pyield/selic/copom.py +0 -201
  41. pyield-0.56.1/pyield/tpf/titulos/_bootstrap_forwards.py +0 -295
  42. pyield-0.56.1/pyield/tpf/vna/__init__.py +0 -5
  43. {pyield-0.56.1 → pyield-0.57.2}/LICENSE +0 -0
  44. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/__init__.py +0 -0
  45. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/br_numbers.py +0 -0
  46. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/cache.py +0 -0
  47. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/converters.py +0 -0
  48. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/data_cache.py +0 -0
  49. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/excel.py +0 -0
  50. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/numbers.py +0 -0
  51. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/retry.py +0 -0
  52. {pyield-0.56.1 → pyield-0.57.2}/pyield/_internal/types.py +0 -0
  53. {pyield-0.56.1 → pyield-0.57.2}/pyield/anbima/__init__.py +0 -0
  54. {pyield-0.56.1 → pyield-0.57.2}/pyield/anbima/imaq.py +0 -0
  55. {pyield-0.56.1 → pyield-0.57.2}/pyield/anbima/taxas.py +0 -0
  56. {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/__init__.py +0 -0
  57. {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/_contratos.py +0 -0
  58. {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/_validar_pregao.py +0 -0
  59. {pyield-0.56.1 → pyield-0.57.2}/pyield/b3/derivativos_intradia.py +0 -0
  60. {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/__init__.py +0 -0
  61. {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/_olinda.py +0 -0
  62. {pyield-0.56.1 → pyield-0.57.2}/pyield/bc/leiloes.py +0 -0
  63. {pyield-0.56.1 → pyield-0.57.2}/pyield/du/__init__.py +0 -0
  64. {pyield-0.56.1 → pyield-0.57.2}/pyield/du/core.py +0 -0
  65. {pyield-0.56.1 → pyield-0.57.2}/pyield/du/feriados_br/__init__.py +0 -0
  66. {pyield-0.56.1 → pyield-0.57.2}/pyield/du/feriados_br/anteriores.txt +0 -0
  67. {pyield-0.56.1 → pyield-0.57.2}/pyield/du/feriados_br/atuais.txt +0 -0
  68. {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/__init__.py +0 -0
  69. {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/contratos.py +0 -0
  70. {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/historico.py +0 -0
  71. {pyield-0.56.1 → pyield-0.57.2}/pyield/futuro/intradia.py +0 -0
  72. {pyield-0.56.1 → pyield-0.57.2}/pyield/ipca/__init__.py +0 -0
  73. {pyield-0.56.1 → pyield-0.57.2}/pyield/ipca/projetado.py +0 -0
  74. {pyield-0.56.1 → pyield-0.57.2}/pyield/py.typed +0 -0
  75. {pyield-0.56.1 → pyield-0.57.2}/pyield/relogio.py +0 -0
  76. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/_taxas.py +0 -0
  77. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/benchmark.py +0 -0
  78. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/dealers.py +0 -0
  79. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/leiloes.py +0 -0
  80. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_aba_1_3.py +0 -0
  81. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_aba_2_1.py +0 -0
  82. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_common.py +0 -0
  83. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/rmd/_download.py +0 -0
  84. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/secundario/__init__.py +0 -0
  85. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/secundario/_intradia.py +0 -0
  86. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/secundario/_mensal.py +0 -0
  87. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/__init__.py +0 -0
  88. {pyield-0.56.1 → pyield-0.57.2}/pyield/tpf/titulos/ntnb1.py +0 -0
  89. /pyield-0.56.1/pyield/tpf/vna/calculo.py → /pyield-0.57.2/pyield/vna/_calculo.py +0 -0
  90. {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
+ [![PyPI version](https://img.shields.io/pypi/v/pyield.svg)](https://pypi.python.org/pypi/pyield)
27
+ [![Made with Python](https://img.shields.io/badge/Python->=3.12-blue?logo=python&logoColor=white)](https://python.org "Go to Python homepage")
28
+ [![Powered by Polars](https://img.shields.io/badge/Powered%20by-Polars-blue)](https://pola.rs/)
29
+ [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/crdcj/PYield/blob/main/LICENSE)
30
+ [![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue?logo=readthedocs&logoColor=white)](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)
@@ -0,0 +1,106 @@
1
+ [![PyPI version](https://img.shields.io/pypi/v/pyield.svg)](https://pypi.python.org/pypi/pyield)
2
+ [![Made with Python](https://img.shields.io/badge/Python->=3.12-blue?logo=python&logoColor=white)](https://python.org "Go to Python homepage")
3
+ [![Powered by Polars](https://img.shields.io/badge/Powered%20by-Polars-blue)](https://pola.rs/)
4
+ [![License](https://img.shields.io/badge/License-MIT-blue)](https://github.com/crdcj/PYield/blob/main/LICENSE)
5
+ [![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue?logo=readthedocs&logoColor=white)](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)
@@ -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 lft, ltn, ntnb, ntnb1, ntnbp, ntnc, ntnf
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 ``selic.cpm``.
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
- 0.1315
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
- 0.104
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
- 0.105
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.selic.compromissadas(inicio="21-08-2025", fim="21-08-2025")
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,4 @@
1
+ """Calendário de reuniões do Copom: calendario e proxima_reuniao."""
2
+
3
+ from pyield.copom._calendario import calendario as calendario
4
+ from pyield.copom._calendario import proxima_reuniao as proxima_reuniao
@@ -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 (bc.copom.calendar()) on meeting month + year extracted from
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.selic.cpm.data("29-01-2025") # doctest: +SKIP
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.selic import copom # noqa: PLC0415
316
+ from pyield import copom # noqa: PLC0415
317
317
 
318
- cal = copom.calendar().select(
319
- _mes_reuniao=pl.col("EndDate").dt.month().cast(pl.Int32),
320
- _ano_reuniao=pl.col("EndDate").dt.year().cast(pl.Int32),
321
- data_fim_reuniao=pl.col("EndDate"),
322
- data_expiracao=pl.col("ExpiryDate"),
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
- probabilities — Implied COPOM meeting probabilities from CPM option prices.
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(["data_expiracao", "variacao_strike_bps"])
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.selic.probabilities.all_meetings("29-01-2025") # doctest: +SKIP
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(["ranking_reuniao", "variacao_strike_bps"])
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.selic.probabilities.meeting("29-01-2025") # doctest: +SKIP
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(