pyield 0.52.1__tar.gz → 0.53.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. {pyield-0.52.1 → pyield-0.53.0}/PKG-INFO +4 -4
  2. {pyield-0.52.1 → pyield-0.53.0}/README.md +3 -3
  3. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/converters.py +3 -2
  4. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/types.py +2 -2
  5. {pyield-0.52.1 → pyield-0.53.0}/pyield/b3/boletim.py +1 -0
  6. {pyield-0.52.1 → pyield-0.53.0}/pyield/b3/derivativos_intradia.py +7 -0
  7. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/__init__.py +2 -4
  8. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/ntnb.py +12 -12
  9. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/ntnf.py +55 -19
  10. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/leiloes.py +11 -0
  11. pyield-0.53.0/pyield/tpf/secundario.py +410 -0
  12. {pyield-0.52.1 → pyield-0.53.0}/pyproject.toml +1 -2
  13. pyield-0.52.1/pyield/bc/tpf_intradia.py +0 -148
  14. pyield-0.52.1/pyield/bc/tpf_mensal.py +0 -146
  15. {pyield-0.52.1 → pyield-0.53.0}/LICENSE +0 -0
  16. {pyield-0.52.1 → pyield-0.53.0}/pyield/__init__.py +0 -0
  17. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/__init__.py +0 -0
  18. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/br_numbers.py +0 -0
  19. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/cache.py +0 -0
  20. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/data_cache.py +0 -0
  21. {pyield-0.52.1 → pyield-0.53.0}/pyield/_internal/retry.py +0 -0
  22. {pyield-0.52.1 → pyield-0.53.0}/pyield/anbima/__init__.py +0 -0
  23. {pyield-0.52.1 → pyield-0.53.0}/pyield/anbima/imaq.py +0 -0
  24. {pyield-0.52.1 → pyield-0.53.0}/pyield/anbima/mercado_secundario.py +0 -0
  25. {pyield-0.52.1 → pyield-0.53.0}/pyield/b3/__init__.py +0 -0
  26. {pyield-0.52.1 → pyield-0.53.0}/pyield/b3/_contratos.py +0 -0
  27. {pyield-0.52.1 → pyield-0.53.0}/pyield/b3/_validar_pregao.py +0 -0
  28. {pyield-0.52.1 → pyield-0.53.0}/pyield/b3/di_over.py +0 -0
  29. {pyield-0.52.1 → pyield-0.53.0}/pyield/bc/__init__.py +0 -0
  30. {pyield-0.52.1 → pyield-0.53.0}/pyield/bc/_olinda.py +0 -0
  31. {pyield-0.52.1 → pyield-0.53.0}/pyield/bc/leiloes.py +0 -0
  32. {pyield-0.52.1 → pyield-0.53.0}/pyield/bc/lft.py +0 -0
  33. {pyield-0.52.1 → pyield-0.53.0}/pyield/bc/sgs.py +0 -0
  34. {pyield-0.52.1 → pyield-0.53.0}/pyield/du/__init__.py +0 -0
  35. {pyield-0.52.1 → pyield-0.53.0}/pyield/du/core.py +0 -0
  36. {pyield-0.52.1 → pyield-0.53.0}/pyield/du/feriados/__init__.py +0 -0
  37. {pyield-0.52.1 → pyield-0.53.0}/pyield/du/feriados/feriados_antigos_br.txt +0 -0
  38. {pyield-0.52.1 → pyield-0.53.0}/pyield/du/feriados/feriados_br.py +0 -0
  39. {pyield-0.52.1 → pyield-0.53.0}/pyield/du/feriados/feriados_novos_br.txt +0 -0
  40. {pyield-0.52.1 → pyield-0.53.0}/pyield/futuro/__init__.py +0 -0
  41. {pyield-0.52.1 → pyield-0.53.0}/pyield/futuro/contratos.py +0 -0
  42. {pyield-0.52.1 → pyield-0.53.0}/pyield/futuro/di1.py +0 -0
  43. {pyield-0.52.1 → pyield-0.53.0}/pyield/futuro/historico.py +0 -0
  44. {pyield-0.52.1 → pyield-0.53.0}/pyield/futuro/intradia.py +0 -0
  45. {pyield-0.52.1 → pyield-0.53.0}/pyield/fwd.py +0 -0
  46. {pyield-0.52.1 → pyield-0.53.0}/pyield/interpolador.py +0 -0
  47. {pyield-0.52.1 → pyield-0.53.0}/pyield/ipca/__init__.py +0 -0
  48. {pyield-0.52.1 → pyield-0.53.0}/pyield/ipca/historico.py +0 -0
  49. {pyield-0.52.1 → pyield-0.53.0}/pyield/ipca/projetado.py +0 -0
  50. {pyield-0.52.1 → pyield-0.53.0}/pyield/py.typed +0 -0
  51. {pyield-0.52.1 → pyield-0.53.0}/pyield/relogio.py +0 -0
  52. {pyield-0.52.1 → pyield-0.53.0}/pyield/selic/__init__.py +0 -0
  53. {pyield-0.52.1 → pyield-0.53.0}/pyield/selic/compromissada.py +0 -0
  54. {pyield-0.52.1 → pyield-0.53.0}/pyield/selic/copom.py +0 -0
  55. {pyield-0.52.1 → pyield-0.53.0}/pyield/selic/cpm.py +0 -0
  56. {pyield-0.52.1 → pyield-0.53.0}/pyield/selic/probabilities.py +0 -0
  57. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/__init__.py +0 -0
  58. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/lft.py +0 -0
  59. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/ltn.py +0 -0
  60. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/ntnb1.py +0 -0
  61. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/ntnbprinc.py +0 -0
  62. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/_titulos/ntnc.py +0 -0
  63. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/benchmark.py +0 -0
  64. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/pre.py +0 -0
  65. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/rmd/__init__.py +0 -0
  66. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/rmd/_aba_1_3.py +0 -0
  67. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/rmd/_aba_2_1.py +0 -0
  68. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/rmd/_common.py +0 -0
  69. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/rmd/_download.py +0 -0
  70. {pyield-0.52.1 → pyield-0.53.0}/pyield/tpf/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyield
