pyield 0.52.0__tar.gz → 0.52.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 (69) hide show
  1. {pyield-0.52.0 → pyield-0.52.2}/PKG-INFO +7 -3
  2. {pyield-0.52.0 → pyield-0.52.2}/README.md +6 -2
  3. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/types.py +2 -2
  4. {pyield-0.52.0 → pyield-0.52.2}/pyield/interpolador.py +7 -5
  5. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/lft.py +23 -4
  6. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/ntnb.py +12 -12
  7. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/ntnf.py +55 -19
  8. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/leiloes.py +11 -0
  9. {pyield-0.52.0 → pyield-0.52.2}/pyproject.toml +1 -1
  10. {pyield-0.52.0 → pyield-0.52.2}/LICENSE +0 -0
  11. {pyield-0.52.0 → pyield-0.52.2}/pyield/__init__.py +0 -0
  12. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/__init__.py +0 -0
  13. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/br_numbers.py +0 -0
  14. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/cache.py +0 -0
  15. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/converters.py +0 -0
  16. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/data_cache.py +0 -0
  17. {pyield-0.52.0 → pyield-0.52.2}/pyield/_internal/retry.py +0 -0
  18. {pyield-0.52.0 → pyield-0.52.2}/pyield/anbima/__init__.py +0 -0
  19. {pyield-0.52.0 → pyield-0.52.2}/pyield/anbima/imaq.py +0 -0
  20. {pyield-0.52.0 → pyield-0.52.2}/pyield/anbima/mercado_secundario.py +0 -0
  21. {pyield-0.52.0 → pyield-0.52.2}/pyield/b3/__init__.py +0 -0
  22. {pyield-0.52.0 → pyield-0.52.2}/pyield/b3/_contratos.py +0 -0
  23. {pyield-0.52.0 → pyield-0.52.2}/pyield/b3/_validar_pregao.py +0 -0
  24. {pyield-0.52.0 → pyield-0.52.2}/pyield/b3/boletim.py +0 -0
  25. {pyield-0.52.0 → pyield-0.52.2}/pyield/b3/derivativos_intradia.py +0 -0
  26. {pyield-0.52.0 → pyield-0.52.2}/pyield/b3/di_over.py +0 -0
  27. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/__init__.py +0 -0
  28. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/_olinda.py +0 -0
  29. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/leiloes.py +0 -0
  30. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/lft.py +0 -0
  31. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/sgs.py +0 -0
  32. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/tpf_intradia.py +0 -0
  33. {pyield-0.52.0 → pyield-0.52.2}/pyield/bc/tpf_mensal.py +0 -0
  34. {pyield-0.52.0 → pyield-0.52.2}/pyield/du/__init__.py +0 -0
  35. {pyield-0.52.0 → pyield-0.52.2}/pyield/du/core.py +0 -0
  36. {pyield-0.52.0 → pyield-0.52.2}/pyield/du/feriados/__init__.py +0 -0
  37. {pyield-0.52.0 → pyield-0.52.2}/pyield/du/feriados/feriados_antigos_br.txt +0 -0
  38. {pyield-0.52.0 → pyield-0.52.2}/pyield/du/feriados/feriados_br.py +0 -0
  39. {pyield-0.52.0 → pyield-0.52.2}/pyield/du/feriados/feriados_novos_br.txt +0 -0
  40. {pyield-0.52.0 → pyield-0.52.2}/pyield/futuro/__init__.py +0 -0
  41. {pyield-0.52.0 → pyield-0.52.2}/pyield/futuro/contratos.py +0 -0
  42. {pyield-0.52.0 → pyield-0.52.2}/pyield/futuro/di1.py +0 -0
  43. {pyield-0.52.0 → pyield-0.52.2}/pyield/futuro/historico.py +0 -0
  44. {pyield-0.52.0 → pyield-0.52.2}/pyield/futuro/intradia.py +0 -0
  45. {pyield-0.52.0 → pyield-0.52.2}/pyield/fwd.py +0 -0
  46. {pyield-0.52.0 → pyield-0.52.2}/pyield/ipca/__init__.py +0 -0
  47. {pyield-0.52.0 → pyield-0.52.2}/pyield/ipca/historico.py +0 -0
  48. {pyield-0.52.0 → pyield-0.52.2}/pyield/ipca/projetado.py +0 -0
  49. {pyield-0.52.0 → pyield-0.52.2}/pyield/py.typed +0 -0
  50. {pyield-0.52.0 → pyield-0.52.2}/pyield/relogio.py +0 -0
  51. {pyield-0.52.0 → pyield-0.52.2}/pyield/selic/__init__.py +0 -0
  52. {pyield-0.52.0 → pyield-0.52.2}/pyield/selic/compromissada.py +0 -0
  53. {pyield-0.52.0 → pyield-0.52.2}/pyield/selic/copom.py +0 -0
  54. {pyield-0.52.0 → pyield-0.52.2}/pyield/selic/cpm.py +0 -0
  55. {pyield-0.52.0 → pyield-0.52.2}/pyield/selic/probabilities.py +0 -0
  56. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/__init__.py +0 -0
  57. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/__init__.py +0 -0
  58. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/ltn.py +0 -0
  59. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/ntnb1.py +0 -0
  60. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/ntnbprinc.py +0 -0
  61. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/_titulos/ntnc.py +0 -0
  62. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/benchmark.py +0 -0
  63. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/pre.py +0 -0
  64. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/rmd/__init__.py +0 -0
  65. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/rmd/_aba_1_3.py +0 -0
  66. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/rmd/_aba_2_1.py +0 -0
  67. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/rmd/_common.py +0 -0
  68. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/rmd/_download.py +0 -0
  69. {pyield-0.52.0 → pyield-0.52.2}/pyield/tpf/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyield
