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.
Files changed (71) hide show
  1. {pyield-0.46.0 → pyield-0.46.2}/PKG-INFO +12 -1
  2. {pyield-0.46.0 → pyield-0.46.2}/README.md +11 -0
  3. pyield-0.46.2/pyield/__about__.py +1 -0
  4. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/difusao.py +2 -2
  5. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/ima.py +2 -2
  6. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/imaq.py +2 -2
  7. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/_validar_pregao.py +4 -12
  8. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/auction.py +52 -84
  9. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/ptax_api.py +34 -14
  10. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/trades_intraday.py +2 -2
  11. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/trades_monthly.py +7 -4
  12. {pyield-0.46.0 → pyield-0.46.2}/pyield/fwd.py +1 -1
  13. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/lft.py +34 -36
  14. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ltn.py +94 -94
  15. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnb.py +209 -205
  16. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnb1.py +30 -30
  17. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnc.py +71 -67
  18. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnf.py +188 -181
  19. pyield-0.46.2/pyield/tn/pre.py +203 -0
  20. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/utils.py +52 -13
  21. pyield-0.46.0/pyield/__about__.py +0 -1
  22. pyield-0.46.0/pyield/tn/pre.py +0 -198
  23. {pyield-0.46.0 → pyield-0.46.2}/.gitignore +0 -0
  24. {pyield-0.46.0 → pyield-0.46.2}/LICENSE +0 -0
  25. {pyield-0.46.0 → pyield-0.46.2}/pyield/__init__.py +0 -0
  26. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/__init__.py +0 -0
  27. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/br_numbers.py +0 -0
  28. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/cache.py +0 -0
  29. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/converters.py +0 -0
  30. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/data_cache.py +0 -0
  31. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/retry.py +0 -0
  32. {pyield-0.46.0 → pyield-0.46.2}/pyield/_internal/types.py +0 -0
  33. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/__init__.py +0 -0
  34. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/ettj_intraday.py +0 -0
  35. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/ettj_last.py +0 -0
  36. {pyield-0.46.0 → pyield-0.46.2}/pyield/anbima/tpf.py +0 -0
  37. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/__init__.py +0 -0
  38. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/_contracts.py +0 -0
  39. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/di1.py +0 -0
  40. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/di_over.py +0 -0
  41. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/__init__.py +0 -0
  42. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/common.py +0 -0
  43. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/historical.py +0 -0
  44. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/futures/intraday.py +0 -0
  45. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/intraday_derivatives.py +0 -0
  46. {pyield-0.46.0 → pyield-0.46.2}/pyield/b3/price_report.py +0 -0
  47. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/__init__.py +0 -0
  48. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/copom.py +0 -0
  49. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/rates.py +0 -0
  50. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/repo.py +0 -0
  51. {pyield-0.46.0 → pyield-0.46.2}/pyield/bc/vna.py +0 -0
  52. {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/__init__.py +0 -0
  53. {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/core.py +0 -0
  54. {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/holidays/br_holidays_new.txt +0 -0
  55. {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/holidays/br_holidays_old.txt +0 -0
  56. {pyield-0.46.0 → pyield-0.46.2}/pyield/bday/holidays/brholidays.py +0 -0
  57. {pyield-0.46.0 → pyield-0.46.2}/pyield/clock.py +0 -0
  58. {pyield-0.46.0 → pyield-0.46.2}/pyield/interpolator.py +0 -0
  59. {pyield-0.46.0 → pyield-0.46.2}/pyield/ipca/__init__.py +0 -0
  60. {pyield-0.46.0 → pyield-0.46.2}/pyield/ipca/historical.py +0 -0
  61. {pyield-0.46.0 → pyield-0.46.2}/pyield/ipca/projected.py +0 -0
  62. {pyield-0.46.0 → pyield-0.46.2}/pyield/py.typed +0 -0
  63. {pyield-0.46.0 → pyield-0.46.2}/pyield/rmd.py +0 -0
  64. {pyield-0.46.0 → pyield-0.46.2}/pyield/selic/__init__.py +0 -0
  65. {pyield-0.46.0 → pyield-0.46.2}/pyield/selic/cpm.py +0 -0
  66. {pyield-0.46.0 → pyield-0.46.2}/pyield/selic/probabilities.py +0 -0
  67. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/__init__.py +0 -0
  68. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/auctions.py +0 -0
  69. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/benchmark.py +0 -0
  70. {pyield-0.46.0 → pyield-0.46.2}/pyield/tn/ntnbprinc.py +0 -0
  71. {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.0
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
- codigo_isin=pl.col("Código ISIN"),
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
- - codigo_isin (string): Código ISIN do título.
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
- codigo_isin=pl.col("Código ISIN"),
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
- - codigo_isin (String): código ISIN.
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
- codigo_isin=pl.col("Código ISIN"),
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
- - codigo_isin (String): código ISIN (International Securities Id Number).
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 (e loga um aviso).
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 = { # Datas especiais
27
- dt.date(data_negociacao.year, 12, 24), # Véspera de Natal
28
- dt.date(data_negociacao.year, 12, 31), # Véspera de Ano Novo
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
- Recupera dados de leilões para um determinado período e tipo de leilão da API do BC.
285
-
286
- **Consultas de período:**
287
- - Para consultar dados de um intervalo, forneça as datas de `start` e `end`.
288
- Exemplo: `auctions(start='2024-10-20', end='2024-10-27')`
289
- - Se apenas `start` for fornecido, a API do BC retornará dados de leilão a partir
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 (DateLike, opcional): A data de início para a consulta dos leilões.
315
- Se `start` for fornecido e `end` for `None`, a API retornará dados de
316
- leilão a partir de `start` até a data mais recente disponível.
317
- Se `start` e `end` forem `None`, a série histórica completa será retornada.
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
- pl.DataFrame: Um DataFrame contendo dados de leilões para o período e tipo
329
- especificados. Em caso de erro ao buscar os dados, um DataFrame vazio
330
- é retornado e uma mensagem de erro é registrada no log.
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%.3f", strict=False
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
- * data_hora (Datetime): data e hora da cotação.
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 ┆ data_hora ┆ cotacao_compra ┆ cotacao_venda ┆ cotacao_media │
123
- │ --- ┆ --- ┆ --- ┆ --- ┆ --- │
124
- │ date ┆ datetime[ms] ┆ f64 ┆ f64 ┆ f64 │
125
- ╞════════════╪═════════════════════════╪════════════════╪═══════════════╪═══════════════╡
126
- │ 2025-04-22 ┆ 2025-04-22 13:09:35.629 ┆ 5.749 ┆ 5.7496 ┆ 5.7493 │
127
- │ 2025-04-23 ┆ 2025-04-23 13:06:30.443 ┆ 5.6874 ┆ 5.688 ┆ 5.6877 │
128
- │ 2025-04-24 ┆ 2025-04-24 13:04:29.639 ┆ 5.6732 ┆ 5.6738 ┆ 5.6735 │
129
- │ 2025-04-25 ┆ 2025-04-25 13:09:26.592 ┆ 5.684 ┆ 5.6846 ┆ 5.6843 │
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
- coletado_em=agora,
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
- - coletado_em (Datetime): timestamp da coleta (BRT).
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
- codigo_isin=pl.col("CODIGO ISIN"),
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
- - codigo_isin (str): código ISIN (International Securities Id Number).
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 nominal atualizado (VNA) do título.
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 operacoes com corretagem.
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["BDToMat"], df["IndicativeRate"])
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 anbima, bday
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
- - ReferenceDate (Date): Data de referência dos dados.
21
- - BondType (String): Tipo do título (ex.: "LFT").
22
- - SelicCode (Int64): Código do título no SELIC.
23
- - IssueBaseDate (Date): Data base/emissão do título.
24
- - MaturityDate (Date): Data de vencimento do título.
25
- - BDToMat (Int64): Dias úteis entre referência e vencimento.
26
- - AvgMaturity (Float64): Prazo médio do título em anos.
27
- - Price (Float64): Preço unitário (PU).
28
- - BidRate (Float64): Taxa de compra (decimal).
29
- - AskRate (Float64): Taxa de venda (decimal).
30
- - IndicativeRate (Float64): Taxa indicativa (decimal).
31
- - DIRate (Float64): Taxa DI interpolada (flat forward).
32
- - Premium (Float64): Rentabilidade da LFT sobre o DI.
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 = anbima.tpf(date, "LFT")
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
- BDToMat=bday.count_expr("ReferenceDate", "MaturityDate"),
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
- AvgMaturity=pl.col("BDToMat") / 252,
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
- Premium=pl.struct("IndicativeRate", "DIRate").map_elements(
57
- lambda s: premium(s["IndicativeRate"], s["DIRate"]),
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
- "ReferenceDate",
64
- "BondType",
65
- "SelicCode",
66
- "IssueBaseDate",
67
- "MaturityDate",
68
- "BDToMat",
69
- "AvgMaturity",
70
- "Price",
71
- "BidRate",
72
- "AskRate",
73
- "IndicativeRate",
74
- "DIRate",
75
- "Premium",
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: 'MaturityDate' [date]
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)["MaturityDate"]
106
+ return data(date)["data_vencimento"]
109
107
 
110
108
 
111
109
  def quotation(