3
- Version: 0.52.1
3
+ Version: 0.53.0
4
4
  Summary: Polars-powered toolkit for Brazilian fixed income analysis
5
5
  Keywords: fixed-income,brazil,finance,analysis,bonds
6
6
  Author: Carlos Carvalho
@@ -113,14 +113,14 @@ documentação.
113
113
  | `yd.forwards(...)` | função | Curva de taxas a termo | |
114
114
  | `yd.futuro` | módulo | Contratos futuros da B3 | `di1`, `historico`, `intradia`, `datas_disponiveis`, `vencimento`, `enriquecer`, `vencimento_expr` |
115
115
  | `yd.di1` | módulo | Curva DI1 e interpolação | `dados`, `interpolar_taxas`, `interpolar_taxa`, `datas_disponiveis` |
116
- | `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premio_pre`, `rmd`, `secundario_mensal`, `secundario_intradia` |
116
+ | `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premio_pre`, `rmd`, `secundario` |
117
117
  | `yd.lft` | módulo | LFT | `dados`, `vencimentos`, `cotacao`, `pu`, `taxa`, `vna`, `rentabilidade`, `rentabilidade_expr` |
118
118
  | `yd.ltn` | módulo | LTN | `dados`, `vencimentos`, `pu`, `taxa`, `duration_expr`, `dv01`, `dv01_expr`, `rentabilidade`, `rentabilidade_expr`, `taxas_forward` |
119
119
  | `yd.ntnb` | módulo | NTN-B | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `taxas_zero`, `duration`, `duration_expr`, `dv01`, `dv01_expr`, `implicitas`, `curva` |