3
- Version: 0.52.0
3
+ Version: 0.52.2
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
@@ -114,13 +114,13 @@ documentação.
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
116
  | `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premio_pre`, `rmd`, `secundario_mensal`, `secundario_intradia` |
117
- | `yd.lft` | módulo | LFT | `dados`, `vencimentos`, `cotacao`, `taxa`, `vna` |
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 | |
@@ -322,6 +322,10 @@ Resumo das quebras desta versão:
322
322
  antes suportadas via sobrecarga vetorial, agora levantam `TypeError`.
323
323
  Substitua por `Interpolador.interpolar_expr` em pipelines Polars ou pela
324
324
  função top-level `yd.interpolar(...)` (curva única ou multi-curva).
325
+ - `yd.interpolar(...)` passou a usar `extrapolar=False` como padrão, alinhado
326
+ com `Interpolador`. Antes era `True`. Chamadas que dependiam da
327
+ extrapolação implícita na ponta longa precisam passar `extrapolar=True`
328
+ explicitamente.
325
329
  - As funções `dv01(...)` dos títulos públicos agora recebem `pu` como argumento
326
330
  explícito. Chamadas antigas que passavam apenas data, vencimento e taxa, ou
327
331
  que passavam VNA no caso da NTN-B, precisam ser atualizadas.
@@ -70,13 +70,13 @@ documentação.
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
72
  | `yd.tpf` | módulo | Títulos públicos federais | `taxas`, `vencimentos`, `estoque`, `leiloes`, `benchmarks`, `curva_pre`, `premio_pre`, `rmd`, `secundario_mensal`, `secundario_intradia` |
73
- | `yd.lft` | módulo | LFT | `dados`, `vencimentos`, `cotacao`, `taxa`, `vna` |
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 | |
@@ -278,6 +278,10 @@ Resumo das quebras desta versão:
278
278
  antes suportadas via sobrecarga vetorial, agora levantam `TypeError`.
279
279
  Substitua por `Interpolador.interpolar_expr` em pipelines Polars ou pela
280
280
  função top-level `yd.interpolar(...)` (curva única ou multi-curva).
281
+ - `yd.interpolar(...)` passou a usar `extrapolar=False` como padrão, alinhado
282
+ com `Interpolador`. Antes era `True`. Chamadas que dependiam da
283
+ extrapolação implícita na ponta longa precisam passar `extrapolar=True`
284
+ explicitamente.
281
285
  - As funções `dv01(...)` dos títulos públicos agora recebem `pu` como argumento
282
286
  explícito. Chamadas antigas que passavam apenas data, vencimento e taxa, ou
