pyield 0.48.9__tar.gz → 0.49.0__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 (75) hide show
  1. {pyield-0.48.9 → pyield-0.49.0}/PKG-INFO +93 -86
  2. {pyield-0.48.9 → pyield-0.49.0}/README.md +60 -52
  3. {pyield-0.48.9 → pyield-0.49.0}/pyield/__init__.py +22 -8
  4. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/br_numbers.py +16 -4
  5. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/converters.py +1 -1
  6. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/types.py +2 -2
  7. {pyield-0.48.9 → pyield-0.49.0}/pyield/anbima/imaq.py +23 -20
  8. pyield-0.48.9/pyield/anbima/tpf.py → pyield-0.49.0/pyield/anbima/mercado_secundario.py +48 -85
  9. pyield-0.49.0/pyield/b3/__init__.py +1 -0
  10. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/_validar_pregao.py +1 -1
  11. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/boletim.py +5 -5
  12. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/di1.py +27 -10
  13. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/di_over.py +9 -9
  14. pyield-0.49.0/pyield/b3/futuro/__init__.py +14 -0
  15. pyield-0.49.0/pyield/b3/futuro/contratos.py +153 -0
  16. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/futuro/historico.py +112 -61
  17. pyield-0.49.0/pyield/b3/futuro/intradia.py +170 -0
  18. pyield-0.49.0/pyield/bc/__init__.py +0 -0
  19. {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/leiloes.py +4 -2
  20. {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/sgs.py +34 -44
  21. {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/tpf_intradia.py +39 -44
  22. {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/tpf_mensal.py +27 -42
  23. {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/vna.py +9 -17
  24. {pyield-0.48.9 → pyield-0.49.0}/pyield/du/__init__.py +4 -4
  25. {pyield-0.48.9 → pyield-0.49.0}/pyield/du/core.py +23 -23
  26. {pyield-0.48.9 → pyield-0.49.0}/pyield/ipca/__init__.py +10 -1
  27. {pyield-0.48.9 → pyield-0.49.0}/pyield/ipca/historico.py +64 -26
  28. pyield-0.49.0/pyield/py.typed +0 -0
  29. {pyield-0.48.9 → pyield-0.49.0}/pyield/relogio.py +1 -1
  30. pyield-0.49.0/pyield/selic/__init__.py +33 -0
  31. {pyield-0.48.9/pyield/bc → pyield-0.49.0/pyield/selic}/compromissada.py +2 -2
  32. {pyield-0.48.9/pyield/bc → pyield-0.49.0/pyield/selic}/copom.py +12 -14
  33. {pyield-0.48.9 → pyield-0.49.0}/pyield/selic/cpm.py +17 -36
  34. {pyield-0.48.9 → pyield-0.49.0}/pyield/selic/probabilities.py +17 -19
  35. pyield-0.49.0/pyield/tn/__init__.py +1 -0
  36. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/benchmark.py +11 -25
  37. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/leiloes.py +52 -59
  38. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/lft.py +3 -0
  39. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnb.py +4 -4
  40. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnf.py +1 -2
  41. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/pre.py +14 -12
  42. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/rmd.py +14 -49
  43. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/utils.py +11 -11
  44. pyield-0.49.0/pyield/tpf.py +25 -0
  45. {pyield-0.48.9 → pyield-0.49.0}/pyproject.toml +16 -24
  46. pyield-0.48.9/.gitignore +0 -23
  47. pyield-0.48.9/pyield/__about__.py +0 -1
  48. pyield-0.48.9/pyield/anbima/__init__.py +0 -9
  49. pyield-0.48.9/pyield/b3/__init__.py +0 -27
  50. pyield-0.48.9/pyield/b3/futuro/__init__.py +0 -154
  51. pyield-0.48.9/pyield/b3/futuro/contratos.py +0 -76
  52. pyield-0.48.9/pyield/b3/futuro/intradia.py +0 -116
  53. pyield-0.48.9/pyield/bc/__init__.py +0 -30
  54. pyield-0.48.9/pyield/selic/__init__.py +0 -14
  55. pyield-0.48.9/pyield/tn/__init__.py +0 -20
  56. {pyield-0.48.9 → pyield-0.49.0}/LICENSE +0 -0
  57. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/__init__.py +0 -0
  58. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/cache.py +0 -0
  59. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/data_cache.py +0 -0
  60. {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/retry.py +0 -0
  61. /pyield-0.48.9/pyield/py.typed → /pyield-0.49.0/pyield/anbima/__init__.py +0 -0
  62. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/_contratos.py +0 -0
  63. {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/derivativos_intradia.py +0 -0
  64. {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/_olinda.py +0 -0
  65. {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/__init__.py +0 -0
  66. {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/feriados_antigos_br.txt +0 -0
  67. {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/feriados_br.py +0 -0
  68. {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/feriados_novos_br.txt +0 -0
  69. {pyield-0.48.9 → pyield-0.49.0}/pyield/fwd.py +0 -0
  70. {pyield-0.48.9 → pyield-0.49.0}/pyield/interpolador.py +0 -0
  71. {pyield-0.48.9 → pyield-0.49.0}/pyield/ipca/projetado.py +0 -0
  72. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ltn.py +0 -0
  73. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnb1.py +0 -0
  74. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnbprinc.py +0 -0
  75. {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnc.py +0 -0
@@ -1,45 +1,44 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.3
2
2
  Name: pyield
3
- Version: 0.48.9
3
+ Version: 0.49.0
4
4
  Summary: A Python library for analysis of fixed income instruments in Brazil
5
- Project-URL: Homepage, https://github.com/crdcj/PYield
6
- Project-URL: Documentation, https://crdcj.github.io/PYield
7
- Project-URL: Source, https://github.com/crdcj/PYield
8
- Project-URL: Bug Tracker, https://github.com/crdcj/PYield/issues
5
+ Keywords: fixed-income,brazil,finance,analysis,bonds
6
+ Author: Carlos Carvalho
9
7
  Author-email: Carlos Carvalho <cr.cj@outlook.com>
10
8
  License: MIT License
11
-
12
- Copyright (c) 2023 Carlos Carvalho
13
-
14
- Permission is hereby granted, free of charge, to any person obtaining a copy
15
- of this software and associated documentation files (the "Software"), to deal
16
- in the Software without restriction, including without limitation the rights
17
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
- copies of the Software, and to permit persons to whom the Software is
19
- furnished to do so, subject to the following conditions:
20
-
21
- The above copyright notice and this permission notice shall be included in all
22
- copies or substantial portions of the Software.
23
-
24
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
- SOFTWARE.
31
- License-File: LICENSE
32
- Keywords: analysis,bonds,brazil,finance,fixed-income
33
- Classifier: Intended Audience :: Financial and Insurance Industry
34
- Classifier: License :: OSI Approved :: MIT License
35
- Classifier: Operating System :: OS Independent
9
+
10
+ Copyright (c) 2023 Carlos Carvalho
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
36
29
  Classifier: Programming Language :: Python :: 3
30
+ Classifier: Operating System :: OS Independent
31
+ Classifier: Intended Audience :: Financial and Insurance Industry
37
32
  Classifier: Topic :: Office/Business :: Financial :: Investment
38
- Requires-Python: >=3.12
39
- Requires-Dist: fastexcel>=0.19.0
40
- Requires-Dist: lxml>=6.0.0
41
33
  Requires-Dist: polars>=1.39.0
34
+ Requires-Dist: lxml>=6.0.0
42
35
  Requires-Dist: requests>=2.31.0
36
+ Requires-Dist: fastexcel>=0.19.0
37
+ Requires-Python: >=3.12
38
+ Project-URL: Homepage, https://github.com/crdcj/PYield
39
+ Project-URL: Documentation, https://crdcj.github.io/PYield
40
+ Project-URL: Source, https://github.com/crdcj/PYield
41
+ Project-URL: Bug Tracker, https://github.com/crdcj/PYield/issues
43
42
  Description-Content-Type: text/markdown
44
43
 
45
44
  [![PyPI version](https://img.shields.io/pypi/v/pyield.svg)](https://pypi.python.org/pypi/pyield)
@@ -64,26 +63,26 @@ pip install pyield
64
63
  ## Início Rápido
65
64
 
66
65
  ```python
67
- from pyield import du, b3, bc, ntnb, Interpolador
66
+ import pyield as yd
68
67
 
69
68
  # Dias úteis (base de todos os cálculos)
70
- du.contar("02-01-2025", "15-01-2025") # -> 9
71
- du.deslocar("29-12-2023", 1) # -> datetime.date(2024, 1, 2)
69
+ yd.du.contar("02-01-2025", "15-01-2025") # -> 9
70
+ yd.du.deslocar("29-12-2023", 1) # -> datetime.date(2024, 1, 2)
72
71
 
73
72
  # Curva de DI Futuro
74
- df = b3.futuro("31-05-2024", "DI1")
73
+ df = yd.futuro.historico("31-05-2024", "DI1")
75
74
  # Colunas: data_referencia, codigo_negociacao, data_vencimento, dias_uteis, taxa_ajuste, ...
76
75
 
77
76
  # Interpolação de taxas (flat forward, convenção 252 dias úteis/ano)
78
- interp = Interpolador(df["dias_uteis"], df["taxa_ajuste"], metodo="flat_forward")
77
+ interp = yd.Interpolador(df["dias_uteis"], df["taxa_ajuste"], metodo="flat_forward")
79
78
  interp(45) # -> 0.04833...
80
79
  interp([30, 60]) # -> Series do Polars com taxas interpoladas
81
80
 
82
81
  # Precificação de títulos públicos
83
- ntnb.cotacao("31-05-2024", "15-05-2035", 0.061490) # -> 99.3651
82
+ yd.ntnb.cotacao("31-05-2024", "15-05-2035", 0.061490) # -> 99.3651
84
83
 
85
84
  # Indicadores do BCB
86
- bc.selic_over("31-05-2024") # -> 0.000414...
85
+ yd.selic.over("31-05-2024") # -> 0.000414...
87
86
  ```
88
87
 
89
88
  Um notebook no Colab com mais exemplos:
@@ -113,7 +112,7 @@ du.gerar("22-12-2023", "02-01-2024")
113
112
  # -> Series: [2023-12-22, 2023-12-26, 2023-12-27, 2023-12-28, 2023-12-29, 2024-01-02]
114
113
 
115
114
  # Verifica se a data é dia útil
116
- du.e_dia_util("25-12-2023") # -> False (Natal)
115
+ du.eh_dia_util("25-12-2023") # -> False (Natal)
117
116
  ```
118
117
 
119
118
  Todas as funções suportam operações vetorizadas com listas, Series ou arrays.
@@ -170,20 +169,16 @@ forwards(dias_uteis, taxas) # -> Series: [0.05, 0.070095, 0.090284]
170
169
 
171
170
  | Módulo | Finalidade |
172
171
  |--------|---------|
173
- | `du` | Calendário de dias úteis com feriados brasileiros |
174
- | `b3.futuro` | Dados históricos de futuros da B3 (DI1, DDI, DAP, DOL, WDO, IND, WIN e outros) |
175
- | `b3.di1` | Curva DI1 interpolada e datas de negociação disponíveis |
172
+ | `du` | Cálculos com dias úteis considerando feriados brasileiros |
173
+ | `futuro` | Dados de futuros (DI1, DDI, DAP, DOL, WDO, IND, WIN e outros) |
174
+ | `tpf` | Taxas, vencimentos, estoque, leilões, benchmarks, RMD e negociações de TPFs |
175
+ | `di1` | Curva DI1 interpolada e datas de negociação disponíveis |
176
176
  | `Interpolador` | Interpolação de taxas (flat_forward, linear) |
177
177
  | `forward` / `forwards` | Cálculo de taxas a termo |
178
178
  | `ltn`, `ntnb`, `ntnf`, `lft`, `ntnc` | Precificação e análise dos títulos públicos principais |
179
- | `ntnb1`, `ntnbprinc`, `pre` | Títulos e curvas adicionais (NTN-B1, NTN-B Principal, curva PRE) |
180
- | `tn.leiloes` / `tn.benchmarks` | Leilões e benchmarks de títulos públicos |
181
- | `anbima` | Dados da ANBIMA (preços de TPF, curvas de juros, índices IMA) |
182
- | `bc` | Indicadores do BCB (SELIC, PTAX, repos, VNA, leilões, negociações) |
183
- | `b3` | Dados da B3 (DI over, price reports, derivativos intradiários) |
179
+ | `ntnb1`, `ntnbprinc` | Títulos adicionais (NTN-B1, NTN-B Principal) |
180
+ | `selic` | Dados da taxa Selic, COPOM, compromissadas do BCB, CPM e probabilidades implícitas |
184
181
  | `ipca` | Dados de inflação (histórico e projeções) |
185
- | `selic` | Opções digitais de COPOM e probabilidades implícitas |
186
- | `tn.rmd` | Relatório Mensal da Dívida do Tesouro Nacional |
187
182
  | `hoje` / `agora` | Data/hora atual no Brasil (America/Sao_Paulo) |
188
183
 
189
184
  ## Títulos Públicos
@@ -210,19 +205,19 @@ ntnf.premio("30-05-2025", pontos_base=True)
210
205
  import pyield as yd
211
206
 
212
207
  # DI1 (Futuro de Depósito Interfinanceiro)
213
- b3.futuro("31-05-2024", "DI1")
208
+ yd.futuro.historico("31-05-2024", "DI1")
214
209
 
215
210
  # Outros contratos disponíveis no cache histórico:
216
211
  # - Juros: DI1, DDI, FRC, FRO, DAP
217
212
  # - Moedas: DOL, WDO
218
213
  # - Índices: IND, WIN
219
- b3.futuro("31-05-2024", "DAP")
214
+ yd.futuro.historico("31-05-2024", "DAP")
220
215
 
221
216
  # Múltiplas datas de uma vez
222
- b3.futuro(["29-05-2024", "31-05-2024"], "DI1")
217
+ yd.futuro.historico(["29-05-2024", "31-05-2024"], "DI1")
223
218
 
224
- # Dados intradiários (quando o mercado estiver aberto)
225
- b3.futuro_intradia("DI1") # Retorna dados ao vivo durante o horário de negociação
219
+ # Dados intradia (quando o mercado estiver aberto)
220
+ yd.futuro.intradia("DI1") # Retorna dados ao vivo durante o pregão
226
221
  ```
227
222
 
228
223
  ## Tratamento de Datas
@@ -251,41 +246,53 @@ Consultas sem dados disponíveis (data futura, feriado, fim de semana ou
251
246
  fonte indisponível) retornam DataFrame vazio ou `nan`, sem lançar exceção:
252
247
 
253
248
  ```python
254
- from pyield import b3, bc
249
+ import pyield as yd
255
250
 
256
- b3.futuro("01-01-2030", "DI1").is_empty() # -> True (data futura)
257
- bc.tpf_mensal("01-01-2030").is_empty() # -> True (mês futuro)
258
- bc.ptax("25-12-2025") # -> nan (feriado)
251
+ yd.futuro.historico("01-01-2030", "DI1").is_empty() # -> True
252
+ yd.tpf.secundario_mensal("01-01-2030").is_empty() # -> True
253
+ yd.ptax("25-12-2025") # -> nan
259
254
  ```
260
255
 
261
- ## Migração para Português (v0.48.0+)
256
+ ## Migração da API por Objeto (v0.49.0)
262
257
 
263
- A partir da versão 0.48.0, a API pública foi migrada para o português. Os principais renomes:
258
+ A versão 0.49.0 reorganiza a API pública para privilegiar o objeto de análise,
259
+ não a fonte do dado. Mapa de migração:
264
260
 
265
- | Antes (< 0.48) | Depois (≥ 0.48) |
261
+ | Antes | Depois |
266
262
  |---|---|
267
- | `yd.bday` | `yd.du` |
268
- | `bday.count()` | `du.contar()` |
269
- | `bday.offset()` | `du.deslocar()` |
270
- | `bday.generate()` | `du.gerar()` |
271
- | `bday.is_business_day()` | `du.e_dia_util()` |
272
- | `Interpolator(method, bdays, rates)` | `Interpolador(dias_uteis, taxas, metodo=...)` |
273
- | `extrapolate=True` | `extrapolar=True` |
274
- | `ntnb.quotation()` | `ntnb.cotacao()` |
275
- | `ntnb.data()` | `ntnb.dados()` |
276
-
277
- ## Migração para Polars (v0.40.0+)
278
-
279
- A partir da versão 0.40.0, todas as saídas tabulares passaram de Pandas para **Polars**. Entradas vetoriais que antes aceitavam `pd.Series` e `np.ndarray` agora aceitam apenas listas, tuplas ou `pl.Series`. Para converter:
280
-
281
- ```python
282
- # Entrada: converter coleções Pandas/NumPy antes de passar para o PYield
283
- pl_series = pl.from_pandas(pd_series) # pd.Series → pl.Series (requer pandas)
284
- pl_series = pl.Series(np_array) # np.ndarray → pl.Series (requer numpy)
285
-
286
- # Saída: converter DataFrame Polars para Pandas
287
- df_pandas = df.to_pandas(use_pyarrow_extension_array=True)
288
- ```
263
+ | `yd.b3.futuro(data, contrato)` | `yd.futuro.historico(data, contrato)` |
264
+ | `yd.b3.futuro_intradia(contrato)` | `yd.futuro.intradia(contrato)` |
265
+ | `yd.b3.futuro_datas_disponiveis(contrato)` | `yd.futuro.datas_disponiveis(contrato)` |
266
+ | `yd.b3.futuro_enriquecer(df, contrato)` | `yd.futuro.enriquecer(df, contrato)` |
267
+ | `yd.b3.di_over(data)` | `yd.di_over(data)` |
268
+ | `yd.b3.di1.dados(data)` | `yd.di1.dados(data)` |
269
+ | `yd.b3.di1.interpolar_taxa(...)` | `yd.di1.interpolar_taxa(...)` |
270
+ | `yd.b3.di1.interpolar_taxas(...)` | `yd.di1.interpolar_taxas(...)` |
271
+ | `yd.b3.di1.datas_disponiveis()` | `yd.di1.datas_disponiveis()` |
272
+ | `yd.bc.ptax(data)` | `yd.ptax(data)` |
273
+ | `yd.bc.ptax_serie(inicio, fim)` | `yd.ptax_serie(inicio, fim)` |
274
+ | `yd.bc.selic_over(data)` | `yd.selic.over(data)` |
275
+ | `yd.bc.selic_over_serie(...)` | `yd.selic.over_serie(...)` |
276
+ | `yd.bc.selic_meta(data)` | `yd.selic.meta(data)` |
277
+ | `yd.bc.selic_meta_serie(...)` | `yd.selic.meta_serie(...)` |
278
+ | `yd.selic_over(data)` | `yd.selic.over(data)` |
279
+ | `yd.selic_over_serie(...)` | `yd.selic.over_serie(...)` |
280
+ | `yd.selic_meta(data)` | `yd.selic.meta(data)` |
281
+ | `yd.selic_meta_serie(...)` | `yd.selic.meta_serie(...)` |
282
+ | `yd.copom` | `yd.selic.copom` |
283
+ | `yd.copom_options(data)` | `yd.selic.cpm.data(data)` |
284
+ | `yd.compromissadas(...)` | `yd.selic.compromissadas(...)` |
285
+ | `yd.anbima.tpf(data, titulo)` | `yd.tpf.taxas(data, titulo)` |
286
+ | `yd.anbima.tpf_vencimentos(data, titulo)` | `yd.tpf.vencimentos(data, titulo)` |
287
+ | `yd.anbima.imaq(data)` | `yd.tpf.estoque(data)` |
288
+ | `yd.tn.leilao(data)` | `yd.tpf.leilao(data)` |
289
+ | `yd.bc.tpf_intradia()` | `yd.tpf.secundario_intradia()` |
290
+ | `yd.bc.tpf_mensal(data, extragrupo=...)` | `yd.tpf.secundario_mensal(data, extragrupo=...)` |
291
+ | `yd.bc.vna_lft(data)` | `yd.lft.vna(data)` |
292
+ | `yd.tn.benchmarks(...)` | `yd.tpf.benchmarks(...)` |
293
+ | `yd.pre.taxas_zero(data)` | `yd.tpf.curva_pre(data)` |
294
+
295
+ As funções antigas listadas acima foram removidas da API pública de alto nível.
289
296
 
290
297
  ## Documentação
291
298
 
@@ -20,26 +20,26 @@ pip install pyield
20
20
  ## Início Rápido
21
21
 
22
22
  ```python
23
- from pyield import du, b3, bc, ntnb, Interpolador
23
+ import pyield as yd
24
24
 
25
25
  # Dias úteis (base de todos os cálculos)
26
- du.contar("02-01-2025", "15-01-2025") # -> 9
27
- du.deslocar("29-12-2023", 1) # -> datetime.date(2024, 1, 2)
26
+ yd.du.contar("02-01-2025", "15-01-2025") # -> 9
27
+ yd.du.deslocar("29-12-2023", 1) # -> datetime.date(2024, 1, 2)
28
28
 
29
29
  # Curva de DI Futuro
30
- df = b3.futuro("31-05-2024", "DI1")
30
+ df = yd.futuro.historico("31-05-2024", "DI1")
31
31
  # Colunas: data_referencia, codigo_negociacao, data_vencimento, dias_uteis, taxa_ajuste, ...
32
32
 
33
33
  # Interpolação de taxas (flat forward, convenção 252 dias úteis/ano)
34
- interp = Interpolador(df["dias_uteis"], df["taxa_ajuste"], metodo="flat_forward")
34
+ interp = yd.Interpolador(df["dias_uteis"], df["taxa_ajuste"], metodo="flat_forward")
35
35
  interp(45) # -> 0.04833...
36
36
  interp([30, 60]) # -> Series do Polars com taxas interpoladas
37
37
 
38
38
  # Precificação de títulos públicos
39
- ntnb.cotacao("31-05-2024", "15-05-2035", 0.061490) # -> 99.3651
39
+ yd.ntnb.cotacao("31-05-2024", "15-05-2035", 0.061490) # -> 99.3651
40
40
 
41
41
  # Indicadores do BCB
42
- bc.selic_over("31-05-2024") # -> 0.000414...
42
+ yd.selic.over("31-05-2024") # -> 0.000414...
43
43
  ```
44
44
 
45
45
  Um notebook no Colab com mais exemplos:
@@ -69,7 +69,7 @@ du.gerar("22-12-2023", "02-01-2024")
69
69
  # -> Series: [2023-12-22, 2023-12-26, 2023-12-27, 2023-12-28, 2023-12-29, 2024-01-02]
70
70
 
71
71
  # Verifica se a data é dia útil
72
- du.e_dia_util("25-12-2023") # -> False (Natal)
72
+ du.eh_dia_util("25-12-2023") # -> False (Natal)
73
73
  ```
74
74
 
75
75
  Todas as funções suportam operações vetorizadas com listas, Series ou arrays.
@@ -126,20 +126,16 @@ forwards(dias_uteis, taxas) # -> Series: [0.05, 0.070095, 0.090284]
126
126
 
127
127
  | Módulo | Finalidade |
128
128
  |--------|---------|
129
- | `du` | Calendário de dias úteis com feriados brasileiros |
130
- | `b3.futuro` | Dados históricos de futuros da B3 (DI1, DDI, DAP, DOL, WDO, IND, WIN e outros) |
131
- | `b3.di1` | Curva DI1 interpolada e datas de negociação disponíveis |
129
+ | `du` | Cálculos com dias úteis considerando feriados brasileiros |
130
+ | `futuro` | Dados de futuros (DI1, DDI, DAP, DOL, WDO, IND, WIN e outros) |
131
+ | `tpf` | Taxas, vencimentos, estoque, leilões, benchmarks, RMD e negociações de TPFs |
132
+ | `di1` | Curva DI1 interpolada e datas de negociação disponíveis |
132
133
  | `Interpolador` | Interpolação de taxas (flat_forward, linear) |
133
134
  | `forward` / `forwards` | Cálculo de taxas a termo |
134
135
  | `ltn`, `ntnb`, `ntnf`, `lft`, `ntnc` | Precificação e análise dos títulos públicos principais |
135
- | `ntnb1`, `ntnbprinc`, `pre` | Títulos e curvas adicionais (NTN-B1, NTN-B Principal, curva PRE) |
136
- | `tn.leiloes` / `tn.benchmarks` | Leilões e benchmarks de títulos públicos |
137
- | `anbima` | Dados da ANBIMA (preços de TPF, curvas de juros, índices IMA) |
138
- | `bc` | Indicadores do BCB (SELIC, PTAX, repos, VNA, leilões, negociações) |
139
- | `b3` | Dados da B3 (DI over, price reports, derivativos intradiários) |
136
+ | `ntnb1`, `ntnbprinc` | Títulos adicionais (NTN-B1, NTN-B Principal) |
137
+ | `selic` | Dados da taxa Selic, COPOM, compromissadas do BCB, CPM e probabilidades implícitas |
140
138
  | `ipca` | Dados de inflação (histórico e projeções) |
141
- | `selic` | Opções digitais de COPOM e probabilidades implícitas |
142
- | `tn.rmd` | Relatório Mensal da Dívida do Tesouro Nacional |
143
139
  | `hoje` / `agora` | Data/hora atual no Brasil (America/Sao_Paulo) |
144
140
 
145
141
  ## Títulos Públicos
@@ -166,19 +162,19 @@ ntnf.premio("30-05-2025", pontos_base=True)
166
162
  import pyield as yd
167
163
 
168
164
  # DI1 (Futuro de Depósito Interfinanceiro)
169
- b3.futuro("31-05-2024", "DI1")
165
+ yd.futuro.historico("31-05-2024", "DI1")
170
166
 
171
167
  # Outros contratos disponíveis no cache histórico:
172
168
  # - Juros: DI1, DDI, FRC, FRO, DAP
173
169
  # - Moedas: DOL, WDO
174
170
  # - Índices: IND, WIN
175
- b3.futuro("31-05-2024", "DAP")
171
+ yd.futuro.historico("31-05-2024", "DAP")
176
172
 
177
173
  # Múltiplas datas de uma vez
178
- b3.futuro(["29-05-2024", "31-05-2024"], "DI1")
174
+ yd.futuro.historico(["29-05-2024", "31-05-2024"], "DI1")
179
175
 
180
- # Dados intradiários (quando o mercado estiver aberto)
181
- b3.futuro_intradia("DI1") # Retorna dados ao vivo durante o horário de negociação
176
+ # Dados intradia (quando o mercado estiver aberto)
177
+ yd.futuro.intradia("DI1") # Retorna dados ao vivo durante o pregão
182
178
  ```
183
179
 
184
180
  ## Tratamento de Datas
@@ -207,41 +203,53 @@ Consultas sem dados disponíveis (data futura, feriado, fim de semana ou
207
203
  fonte indisponível) retornam DataFrame vazio ou `nan`, sem lançar exceção:
208
204
 
209
205
  ```python
210
- from pyield import b3, bc
206
+ import pyield as yd
211
207
 
212
- b3.futuro("01-01-2030", "DI1").is_empty() # -> True (data futura)
213
- bc.tpf_mensal("01-01-2030").is_empty() # -> True (mês futuro)
214
- bc.ptax("25-12-2025") # -> nan (feriado)
208
+ yd.futuro.historico("01-01-2030", "DI1").is_empty() # -> True
209
+ yd.tpf.secundario_mensal("01-01-2030").is_empty() # -> True
210
+ yd.ptax("25-12-2025") # -> nan
215
211
  ```
216
212
 
217
- ## Migração para Português (v0.48.0+)
213
+ ## Migração da API por Objeto (v0.49.0)
218
214
 
219
- A partir da versão 0.48.0, a API pública foi migrada para o português. Os principais renomes:
215
+ A versão 0.49.0 reorganiza a API pública para privilegiar o objeto de análise,
216
+ não a fonte do dado. Mapa de migração:
220
217
 
221
- | Antes (< 0.48) | Depois (≥ 0.48) |
218
+ | Antes | Depois |
222
219
  |---|---|
223
- | `yd.bday` | `yd.du` |
224
- | `bday.count()` | `du.contar()` |
225
- | `bday.offset()` | `du.deslocar()` |
226
- | `bday.generate()` | `du.gerar()` |
227
- | `bday.is_business_day()` | `du.e_dia_util()` |
228
- | `Interpolator(method, bdays, rates)` | `Interpolador(dias_uteis, taxas, metodo=...)` |
229
- | `extrapolate=True` | `extrapolar=True` |
230
- | `ntnb.quotation()` | `ntnb.cotacao()` |
231
- | `ntnb.data()` | `ntnb.dados()` |
232
-
233
- ## Migração para Polars (v0.40.0+)
234
-
235
- A partir da versão 0.40.0, todas as saídas tabulares passaram de Pandas para **Polars**. Entradas vetoriais que antes aceitavam `pd.Series` e `np.ndarray` agora aceitam apenas listas, tuplas ou `pl.Series`. Para converter:
236
-
237
- ```python
238
- # Entrada: converter coleções Pandas/NumPy antes de passar para o PYield
239
- pl_series = pl.from_pandas(pd_series) # pd.Series → pl.Series (requer pandas)
240
- pl_series = pl.Series(np_array) # np.ndarray → pl.Series (requer numpy)
241
-
242
- # Saída: converter DataFrame Polars para Pandas
243
- df_pandas = df.to_pandas(use_pyarrow_extension_array=True)
244
- ```
220
+ | `yd.b3.futuro(data, contrato)` | `yd.futuro.historico(data, contrato)` |
221
+ | `yd.b3.futuro_intradia(contrato)` | `yd.futuro.intradia(contrato)` |
222
+ | `yd.b3.futuro_datas_disponiveis(contrato)` | `yd.futuro.datas_disponiveis(contrato)` |
223
+ | `yd.b3.futuro_enriquecer(df, contrato)` | `yd.futuro.enriquecer(df, contrato)` |
224
+ | `yd.b3.di_over(data)` | `yd.di_over(data)` |
225
+ | `yd.b3.di1.dados(data)` | `yd.di1.dados(data)` |
226
+ | `yd.b3.di1.interpolar_taxa(...)` | `yd.di1.interpolar_taxa(...)` |
227
+ | `yd.b3.di1.interpolar_taxas(...)` | `yd.di1.interpolar_taxas(...)` |
228
+ | `yd.b3.di1.datas_disponiveis()` | `yd.di1.datas_disponiveis()` |
229
+ | `yd.bc.ptax(data)` | `yd.ptax(data)` |
230
+ | `yd.bc.ptax_serie(inicio, fim)` | `yd.ptax_serie(inicio, fim)` |
231
+ | `yd.bc.selic_over(data)` | `yd.selic.over(data)` |
232
+ | `yd.bc.selic_over_serie(...)` | `yd.selic.over_serie(...)` |
233
+ | `yd.bc.selic_meta(data)` | `yd.selic.meta(data)` |
234
+ | `yd.bc.selic_meta_serie(...)` | `yd.selic.meta_serie(...)` |
235
+ | `yd.selic_over(data)` | `yd.selic.over(data)` |
236
+ | `yd.selic_over_serie(...)` | `yd.selic.over_serie(...)` |
237
+ | `yd.selic_meta(data)` | `yd.selic.meta(data)` |
238
+ | `yd.selic_meta_serie(...)` | `yd.selic.meta_serie(...)` |
239
+ | `yd.copom` | `yd.selic.copom` |
240
+ | `yd.copom_options(data)` | `yd.selic.cpm.data(data)` |
241
+ | `yd.compromissadas(...)` | `yd.selic.compromissadas(...)` |
242
+ | `yd.anbima.tpf(data, titulo)` | `yd.tpf.taxas(data, titulo)` |
243
+ | `yd.anbima.tpf_vencimentos(data, titulo)` | `yd.tpf.vencimentos(data, titulo)` |
244
+ | `yd.anbima.imaq(data)` | `yd.tpf.estoque(data)` |
245
+ | `yd.tn.leilao(data)` | `yd.tpf.leilao(data)` |
246
+ | `yd.bc.tpf_intradia()` | `yd.tpf.secundario_intradia()` |
247
+ | `yd.bc.tpf_mensal(data, extragrupo=...)` | `yd.tpf.secundario_mensal(data, extragrupo=...)` |
248
+ | `yd.bc.vna_lft(data)` | `yd.lft.vna(data)` |
249
+ | `yd.tn.benchmarks(...)` | `yd.tpf.benchmarks(...)` |
250
+ | `yd.pre.taxas_zero(data)` | `yd.tpf.curva_pre(data)` |
251
+
252
+ As funções antigas listadas acima foram removidas da API pública de alto nível.
245
253
 
246
254
  ## Documentação
247
255
 
@@ -1,25 +1,36 @@
1
+ # ruff: noqa: I001
2
+
1
3
  import logging
4
+ from importlib.metadata import PackageNotFoundError, version
2
5
 
3
- from pyield import anbima, b3, bc, du, ipca, selic, tn
4
- from pyield.__about__ import __version__
6
+ from pyield import du, ipca
7
+ from pyield.b3 import futuro
5
8
  from pyield.b3 import di1
9
+ from pyield.b3.di_over import di_over
10
+
11
+ # Ordem intencional: alguns módulos importam `di1` a partir de `pyield`
12
+ # durante a inicialização do pacote.
13
+ from pyield import selic, tpf
14
+ from pyield.bc.sgs import ptax, ptax_serie
6
15
  from pyield.fwd import forward, forwards
7
16
  from pyield.interpolador import Interpolador
8
17
  from pyield.relogio import agora, hoje
9
- from pyield.selic.cpm import data as copom_options
10
18
  from pyield.tn import lft, ltn, ntnb, ntnb1, ntnbprinc, ntnc, ntnf
11
19
 
20
+ try:
21
+ __version__ = version("pyield")
22
+ except PackageNotFoundError:
23
+ __version__ = "0+unknown"
24
+
12
25
  __all__ = [
13
26
  "__version__",
14
27
  "agora",
15
- "anbima",
16
- "b3",
17
- "bc",
18
- "copom_options",
19
28
  "di1",
29
+ "di_over",
20
30
  "du",
21
31
  "forward",
22
32
  "forwards",
33
+ "futuro",
23
34
  "hoje",
24
35
  "Interpolador",
25
36
  "ipca",
@@ -30,9 +41,12 @@ __all__ = [
30
41
  "ntnbprinc",
31
42
  "ntnc",
32
43
  "ntnf",
44
+ "ptax",
45
+ "ptax_serie",
33
46
  "selic",
34
- "tn",
47
+ "tpf",
35
48
  ]
36
49
 
50
+
37
51
  # Configura o logger do pacote principal com um NullHandler
38
52
  logging.getLogger(__name__).addHandler(logging.NullHandler())
@@ -1,5 +1,19 @@
1
1
  import polars as pl
2
2
 
3
+ # 10 casas decimais após divisão por 100: limpa ruído IEEE-754 (ex:
4
+ # 12.15 / 100 → 0.12150000000000001) sem truncar dado real. BCB e B3
5
+ # publicam taxas com no máximo 6–8 casas decimais; 10 é margem segura.
6
+ _CASAS_DECIMAIS_TAXA = 10
7
+
8
+
9
+ def pct_para_decimal(expr: pl.Expr) -> pl.Expr:
10
+ """Converte expressão percentual (ex: 12.15) para decimal (0.1215).
11
+
12
+ Aceita qualquer ``pl.Expr``, incluindo seletores como
13
+ ``cs.starts_with("taxa_")``, que também são ``Expr``.
14
+ """
15
+ return expr.truediv(100).round(_CASAS_DECIMAIS_TAXA)
16
+
3
17
 
4
18
  def float_br(coluna: str) -> pl.Expr:
5
19
  """Converte coluna string no formato numérico brasileiro para Float64.
@@ -15,15 +29,13 @@ def float_br(coluna: str) -> pl.Expr:
15
29
  )
16
30
 
17
31
 
18
- def taxa_br(coluna: str, casas_pct: int = 4) -> pl.Expr:
32
+ def taxa_br(coluna: str) -> pl.Expr:
19
33
  """Converte taxa percentual BR (string) para decimal Float64.
20
34
 
21
35
  Args:
22
36
  coluna: Nome da coluna com taxa em formato BR (ex.: "12,3456").
23
- casas_pct: Casas decimais da taxa percentual de entrada. Default 4,
24
- padrão do mercado brasileiro de renda fixa.
25
37
  """
26
- return (float_br(coluna) / 100).round(casas_pct + 2)
38
+ return pct_para_decimal(float_br(coluna))
27
39
 
28
40
 
29
41
  def inteiro_br(coluna: str) -> pl.Expr:
@@ -13,7 +13,7 @@ def data_referencia_valida(date: dt.date | None) -> bool:
13
13
  return False
14
14
  from pyield import du, relogio # noqa: PLC0415
15
15
 
16
- return du.e_dia_util(date) and date <= relogio.hoje()
16
+ return du.eh_dia_util(date) and date <= relogio.hoje()
17
17
 
18
18
 
19
19
  def converter_datas_expr(expr: pl.Expr | str) -> pl.Expr:
@@ -1,12 +1,12 @@
1
1
  import datetime as dt
2
2
  import math
3
3
  from collections.abc import Collection, Sized
4
- from typing import Any, Sequence, TypeAlias
4
+ from typing import Any, TypeAlias
5
5
 
6
6
  import polars as pl
7
7
 
8
8
  DateLike: TypeAlias = str | dt.datetime | dt.date
9
- ArrayLike: TypeAlias = Sequence[Any] | pl.Series
9
+ ArrayLike: TypeAlias = list[Any] | tuple[Any, ...] | pl.Series
10
10
 
11
11
 
12
12
  def _is_empty(arg: Any) -> bool:
@@ -113,34 +113,37 @@ def _processar_df(df: pl.DataFrame, data_referencia: dt.date) -> pl.DataFrame:
113
113
  )
114
114
 
115
115
 
116
- def imaq(data: DateLike) -> pl.DataFrame:
117
- """Consulta e processa dados de estoque IMA-Q da ANBIMA para uma data.
116
+ def estoque(data: DateLike) -> pl.DataFrame:
117
+ """Busca dados de estoque de TPFs.
118
+
119
+ Fonte: IMA-Q da ANBIMA. Contém quantidade em mercado, valor de mercado
120
+ e variação diária da quantidade dos títulos.
118
121
 
119
122
  Args:
120
- data: Data da consulta. Apenas os últimos 5 dias úteis estão
121
- disponíveis; o dado do dia anterior costuma ser publicado ao longo do dia.
123
+ data: Data de referência.
122
124
 
123
125
  Returns:
124
- DataFrame com dados processados ou DataFrame vazio se a data for
125
- inválida ou não houver dados disponíveis.
126
+ DataFrame Polars com dados de estoque. Retorna DataFrame vazio se a
127
+ data for inválida ou não houver dados.
126
128
 
127
129
  Output Columns:
128
- - data_referencia (Date): data de referência dos dados.
129
- - titulo (String): tipo do título (LTN, NTN-B, NTN-F, LFT, …).
130
- - data_vencimento (Date): data de vencimento do título.
131
- - codigo_selic (Int64): código SELIC do título.
132
- - isin (String): código ISIN.
133
- - pu (Float64): PU do título em R$.
134
- - quantidade_mercado (Int64): quantidade em mercado (unidades).
135
- - valor_mercado (Int64): valor de mercado em R$.
136
- - variacao_quantidade (Int64): variação diária da quantidade.
137
- - status_titulo (String): status do título.
138
-
139
- Notes:
140
- Valores convertidos para unidades puras (ex: MarketQuantity × 1.000).
130
+ * data_referencia (Date): data de referência dos dados.
131
+ * titulo (String): tipo do título público.
132
+ * data_vencimento (Date): data de vencimento do título.
133
+ * codigo_selic (Int64): código SELIC do título.
134
+ * isin (String): código ISIN.
135
+ * pu (Float64): preço unitário do título em reais.
136
+ * quantidade_mercado (Int64): quantidade em mercado.
137
+ * valor_mercado (Int64): valor de mercado em reais.
138
+ * variacao_quantidade (Int64): variação diária da quantidade.
139
+ * status_titulo (String): status do título.
141
140
 
142
141
  Examples:
143
- >>> yd.anbima.imaq("04-02-2026") # doctest: +SKIP
142
+ >>> import datetime as dt
143
+ >>> data = yd.du.deslocar(dt.date.today(), -2)
144
+ >>> df = yd.tpf.estoque(data)
145
+ >>> df.shape[0] > 0
146
+ True
144
147
  """
145
148
  data = cv.converter_datas(data)
146
149
  if not cv.data_referencia_valida(data):