120
120
  | `yd.ntnb1` | módulo | NTN-B1 | `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `duration`, `dv01` |
121
121
  | `yd.ntnbprinc` | módulo | NTN-B Principal | `pu`, `dv01` |
122
122
  | `yd.ntnc` | módulo | NTN-C | `dados`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
123
- | `yd.ntnf` | módulo | NTN-F | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `pu`, `taxa`, `taxas_zero`, `premio`, `premio_limpo`, `rentabilidade`, `rentabilidade_expr`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
123
+ | `yd.ntnf` | módulo | NTN-F | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `pu`, `taxa`, `taxas_zero`, `premio`, `premio_limpo`, `premio_limpo_expr`, `rentabilidade`, `rentabilidade_expr`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
124
124
  | `yd.selic` | módulo | Selic, COPOM e política monetária | `over`, `over_serie`, `meta`, `meta_serie`, `compromissadas`, `copom`, `cpm`, `probabilities` |
125
125
  | `yd.ipca` | módulo | IPCA histórico e projetado | `indice`, `indices`, `indices_ultimos`, `taxa`, `taxas`, `taxas_ultimas`, `taxa_projetada` |
126
126
  | `yd.ptax(data)` | função | PTAX para uma data | |
@@ -305,7 +305,7 @@ fonte indisponível) retornam DataFrame vazio ou `nan`, sem lançar exceção:
305
305
  import pyield as yd
306
306
 
307
307
  yd.futuro.historico("01-01-2030", "DI1").is_empty() # -> True
308
- yd.tpf.secundario_mensal("01-01-2030").is_empty() # -> True
308
+ yd.tpf.secundario.mensal("01-01-2030").is_empty() # -> True
309
309
  yd.ptax("25-12-2025") # -> nan
310
310
  ```
311
311
 
@@ -69,14 +69,14 @@ documentação.
69
69
  | `yd.forwards(...)` | função | Curva de taxas a termo | |
70
70
  | `yd.futuro` | módulo | Contratos futuros da B3 | `di1`, `historico`, `intradia`, `datas_disponiveis`, `vencimento`, `enriquecer`, `vencimento_expr` |
71
71
  | `yd.di1` | módulo | Curva DI1 e interpolação | `dados`, `interpolar_taxas`, `interpolar_taxa`, `datas_disponiveis` |
72
- | `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premio_pre`, `rmd`, `secundario_mensal`, `secundario_intradia` |
72
+ | `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premio_pre`, `rmd`, `secundario` |
73
73
  | `yd.lft` | módulo | LFT | `dados`, `vencimentos`, `cotacao`, `pu`, `taxa`, `vna`, `rentabilidade`, `rentabilidade_expr` |
74
74
  | `yd.ltn` | módulo | LTN | `dados`, `vencimentos`, `pu`, `taxa`, `duration_expr`, `dv01`, `dv01_expr`, `rentabilidade`, `rentabilidade_expr`, `taxas_forward` |
75
75
  | `yd.ntnb` | módulo | NTN-B | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `taxas_zero`, `duration`, `duration_expr`, `dv01`, `dv01_expr`, `implicitas`, `curva` |
76
76
  | `yd.ntnb1` | módulo | NTN-B1 | `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `duration`, `dv01` |
77
77
  | `yd.ntnbprinc` | módulo | NTN-B Principal | `pu`, `dv01` |
78
78
  | `yd.ntnc` | módulo | NTN-C | `dados`, `datas_pagamento`, `fluxos_caixa`, `cotacao`, `pu`, `taxa`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
79
- | `yd.ntnf` | módulo | NTN-F | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `pu`, `taxa`, `taxas_zero`, `premio`, `premio_limpo`, `rentabilidade`, `rentabilidade_expr`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
79
+ | `yd.ntnf` | módulo | NTN-F | `dados`, `vencimentos`, `datas_pagamento`, `fluxos_caixa`, `pu`, `taxa`, `taxas_zero`, `premio`, `premio_limpo`, `premio_limpo_expr`, `rentabilidade`, `rentabilidade_expr`, `duration`, `duration_expr`, `dv01`, `dv01_expr` |
80
80
  | `yd.selic` | módulo | Selic, COPOM e política monetária | `over`, `over_serie`, `meta`, `meta_serie`, `compromissadas`, `copom`, `cpm`, `probabilities` |
81
81
  | `yd.ipca` | módulo | IPCA histórico e projetado | `indice`, `indices`, `indices_ultimos`, `taxa`, `taxas`, `taxas_ultimas`, `taxa_projetada` |
82
82
  | `yd.ptax(data)` | função | PTAX para uma data | |
@@ -261,7 +261,7 @@ fonte indisponível) retornam DataFrame vazio ou `nan`, sem lançar exceção:
261
261
  import pyield as yd
262
262
 
263
263
  yd.futuro.historico("01-01-2030", "DI1").is_empty() # -> True
264
- yd.tpf.secundario_mensal("01-01-2030").is_empty() # -> True
264
+ yd.tpf.secundario.mensal("01-01-2030").is_empty() # -> True
265
265
  yd.ptax("25-12-2025") # -> nan
266
266
  ```
267
267
 