283
287
  que passavam VNA no caso da NTN-B, precisam ser atualizadas.
@@ -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:
@@ -310,7 +310,7 @@ def interpolar( # noqa: PLR0913
310
310
  *,
311
311
  datas_alvo: pl.Series | None = None,
312
312
  datas_curva: pl.Series | None = None,
313
- extrapolar: bool = True,
313
+ extrapolar: bool = False,
314
314
  ) -> pl.Series:
315
315
  r"""Interpola taxas flat-forward para uma série de pontos alvo.
316
316
 
@@ -332,10 +332,12 @@ def interpolar( # noqa: PLR0913
332
332
  Padrão: ``None`` (curva única).
333
333
  datas_curva: Series Date com a data de referência de cada
334
334
  vértice da curva. Padrão: ``None`` (curva única).
335
- extrapolar: Se True (padrão), pontos acima do maior vértice de
336
- cada grupo recebem a última taxa conhecida. Se False, recebem
337
- ``null``. Pontos abaixo do menor vértice sempre recebem a
338
- primeira taxa do grupo.
335
+ extrapolar: Controla apenas o comportamento na ponta longa (DU acima
336
+ do maior vértice de cada grupo). Se True, retorna a última taxa
337
+ conhecida; se False (padrão), retorna ``null``. A ponta curta
338
+ (DU abaixo do menor vértice) sempre retorna a primeira taxa do
339
+ grupo, independentemente desta flag. O default casa com o da
340
+ classe :class:`Interpolador`.
339
341
 
340
342
  Returns:
341
343
  Series Float64 ``taxa_interpolada`` na mesma ordem de
@@ -55,10 +55,7 @@ def dados(data: DateLike) -> pl.DataFrame:
55
55
  df = utils.adicionar_taxa_di(df, data_ref)
56
56
 
57
57
  df = df.with_columns(
58
- rentabilidade=pl.struct("taxa_indicativa", "taxa_di").map_elements(
59
- lambda s: rentabilidade(s["taxa_indicativa"], s["taxa_di"]),
60
- return_dtype=pl.Float64,
61
- )
58
+ rentabilidade=rentabilidade_expr("taxa_indicativa", "taxa_di"),
62
59
  )
63
60
 
64
61
  return df.select(
@@ -226,6 +223,28 @@ def rentabilidade(taxa_lft: float, taxa_di: float) -> float:
226
223
  return (fator_lft * fator_di - 1) / (fator_di - 1)
227
224
 
228
225
 
226
+ def rentabilidade_expr(
227
+ taxa_lft: pl.Expr | str,
228
+ taxa_di: pl.Expr | str,
229
+ ) -> pl.Expr:
230
+ """Cria expressão Polars para a rentabilidade da LFT sobre o DI.
231
+
232
+ Args:
233
+ taxa_lft: Nome de coluna ou expressão Polars com a taxa anualizada da
234
+ LFT sobre a Selic.
235
+ taxa_di: Nome de coluna ou expressão Polars com a taxa DI Futuro
236
+ anualizada (interpolada para o mesmo vencimento da LFT).
237
+
238
+ Returns:
239
+ pl.Expr: Expressão sem alias com a rentabilidade da LFT sobre o DI.
240
+ """
241
+ expr_lft = taxa_lft if isinstance(taxa_lft, pl.Expr) else pl.col(taxa_lft)
242
+ expr_di = taxa_di if isinstance(taxa_di, pl.Expr) else pl.col(taxa_di)
243
+ fator_lft = (expr_lft + 1) ** (1 / 252)
244
+ fator_di = (expr_di + 1) ** (1 / 252)
245
+ return (fator_lft * fator_di - 1) / (fator_di - 1)
246
+
247
+
229
248
  def _calcular_pu(
230
249
  vna: float,
231
250
  cotacao: float,
@@ -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.
@@ -19,7 +19,7 @@ dependencies = [
19
19
  "fastexcel>=0.19.0",
20
20
  "tzdata>=2024.1; platform_system == 'Windows'",
21
21
  ]
22
- version = "0.52.0"
22
+ version = "0.52.2"
23
23
 
24
24
  [project.urls]
25
25
  Homepage = "https://github.com/crdcj/PYield"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes