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.
- {pyield-0.48.9 → pyield-0.49.0}/PKG-INFO +93 -86
- {pyield-0.48.9 → pyield-0.49.0}/README.md +60 -52
- {pyield-0.48.9 → pyield-0.49.0}/pyield/__init__.py +22 -8
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/br_numbers.py +16 -4
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/converters.py +1 -1
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/types.py +2 -2
- {pyield-0.48.9 → pyield-0.49.0}/pyield/anbima/imaq.py +23 -20
- pyield-0.48.9/pyield/anbima/tpf.py → pyield-0.49.0/pyield/anbima/mercado_secundario.py +48 -85
- pyield-0.49.0/pyield/b3/__init__.py +1 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/_validar_pregao.py +1 -1
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/boletim.py +5 -5
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/di1.py +27 -10
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/di_over.py +9 -9
- pyield-0.49.0/pyield/b3/futuro/__init__.py +14 -0
- pyield-0.49.0/pyield/b3/futuro/contratos.py +153 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/futuro/historico.py +112 -61
- pyield-0.49.0/pyield/b3/futuro/intradia.py +170 -0
- pyield-0.49.0/pyield/bc/__init__.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/leiloes.py +4 -2
- {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/sgs.py +34 -44
- {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/tpf_intradia.py +39 -44
- {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/tpf_mensal.py +27 -42
- {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/vna.py +9 -17
- {pyield-0.48.9 → pyield-0.49.0}/pyield/du/__init__.py +4 -4
- {pyield-0.48.9 → pyield-0.49.0}/pyield/du/core.py +23 -23
- {pyield-0.48.9 → pyield-0.49.0}/pyield/ipca/__init__.py +10 -1
- {pyield-0.48.9 → pyield-0.49.0}/pyield/ipca/historico.py +64 -26
- pyield-0.49.0/pyield/py.typed +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/relogio.py +1 -1
- pyield-0.49.0/pyield/selic/__init__.py +33 -0
- {pyield-0.48.9/pyield/bc → pyield-0.49.0/pyield/selic}/compromissada.py +2 -2
- {pyield-0.48.9/pyield/bc → pyield-0.49.0/pyield/selic}/copom.py +12 -14
- {pyield-0.48.9 → pyield-0.49.0}/pyield/selic/cpm.py +17 -36
- {pyield-0.48.9 → pyield-0.49.0}/pyield/selic/probabilities.py +17 -19
- pyield-0.49.0/pyield/tn/__init__.py +1 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/benchmark.py +11 -25
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/leiloes.py +52 -59
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/lft.py +3 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnb.py +4 -4
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnf.py +1 -2
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/pre.py +14 -12
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/rmd.py +14 -49
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/utils.py +11 -11
- pyield-0.49.0/pyield/tpf.py +25 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyproject.toml +16 -24
- pyield-0.48.9/.gitignore +0 -23
- pyield-0.48.9/pyield/__about__.py +0 -1
- pyield-0.48.9/pyield/anbima/__init__.py +0 -9
- pyield-0.48.9/pyield/b3/__init__.py +0 -27
- pyield-0.48.9/pyield/b3/futuro/__init__.py +0 -154
- pyield-0.48.9/pyield/b3/futuro/contratos.py +0 -76
- pyield-0.48.9/pyield/b3/futuro/intradia.py +0 -116
- pyield-0.48.9/pyield/bc/__init__.py +0 -30
- pyield-0.48.9/pyield/selic/__init__.py +0 -14
- pyield-0.48.9/pyield/tn/__init__.py +0 -20
- {pyield-0.48.9 → pyield-0.49.0}/LICENSE +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/__init__.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/cache.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/data_cache.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/_internal/retry.py +0 -0
- /pyield-0.48.9/pyield/py.typed → /pyield-0.49.0/pyield/anbima/__init__.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/_contratos.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/b3/derivativos_intradia.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/bc/_olinda.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/__init__.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/feriados_antigos_br.txt +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/feriados_br.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/du/feriados/feriados_novos_br.txt +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/fwd.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/interpolador.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/ipca/projetado.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ltn.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnb1.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnbprinc.py +0 -0
- {pyield-0.48.9 → pyield-0.49.0}/pyield/tn/ntnc.py +0 -0
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: pyield
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.49.0
|
|
4
4
|
Summary: A Python library for analysis of fixed income instruments in Brazil
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
[](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
|
-
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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` |
|
|
174
|
-
| `
|
|
175
|
-
| `
|
|
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
|
|
180
|
-
| `
|
|
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
|
-
|
|
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
|
-
|
|
214
|
+
yd.futuro.historico("31-05-2024", "DAP")
|
|
220
215
|
|
|
221
216
|
# Múltiplas datas de uma vez
|
|
222
|
-
|
|
217
|
+
yd.futuro.historico(["29-05-2024", "31-05-2024"], "DI1")
|
|
223
218
|
|
|
224
|
-
# Dados
|
|
225
|
-
|
|
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
|
-
|
|
249
|
+
import pyield as yd
|
|
255
250
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
|
|
256
|
+
## Migração da API por Objeto (v0.49.0)
|
|
262
257
|
|
|
263
|
-
A
|
|
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
|
|
261
|
+
| Antes | Depois |
|
|
266
262
|
|---|---|
|
|
267
|
-
| `yd.
|
|
268
|
-
| `
|
|
269
|
-
| `
|
|
270
|
-
| `
|
|
271
|
-
| `
|
|
272
|
-
| `
|
|
273
|
-
| `
|
|
274
|
-
| `
|
|
275
|
-
| `
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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` |
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
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
|
|
136
|
-
| `
|
|
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
|
-
|
|
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
|
-
|
|
171
|
+
yd.futuro.historico("31-05-2024", "DAP")
|
|
176
172
|
|
|
177
173
|
# Múltiplas datas de uma vez
|
|
178
|
-
|
|
174
|
+
yd.futuro.historico(["29-05-2024", "31-05-2024"], "DI1")
|
|
179
175
|
|
|
180
|
-
# Dados
|
|
181
|
-
|
|
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
|
-
|
|
206
|
+
import pyield as yd
|
|
211
207
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
|
213
|
+
## Migração da API por Objeto (v0.49.0)
|
|
218
214
|
|
|
219
|
-
A
|
|
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
|
|
218
|
+
| Antes | Depois |
|
|
222
219
|
|---|---|
|
|
223
|
-
| `yd.
|
|
224
|
-
| `
|
|
225
|
-
| `
|
|
226
|
-
| `
|
|
227
|
-
| `
|
|
228
|
-
| `
|
|
229
|
-
| `
|
|
230
|
-
| `
|
|
231
|
-
| `
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
|
4
|
-
from pyield.
|
|
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
|
-
"
|
|
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
|
|
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)
|
|
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.
|
|
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,
|
|
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 =
|
|
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
|
|
117
|
-
"""
|
|
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
|
|
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
|
|
125
|
-
inválida ou não houver dados
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
>>>
|
|
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):
|