@@ -52,14 +52,15 @@ def converter_datas_expr(expr: pl.Expr | str) -> pl.Expr:
52
52
  expr = pl.col(expr)
53
53
 
54
54
  # Fallback por linha: o primeiro valor não-nulo vence.
55
- # Se o elemento for Date, o cast resolve no 1o termo.
55
+ # Datas e datetimes Python chegam ao Polars como strings ISO.
56
56
  # Se o elemento for null, ele permanece null em todos os termos.
57
57
  expr_str = expr.cast(pl.String, strict=False).str.strip_chars()
58
58
  return pl.coalesce(
59
- expr.cast(pl.Date, strict=False),
60
59
  expr_str.str.to_date(format="%d-%m-%Y", strict=False),
61
60
  expr_str.str.to_date(format="%d/%m/%Y", strict=False),
62
61
  expr_str.str.to_date(format="%Y-%m-%d", strict=False),
62
+ expr_str.str.to_date(format="%Y-%m-%d %H:%M:%S", strict=False),
63
+ expr_str.str.to_date(format="%Y-%m-%d %H:%M:%S%.f", strict=False),
63
64
  )
64
65
 
65
66
 
@@ -1,13 +1,13 @@
1
1
  import datetime as dt
2
2
  import math
3
- from collections.abc import Sequence, Sized
3
+ from collections.abc import Sized
4
4
  from typing import Any, TypeAlias, TypeGuard
5
5
 
6
6
  import polars as pl
7
7
 
8
8
  DateLike: TypeAlias = str | dt.datetime | dt.date
9
9
  ArrayLike: TypeAlias = list[Any] | tuple[Any, ...] | pl.Series
10
- DatesLike: TypeAlias = Sequence[DateLike] | pl.Series
10
+ DatesLike: TypeAlias = list[DateLike] | tuple[DateLike, ...] | pl.Series
11
11
 
12
12
 
13
13
  def _is_empty(arg: Any) -> bool:
@@ -298,6 +298,7 @@ def _converter_para_df(registros: list[dict]) -> pl.DataFrame:
298
298
  # (pl.DataFrame infere colunas de ~50 primeiras linhas por padrão.)
299
299
  schema_str = {nome: pl.String for nome in SCHEMA_PRICE_REPORT}
300
300
  df = pl.DataFrame(registros, schema=schema_str)
301
+ df = df.with_columns(TradDt=pl.col("TradDt").str.to_date("%Y-%m-%d"))
301
302
  return df.cast(SCHEMA_PRICE_REPORT, strict=False)
302
303
 
303
304
 
@@ -103,8 +103,15 @@ def _converter_json_intradia(dados_json: list[dict]) -> pl.DataFrame:
103
103
  def _processar_colunas_intradia(df: pl.DataFrame) -> pl.DataFrame:
104
104
  colunas_disponiveis = [col for col in MAPEAMENTO if col in df.columns]
105
105
  tipos_disponiveis = pl.Schema({col: TIPOS[col] for col in colunas_disponiveis})
106
+ coluna_vencimento = "asset.AsstSummry.mtrtyCode"
107
+ exprs_data = []
108
+ if coluna_vencimento in colunas_disponiveis:
109
+ exprs_data.append(
110
+ pl.col(coluna_vencimento).str.to_date("%Y-%m-%d", strict=False)
111
+ )
106
112
  return (
107
113
  df.select(colunas_disponiveis)
114
+ .with_columns(exprs_data)
108
115
  .cast(tipos_disponiveis, strict=False)
109
116
  .rename(MAPEAMENTO, strict=False)
110
117
  )
@@ -2,8 +2,7 @@
2
2
 
3
3
  from pyield.anbima.imaq import estoque
4
4
  from pyield.anbima.mercado_secundario import TipoTPF, taxas, vencimentos
5
- from pyield.bc.tpf_intradia import secundario_intradia
6
- from pyield.bc.tpf_mensal import secundario_mensal
5
+ from pyield.tpf import secundario
7
6
  from pyield.tpf._titulos import lft, ltn, ntnb, ntnb1, ntnbprinc, ntnc, ntnf
8
7
  from pyield.tpf.benchmark import benchmarks
9
8
  from pyield.tpf.leiloes import leiloes
