PYield 0.46.0__tar.gz → 0.46.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.46.0 → pyield-0.46.2}/PKG-INFO +12 -1
- {pyield-0.46.0 → pyield-0.46.2}/README.md +11 -0
- pyield-0.46.2/pyield/__about__.py +1 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/difusao.py +2 -2
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/ima.py +2 -2
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/imaq.py +2 -2
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/_validar_pregao.py +4 -12
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/auction.py +52 -84
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/ptax_api.py +34 -14
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/trades_intraday.py +2 -2
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/trades_monthly.py +7 -4
- {pyield-0.46.0 → pyield-0.46.2}/pyield/fwd.py +1 -1
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/lft.py +34 -36
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ltn.py +94 -94
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnb.py +209 -205
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnb1.py +30 -30
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnc.py +71 -67
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnf.py +188 -181
- pyield-0.46.2/pyield/tn/pre.py +203 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/utils.py +52 -13
- pyield-0.46.0/pyield/__about__.py +0 -1
- pyield-0.46.0/pyield/tn/pre.py +0 -198
- {pyield-0.46.0 → pyield-0.46.2}/.gitignore +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/LICENSE +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/br_numbers.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/cache.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/converters.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/data_cache.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/retry.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/types.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/ettj_intraday.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/ettj_last.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/tpf.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/_contracts.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/di1.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/di_over.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/common.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/historical.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/intraday.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/intraday_derivatives.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/price_report.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/copom.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/rates.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/repo.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/vna.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/core.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/holidays/br_holidays_new.txt +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/holidays/br_holidays_old.txt +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/holidays/brholidays.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/clock.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/interpolator.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/ipca/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/ipca/historical.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/ipca/projected.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/py.typed +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/rmd.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/selic/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/selic/cpm.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/selic/probabilities.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/__init__.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/auctions.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/benchmark.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnbprinc.py +0 -0
- {pyield-0.46.0 → pyield-0.46.2}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyield
|
|
3
|
-
Version: 0.46.
|
|
3
|
+
Version: 0.46.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
|
|
@@ -247,6 +247,17 @@ ntnb.quotation(None, "15-05-2035", 0.06149) # -> nan
|
|
|
247
247
|
bday.count(["01-01-2024", None], "01-02-2024") # -> Series: [22, null]
|
|
248
248
|
```
|
|
249
249
|
|
|
250
|
+
Consultas sem dados disponíveis (data futura, feriado, fim de semana ou
|
|
251
|
+
fonte indisponível) retornam DataFrame vazio ou `nan`, sem lançar exceção:
|
|
252
|
+
|
|
253
|
+
```python
|
|
254
|
+
from pyield import bc, futures
|
|
255
|
+
|
|
256
|
+
futures("01-01-2030", "DI1").is_empty() # -> True (data futura)
|
|
257
|
+
bc.tpf_monthly_trades("01-01-2030").is_empty() # -> True (mês futuro)
|
|
258
|
+
bc.ptax("25-12-2025") # -> nan (feriado)
|
|
259
|
+
```
|
|
260
|
+
|
|
250
261
|
## Migração para Polars (v0.40.0+)
|
|
251
262
|
|
|
252
263
|
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:
|
|
@@ -203,6 +203,17 @@ ntnb.quotation(None, "15-05-2035", 0.06149) # -> nan
|
|
|
203
203
|
bday.count(["01-01-2024", None], "01-02-2024") # -> Series: [22, null]
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
+
Consultas sem dados disponíveis (data futura, feriado, fim de semana ou
|
|
207
|
+
fonte indisponível) retornam DataFrame vazio ou `nan`, sem lançar exceção:
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
from pyield import bc, futures
|
|
211
|
+
|
|
212
|
+
futures("01-01-2030", "DI1").is_empty() # -> True (data futura)
|
|
213
|
+
bc.tpf_monthly_trades("01-01-2030").is_empty() # -> True (mês futuro)
|
|
214
|
+
bc.ptax("25-12-2025") # -> nan (feriado)
|
|
215
|
+
```
|
|
216
|
+
|
|
206
217
|
## Migração para Polars (v0.40.0+)
|
|
207
218
|
|
|
208
219
|
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:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.46.2"
|
|
@@ -109,7 +109,7 @@ def _processar_csv(data_ref: dt.date, df: pl.DataFrame) -> pl.DataFrame:
|
|
|
109
109
|
provedor=pl.col("Provedor"),
|
|
110
110
|
titulo=pl.col("Título"),
|
|
111
111
|
data_vencimento=pl.col("data_vencimento"),
|
|
112
|
-
|
|
112
|
+
isin=pl.col("Código ISIN"),
|
|
113
113
|
dias_uteis=bday.count_expr(data_ref, "data_vencimento"),
|
|
114
114
|
taxa_indicativa_anterior=taxa_br("Fech D-1"),
|
|
115
115
|
taxa_indicativa_superior=taxa_br("Indicativo Superior"),
|
|
@@ -142,7 +142,7 @@ def tpf_difusao(data_referencia: DateLike) -> pl.DataFrame:
|
|
|
142
142
|
- provedor (string): Provedor dos dados.
|
|
143
143
|
- titulo (string): Nome do título (ex: LFT, LTN).
|
|
144
144
|
- data_vencimento (date): Data de vencimento do título.
|
|
145
|
-
-
|
|
145
|
+
- isin (string): código ISIN do título.
|
|
146
146
|
- dias_uteis (int): Dias úteis entre a data de referência e o vencimento.
|
|
147
147
|
- taxa_indicativa_anterior (float): Taxa indicativa de fechamento D-1 (decimal).
|
|
148
148
|
- taxa_indicativa_superior (float): Limite superior da banda indicativa (decimal).
|
|
@@ -59,7 +59,7 @@ def _processar_df(df: pl.DataFrame) -> pl.DataFrame:
|
|
|
59
59
|
titulo=pl.col("Títulos"),
|
|
60
60
|
data_vencimento=pl.col("Data de Vencimento").str.to_date("%d/%m/%Y"),
|
|
61
61
|
codigo_selic=pl.col("Código SELIC").cast(pl.Int64),
|
|
62
|
-
|
|
62
|
+
isin=pl.col("Código ISIN"),
|
|
63
63
|
dias_uteis=pl.col("Prazo (d.u.)").cast(pl.Int64),
|
|
64
64
|
duration=pl.col("duration"),
|
|
65
65
|
taxa_indicativa=pl.col("taxa_indicativa"),
|
|
@@ -100,7 +100,7 @@ def last_ima(ima_type: TiposIMA | None = None) -> pl.DataFrame:
|
|
|
100
100
|
- titulo (String): título (ex: 'LTN', 'NTN-B').
|
|
101
101
|
- data_vencimento (Date): data de vencimento do título.
|
|
102
102
|
- codigo_selic (Int64): código do título no sistema SELIC.
|
|
103
|
-
-
|
|
103
|
+
- isin (String): código ISIN.
|
|
104
104
|
- dias_uteis (Int64): dias úteis até o vencimento.
|
|
105
105
|
- duration (Float64): duration do título em anos úteis (252 d.u./ano).
|
|
106
106
|
- taxa_indicativa (Float64): taxa indicativa em decimal (ex: 0.10 para 10%).
|
|
@@ -102,7 +102,7 @@ def _processar_df(df: pl.DataFrame, data_referencia: dt.date) -> pl.DataFrame:
|
|
|
102
102
|
titulo=pl.col("Título"),
|
|
103
103
|
data_vencimento=pl.col("Data de Vencimento").str.to_date(format="%d/%m/%Y"),
|
|
104
104
|
codigo_selic=pl.col("Codigo Selic").cast(pl.Int64),
|
|
105
|
-
|
|
105
|
+
isin=pl.col("Código ISIN"),
|
|
106
106
|
pu=float_br("PU (R$)"),
|
|
107
107
|
quantidade_mercado=inteiro_m("Quantidade em Mercado (1.000 Títulos)"),
|
|
108
108
|
valor_mercado=inteiro_m("Valor de Mercado (R$ Mil)"),
|
|
@@ -129,7 +129,7 @@ def imaq(date: DateLike) -> pl.DataFrame:
|
|
|
129
129
|
- titulo (String): tipo do título (LTN, NTN-B, NTN-F, LFT, …).
|
|
130
130
|
- data_vencimento (Date): data de vencimento do título.
|
|
131
131
|
- codigo_selic (Int64): código SELIC do título.
|
|
132
|
-
-
|
|
132
|
+
- isin (String): código ISIN.
|
|
133
133
|
- pu (Float64): PU do título em R$.
|
|
134
134
|
- quantidade_mercado (Int64): quantidade em mercado (unidades).
|
|
135
135
|
- valor_mercado (Int64): valor de mercado em R$.
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
import logging
|
|
3
2
|
|
|
4
3
|
from pyield import bday, clock
|
|
5
4
|
|
|
6
|
-
registro = logging.getLogger(__name__)
|
|
7
|
-
|
|
8
5
|
|
|
9
6
|
def data_negociacao_valida(data_negociacao: dt.date) -> bool:
|
|
10
7
|
"""Valida se a data de referência é utilizável para consulta.
|
|
@@ -13,24 +10,19 @@ def data_negociacao_valida(data_negociacao: dt.date) -> bool:
|
|
|
13
10
|
- Deve ser um dia útil brasileiro.
|
|
14
11
|
- Não pode estar no futuro (maior que a data corrente no Brasil).
|
|
15
12
|
|
|
16
|
-
Retorna True se válida, False caso contrário
|
|
13
|
+
Retorna True se válida, False caso contrário.
|
|
17
14
|
"""
|
|
18
15
|
if data_negociacao > clock.today():
|
|
19
|
-
registro.warning(f"A data informada {data_negociacao} está no futuro.")
|
|
20
16
|
return False
|
|
21
17
|
if not bday.is_business_day(data_negociacao):
|
|
22
|
-
registro.warning(f"A data informada {data_negociacao} não é dia útil.")
|
|
23
18
|
return False
|
|
24
19
|
|
|
25
20
|
# Não tem pregão na véspera de Natal e Ano Novo
|
|
26
|
-
datas_fechadas_especiais = {
|
|
27
|
-
dt.date(data_negociacao.year, 12, 24),
|
|
28
|
-
dt.date(data_negociacao.year, 12, 31),
|
|
21
|
+
datas_fechadas_especiais = {
|
|
22
|
+
dt.date(data_negociacao.year, 12, 24),
|
|
23
|
+
dt.date(data_negociacao.year, 12, 31),
|
|
29
24
|
}
|
|
30
25
|
if data_negociacao in datas_fechadas_especiais:
|
|
31
|
-
registro.warning(
|
|
32
|
-
f"Não há pregão na véspera de Natal e de Ano Novo: {data_negociacao}"
|
|
33
|
-
)
|
|
34
26
|
return False
|
|
35
27
|
|
|
36
28
|
return True
|
|
@@ -280,54 +280,62 @@ def auctions(
|
|
|
280
280
|
end: DateLike | None = None,
|
|
281
281
|
auction_type: Literal["sell", "buy"] | None = None,
|
|
282
282
|
) -> pl.DataFrame:
|
|
283
|
-
"""
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
da data de `start` **até a data mais recente disponível**.
|
|
291
|
-
Exemplo: `auctions(start='2024-10-20')`
|
|
292
|
-
- Se apenas `end` for fornecido, a API do BC retornará dados de leilão **desde a
|
|
293
|
-
data mais antiga disponível até a data de `end`**.
|
|
294
|
-
Exemplo: `auctions(end='2024-10-27')`
|
|
295
|
-
|
|
296
|
-
**Série histórica completa:**
|
|
297
|
-
- Para recuperar a série histórica completa de leilões (desde 12/11/2012 até o
|
|
298
|
-
último dia útil), chame a função sem fornecer os parâmetros `start` e `end`.
|
|
299
|
-
Exemplo: `auctions()`
|
|
300
|
-
|
|
301
|
-
Busca dados de leilões da API do BC para as datas de início e fim especificadas,
|
|
302
|
-
filtrando os resultados diretamente na API pelo tipo de leilão, se especificado.
|
|
303
|
-
O comportamento da função em relação aos parâmetros `start` e `end` segue o padrão
|
|
304
|
-
da API do Banco Central:
|
|
305
|
-
- Se `start` for fornecido e `end` não, a função retorna dados de `start` até o fim.
|
|
306
|
-
- Se `end` for fornecido e `start` não, a API retorna dados do início até `end`.
|
|
307
|
-
- Se ambos `start` e `end` forem omitidos, a API retorna a série histórica completa.
|
|
308
|
-
|
|
309
|
-
Os dados podem ser filtrados pelo tipo de leilão especificado ("Sell" ou "Buy").
|
|
310
|
-
Leilões de "Sell" são aqueles em que o Tesouro Nacional vende títulos ao mercado.
|
|
311
|
-
Leilões de "Buy" são aqueles em que o Tesouro Nacional compra títulos do mercado.
|
|
283
|
+
"""Dados de leilões de títulos públicos federais do BCB.
|
|
284
|
+
|
|
285
|
+
Fonte: Banco Central do Brasil. Disponível desde 12/11/2012.
|
|
286
|
+
|
|
287
|
+
Se ambos `start` e `end` forem omitidos, retorna a série
|
|
288
|
+
histórica completa. Se apenas um for informado, a API do BCB
|
|
289
|
+
usa o início ou fim do histórico como limite.
|
|
312
290
|
|
|
313
291
|
Args:
|
|
314
|
-
start
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
Padrão é `None`.
|
|
319
|
-
end (DateLike, opcional): A data de fim para a consulta de dados de leilão.
|
|
320
|
-
Se `end` for fornecido e `start` for `None`, a API retornará dados de
|
|
321
|
-
leilão desde a data mais antiga disponível até a data de `end`.
|
|
322
|
-
Se `start` e `end` forem `None`, a série histórica completa será retornada.
|
|
323
|
-
Padrão é `None`.
|
|
324
|
-
auction_type (Literal["sell", "buy"], opcional): O tipo de leilão para filtrar
|
|
325
|
-
diretamente na API. Padrão é `None` (retorna todos os tipos de leilão).
|
|
292
|
+
start: Data de início. Padrão é ``None``.
|
|
293
|
+
end: Data de fim. Padrão é ``None``.
|
|
294
|
+
auction_type: Tipo de leilão (``"sell"`` = venda,
|
|
295
|
+
``"buy"`` = compra). Padrão é ``None`` (todos).
|
|
326
296
|
|
|
327
297
|
Returns:
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
298
|
+
DataFrame com dados de leilões, ou DataFrame vazio
|
|
299
|
+
se não houver dados.
|
|
300
|
+
|
|
301
|
+
Output Columns:
|
|
302
|
+
* data_leilao (Date): data do leilão.
|
|
303
|
+
* data_liquidacao (Date): data de liquidação.
|
|
304
|
+
* tipo_leilao (String): "Venda" ou "Compra".
|
|
305
|
+
* numero_edital (Int64): edital normativo.
|
|
306
|
+
* tipo_publico (String): categoria do comprador.
|
|
307
|
+
* titulo (String): sigla do título (LTN, LFT, NTN-B, NTN-F).
|
|
308
|
+
* codigo_selic (Int64): código no sistema Selic.
|
|
309
|
+
* data_vencimento (Date): data de vencimento.
|
|
310
|
+
* dias_uteis (Int32): dias úteis até o vencimento.
|
|
311
|
+
* duration (Float64): duração de Macaulay em anos.
|
|
312
|
+
* prazo_medio (Float64): prazo médio em anos.
|
|
313
|
+
* pu_medio (Float64): PU médio no leilão.
|
|
314
|
+
* pu_corte (Float64): PU de corte.
|
|
315
|
+
* taxa_media (Float64): taxa média (decimal).
|
|
316
|
+
* taxa_corte (Float64): taxa de corte (decimal).
|
|
317
|
+
* dv01_1v (Float64): DV01 da 1ª volta em R$.
|
|
318
|
+
* dv01_2v (Float64): DV01 da 2ª volta em R$.
|
|
319
|
+
* dv01_total (Float64): DV01 total em R$.
|
|
320
|
+
* ptax (Float64): PTAX (venda) para conversão USD.
|
|
321
|
+
* dv01_1v_usd (Float64): DV01 da 1ª volta em USD.
|
|
322
|
+
* dv01_2v_usd (Float64): DV01 da 2ª volta em USD.
|
|
323
|
+
* dv01_total_usd (Float64): DV01 total em USD.
|
|
324
|
+
* quantidade_liquidada_1v (Int64): qtd liquidada 1ª volta.
|
|
325
|
+
* quantidade_liquidada_2v (Int64): qtd liquidada 2ª volta.
|
|
326
|
+
* quantidade_liquidada_total (Int64): qtd total liquidada.
|
|
327
|
+
* quantidade_ofertada_1v (Int64): qtd ofertada 1ª volta.
|
|
328
|
+
* quantidade_ofertada_2v (Int64): qtd ofertada 2ª volta.
|
|
329
|
+
* quantidade_ofertada_total (Int64): qtd total ofertada.
|
|
330
|
+
* quantidade_aceita_1v (Int64): qtd aceita 1ª volta.
|
|
331
|
+
* quantidade_aceita_2v (Int64): qtd aceita 2ª volta.
|
|
332
|
+
* quantidade_aceita_total (Int64): qtd total aceita.
|
|
333
|
+
* financeiro_1v (Int64): financeiro 1ª volta em R$.
|
|
334
|
+
* financeiro_2v (Int64): financeiro 2ª volta em R$.
|
|
335
|
+
* financeiro_total (Int64): financeiro total em R$.
|
|
336
|
+
|
|
337
|
+
Notes:
|
|
338
|
+
1v = primeira volta (rodada), 2v = segunda volta.
|
|
331
339
|
|
|
332
340
|
Examples:
|
|
333
341
|
>>> from pyield import bc
|
|
@@ -344,46 +352,6 @@ def auctions(
|
|
|
344
352
|
│ 2025-08-19 ┆ 2025-08-20 ┆ Venda ┆ 194 ┆ … ┆ 500542 ┆ 2071654327 ┆ 2245673 ┆ 2073900000 │
|
|
345
353
|
│ 2025-08-19 ┆ 2025-08-20 ┆ Venda ┆ 194 ┆ … ┆ 500000 ┆ 2010700000 ┆ 0 ┆ 2010700000 │
|
|
346
354
|
└─────────────┴─────────────────┴─────────────┴───────────────┴───┴─────────────────────────┴───────────────┴───────────────┴──────────────────┘
|
|
347
|
-
|
|
348
|
-
Notes:
|
|
349
|
-
1v = Primeira Volta (Rodada)
|
|
350
|
-
2v = Segunda Volta (Rodada)
|
|
351
|
-
|
|
352
|
-
Colunas do DataFrame:
|
|
353
|
-
- data_leilao (Date): data do leilão.
|
|
354
|
-
- data_liquidacao (Date): data de liquidação do leilão.
|
|
355
|
-
- tipo_leilao (String): tipo de leilão (ex: "Venda" ou "Compra").
|
|
356
|
-
- numero_edital (Int64): edital normativo associado ao leilão.
|
|
357
|
-
- tipo_publico (String): categoria do comprador.
|
|
358
|
-
- titulo (String): tipo do título (ex: "LTN", "LFT", "NTN-B", "NTN-F").
|
|
359
|
-
- codigo_selic (Int64): código do título no sistema Selic.
|
|
360
|
-
- data_vencimento (Date): data de vencimento do título.
|
|
361
|
-
- dias_uteis (Int32): dias úteis entre a liquidação e o vencimento.
|
|
362
|
-
- duration (Float64): duração de Macaulay em anos.
|
|
363
|
-
- prazo_medio (Float64): prazo médio do título em anos.
|
|
364
|
-
- pu_medio (Float64): preço unitário médio no leilão.
|
|
365
|
-
- pu_corte (Float64): preço unitário de corte.
|
|
366
|
-
- taxa_media (Float64): taxa de juros média (formato decimal).
|
|
367
|
-
- taxa_corte (Float64): taxa de corte (formato decimal).
|
|
368
|
-
- dv01_1v (Float64): DV01 da 1ª volta em R$.
|
|
369
|
-
- dv01_2v (Float64): DV01 da 2ª volta em R$.
|
|
370
|
-
- dv01_total (Float64): DV01 total do leilão em R$.
|
|
371
|
-
- ptax (Float64): taxa PTAX utilizada na conversão para USD.
|
|
372
|
-
- dv01_1v_usd (Float64): DV01 da 1ª volta em USD.
|
|
373
|
-
- dv01_2v_usd (Float64): DV01 da 2ª volta em USD.
|
|
374
|
-
- dv01_total_usd (Float64): DV01 total em USD.
|
|
375
|
-
- quantidade_liquidada_1v (Int64): quantidade liquidada na 1ª volta.
|
|
376
|
-
- quantidade_liquidada_2v (Int64): quantidade liquidada na 2ª volta.
|
|
377
|
-
- quantidade_liquidada_total (Int64): quantidade total liquidada.
|
|
378
|
-
- quantidade_ofertada_1v (Int64): quantidade ofertada na 1ª volta.
|
|
379
|
-
- quantidade_ofertada_2v (Int64): quantidade ofertada na 2ª volta.
|
|
380
|
-
- quantidade_ofertada_total (Int64): quantidade total ofertada.
|
|
381
|
-
- quantidade_aceita_1v (Int64): quantidade aceita na 1ª volta.
|
|
382
|
-
- quantidade_aceita_2v (Int64): quantidade aceita na 2ª volta.
|
|
383
|
-
- quantidade_aceita_total (Int64): quantidade total aceita.
|
|
384
|
-
- financeiro_1v (Int64): valor financeiro da 1ª volta em R$.
|
|
385
|
-
- financeiro_2v (Int64): valor financeiro da 2ª volta em R$.
|
|
386
|
-
- financeiro_total (Int64): valor financeiro total em R$.
|
|
387
355
|
"""
|
|
388
356
|
url = _montar_url(inicio=start, fim=end, tipo_leilao=auction_type)
|
|
389
357
|
dados = _buscar_csv(url)
|
|
@@ -9,10 +9,14 @@ cotacaoCompra, cotacaoVenda, dataHoraCotacao
|
|
|
9
9
|
2814 , 2828 , 1984-12-03 11:29:00.0
|
|
10
10
|
2814 , 2828 , 1984-12-03 16:38:00.0
|
|
11
11
|
2867 , 2881 , 1984-12-04 11:17:00.0
|
|
12
|
+
"0,843" , "0,845" , 1995-01-02 18:20:00.0
|
|
12
13
|
...
|
|
13
14
|
"5,4272" , "5,4278" , 2025-09-08 13:09:40.608
|
|
14
15
|
"5,4272" , "5,4278" , 2025-09-09 13:07:27.786
|
|
15
16
|
"5,4117" , "5,4123" , 2025-09-10 13:06:29.196
|
|
17
|
+
|
|
18
|
+
ATENÇÃO: a fração de segundo varia entre .0 (datas antigas) e .608
|
|
19
|
+
(datas recentes). Usar %.f (variável) no parsing, nunca %.3f (fixo).
|
|
16
20
|
"""
|
|
17
21
|
|
|
18
22
|
import datetime as dt
|
|
@@ -60,18 +64,20 @@ def _processar_df(df: pl.DataFrame) -> pl.DataFrame:
|
|
|
60
64
|
cotacao_compra=float_br("cotacaoCompra"),
|
|
61
65
|
cotacao_venda=float_br("cotacaoVenda"),
|
|
62
66
|
data_hora=pl.col("dataHoraCotacao").str.to_datetime(
|
|
63
|
-
format="%Y-%m-%d %H:%M:%S%.
|
|
67
|
+
format="%Y-%m-%d %H:%M:%S%.f", strict=False
|
|
64
68
|
),
|
|
65
69
|
)
|
|
66
70
|
.with_columns(
|
|
67
71
|
data=pl.col("data_hora").cast(pl.Date),
|
|
72
|
+
hora=pl.col("data_hora").dt.time(),
|
|
68
73
|
cotacao_media=pl.mean_horizontal("cotacao_compra", "cotacao_venda").round(
|
|
69
74
|
5
|
|
70
75
|
),
|
|
71
76
|
)
|
|
72
|
-
.unique(subset=["data"], keep="last")
|
|
73
|
-
.select("data", "data_hora", "cotacao_compra", "cotacao_venda", "cotacao_media")
|
|
74
77
|
.sort("data_hora")
|
|
78
|
+
.unique(subset=["data"], keep="last")
|
|
79
|
+
.select("data", "hora", "cotacao_compra", "cotacao_venda", "cotacao_media")
|
|
80
|
+
.sort("data")
|
|
75
81
|
)
|
|
76
82
|
|
|
77
83
|
|
|
@@ -96,7 +102,7 @@ def ptax_series(
|
|
|
96
102
|
|
|
97
103
|
Output Columns:
|
|
98
104
|
* data (Date): data da cotação.
|
|
99
|
-
*
|
|
105
|
+
* hora (Time): hora da cotação.
|
|
100
106
|
* cotacao_compra (Float64): taxa de compra em R$.
|
|
101
107
|
* cotacao_venda (Float64): taxa de venda em R$.
|
|
102
108
|
* cotacao_media (Float64): média de compra/venda (5 casas).
|
|
@@ -118,16 +124,30 @@ def ptax_series(
|
|
|
118
124
|
>>> from pyield import bc
|
|
119
125
|
>>> bc.ptax_series(start="20-04-2025", end="25-04-2025")
|
|
120
126
|
shape: (4, 5)
|
|
121
|
-
|
|
122
|
-
│ data ┆
|
|
123
|
-
│ --- ┆ ---
|
|
124
|
-
│ date ┆
|
|
125
|
-
|
|
126
|
-
│ 2025-04-22 ┆
|
|
127
|
-
│ 2025-04-23 ┆
|
|
128
|
-
│ 2025-04-24 ┆
|
|
129
|
-
│ 2025-04-25 ┆
|
|
130
|
-
|
|
127
|
+
┌────────────┬──────────────┬────────────────┬───────────────┬───────────────┐
|
|
128
|
+
│ data ┆ hora ┆ cotacao_compra ┆ cotacao_venda ┆ cotacao_media │
|
|
129
|
+
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
|
|
130
|
+
│ date ┆ time ┆ f64 ┆ f64 ┆ f64 │
|
|
131
|
+
╞════════════╪══════════════╪════════════════╪═══════════════╪═══════════════╡
|
|
132
|
+
│ 2025-04-22 ┆ 13:09:35.629 ┆ 5.749 ┆ 5.7496 ┆ 5.7493 │
|
|
133
|
+
│ 2025-04-23 ┆ 13:06:30.443 ┆ 5.6874 ┆ 5.688 ┆ 5.6877 │
|
|
134
|
+
│ 2025-04-24 ┆ 13:04:29.639 ┆ 5.6732 ┆ 5.6738 ┆ 5.6735 │
|
|
135
|
+
│ 2025-04-25 ┆ 13:09:26.592 ┆ 5.684 ┆ 5.6846 ┆ 5.6843 │
|
|
136
|
+
└────────────┴──────────────┴────────────────┴───────────────┴───────────────┘
|
|
137
|
+
|
|
138
|
+
>>> bc.ptax_series(start="02-01-1995", end="06-01-1995")
|
|
139
|
+
shape: (5, 5)
|
|
140
|
+
┌────────────┬──────────┬────────────────┬───────────────┬───────────────┐
|
|
141
|
+
│ data ┆ hora ┆ cotacao_compra ┆ cotacao_venda ┆ cotacao_media │
|
|
142
|
+
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
|
|
143
|
+
│ date ┆ time ┆ f64 ┆ f64 ┆ f64 │
|
|
144
|
+
╞════════════╪══════════╪════════════════╪═══════════════╪═══════════════╡
|
|
145
|
+
│ 1995-01-02 ┆ 18:20:00 ┆ 0.843 ┆ 0.845 ┆ 0.844 │
|
|
146
|
+
│ 1995-01-03 ┆ 18:25:00 ┆ 0.844 ┆ 0.846 ┆ 0.845 │
|
|
147
|
+
│ 1995-01-04 ┆ 18:12:00 ┆ 0.844 ┆ 0.846 ┆ 0.845 │
|
|
148
|
+
│ 1995-01-05 ┆ 18:07:00 ┆ 0.842 ┆ 0.844 ┆ 0.843 │
|
|
149
|
+
│ 1995-01-06 ┆ 18:12:00 ┆ 0.839 ┆ 0.841 ┆ 0.84 │
|
|
150
|
+
└────────────┴──────────┴────────────────┴───────────────┴───────────────┘
|
|
131
151
|
"""
|
|
132
152
|
if start:
|
|
133
153
|
start = cv.converter_datas(start)
|
|
@@ -49,7 +49,7 @@ def _processar_df(df: pl.DataFrame) -> pl.DataFrame:
|
|
|
49
49
|
"""Filtra registros, converte tipos e reordena colunas."""
|
|
50
50
|
agora = clock.now()
|
|
51
51
|
return df.filter(pl.col("//1") == "1").select(
|
|
52
|
-
|
|
52
|
+
data_hora_consulta=agora,
|
|
53
53
|
data_liquidacao=agora.date(),
|
|
54
54
|
titulo=pl.col("sigla").str.strip_chars(),
|
|
55
55
|
codigo_selic=inteiro_br("código título"),
|
|
@@ -106,7 +106,7 @@ def tpf_intraday_trades() -> pl.DataFrame:
|
|
|
106
106
|
estiver fechado ou ocorrer erro.
|
|
107
107
|
|
|
108
108
|
Output Columns:
|
|
109
|
-
-
|
|
109
|
+
- data_hora_consulta (Datetime): data e hora da consulta (BRT).
|
|
110
110
|
- data_liquidacao (Date): data de liquidação à vista.
|
|
111
111
|
- titulo (String): sigla do título (ex.: LFT, LTN, NTN-B).
|
|
112
112
|
- codigo_selic (Int64): código SELIC do título.
|
|
@@ -23,6 +23,7 @@ from pyield._internal.cache import ttl_cache
|
|
|
23
23
|
from pyield._internal.converters import converter_datas
|
|
24
24
|
from pyield._internal.retry import retry_padrao
|
|
25
25
|
from pyield._internal.types import DateLike, any_is_empty
|
|
26
|
+
from pyield.clock import today
|
|
26
27
|
|
|
27
28
|
URL_BASE = "https://www4.bcb.gov.br/pom/demab/negociacoes/download"
|
|
28
29
|
|
|
@@ -72,7 +73,7 @@ def _processar_df(df: pl.DataFrame) -> pl.DataFrame:
|
|
|
72
73
|
data_liquidacao=pl.col("DATA MOV").str.to_date("%d/%m/%Y", strict=False),
|
|
73
74
|
titulo=pl.col("SIGLA"),
|
|
74
75
|
codigo_selic=pl.col("CODIGO").cast(pl.Int64),
|
|
75
|
-
|
|
76
|
+
isin=pl.col("CODIGO ISIN"),
|
|
76
77
|
data_emissao=pl.col("EMISSAO").str.to_date("%d/%m/%Y", strict=False),
|
|
77
78
|
data_vencimento=pl.col("VENCIMENTO").str.to_date("%d/%m/%Y", strict=False),
|
|
78
79
|
operacoes=pl.col("NUM DE OPER").cast(pl.Int64),
|
|
@@ -120,7 +121,7 @@ def tpf_monthly_trades(target_date: DateLike, extragroup: bool = False) -> pl.Da
|
|
|
120
121
|
- data_liquidacao (Date): data de liquidação da negociação.
|
|
121
122
|
- titulo (str): sigla do título (ex: LFT, LTN, NTN-B, NTN-F).
|
|
122
123
|
- codigo_selic (Int64): código único no sistema Selic.
|
|
123
|
-
-
|
|
124
|
+
- isin (str): código ISIN.
|
|
124
125
|
- data_emissao (Date): data de emissão do título.
|
|
125
126
|
- data_vencimento (Date): data de vencimento do título.
|
|
126
127
|
- operacoes (Int64): número total de operações realizadas.
|
|
@@ -130,11 +131,11 @@ def tpf_monthly_trades(target_date: DateLike, extragroup: bool = False) -> pl.Da
|
|
|
130
131
|
- pu_medio (Float64): preço unitário médio.
|
|
131
132
|
- pu_maximo (Float64): preço unitário máximo.
|
|
132
133
|
- pu_lastro (Float64): PU lastro.
|
|
133
|
-
- valor_par (Float64): valor
|
|
134
|
+
- valor_par (Float64): valor par do título.
|
|
134
135
|
- taxa_minima (Float64): taxa mínima.
|
|
135
136
|
- taxa_media (Float64): taxa média.
|
|
136
137
|
- taxa_maxima (Float64): taxa máxima.
|
|
137
|
-
- operacoes_corretagem (Int64): subconjunto de
|
|
138
|
+
- operacoes_corretagem (Int64): subconjunto de operações com corretagem.
|
|
138
139
|
- quantidade_corretagem (Int64): subconjunto de quantidade com corretagem.
|
|
139
140
|
|
|
140
141
|
Notes:
|
|
@@ -148,6 +149,8 @@ def tpf_monthly_trades(target_date: DateLike, extragroup: bool = False) -> pl.Da
|
|
|
148
149
|
if any_is_empty(target_date):
|
|
149
150
|
return pl.DataFrame()
|
|
150
151
|
data_alvo = converter_datas(target_date)
|
|
152
|
+
if (data_alvo.year, data_alvo.month) > (today().year, today().month):
|
|
153
|
+
return pl.DataFrame()
|
|
151
154
|
url = _montar_url(data_alvo, extragroup)
|
|
152
155
|
conteudo_zip = _baixar_zip(url)
|
|
153
156
|
arquivo_extraido = _descompactar_zip(conteudo_zip)
|
|
@@ -103,7 +103,7 @@ def forwards(
|
|
|
103
103
|
>>> # Exemplo com taxas indicativas de NTN-B em 16-09-2025
|
|
104
104
|
>>> from pyield import ntnb
|
|
105
105
|
>>> df = ntnb.data("16-09-2025")
|
|
106
|
-
>>> yd.forwards(df["
|
|
106
|
+
>>> yd.forwards(df["dias_uteis"], df["taxa_indicativa"])
|
|
107
107
|
shape: (13,)
|
|
108
108
|
Series: 'fwd' [f64]
|
|
109
109
|
[
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import polars as pl
|
|
2
2
|
|
|
3
3
|
import pyield._internal.converters as cv
|
|
4
|
-
from pyield import
|
|
4
|
+
from pyield import bday
|
|
5
5
|
from pyield._internal.types import DateLike, any_is_empty
|
|
6
6
|
from pyield.tn import utils
|
|
7
7
|
|
|
@@ -17,62 +17,60 @@ def data(date: DateLike) -> pl.DataFrame:
|
|
|
17
17
|
pl.DataFrame: DataFrame Polars com os dados de LFT.
|
|
18
18
|
|
|
19
19
|
Output Columns:
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
20
|
+
- data_referencia (Date): Data de referência dos dados.
|
|
21
|
+
- titulo (String): Tipo do título (ex.: "LFT").
|
|
22
|
+
- codigo_selic (Int64): Código do título no SELIC.
|
|
23
|
+
- data_base (Date): Data base/emissão do título.
|
|
24
|
+
- data_vencimento (Date): Data de vencimento do título.
|
|
25
|
+
- dias_uteis (Int64): Dias úteis entre referência e vencimento.
|
|
26
|
+
- prazo_medio (Float64): Prazo médio do título em anos.
|
|
27
|
+
- pu (Float64): Preço unitário (PU).
|
|
28
|
+
- taxa_compra (Float64): Taxa de compra (decimal).
|
|
29
|
+
- taxa_venda (Float64): Taxa de venda (decimal).
|
|
30
|
+
- taxa_indicativa (Float64): Taxa indicativa (decimal).
|
|
31
|
+
- taxa_di (Float64): Taxa DI interpolada pelo método flat forward.
|
|
32
|
+
- rentabilidade (Float64): Rentabilidade da LFT sobre o DI.
|
|
33
33
|
|
|
34
34
|
Examples:
|
|
35
35
|
>>> from pyield import lft
|
|
36
36
|
>>> df_lft = lft.data("23-08-2024") # doctest: +SKIP
|
|
37
37
|
"""
|
|
38
|
-
df =
|
|
38
|
+
df = utils.obter_tpf(date, "LFT")
|
|
39
39
|
if df.is_empty():
|
|
40
40
|
return df
|
|
41
41
|
|
|
42
42
|
data_ref = cv.converter_datas(date)
|
|
43
43
|
|
|
44
|
-
# Adiciona BDToMat (dado derivado, não vem da ANBIMA)
|
|
45
44
|
df = df.with_columns(
|
|
46
|
-
|
|
45
|
+
dias_uteis=bday.count_expr("data_referencia", "data_vencimento"),
|
|
47
46
|
)
|
|
48
47
|
|
|
49
|
-
# Adiciona AvgMaturity e DIRate
|
|
50
48
|
df = df.with_columns(
|
|
51
|
-
|
|
49
|
+
prazo_medio=pl.col("dias_uteis") / 252,
|
|
52
50
|
)
|
|
53
51
|
df = utils.adicionar_taxa_di(df, data_ref)
|
|
54
52
|
|
|
55
53
|
df = df.with_columns(
|
|
56
|
-
|
|
57
|
-
lambda s: premium(s["
|
|
54
|
+
rentabilidade=pl.struct("taxa_indicativa", "taxa_di").map_elements(
|
|
55
|
+
lambda s: premium(s["taxa_indicativa"], s["taxa_di"]),
|
|
58
56
|
return_dtype=pl.Float64,
|
|
59
57
|
)
|
|
60
58
|
)
|
|
61
59
|
|
|
62
60
|
return df.select(
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
61
|
+
"data_referencia",
|
|
62
|
+
"titulo",
|
|
63
|
+
"codigo_selic",
|
|
64
|
+
"data_base",
|
|
65
|
+
"data_vencimento",
|
|
66
|
+
"dias_uteis",
|
|
67
|
+
"prazo_medio",
|
|
68
|
+
"pu",
|
|
69
|
+
"taxa_compra",
|
|
70
|
+
"taxa_venda",
|
|
71
|
+
"taxa_indicativa",
|
|
72
|
+
"taxa_di",
|
|
73
|
+
"rentabilidade",
|
|
76
74
|
)
|
|
77
75
|
|
|
78
76
|
|
|
@@ -90,7 +88,7 @@ def maturities(date: DateLike) -> pl.Series:
|
|
|
90
88
|
>>> from pyield import lft
|
|
91
89
|
>>> lft.maturities("22-08-2024")
|
|
92
90
|
shape: (14,)
|
|
93
|
-
Series: '
|
|
91
|
+
Series: 'data_vencimento' [date]
|
|
94
92
|
[
|
|
95
93
|
2024-09-01
|
|
96
94
|
2025-03-01
|
|
@@ -105,7 +103,7 @@ def maturities(date: DateLike) -> pl.Series:
|
|
|
105
103
|
2030-09-01
|
|
106
104
|
]
|
|
107
105
|
"""
|
|
108
|
-
return data(date)["
|
|
106
|
+
return data(date)["data_vencimento"]
|
|
109
107
|
|
|
110
108
|
|
|
111
109
|
def quotation(
|