pyield 0.48.0__tar.gz → 0.48.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyield-0.48.0 → pyield-0.48.2}/PKG-INFO +4 -5
- {pyield-0.48.0 → pyield-0.48.2}/README.md +3 -4
- pyield-0.48.2/pyield/__about__.py +1 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/__init__.py +13 -4
- {pyield-0.48.0 → pyield-0.48.2}/pyield/fwd.py +1 -1
- pyield-0.48.2/pyield/tn/__init__.py +7 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/lft.py +6 -6
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/ltn.py +11 -10
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/ntnb.py +11 -11
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/ntnb1.py +6 -6
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/ntnbprinc.py +2 -2
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/ntnc.py +7 -7
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/ntnf.py +13 -12
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/pre.py +0 -79
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/utils.py +75 -0
- pyield-0.48.0/pyield/__about__.py +0 -1
- pyield-0.48.0/pyield/tn/__init__.py +0 -19
- {pyield-0.48.0 → pyield-0.48.2}/.gitignore +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/LICENSE +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/br_numbers.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/cache.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/converters.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/data_cache.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/retry.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/_internal/types.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/anbima/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/anbima/ettj_intradia.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/anbima/ettj_ultima.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/anbima/ima_ultimo.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/anbima/imaq.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/anbima/tpf.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/_contratos.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/_validar_pregao.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/boletim.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/derivativos_intradia.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/di1.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/di_over.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/futuro/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/futuro/contratos.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/futuro/historico.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/b3/futuro/intradia.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/compromissada.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/copom.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/leiloes.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/ptax.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/taxas.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/tpf_intradia.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/tpf_mensal.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/bc/vna.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/dus/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/dus/core.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/dus/feriados/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/dus/feriados/feriados_antigos_br.txt +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/dus/feriados/feriados_br.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/dus/feriados/feriados_novos_br.txt +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/interpolador.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/ipca/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/ipca/historico.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/ipca/projetado.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/py.typed +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/relogio.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/selic/__init__.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/selic/cpm.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/selic/probabilities.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/benchmark.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/leiloes.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyield/tn/rmd.py +0 -0
- {pyield-0.48.0 → pyield-0.48.2}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyield
|
|
3
|
-
Version: 0.48.
|
|
3
|
+
Version: 0.48.2
|
|
4
4
|
Summary: A Python library for analysis of fixed income instruments in Brazil
|
|
5
5
|
Project-URL: Homepage, https://github.com/crdcj/PYield
|
|
6
6
|
Project-URL: Documentation, https://crdcj.github.io/PYield
|
|
@@ -45,6 +45,7 @@ Description-Content-Type: text/markdown
|
|
|
45
45
|
[](https://pypi.python.org/pypi/pyield)
|
|
46
46
|
[](https://python.org "Go to Python homepage")
|
|
47
47
|
[](https://github.com/crdcj/PYield/blob/main/LICENSE)
|
|
48
|
+
[](https://crdcj.github.io/PYield/)
|
|
48
49
|
|
|
49
50
|
# PYield: Toolkit de Renda Fixa Brasileira
|
|
50
51
|
|
|
@@ -63,8 +64,7 @@ pip install pyield
|
|
|
63
64
|
## Início Rápido
|
|
64
65
|
|
|
65
66
|
```python
|
|
66
|
-
from pyield import dus, b3, bc, Interpolador
|
|
67
|
-
from pyield.tn import ntnb
|
|
67
|
+
from pyield import dus, b3, bc, ntnb, Interpolador
|
|
68
68
|
|
|
69
69
|
# Dias úteis (base de todos os cálculos)
|
|
70
70
|
dus.contar("02-01-2025", "15-01-2025") # -> 9
|
|
@@ -241,8 +241,7 @@ Tratamento de nulos: funções escalares retornam `float('nan')` para entradas a
|
|
|
241
241
|
(propaga nos cálculos). Funções vetorizadas propagam `null` elemento a elemento.
|
|
242
242
|
|
|
243
243
|
```python
|
|
244
|
-
from pyield
|
|
245
|
-
from pyield import dus
|
|
244
|
+
from pyield import ntnb, dus
|
|
246
245
|
|
|
247
246
|
ntnb.cotacao(None, "15-05-2035", 0.06149) # -> nan
|
|
248
247
|
dus.contar(["01-01-2024", None], "01-02-2024") # -> Series: [22, null]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
[](https://pypi.python.org/pypi/pyield)
|
|
2
2
|
[](https://python.org "Go to Python homepage")
|
|
3
3
|
[](https://github.com/crdcj/PYield/blob/main/LICENSE)
|
|
4
|
+
[](https://crdcj.github.io/PYield/)
|
|
4
5
|
|
|
5
6
|
# PYield: Toolkit de Renda Fixa Brasileira
|
|
6
7
|
|
|
@@ -19,8 +20,7 @@ pip install pyield
|
|
|
19
20
|
## Início Rápido
|
|
20
21
|
|
|
21
22
|
```python
|
|
22
|
-
from pyield import dus, b3, bc, Interpolador
|
|
23
|
-
from pyield.tn import ntnb
|
|
23
|
+
from pyield import dus, b3, bc, ntnb, Interpolador
|
|
24
24
|
|
|
25
25
|
# Dias úteis (base de todos os cálculos)
|
|
26
26
|
dus.contar("02-01-2025", "15-01-2025") # -> 9
|
|
@@ -197,8 +197,7 @@ Tratamento de nulos: funções escalares retornam `float('nan')` para entradas a
|
|
|
197
197
|
(propaga nos cálculos). Funções vetorizadas propagam `null` elemento a elemento.
|
|
198
198
|
|
|
199
199
|
```python
|
|
200
|
-
from pyield
|
|
201
|
-
from pyield import dus
|
|
200
|
+
from pyield import ntnb, dus
|
|
202
201
|
|
|
203
202
|
ntnb.cotacao(None, "15-05-2035", 0.06149) # -> nan
|
|
204
203
|
dus.contar(["01-01-2024", None], "01-02-2024") # -> Series: [22, null]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.48.2"
|
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from pyield import anbima, b3, bc, dus, ipca,
|
|
3
|
+
from pyield import anbima, b3, bc, dus, ipca, selic, tn
|
|
4
4
|
from pyield.__about__ import __version__
|
|
5
|
+
from pyield.b3 import di1
|
|
5
6
|
from pyield.fwd import forward, forwards
|
|
6
7
|
from pyield.interpolador import Interpolador
|
|
7
8
|
from pyield.relogio import agora, hoje
|
|
8
9
|
from pyield.selic.cpm import data as copom_options
|
|
10
|
+
from pyield.tn import lft, ltn, ntnb, ntnb1, ntnbprinc, ntnc, ntnf
|
|
9
11
|
|
|
10
12
|
__all__ = [
|
|
11
13
|
"Interpolador",
|
|
12
14
|
"__version__",
|
|
15
|
+
"agora",
|
|
13
16
|
"anbima",
|
|
14
17
|
"b3",
|
|
15
18
|
"bc",
|
|
16
19
|
"copom_options",
|
|
20
|
+
"di1",
|
|
17
21
|
"dus",
|
|
18
22
|
"forward",
|
|
19
23
|
"forwards",
|
|
20
|
-
"
|
|
24
|
+
"hoje",
|
|
21
25
|
"ipca",
|
|
22
|
-
"
|
|
26
|
+
"lft",
|
|
27
|
+
"ltn",
|
|
28
|
+
"ntnb",
|
|
29
|
+
"ntnb1",
|
|
30
|
+
"ntnbprinc",
|
|
31
|
+
"ntnc",
|
|
32
|
+
"ntnf",
|
|
23
33
|
"selic",
|
|
24
34
|
"tn",
|
|
25
|
-
"hoje",
|
|
26
35
|
]
|
|
27
36
|
|
|
28
37
|
# Configura o logger do pacote principal com um NullHandler
|
|
@@ -102,7 +102,7 @@ def forwards(
|
|
|
102
102
|
]
|
|
103
103
|
|
|
104
104
|
>>> # Exemplo com taxas indicativas de NTN-B em 16-09-2025
|
|
105
|
-
>>> from pyield
|
|
105
|
+
>>> from pyield import ntnb
|
|
106
106
|
>>> df = ntnb.dados("16-09-2025")
|
|
107
107
|
>>> yd.forwards(df["dias_uteis"], df["taxa_indicativa"])
|
|
108
108
|
shape: (13,)
|
|
@@ -33,7 +33,7 @@ def dados(data: DateLike) -> pl.DataFrame:
|
|
|
33
33
|
- rentabilidade (Float64): Rentabilidade da LFT sobre o DI.
|
|
34
34
|
|
|
35
35
|
Examples:
|
|
36
|
-
>>> from pyield
|
|
36
|
+
>>> from pyield import lft
|
|
37
37
|
>>> df_lft = lft.dados("23-08-2024") # doctest: +SKIP
|
|
38
38
|
"""
|
|
39
39
|
df = utils.obter_tpf(data, "LFT")
|
|
@@ -86,7 +86,7 @@ def vencimentos(data: DateLike) -> pl.Series:
|
|
|
86
86
|
pl.Series: Série de datas de vencimento disponíveis.
|
|
87
87
|
|
|
88
88
|
Examples:
|
|
89
|
-
>>> from pyield
|
|
89
|
+
>>> from pyield import lft
|
|
90
90
|
>>> lft.vencimentos("22-08-2024")
|
|
91
91
|
shape: (14,)
|
|
92
92
|
Series: 'data_vencimento' [date]
|
|
@@ -125,7 +125,7 @@ def cotacao(
|
|
|
125
125
|
|
|
126
126
|
Examples:
|
|
127
127
|
Calcula a cotação de uma LFT com taxa de 0,02:
|
|
128
|
-
>>> from pyield
|
|
128
|
+
>>> from pyield import lft
|
|
129
129
|
>>> lft.cotacao(
|
|
130
130
|
... data_liquidacao="24-07-2024",
|
|
131
131
|
... data_vencimento="01-09-2030",
|
|
@@ -176,7 +176,7 @@ def taxa(
|
|
|
176
176
|
caso de erro.
|
|
177
177
|
|
|
178
178
|
Examples:
|
|
179
|
-
>>> from pyield
|
|
179
|
+
>>> from pyield import lft
|
|
180
180
|
>>> lft.taxa("24-07-2024", "01-09-2030", 15785.324502, 15621.867466)
|
|
181
181
|
0.001717
|
|
182
182
|
>>> lft.taxa("24-07-2024", "01-03-2025", 15785.324502, 15774.132706)
|
|
@@ -209,7 +209,7 @@ def rentabilidade(taxa_lft: float, taxa_di: float) -> float:
|
|
|
209
209
|
|
|
210
210
|
Examples:
|
|
211
211
|
Calcula a rentabilidade de uma LFT em 28/04/2025:
|
|
212
|
-
>>> from pyield
|
|
212
|
+
>>> from pyield import lft
|
|
213
213
|
>>> taxa_lft = 0.001124 # 0.1124%
|
|
214
214
|
>>> taxa_di = 0.13967670224373396 # 13.967670224373396%
|
|
215
215
|
>>> lft.rentabilidade(taxa_lft, taxa_di)
|
|
@@ -250,7 +250,7 @@ def pu(
|
|
|
250
250
|
- SEI Proccess 17944.005214/2024-09
|
|
251
251
|
|
|
252
252
|
Examples:
|
|
253
|
-
>>> from pyield
|
|
253
|
+
>>> from pyield import lft
|
|
254
254
|
>>> lft.pu(15785.324502, 99.9291)
|
|
255
255
|
15774.132706
|
|
256
256
|
"""
|
|
@@ -4,7 +4,6 @@ import pyield._internal.converters as cv
|
|
|
4
4
|
from pyield import dus, fwd
|
|
5
5
|
from pyield._internal.types import DateLike, any_is_empty
|
|
6
6
|
from pyield.tn import utils
|
|
7
|
-
from pyield.tn.pre import premio as premio_pre
|
|
8
7
|
|
|
9
8
|
VALOR_FACE = 1000
|
|
10
9
|
|
|
@@ -41,7 +40,7 @@ def dados(data: DateLike) -> pl.DataFrame:
|
|
|
41
40
|
- rentabilidade (Float64): Rentabilidade diária da LTN sobre o DI.
|
|
42
41
|
|
|
43
42
|
Examples:
|
|
44
|
-
>>> from pyield
|
|
43
|
+
>>> from pyield import ltn
|
|
45
44
|
>>> df_ltn = ltn.dados("23-08-2024") # doctest: +SKIP
|
|
46
45
|
"""
|
|
47
46
|
df = utils.obter_tpf(data, "LTN")
|
|
@@ -100,7 +99,7 @@ def vencimentos(data: DateLike) -> pl.Series:
|
|
|
100
99
|
pl.Series: Série de datas de vencimento disponíveis.
|
|
101
100
|
|
|
102
101
|
Examples:
|
|
103
|
-
>>> from pyield
|
|
102
|
+
>>> from pyield import ltn
|
|
104
103
|
>>> ltn.vencimentos("22-08-2024")
|
|
105
104
|
shape: (13,)
|
|
106
105
|
Series: 'data_vencimento' [date]
|
|
@@ -141,7 +140,7 @@ def pu(
|
|
|
141
140
|
- https://www.anbima.com.br/data/files/A0/02/CC/70/8FEFC8104606BDC8B82BA2A8/Metodologias%20ANBIMA%20de%20Precificacao%20Titulos%20Publicos.pdf
|
|
142
141
|
|
|
143
142
|
Examples:
|
|
144
|
-
>>> from pyield
|
|
143
|
+
>>> from pyield import ltn
|
|
145
144
|
>>> ltn.pu("05-07-2024", "01-01-2030", 0.12145)
|
|
146
145
|
535.279902
|
|
147
146
|
"""
|
|
@@ -181,7 +180,7 @@ def taxa(
|
|
|
181
180
|
caso de erro.
|
|
182
181
|
|
|
183
182
|
Examples:
|
|
184
|
-
>>> from pyield
|
|
183
|
+
>>> from pyield import ltn
|
|
185
184
|
>>> ltn.taxa("05-07-2024", "01-01-2030", 535.279902)
|
|
186
185
|
0.12145
|
|
187
186
|
>>> ltn.taxa("13-03-2026", "01-01-2027", 895.563913)
|
|
@@ -214,7 +213,7 @@ def rentabilidade(taxa_ltn: float, taxa_di: float) -> float:
|
|
|
214
213
|
Reference date: 22-08-2024
|
|
215
214
|
LTN rate for 01-01-2030: 0.118746
|
|
216
215
|
DI (JAN30) Settlement rate: 0.11725
|
|
217
|
-
>>> from pyield
|
|
216
|
+
>>> from pyield import ltn
|
|
218
217
|
>>> ltn.rentabilidade(0.118746, 0.11725)
|
|
219
218
|
1.0120718007994287
|
|
220
219
|
"""
|
|
@@ -247,7 +246,7 @@ def dv01(
|
|
|
247
246
|
float: DV01, variação de preço para 1 bp.
|
|
248
247
|
|
|
249
248
|
Examples:
|
|
250
|
-
>>> from pyield
|
|
249
|
+
>>> from pyield import ltn
|
|
251
250
|
>>> ltn.dv01("26-03-2025", "01-01-2032", 0.150970)
|
|
252
251
|
0.2269059999999854
|
|
253
252
|
"""
|
|
@@ -291,7 +290,7 @@ def premio(
|
|
|
291
290
|
ValueError: Se os dados de DI não possuem 'taxa_ajuste' ou estão vazios.
|
|
292
291
|
|
|
293
292
|
Examples:
|
|
294
|
-
>>> from pyield
|
|
293
|
+
>>> from pyield import ltn
|
|
295
294
|
>>> ltn.premio("30-05-2025", pontos_base=True)
|
|
296
295
|
shape: (13, 3)
|
|
297
296
|
┌────────┬─────────────────┬────────┐
|
|
@@ -312,7 +311,9 @@ def premio(
|
|
|
312
311
|
│ LTN ┆ 2032-01-01 ┆ 11.24 │
|
|
313
312
|
└────────┴─────────────────┴────────┘
|
|
314
313
|
"""
|
|
315
|
-
return premio_pre(data, pontos_base=pontos_base).filter(
|
|
314
|
+
return utils.premio_pre(data, pontos_base=pontos_base).filter(
|
|
315
|
+
pl.col("titulo") == "LTN"
|
|
316
|
+
)
|
|
316
317
|
|
|
317
318
|
|
|
318
319
|
def taxas_forward(data: DateLike) -> pl.DataFrame:
|
|
@@ -335,7 +336,7 @@ def taxas_forward(data: DateLike) -> pl.DataFrame:
|
|
|
335
336
|
- taxa_forward (Float64): Taxa forward.
|
|
336
337
|
|
|
337
338
|
Examples:
|
|
338
|
-
>>> from pyield
|
|
339
|
+
>>> from pyield import ltn
|
|
339
340
|
>>> ltn.taxas_forward("17-10-2025")
|
|
340
341
|
shape: (13, 4)
|
|
341
342
|
┌─────────────────┬────────────┬─────────────────┬──────────────┐
|
|
@@ -55,7 +55,7 @@ def dados(data: DateLike) -> pl.DataFrame:
|
|
|
55
55
|
a partir de taxas nominais do DI Futuro e taxas zero das NTN-B.
|
|
56
56
|
|
|
57
57
|
Examples:
|
|
58
|
-
>>> from pyield
|
|
58
|
+
>>> from pyield import ntnb
|
|
59
59
|
>>> df_ntnb = ntnb.dados("23-08-2024") # doctest: +SKIP
|
|
60
60
|
"""
|
|
61
61
|
from pyield.b3 import di1 # noqa: PLC0415
|
|
@@ -129,7 +129,7 @@ def vencimentos(data: DateLike) -> pl.Series:
|
|
|
129
129
|
pl.Series: Série de datas de vencimento de NTN-B.
|
|
130
130
|
|
|
131
131
|
Examples:
|
|
132
|
-
>>> from pyield
|
|
132
|
+
>>> from pyield import ntnb
|
|
133
133
|
>>> ntnb.vencimentos("16-08-2024")
|
|
134
134
|
shape: (14,)
|
|
135
135
|
Series: 'data_vencimento' [date]
|
|
@@ -198,7 +198,7 @@ def datas_pagamento(
|
|
|
198
198
|
vencimento for menor ou igual à liquidação.
|
|
199
199
|
|
|
200
200
|
Examples:
|
|
201
|
-
>>> from pyield
|
|
201
|
+
>>> from pyield import ntnb
|
|
202
202
|
>>> ntnb.datas_pagamento("10-05-2024", "15-05-2025")
|
|
203
203
|
shape: (3,)
|
|
204
204
|
Series: 'datas_pagamento' [date]
|
|
@@ -246,7 +246,7 @@ def fluxos_caixa(
|
|
|
246
246
|
- valor_pagamento (Float64): Valor do pagamento.
|
|
247
247
|
|
|
248
248
|
Examples:
|
|
249
|
-
>>> from pyield
|
|
249
|
+
>>> from pyield import ntnb
|
|
250
250
|
>>> ntnb.fluxos_caixa("10-05-2024", "15-05-2025")
|
|
251
251
|
shape: (3, 2)
|
|
252
252
|
┌────────────────┬─────────────────┐
|
|
@@ -309,7 +309,7 @@ def cotacao(
|
|
|
309
309
|
semestral e arredondamento para 6 casas, conforme ANBIMA.
|
|
310
310
|
|
|
311
311
|
Examples:
|
|
312
|
-
>>> from pyield
|
|
312
|
+
>>> from pyield import ntnb
|
|
313
313
|
>>> ntnb.cotacao("31-05-2024", "15-05-2035", 0.061490)
|
|
314
314
|
99.3651
|
|
315
315
|
>>> ntnb.cotacao("31-05-2024", "15-08-2060", 0.061878)
|
|
@@ -361,7 +361,7 @@ def pu(
|
|
|
361
361
|
- https://www.anbima.com.br/data/files/A0/02/CC/70/8FEFC8104606BDC8B82BA2A8/Metodologias%20ANBIMA%20de%20Precificacao%20Titulos%20Publicos.pdf
|
|
362
362
|
|
|
363
363
|
Examples:
|
|
364
|
-
>>> from pyield
|
|
364
|
+
>>> from pyield import ntnb
|
|
365
365
|
>>> ntnb.pu(4299.160173, 99.3651)
|
|
366
366
|
4271.864805
|
|
367
367
|
>>> ntnb.pu(4315.498383, 100.6409)
|
|
@@ -497,7 +497,7 @@ def taxas_zero(
|
|
|
497
497
|
- taxa_zero (Float64): Taxa zero (real).
|
|
498
498
|
|
|
499
499
|
Examples:
|
|
500
|
-
>>> from pyield
|
|
500
|
+
>>> from pyield import ntnb
|
|
501
501
|
>>> # Busca as taxas de NTN-B para uma data de referência
|
|
502
502
|
>>> df = ntnb.dados("16-08-2024")
|
|
503
503
|
>>> # Calcula as taxas zero considerando a liquidação na data de referência
|
|
@@ -707,7 +707,7 @@ def duration(
|
|
|
707
707
|
float: Macaulay duration em anos úteis.
|
|
708
708
|
|
|
709
709
|
Examples:
|
|
710
|
-
>>> from pyield
|
|
710
|
+
>>> from pyield import ntnb
|
|
711
711
|
>>> ntnb.duration("23-08-2024", "15-08-2060", 0.061005)
|
|
712
712
|
15.08305431313046
|
|
713
713
|
"""
|
|
@@ -745,7 +745,7 @@ def dv01(
|
|
|
745
745
|
float: DV01, variação de preço para 1 bp.
|
|
746
746
|
|
|
747
747
|
Examples:
|
|
748
|
-
>>> from pyield
|
|
748
|
+
>>> from pyield import ntnb
|
|
749
749
|
>>> ntnb.dv01("26-03-2025", "15-08-2060", 0.074358, 4470.979474)
|
|
750
750
|
4.640875999999935
|
|
751
751
|
"""
|
|
@@ -783,7 +783,7 @@ def taxa(
|
|
|
783
783
|
caso de erro.
|
|
784
784
|
|
|
785
785
|
Examples:
|
|
786
|
-
>>> from pyield
|
|
786
|
+
>>> from pyield import ntnb
|
|
787
787
|
>>> ntnb.taxa("31-05-2024", "15-05-2035", 4299.160173, 4271.864805)
|
|
788
788
|
0.06149
|
|
789
789
|
>>> ntnb.taxa("15-08-2024", "15-08-2032", 4315.498383, 4343.156412)
|
|
@@ -825,7 +825,7 @@ def forward(
|
|
|
825
825
|
- taxa_forward (Float64): Taxa forward calculada.
|
|
826
826
|
|
|
827
827
|
Examples:
|
|
828
|
-
>>> from pyield
|
|
828
|
+
>>> from pyield import ntnb
|
|
829
829
|
>>> ntnb.forward("17-10-2025", usar_taxa_zero=True)
|
|
830
830
|
shape: (13, 4)
|
|
831
831
|
┌─────────────────┬────────────┬─────────────────┬──────────────┐
|
|
@@ -70,7 +70,7 @@ def datas_pagamento(
|
|
|
70
70
|
pl.Series: Série de datas de amortização no intervalo.
|
|
71
71
|
|
|
72
72
|
Examples:
|
|
73
|
-
>>> from pyield
|
|
73
|
+
>>> from pyield import ntnb1
|
|
74
74
|
>>> r_mais = ntnb1.NomeComercial.RENDA_MAIS
|
|
75
75
|
>>> ntnb1.datas_pagamento("10-05-2024", "15-12-2050", r_mais)
|
|
76
76
|
shape: (240,)
|
|
@@ -139,7 +139,7 @@ def fluxos_caixa(
|
|
|
139
139
|
- valor_pagamento (Float64): Valor do pagamento.
|
|
140
140
|
|
|
141
141
|
Examples:
|
|
142
|
-
>>> from pyield
|
|
142
|
+
>>> from pyield import ntnb1
|
|
143
143
|
>>> r_mais = ntnb1.NomeComercial.RENDA_MAIS
|
|
144
144
|
>>> ntnb1.fluxos_caixa("10-05-2024", "15-12-2060", r_mais)
|
|
145
145
|
shape: (240, 2)
|
|
@@ -210,7 +210,7 @@ def cotacao(
|
|
|
210
210
|
- https://www.anbima.com.br/data/files/A0/02/CC/70/8FEFC8104606BDC8B82BA2A8/Metodologias%20ANBIMA%20de%20Precificacao%20Titulos%20Publicos.pdf
|
|
211
211
|
|
|
212
212
|
Examples:
|
|
213
|
-
>>> from pyield
|
|
213
|
+
>>> from pyield import ntnb1
|
|
214
214
|
>>> r_mais = ntnb1.NomeComercial.RENDA_MAIS
|
|
215
215
|
>>> ntnb1.cotacao("18-06-2025", "15-12-2084", 0.07010, r_mais)
|
|
216
216
|
0.038332
|
|
@@ -247,7 +247,7 @@ def pu(
|
|
|
247
247
|
- SEI Proccess 17944.005214/2024-09
|
|
248
248
|
|
|
249
249
|
Examples:
|
|
250
|
-
>>> from pyield
|
|
250
|
+
>>> from pyield import ntnb1
|
|
251
251
|
>>> ntnb1.pu(4299.160173, 99.3651 / 100)
|
|
252
252
|
4271.864805
|
|
253
253
|
>>> ntnb1.pu(4315.498383, 100.6409 / 100)
|
|
@@ -277,7 +277,7 @@ def duration(
|
|
|
277
277
|
float: Macaulay duration em anos úteis.
|
|
278
278
|
|
|
279
279
|
Examples:
|
|
280
|
-
>>> from pyield
|
|
280
|
+
>>> from pyield import ntnb1
|
|
281
281
|
>>> r_mais = ntnb1.NomeComercial.RENDA_MAIS
|
|
282
282
|
>>> ntnb1.duration("23-06-2025", "15-12-2084", 0.0686, r_mais)
|
|
283
283
|
47.10493458167134
|
|
@@ -318,7 +318,7 @@ def dv01(
|
|
|
318
318
|
float: DV01, variação de preço para 1 bp.
|
|
319
319
|
|
|
320
320
|
Examples:
|
|
321
|
-
>>> from pyield
|
|
321
|
+
>>> from pyield import ntnb1
|
|
322
322
|
>>> r_mais = ntnb1.NomeComercial.RENDA_MAIS
|
|
323
323
|
>>> ntnb1.dv01("23-06-2025", "15-12-2084", 0.0686, 4299.160173, r_mais)
|
|
324
324
|
0.7738490000000127
|
|
@@ -25,7 +25,7 @@ def pu(
|
|
|
25
25
|
- https://www.anbima.com.br/data/files/A0/02/CC/70/8FEFC8104606BDC8B82BA2A8/Metodologias%20ANBIMA%20de%20Precificacao%20Titulos%20Publicos.pdf
|
|
26
26
|
|
|
27
27
|
Examples:
|
|
28
|
-
>>> from pyield
|
|
28
|
+
>>> from pyield import ntnbprinc
|
|
29
29
|
>>> ntnbprinc.pu("02-12-2025", "15-05-2029", 0.0777, 4567.033825)
|
|
30
30
|
3537.763157
|
|
31
31
|
"""
|
|
@@ -65,7 +65,7 @@ def dv01(
|
|
|
65
65
|
float: DV01 (Dollar Value of 01), variação de preço para 1 bp.
|
|
66
66
|
|
|
67
67
|
Examples:
|
|
68
|
-
>>> from pyield
|
|
68
|
+
>>> from pyield import ntnbprinc as bp
|
|
69
69
|
>>> bp.dv01("02-12-2025", "15-05-2029", 0.0777, 4567.033825)
|
|
70
70
|
1.1200559999997495
|
|
71
71
|
"""
|
|
@@ -68,7 +68,7 @@ def dados(data: DateLike) -> pl.DataFrame:
|
|
|
68
68
|
método flat forward.
|
|
69
69
|
|
|
70
70
|
Examples:
|
|
71
|
-
>>> from pyield
|
|
71
|
+
>>> from pyield import ntnc
|
|
72
72
|
>>> ntnc.dados("23-08-2024") # doctest: +SKIP
|
|
73
73
|
"""
|
|
74
74
|
df = utils.obter_tpf(data, "NTN-C")
|
|
@@ -123,7 +123,7 @@ def datas_pagamento(
|
|
|
123
123
|
vencimento for menor que a liquidação.
|
|
124
124
|
|
|
125
125
|
Examples:
|
|
126
|
-
>>> from pyield
|
|
126
|
+
>>> from pyield import ntnc
|
|
127
127
|
>>> ntnc.datas_pagamento("21-03-2025", "01-01-2031")
|
|
128
128
|
shape: (12,)
|
|
129
129
|
Series: 'datas_pagamento' [date]
|
|
@@ -184,7 +184,7 @@ def fluxos_caixa(
|
|
|
184
184
|
- valor_pagamento (Float64): Valor do pagamento.
|
|
185
185
|
|
|
186
186
|
Examples:
|
|
187
|
-
>>> from pyield
|
|
187
|
+
>>> from pyield import ntnc
|
|
188
188
|
>>> ntnc.fluxos_caixa("21-03-2025", "01-01-2031")
|
|
189
189
|
shape: (12, 2)
|
|
190
190
|
┌────────────────┬─────────────────┐
|
|
@@ -259,7 +259,7 @@ def cotacao(
|
|
|
259
259
|
semestral e arredondamento para 6 casas, conforme ANBIMA.
|
|
260
260
|
|
|
261
261
|
Examples:
|
|
262
|
-
>>> from pyield
|
|
262
|
+
>>> from pyield import ntnc
|
|
263
263
|
>>> ntnc.cotacao("21-03-2025", "01-01-2031", 0.067626)
|
|
264
264
|
126.4958
|
|
265
265
|
"""
|
|
@@ -310,7 +310,7 @@ def pu(
|
|
|
310
310
|
- https://www.anbima.com.br/data/files/A0/02/CC/70/8FEFC8104606BDC8B82BA2A8/Metodologias%20ANBIMA%20de%20Precificacao%20Titulos%20Publicos.pdf
|
|
311
311
|
|
|
312
312
|
Examples:
|
|
313
|
-
>>> from pyield
|
|
313
|
+
>>> from pyield import ntnc
|
|
314
314
|
>>> ntnc.pu(6598.913723, 126.4958)
|
|
315
315
|
8347.348705
|
|
316
316
|
"""
|
|
@@ -341,7 +341,7 @@ def taxa(
|
|
|
341
341
|
caso de erro.
|
|
342
342
|
|
|
343
343
|
Examples:
|
|
344
|
-
>>> from pyield
|
|
344
|
+
>>> from pyield import ntnc
|
|
345
345
|
>>> ntnc.taxa("21-03-2025", "01-01-2031", 6598.913723, 8347.348705)
|
|
346
346
|
0.067626
|
|
347
347
|
"""
|
|
@@ -376,7 +376,7 @@ def duracao(
|
|
|
376
376
|
float: Macaulay duration em anos úteis.
|
|
377
377
|
|
|
378
378
|
Examples:
|
|
379
|
-
>>> from pyield
|
|
379
|
+
>>> from pyield import ntnc
|
|
380
380
|
>>> ntnc.duracao("21-03-2025", "01-01-2031", 0.067626)
|
|
381
381
|
4.405363320448
|
|
382
382
|
"""
|
|
@@ -10,7 +10,6 @@ from pyield import dus
|
|
|
10
10
|
from pyield._internal.types import ArrayLike, DateLike, any_is_empty
|
|
11
11
|
from pyield.b3 import di1
|
|
12
12
|
from pyield.tn import utils
|
|
13
|
-
from pyield.tn.pre import premio as premio_pre
|
|
14
13
|
|
|
15
14
|
"""
|
|
16
15
|
Constantes calculadas conforme regras da ANBIMA
|
|
@@ -62,7 +61,7 @@ def dados(data: DateLike) -> pl.DataFrame:
|
|
|
62
61
|
- rentabilidade (Float64): Rentabilidade da NTN-F sobre a curva DI.
|
|
63
62
|
|
|
64
63
|
Examples:
|
|
65
|
-
>>> from pyield
|
|
64
|
+
>>> from pyield import ntnf
|
|
66
65
|
>>> df_ntnf = ntnf.dados("23-08-2024") # doctest: +SKIP
|
|
67
66
|
"""
|
|
68
67
|
df = utils.obter_tpf(data, "NTN-F")
|
|
@@ -154,7 +153,7 @@ def vencimentos(data: DateLike) -> pl.Series:
|
|
|
154
153
|
pl.Series: Série de datas de vencimento de NTN-F.
|
|
155
154
|
|
|
156
155
|
Examples:
|
|
157
|
-
>>> from pyield
|
|
156
|
+
>>> from pyield import ntnf
|
|
158
157
|
>>> ntnf.vencimentos("23-08-2024")
|
|
159
158
|
shape: (6,)
|
|
160
159
|
Series: 'data_vencimento' [date]
|
|
@@ -191,7 +190,7 @@ def datas_pagamento(
|
|
|
191
190
|
for menor ou igual à liquidação.
|
|
192
191
|
|
|
193
192
|
Examples:
|
|
194
|
-
>>> from pyield
|
|
193
|
+
>>> from pyield import ntnf
|
|
195
194
|
>>> ntnf.datas_pagamento("15-05-2024", "01-01-2027")
|
|
196
195
|
shape: (6,)
|
|
197
196
|
Series: 'datas_pagamento' [date]
|
|
@@ -251,7 +250,7 @@ def fluxos_caixa(
|
|
|
251
250
|
- valor_pagamento (Float64): Valor do pagamento.
|
|
252
251
|
|
|
253
252
|
Examples:
|
|
254
|
-
>>> from pyield
|
|
253
|
+
>>> from pyield import ntnf
|
|
255
254
|
>>> ntnf.fluxos_caixa("15-05-2024", "01-01-2027")
|
|
256
255
|
shape: (6, 2)
|
|
257
256
|
┌────────────────┬─────────────────┐
|
|
@@ -340,7 +339,7 @@ def pu(
|
|
|
340
339
|
semestral e arredondamento para 5 casas, conforme ANBIMA.
|
|
341
340
|
|
|
342
341
|
Examples:
|
|
343
|
-
>>> from pyield
|
|
342
|
+
>>> from pyield import ntnf
|
|
344
343
|
>>> ntnf.pu("05-07-2024", "01-01-2035", 0.11921)
|
|
345
344
|
895.359254
|
|
346
345
|
"""
|
|
@@ -383,7 +382,7 @@ def taxas_zero( # noqa
|
|
|
383
382
|
- taxa_zero (Float64): Taxa zero (zero cupom).
|
|
384
383
|
|
|
385
384
|
Examples:
|
|
386
|
-
>>> from pyield
|
|
385
|
+
>>> from pyield import ntnf, ltn
|
|
387
386
|
>>> df_ltn = ltn.dados("03-09-2024")
|
|
388
387
|
>>> df_ntnf = ntnf.dados("03-09-2024")
|
|
389
388
|
>>> ntnf.taxas_zero(
|
|
@@ -659,7 +658,7 @@ def premio(data: DateLike, pontos_base: bool = False) -> pl.DataFrame:
|
|
|
659
658
|
ValueError: Se os dados de DI não possuem 'taxa_ajuste' ou estão vazios.
|
|
660
659
|
|
|
661
660
|
Examples:
|
|
662
|
-
>>> from pyield
|
|
661
|
+
>>> from pyield import ntnf
|
|
663
662
|
>>> ntnf.premio("30-05-2025", pontos_base=True)
|
|
664
663
|
shape: (5, 3)
|
|
665
664
|
┌────────┬─────────────────┬────────┐
|
|
@@ -674,7 +673,9 @@ def premio(data: DateLike, pontos_base: bool = False) -> pl.DataFrame:
|
|
|
674
673
|
│ NTN-F ┆ 2035-01-01 ┆ 22.0 │
|
|
675
674
|
└────────┴─────────────────┴────────┘
|
|
676
675
|
"""
|
|
677
|
-
return premio_pre(data, pontos_base=pontos_base).filter(
|
|
676
|
+
return utils.premio_pre(data, pontos_base=pontos_base).filter(
|
|
677
|
+
pl.col("titulo") == "NTN-F"
|
|
678
|
+
)
|
|
678
679
|
|
|
679
680
|
|
|
680
681
|
def premio_limpo( # noqa
|
|
@@ -778,7 +779,7 @@ def duration(
|
|
|
778
779
|
float: Macaulay duration em anos úteis. Retorna NaN se inválido.
|
|
779
780
|
|
|
780
781
|
Examples:
|
|
781
|
-
>>> from pyield
|
|
782
|
+
>>> from pyield import ntnf
|
|
782
783
|
>>> ntnf.duration("02-09-2024", "01-01-2035", 0.121785)
|
|
783
784
|
6.32854218039796
|
|
784
785
|
"""
|
|
@@ -814,7 +815,7 @@ def dv01(
|
|
|
814
815
|
float: DV01, variação de preço para 1 bp.
|
|
815
816
|
|
|
816
817
|
Examples:
|
|
817
|
-
>>> from pyield
|
|
818
|
+
>>> from pyield import ntnf
|
|
818
819
|
>>> ntnf.dv01("26-03-2025", "01-01-2035", 0.151375)
|
|
819
820
|
0.39025200000003224
|
|
820
821
|
"""
|
|
@@ -846,7 +847,7 @@ def taxa(
|
|
|
846
847
|
float: TIR implícita em formato decimal. Retorna NaN em caso de erro.
|
|
847
848
|
|
|
848
849
|
Examples:
|
|
849
|
-
>>> from pyield
|
|
850
|
+
>>> from pyield import ntnf
|
|
850
851
|
>>> pu = ntnf.pu("05-07-2024", "01-01-2035", 0.11921)
|
|
851
852
|
>>> ntnf.taxa("13-03-2026", "01-01-2035", 820.995125)
|
|
852
853
|
0.142743
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import polars as pl
|
|
2
2
|
|
|
3
|
-
import pyield._internal.converters as cv
|
|
4
3
|
from pyield import dus
|
|
5
4
|
from pyield._internal.types import DateLike
|
|
6
5
|
from pyield.tn import ntnf, utils
|
|
@@ -137,81 +136,3 @@ def _validar_resultado_final(df: pl.DataFrame) -> None:
|
|
|
137
136
|
|
|
138
137
|
if df["taxa_zero"].is_null().any():
|
|
139
138
|
raise ValueError("Resultado final contém NaN na coluna taxa_zero")
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def premio(
|
|
143
|
-
data: DateLike,
|
|
144
|
-
pontos_base: bool = False,
|
|
145
|
-
) -> pl.DataFrame:
|
|
146
|
-
"""
|
|
147
|
-
Calcula o prêmio dos títulos prefixados (LTN e NTN-F) sobre o DI.
|
|
148
|
-
|
|
149
|
-
Em linguagem de mercado, esse valor é chamado de prêmio. Em termos
|
|
150
|
-
descritivos, trata-se do spread sobre o DI.
|
|
151
|
-
|
|
152
|
-
Definição do prêmio:
|
|
153
|
-
premio = taxa indicativa do PRE - taxa de ajuste do DI
|
|
154
|
-
|
|
155
|
-
Quando ``pontos_base=False`` a coluna retorna essa diferença em formato
|
|
156
|
-
decimal (ex: 0.000439 ≈ 4.39 bps). Quando ``pontos_base=True`` o valor é
|
|
157
|
-
automaticamente
|
|
158
|
-
multiplicado por 10_000 e exibido diretamente em basis points.
|
|
159
|
-
|
|
160
|
-
Args:
|
|
161
|
-
data: Data da consulta para buscar as taxas.
|
|
162
|
-
pontos_base: Se True, retorna o prêmio já convertido em basis points.
|
|
163
|
-
Padrão False.
|
|
164
|
-
|
|
165
|
-
Returns:
|
|
166
|
-
pl.DataFrame: DataFrame com as colunas do prêmio.
|
|
167
|
-
|
|
168
|
-
Output Columns:
|
|
169
|
-
- titulo (String): Tipo do título.
|
|
170
|
-
- data_vencimento (Date): Data de vencimento.
|
|
171
|
-
- premio (Float64): prêmio em decimal ou bps conforme parâmetro
|
|
172
|
-
(spread sobre o DI).
|
|
173
|
-
|
|
174
|
-
Examples:
|
|
175
|
-
>>> from pyield.tn import pre
|
|
176
|
-
>>> pre.premio("30-05-2025", pontos_base=True)
|
|
177
|
-
shape: (18, 3)
|
|
178
|
-
┌────────┬─────────────────┬────────┐
|
|
179
|
-
│ titulo ┆ data_vencimento ┆ premio │
|
|
180
|
-
│ --- ┆ --- ┆ --- │
|
|
181
|
-
│ str ┆ date ┆ f64 │
|
|
182
|
-
╞════════╪═════════════════╪════════╡
|
|
183
|
-
│ LTN ┆ 2025-07-01 ┆ 4.39 │
|
|
184
|
-
│ LTN ┆ 2025-10-01 ┆ -9.0 │
|
|
185
|
-
│ LTN ┆ 2026-01-01 ┆ -4.88 │
|
|
186
|
-
│ LTN ┆ 2026-04-01 ┆ -4.45 │
|
|
187
|
-
│ LTN ┆ 2026-07-01 ┆ 0.81 │
|
|
188
|
-
│ … ┆ … ┆ … │
|
|
189
|
-
│ NTN-F ┆ 2027-01-01 ┆ -3.31 │
|
|
190
|
-
│ NTN-F ┆ 2029-01-01 ┆ 14.21 │
|
|
191
|
-
│ NTN-F ┆ 2031-01-01 ┆ 21.61 │
|
|
192
|
-
│ NTN-F ┆ 2033-01-01 ┆ 11.51 │
|
|
193
|
-
│ NTN-F ┆ 2035-01-01 ┆ 22.0 │
|
|
194
|
-
└────────┴─────────────────┴────────┘
|
|
195
|
-
"""
|
|
196
|
-
# Busca taxas dos títulos (LTN e NTN-F) e adiciona taxa_di
|
|
197
|
-
df = utils.obter_tpf(data, "PRE").select(
|
|
198
|
-
"titulo", "data_vencimento", "taxa_indicativa"
|
|
199
|
-
)
|
|
200
|
-
if df.is_empty():
|
|
201
|
-
return df.select(
|
|
202
|
-
pl.lit("").alias("titulo"),
|
|
203
|
-
pl.lit(None, dtype=pl.Date).alias("data_vencimento"),
|
|
204
|
-
pl.lit(None, dtype=pl.Float64).alias("premio"),
|
|
205
|
-
).clear()
|
|
206
|
-
data_ref = cv.converter_datas(data)
|
|
207
|
-
df = utils.adicionar_taxa_di(df, data_ref)
|
|
208
|
-
df = (
|
|
209
|
-
df.with_columns(premio=pl.col("taxa_indicativa") - pl.col("taxa_di"))
|
|
210
|
-
.select("titulo", "data_vencimento", "premio")
|
|
211
|
-
.sort("titulo", "data_vencimento")
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
if pontos_base:
|
|
215
|
-
df = df.with_columns(pl.col("premio") * 10_000)
|
|
216
|
-
|
|
217
|
-
return df
|
|
@@ -6,6 +6,7 @@ from typing import overload
|
|
|
6
6
|
|
|
7
7
|
import polars as pl
|
|
8
8
|
|
|
9
|
+
import pyield._internal.converters as cv
|
|
9
10
|
from pyield._internal.types import DateLike
|
|
10
11
|
from pyield.anbima.tpf import TipoTPF
|
|
11
12
|
|
|
@@ -298,3 +299,77 @@ def encontrar_raiz(func_diferenca_preco: Callable[[float], float]) -> float:
|
|
|
298
299
|
|
|
299
300
|
a, b = intervalo
|
|
300
301
|
return _metodo_bissecao(func_diferenca_preco, a, b)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def premio_pre(
|
|
305
|
+
data: DateLike,
|
|
306
|
+
pontos_base: bool = False,
|
|
307
|
+
) -> pl.DataFrame:
|
|
308
|
+
"""Calcula o prêmio dos títulos prefixados (LTN e NTN-F) sobre o DI.
|
|
309
|
+
|
|
310
|
+
Em linguagem de mercado, esse valor é chamado de prêmio. Em termos
|
|
311
|
+
descritivos, trata-se do spread sobre o DI.
|
|
312
|
+
|
|
313
|
+
Definição do prêmio:
|
|
314
|
+
premio = taxa indicativa do PRE - taxa de ajuste do DI
|
|
315
|
+
|
|
316
|
+
Quando ``pontos_base=False`` a coluna retorna essa diferença em formato
|
|
317
|
+
decimal (ex: 0.000439 ≈ 4.39 bps). Quando ``pontos_base=True`` o valor
|
|
318
|
+
é automaticamente multiplicado por 10_000 e exibido diretamente em
|
|
319
|
+
basis points.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
data: Data da consulta para buscar as taxas.
|
|
323
|
+
pontos_base: Se True, retorna o prêmio já convertido em basis
|
|
324
|
+
points. Padrão False.
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
pl.DataFrame: DataFrame com as colunas do prêmio.
|
|
328
|
+
|
|
329
|
+
Output Columns:
|
|
330
|
+
- titulo (String): Tipo do título.
|
|
331
|
+
- data_vencimento (Date): Data de vencimento.
|
|
332
|
+
- premio (Float64): prêmio em decimal ou bps conforme parâmetro
|
|
333
|
+
(spread sobre o DI).
|
|
334
|
+
|
|
335
|
+
Examples:
|
|
336
|
+
>>> from pyield.tn import utils
|
|
337
|
+
>>> utils.premio_pre("30-05-2025", pontos_base=True)
|
|
338
|
+
shape: (18, 3)
|
|
339
|
+
┌────────┬─────────────────┬────────┐
|
|
340
|
+
│ titulo ┆ data_vencimento ┆ premio │
|
|
341
|
+
│ --- ┆ --- ┆ --- │
|
|
342
|
+
│ str ┆ date ┆ f64 │
|
|
343
|
+
╞════════╪═════════════════╪════════╡
|
|
344
|
+
│ LTN ┆ 2025-07-01 ┆ 4.39 │
|
|
345
|
+
│ LTN ┆ 2025-10-01 ┆ -9.0 │
|
|
346
|
+
│ LTN ┆ 2026-01-01 ┆ -4.88 │
|
|
347
|
+
│ LTN ┆ 2026-04-01 ┆ -4.45 │
|
|
348
|
+
│ LTN ┆ 2026-07-01 ┆ 0.81 │
|
|
349
|
+
│ … ┆ … ┆ … │
|
|
350
|
+
│ NTN-F ┆ 2027-01-01 ┆ -3.31 │
|
|
351
|
+
│ NTN-F ┆ 2029-01-01 ┆ 14.21 │
|
|
352
|
+
│ NTN-F ┆ 2031-01-01 ┆ 21.61 │
|
|
353
|
+
│ NTN-F ┆ 2033-01-01 ┆ 11.51 │
|
|
354
|
+
│ NTN-F ┆ 2035-01-01 ┆ 22.0 │
|
|
355
|
+
└────────┴─────────────────┴────────┘
|
|
356
|
+
"""
|
|
357
|
+
df = obter_tpf(data, "PRE").select("titulo", "data_vencimento", "taxa_indicativa")
|
|
358
|
+
if df.is_empty():
|
|
359
|
+
return df.select(
|
|
360
|
+
pl.lit("").alias("titulo"),
|
|
361
|
+
pl.lit(None, dtype=pl.Date).alias("data_vencimento"),
|
|
362
|
+
pl.lit(None, dtype=pl.Float64).alias("premio"),
|
|
363
|
+
).clear()
|
|
364
|
+
data_ref = cv.converter_datas(data)
|
|
365
|
+
df = adicionar_taxa_di(df, data_ref)
|
|
366
|
+
df = (
|
|
367
|
+
df.with_columns(premio=pl.col("taxa_indicativa") - pl.col("taxa_di"))
|
|
368
|
+
.select("titulo", "data_vencimento", "premio")
|
|
369
|
+
.sort("titulo", "data_vencimento")
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
if pontos_base:
|
|
373
|
+
df = df.with_columns(pl.col("premio") * 10_000)
|
|
374
|
+
|
|
375
|
+
return df
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.48.0"
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from pyield.tn.benchmark import benchmarks
|
|
2
|
-
from pyield.tn.leiloes import leilao
|
|
3
|
-
from pyield.tn.pre import premio
|
|
4
|
-
from pyield.tn.rmd import rmd
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"benchmarks",
|
|
8
|
-
"leilao",
|
|
9
|
-
"lft",
|
|
10
|
-
"ltn",
|
|
11
|
-
"ntnb",
|
|
12
|
-
"ntnb1",
|
|
13
|
-
"ntnbprinc",
|
|
14
|
-
"ntnc",
|
|
15
|
-
"ntnf",
|
|
16
|
-
"pre",
|
|
17
|
-
"premio",
|
|
18
|
-
"rmd",
|
|
19
|
-
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|