@@ -26,8 +25,7 @@ __all__ = [
26
25
  "ntnf",
27
26
  "premio_pre",
28
27
  "rmd",
29
- "secundario_intradia",
30
- "secundario_mensal",
28
+ "secundario",
31
29
  "taxas",
32
30
  "vencimentos",
33
31
  ]
@@ -5,7 +5,7 @@ import polars as pl
5
5
 
6
6
  import pyield._internal.converters as conversores
7
7
  from pyield import du, fwd, interpolador
8
- from pyield._internal.types import ArrayLike, DateLike, any_is_empty
8
+ from pyield._internal.types import ArrayLike, DateLike, DatesLike, any_is_empty
9
9
  from pyield.tpf import utils
10
10
 
11
11
  """
@@ -367,7 +367,7 @@ def pu(
367
367
 
368
368
  def _validar_entradas_taxas_zero(
369
369
  data_liquidacao: DateLike,
370
- vencimentos: ArrayLike,
370
+ vencimentos: DatesLike,
371
371
  taxas: ArrayLike,
372
372
  ) -> tuple[dt.date, pl.Series, pl.Series]:
373
373
  # Processa e valida os dados de entrada
@@ -459,7 +459,7 @@ def _calcular_valor_presente_cupons(
459
459
 
460
460
  def taxas_zero(
461
461
  data_liquidacao: DateLike,
462
- vencimentos: ArrayLike,
462
+ vencimentos: DatesLike,
463
463
  taxas: ArrayLike,
464
464
  incluir_cupons: bool = False,
465
465
  ) -> pl.DataFrame:
@@ -471,7 +471,7 @@ def taxas_zero(
471
471
 
472
472
  Args:
473
473
  data_liquidacao (DateLike): Data de liquidação.
474
- vencimentos (ArrayLike): Datas de vencimento dos títulos.
474
+ vencimentos (DatesLike): Datas de vencimento dos títulos.
475
475
  taxas (ArrayLike): TIRs correspondentes.
476
476
  incluir_cupons (bool, optional): Se True, inclui datas intermediárias de cupom.
477
477
  Padrão False.
@@ -586,9 +586,9 @@ def taxas_zero(
586
586
 
587
587
  def implicitas( # noqa: PLR0913
588
588
  data_liquidacao: DateLike,
589
- vencimentos_tir: ArrayLike,
589
+ vencimentos_tir: DatesLike,
590
590
  taxas_tir: ArrayLike,
591
- vencimentos_nominais: ArrayLike,
591
+ vencimentos_nominais: DatesLike,
592
592
  taxas_nominais: ArrayLike,
593
593
  *,
594
594
  extrapolar: bool = False,
@@ -601,12 +601,12 @@ def implicitas( # noqa: PLR0913
601
601
 
602
602
  Args:
603
603
  data_liquidacao (DateLike): Data de liquidação da operação.
604
- vencimentos_tir (ArrayLike): Vencimentos das NTN-B usadas como vértices
604
+ vencimentos_tir (DatesLike): Vencimentos das NTN-B usadas como vértices
605
605
  da curva de TIR real.
606
606
  taxas_tir (ArrayLike): TIRs reais observadas das NTN-B correspondentes
607
607
  aos vencimentos informados. A função calcula a curva zero real a
608
608
  partir dessas taxas.
609
- vencimentos_nominais (ArrayLike): Vencimentos da curva nominal de
609
+ vencimentos_nominais (DatesLike): Vencimentos da curva nominal de
610
610
  referência.
611
611
  taxas_nominais (ArrayLike): Taxas da curva nominal de referência. Pode
612
612
  representar DI Futuro, curva soberana prefixada ou outra curva
@@ -709,9 +709,9 @@ def implicitas( # noqa: PLR0913
709
709
 
710
710
  def curva( # noqa: PLR0913
711
711
  data_liquidacao: DateLike,
712
- vencimentos_tir: ArrayLike,
712
+ vencimentos_tir: DatesLike,
713
713
  taxas_tir: ArrayLike,
714
- vencimentos_nominais: ArrayLike,
714
+ vencimentos_nominais: DatesLike,
715
715
  taxas_nominais: ArrayLike,
716
716
  *,
717
717
  extrapolar: bool = False,
@@ -725,12 +725,12 @@ def curva( # noqa: PLR0913
725
725
 
726
726
  Args:
727
727
  data_liquidacao (DateLike): Data de liquidação da operação.
728
- vencimentos_tir (ArrayLike): Vencimentos das NTN-B usadas como vértices
728
+ vencimentos_tir (DatesLike): Vencimentos das NTN-B usadas como vértices
729
729
  da curva de TIR real.
730
730
  taxas_tir (ArrayLike): TIRs reais observadas das NTN-B correspondentes
731
731
  aos vencimentos informados. A função calcula a curva zero real a
732
732
  partir dessas taxas.
733
- vencimentos_nominais (ArrayLike): Vencimentos da curva nominal de
733
+ vencimentos_nominais (DatesLike): Vencimentos da curva nominal de
734
734
  referência.
735
735
  taxas_nominais (ArrayLike): Taxas da curva nominal de referência. Pode
736
736
  representar DI Futuro, curva soberana prefixada ou outra curva
@@ -7,7 +7,7 @@ import polars as pl
7
7
  import pyield._internal.converters as cv
8
8
  import pyield.interpolador as ip
9
9
  from pyield import du
10
- from pyield._internal.types import ArrayLike, DateLike, any_is_empty
10
+ from pyield._internal.types import ArrayLike, DateLike, DatesLike, any_is_empty
11
11
  from pyield.futuro import di1
12
12
  from pyield.tpf import utils
13
13
 
@@ -96,15 +96,12 @@ def dados(data: DateLike) -> pl.DataFrame:
96
96
  # Calcula prêmios e rentabilidade para cada vencimento
97
97
  df = df.with_columns(
98
98
  premio=pl.col("taxa_indicativa") - pl.col("taxa_di"),
99
- premio_limpo=pl.struct("data_vencimento", "taxa_indicativa").map_elements(
100
- lambda row: premio_limpo(
101
- data_liquidacao=data,
102
- data_vencimento=row["data_vencimento"],
103
- taxa_ntnf=row["taxa_indicativa"],
104
- vencimentos_di=df_di["data_vencimento"],
105
- taxas_di=df_di["taxa_ajuste"],
106
- ),
107
- return_dtype=pl.Float64,
99
+ premio_limpo=premio_limpo_expr(
100
+ data_liquidacao=data,
101
+ data_vencimento="data_vencimento",
102
+ taxa_ntnf="taxa_indicativa",
103
+ vencimentos_di=df_di["data_vencimento"],
104
+ taxas_di=df_di["taxa_ajuste"],
108
105
  ),
109
106
  rentabilidade=rentabilidade_expr(
110
107
  data_liquidacao=data,
@@ -343,9 +340,9 @@ def pu(
343
340
 
344
341
  def taxas_zero( # noqa
345
342
  data_liquidacao: DateLike,
346
- vencimentos_ltn: ArrayLike,
343
+ vencimentos_ltn: DatesLike,
347
344
  taxas_ltn: ArrayLike,
348
- vencimentos_ntnf: ArrayLike,
345
+ vencimentos_ntnf: DatesLike,
349
346
  taxas_ntnf: ArrayLike,
350
347
  incluir_cupons: bool = False,
351
348
  ) -> pl.DataFrame:
@@ -360,11 +357,11 @@ def taxas_zero( # noqa
360
357
 
361
358
  Args:
362
359
  data_liquidacao (DateLike): Data de liquidação para o cálculo.
363
- vencimentos_ltn (ArrayLike): Datas de vencimento das LTNs usadas como
360
+ vencimentos_ltn (DatesLike): Datas de vencimento das LTNs usadas como
364
361
  vértices prefixados zero cupom.
365
362
  taxas_ltn (ArrayLike): Taxas das LTNs. Como a LTN é zero cupom, essas
366
363
  taxas são usadas diretamente como taxas zero no bootstrap.
367
- vencimentos_ntnf (ArrayLike): Datas de vencimento das NTN-F usadas no
364
+ vencimentos_ntnf (DatesLike): Datas de vencimento das NTN-F usadas no
368
365
  bootstrap.
369
366
  taxas_ntnf (ArrayLike): TIRs das NTN-F correspondentes aos vencimentos
370
367
  informados.
@@ -524,7 +521,7 @@ def rentabilidade( # noqa
524
521
  data_liquidacao: DateLike,
525
522
  data_vencimento: DateLike,
526
523
  taxa_ntnf: float,
527
- vencimentos_di: ArrayLike,
524
+ vencimentos_di: DatesLike,
528
525
  taxas_di: ArrayLike,
529
526
  ) -> float:
530
527
  """
@@ -539,7 +536,7 @@ def rentabilidade( # noqa
539
536
  data_liquidacao (DateLike): Data de liquidação para o cálculo.
540
537
  data_vencimento (DateLike): Data de vencimento da NTN-F.
541
538
  taxa_ntnf (float): TIR da NTN-F.
542
- vencimentos_di (ArrayLike): Datas de vencimento da curva DI.
539
+ vencimentos_di (DatesLike): Datas de vencimento da curva DI.
543
540
  taxas_di (ArrayLike): Taxas DI correspondentes aos vencimentos.
544
541
 
545
542
  Returns:
@@ -629,7 +626,7 @@ def rentabilidade_expr(
629
626
  data_liquidacao: DateLike,
630
627
  data_vencimento: pl.Expr | str,
631
628
  taxa_ntnf: pl.Expr | str,
632
- vencimentos_di: ArrayLike,
629
+ vencimentos_di: DatesLike,
633
630
  taxas_di: ArrayLike,
634
631
  ) -> pl.Expr:
635
632
  """Cria expressão Polars para a rentabilidade da NTN-F sobre a curva DI.
@@ -717,7 +714,7 @@ def premio_limpo( # noqa
717
714
  data_liquidacao: DateLike,
718
715
  data_vencimento: DateLike,
719
716
  taxa_ntnf: float,
720
- vencimentos_di: ArrayLike,
717
+ vencimentos_di: DatesLike,
721
718
  taxas_di: ArrayLike,
722
719
  ) -> float:
723
720
  """
@@ -731,7 +728,7 @@ def premio_limpo( # noqa
731
728
  data_liquidacao (DateLike): Data de liquidação para o cálculo.
732
729
  data_vencimento (DateLike): Data de vencimento do título.
733
730
  taxa_ntnf (float): TIR do título.
734
- vencimentos_di (ArrayLike): Vencimentos da curva DI.
731
+ vencimentos_di (DatesLike): Vencimentos da curva DI.
735
732
  taxas_di (ArrayLike): Série de taxas DI.
736
733
 
737
734
  Returns:
@@ -796,6 +793,45 @@ def premio_limpo( # noqa
796
793
  return utils.encontrar_raiz(diferenca_preco)
797
794
 
798
795
 
796
+ def premio_limpo_expr(
797
+ data_liquidacao: DateLike,
798
+ data_vencimento: pl.Expr | str,
799
+ taxa_ntnf: pl.Expr | str,
800
+ vencimentos_di: DatesLike,
801
+ taxas_di: ArrayLike,
802
+ ) -> pl.Expr:
803
+ """Cria expressão Polars para o prêmio limpo da NTN-F sobre a curva DI.
804
+
805
+ O cálculo é aplicado linha a linha porque o prêmio limpo depende dos fluxos
806
+ de caixa do título, da interpolação da curva DI e da resolução de raiz.
807
+
808
+ Args:
809
+ data_liquidacao: Data de liquidação para o cálculo.
810
+ data_vencimento: Nome de coluna ou expressão Polars com a data de
811
+ vencimento da NTN-F.
812
+ taxa_ntnf: Nome de coluna ou expressão Polars com a TIR da NTN-F.
813
+ vencimentos_di: Datas de vencimento da curva DI.
814
+ taxas_di: Taxas DI correspondentes aos vencimentos.
815
+
816
+ Returns:
817
+ pl.Expr: Expressão sem alias com o prêmio limpo da NTN-F sobre a curva
818
+ DI.
819
+ """
820
+ return pl.struct(
821
+ utils.coluna_ou_expr(data_vencimento, "data_vencimento"),
822
+ utils.coluna_ou_expr(taxa_ntnf, "taxa_ntnf"),
823
+ ).map_elements(
824
+ lambda row: premio_limpo(
825
+ data_liquidacao=data_liquidacao,
826
+ data_vencimento=row["data_vencimento"],
827
+ taxa_ntnf=row["taxa_ntnf"],
828
+ vencimentos_di=vencimentos_di,
829
+ taxas_di=taxas_di,
830
+ ),
831
+ return_dtype=pl.Float64,
832
+ )
833
+
834
+
799
835
  def duration(
800
836
  data_liquidacao: DateLike,
801
837
  data_vencimento: DateLike,
@@ -24,6 +24,7 @@ DEFINICOES_COLUNAS = [
24
24
  ("liquidacao_segunda_volta", "data_liquidacao_2v", pl.String),
25
25
  ("numero_edital", "numero_edital", pl.Int64),
26
26
  ("tipo_leilao", "tipo_leilao", pl.String),
27
+ ("tipo_ocorrencia", "tipo_ocorrencia", pl.String),
27
28
  ("titulo", "titulo", pl.String),
28
29
  ("benchmark", "benchmark", pl.String),
29
30
  ("vencimento", "data_vencimento", pl.String),
@@ -31,6 +32,8 @@ DEFINICOES_COLUNAS = [
31
32
  ("quantidade_aceita", "quantidade_aceita_1v", pl.Int64),
32
33
  ("oferta_segunda_volta", "quantidade_ofertada_2v", pl.Int64),
33
34
  ("quantidade_aceita_segunda_volta", "quantidade_aceita_2v", pl.Int64),
35
+ ("quantidade_liquidada", "quantidade_liquidada_1v", pl.Int64),
36
+ ("quantidade_liquidada_segunda_volta", "quantidade_liquidada_2v", pl.Int64),
34
37
  ("financeiro_aceito", "financeiro_aceito_1v", pl.Float64),
35
38
  ("financeiro_aceito_segunda_volta", "financeiro_aceito_2v", pl.Float64),
36
39
  ("quantidade_bcb", "quantidade_bcb", pl.Int64),
@@ -50,6 +53,7 @@ ORDEM_FINAL_COLUNAS = [
50
53
  "data_liquidacao_2v",
51
54
  "numero_edital",
52
55
  "tipo_leilao",
56
+ "tipo_ocorrencia",
53
57
  "titulo",
54
58
  "benchmark",
55
59
  "data_vencimento",
@@ -62,6 +66,8 @@ ORDEM_FINAL_COLUNAS = [
62
66
  "quantidade_aceita_1v",
63
67
  "quantidade_aceita_2v",
64
68
  "quantidade_aceita_total",
69
+ "quantidade_liquidada_1v",
70
+ "quantidade_liquidada_2v",
65
71
  "financeiro_ofertado_1v",
66
72
  "financeiro_ofertado_2v",
67
73
  "financeiro_ofertado_total",
@@ -155,7 +161,9 @@ def _transformar_dados_brutos(dados_brutos: list[dict]) -> pl.DataFrame:
155
161
  "liquidacao_segunda_volta": pl.String,
156
162
  "oferta_segunda_volta": pl.Int64,
157
163
  "financeiro_aceito_segunda_volta": pl.Float64,
164
+ "tipo_ocorrencia": pl.String,
158
165
  "quantidade_liquidada": pl.Int64,
166
+ "quantidade_liquidada_segunda_volta": pl.Int64,
159
167
  "quantidade_aceita_segunda_volta": pl.Int64,
160
168
  }
161
169
 
@@ -371,6 +379,7 @@ def leiloes(
371
379
  * data_liquidacao_2v (Date): data de liquidação financeira da 2ª volta.
372
380
  * numero_edital (Int64): número do edital do leilão.
373
381
  * tipo_leilao (String): tipo da operação.
382
+ * tipo_ocorrencia (String): classificação da ocorrência do leilão.
374
383
  * titulo (String): código do título público leiloado.
375
384
  * benchmark (String): descrição de referência do título.
376
385
  * data_vencimento (Date): data de vencimento do título.
@@ -383,6 +392,8 @@ def leiloes(
383
392
  * quantidade_aceita_1v (Int64): quantidade aceita na 1ª volta.
384
393
  * quantidade_aceita_2v (Int64): quantidade aceita na 2ª volta.
385
394
  * quantidade_aceita_total (Int64): quantidade aceita total.
395
+ * quantidade_liquidada_1v (Int64): quantidade liquidada na 1ª volta.
396
+ * quantidade_liquidada_2v (Int64): quantidade liquidada na 2ª volta.
386
397
  * financeiro_ofertado_1v (Float64): financeiro ofertado na 1ª volta.
387
398
  * financeiro_ofertado_2v (Float64): financeiro ofertado na 2ª volta.
388
399
  * financeiro_ofertado_total (Float64): financeiro ofertado total.