NTN-B
cotacao(data_liquidacao, data_vencimento, taxa)
Calcula a cotação da NTN-B pela metodologia da STN para leilões primários.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação da operação. |
required |
data_vencimento
|
DateLike
|
Data de vencimento da NTN-B. |
required |
taxa
|
float | Decimal
|
Taxa de desconto (TIR) em formato decimal. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
Decimal |
Decimal
|
Fator de cotação em base 1, truncado em 6 casas. Retorna Decimal('NaN') em erro. |
Notes
A STN apresenta a cotação na escala percentual (base 100). Esta função retorna o fator equivalente em base 1, usado diretamente no cálculo do PU. O truncamento de 4 casas na escala STN equivale ao truncamento de 6 casas nesta representação.
O cupom semestral definido pela STN como 2,956301% é armazenado como 0,02956301 em base 1.
References
- Secretaria do Tesouro Nacional. Metodologia de Cálculo dos Títulos Públicos Federais Ofertados nos Leilões Primários. https://crdcj.github.io/PYield/referencias/metodologia-calculo-tpf-stn/
Examples:
>>> from pyield import ntnb
>>> ntnb.cotacao("31-05-2024", "15-05-2035", 0.061490)
Decimal('0.993651')
>>> ntnb.cotacao("31-05-2024", "15-08-2060", 0.061878)
Decimal('0.995341')
>>> ntnb.cotacao("15-08-2024", "15-08-2032", 0.05929)
Decimal('1.006409')
>>> ntnb.cotacao("15-05-2024", "15-05-2025", 0.10)
Decimal('0.964454')
>>> ntnb.cotacao("21-05-2008", "15-08-2010", 0.082900009)
Decimal('0.970813')
Source code in pyield/tpf/titulos/ntnb.py
dados(data)
Busca as taxas indicativas de NTN-B para a data de referência.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data
|
DateLike
|
Data da consulta. |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
pl.DataFrame: DataFrame Polars com os dados de NTN-B. |
Output Columns
- data_referencia (Date): Data de referência dos dados.
- titulo (String): Tipo do título (ex.: "NTN-B").
- codigo_selic (Int64): Código do título no SELIC.
- data_base (Date): Data base de emissão do título.
- data_vencimento (Date): Data de vencimento do título.
- dias_uteis (Int64): Dias úteis entre referência e vencimento.
- duration (Float64): Macaulay Duration do título (anos).
- prazo_medio (Float64): Prazo médio do título (anos).
- dv01 (Float64): Variação no preço para 1bp de taxa.
- pu (Float64): Preço unitário (PU).
- taxa_compra (Float64): Taxa de compra (decimal).
- taxa_venda (Float64): Taxa de venda (decimal).
- taxa_indicativa (Float64): Taxa indicativa (decimal).
- taxa_di (Float64): Taxa de ajuste do DI Futuro interpolada pelo método flat forward.
- taxa_zero (Float64): Taxa zero real (via bootstrap das taxas indicativas).
- taxa_forward (Float64): Taxa forward real (a partir das taxas zero).
- inflacao_implicita (Float64): Inflação implícita (breakeven) calculada a partir de taxas nominais do DI Futuro e taxas zero das NTN-B.
Examples:
Source code in pyield/tpf/titulos/ntnb.py
datas_pagamento(data_liquidacao, data_vencimento)
Gera todas as datas de pagamento entre liquidação e vencimento.
Os pagamentos são semestrais e seguem a série do título, com datas em 15/02, 15/05, 15/08 ou 15/11. No vencimento, o fluxo inclui o último cupom e a amortização do principal. As datas são contratuais e não são ajustadas para dias úteis.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação (exclusiva). |
required |
data_vencimento
|
DateLike
|
Data de vencimento. |
required |
Returns:
| Type | Description |
|---|---|
Series
|
pl.Series: Série de datas de pagamento entre a liquidação (exclusiva) e o vencimento (inclusivo). Retorna série vazia se o vencimento for menor ou igual à liquidação. |
Notes
Para obter as datas efetivas de processamento, use
yd.du.deslocar(..., 0).
Examples:
>>> from pyield import ntnb
>>> ntnb.datas_pagamento("10-05-2024", "15-05-2025")
shape: (3,)
Series: 'datas_pagamento' [date]
[
2024-05-15
2024-11-15
2025-05-15
]
A data de liquidação coincidente com um pagamento é exclusiva:
>>> ntnb.datas_pagamento("15-05-2024", "15-05-2025")
shape: (2,)
Series: 'datas_pagamento' [date]
[
2024-11-15
2025-05-15
]
Source code in pyield/tpf/titulos/ntnb.py
duration(data_liquidacao, data_vencimento, taxa)
Calcula a Macaulay duration da NTN-B em anos úteis.
Fórmula
Sum( t * CFₜ / (1 + y)ᵗ )
MacD = ---------------------------------
Current Bond Price
Onde
t = tempo (anos) até o pagamento CFₜ = fluxo no tempo t y = TIR (periódica) Price = Soma( CFₜ / (1 + y)ᵗ )
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação. |
required |
data_vencimento
|
DateLike
|
Data de vencimento. |
required |
taxa
|
float
|
Taxa de desconto usada no cálculo. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
float |
float
|
Macaulay duration em anos úteis. |
Examples:
>>> from pyield import ntnb
>>> ntnb.duration("23-08-2024", "15-08-2060", 0.061005)
15.08305431313045
Source code in pyield/tpf/titulos/ntnb.py
duration_expr(data_liquidacao, data_vencimento, taxa)
Cria expressão Polars para a duration da NTN-B.
O cálculo é aplicado linha a linha porque a duration depende dos fluxos de caixa do título.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
Expr | str
|
Nome de coluna ou expressão Polars com a data de liquidação. |
required |
data_vencimento
|
Expr | str
|
Nome de coluna ou expressão Polars com a data de vencimento. |
required |
taxa
|
Expr | str
|
Nome de coluna ou expressão Polars com a taxa em formato decimal. |
required |
Returns:
| Type | Description |
|---|---|
Expr
|
pl.Expr: Expressão sem alias com a Macaulay duration em anos úteis. |
Source code in pyield/tpf/titulos/ntnb.py
dv01(data_liquidacao, data_vencimento, taxa, pu)
Calcula o DV01 (Dollar Value of 01) da NTN-B em R$.
Representa a variação do PU informado para um aumento de 1 bp (0,01%) na taxa.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação. |
required |
data_vencimento
|
DateLike
|
Data de vencimento. |
required |
taxa
|
float
|
Taxa de desconto (TIR) da NTN-B. |
required |
pu
|
float | Decimal
|
PU usado como base para o cálculo. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
float |
float
|
DV01, variação de preço para 1 bp. |
Examples:
>>> from pyield import ntnb
>>> cot = ntnb.cotacao("26-03-2025", "15-08-2060", 0.074358)
>>> pu = ntnb.pu(4470.979474, cot)
>>> ntnb.dv01("26-03-2025", "15-08-2060", 0.074358, pu)
4.640876692897651
Source code in pyield/tpf/titulos/ntnb.py
dv01_expr(data_liquidacao, data_vencimento, taxa, pu)
Cria expressão Polars para o DV01 da NTN-B.
O cálculo é aplicado linha a linha e reprifica o PU informado para um aumento de 1 bp na taxa.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
Expr | str
|
Nome de coluna ou expressão Polars com a data de liquidação. |
required |
data_vencimento
|
Expr | str
|
Nome de coluna ou expressão Polars com a data de vencimento. |
required |
taxa
|
Expr | str
|
Nome de coluna ou expressão Polars com a taxa em formato decimal. |
required |
pu
|
Expr | str
|
Nome de coluna ou expressão Polars com o PU usado como base. |
required |
Returns:
| Type | Description |
|---|---|
Expr
|
pl.Expr: Expressão sem alias com o DV01. |
Source code in pyield/tpf/titulos/ntnb.py
fluxos_caixa(data_liquidacao, data_vencimento)
Gera os fluxos de caixa da NTN-B entre liquidação e vencimento.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação (exclusiva). |
required |
data_vencimento
|
DateLike
|
Data de vencimento. |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
pl.DataFrame: DataFrame com as colunas de fluxo. |
Output Columns
- data_pagamento (Date): Data contratual do pagamento, sem ajuste para dia útil.
- valor_pagamento (Float64): Valor do pagamento em base 1.
Notes
Para obter as datas efetivas de processamento, use
yd.du.deslocar(..., 0).
Examples:
>>> from pyield import ntnb
>>> with pl.Config(float_precision=8):
... ntnb.fluxos_caixa("10-05-2024", "15-05-2025")
shape: (3, 2)
┌────────────────┬─────────────────┐
│ data_pagamento ┆ valor_pagamento │
│ --- ┆ --- │
│ date ┆ f64 │
╞════════════════╪═════════════════╡
│ 2024-05-15 ┆ 0.02956301 │
│ 2024-11-15 ┆ 0.02956301 │
│ 2025-05-15 ┆ 1.02956301 │
└────────────────┴─────────────────┘
Source code in pyield/tpf/titulos/ntnb.py
implicitas(data_liquidacao, vencimentos_tir, taxas_tir, vencimentos_nominais, taxas_nominais, *, extrapolar=False)
Calcula a inflação implícita para NTN-B contra uma curva nominal de referência.
A inflação implícita (breakeven) é a que iguala yields reais e nominais, baseada nas taxas zero das NTN-B e na curva nominal informada.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação da operação. |
required |
vencimentos_tir
|
DatesLike
|
Vencimentos das NTN-B usadas como vértices da curva de TIR real. |
required |
taxas_tir
|
ArrayLike
|
TIRs reais observadas das NTN-B correspondentes aos vencimentos informados. A função calcula a curva zero real a partir dessas taxas. |
required |
vencimentos_nominais
|
DatesLike
|
Vencimentos da curva nominal de referência. |
required |
taxas_nominais
|
ArrayLike
|
Taxas da curva nominal de referência. Pode representar DI Futuro, curva soberana prefixada ou outra curva nominal escolhida pelo usuário. |
required |
extrapolar
|
bool
|
Se |
False
|
Returns:
| Type | Description |
|---|---|
DataFrame
|
pl.DataFrame: DataFrame com as taxas calculadas. |
Output Columns
- data_vencimento (Date): Data de vencimento.
- dias_uteis (Int64): Dias úteis entre liquidação e vencimento.
- taxa_tir_real (Float64): TIR real da NTN-B recebida na entrada.
- taxa_zero_real (Float64): Taxa real zero via bootstrap.
- taxa_nominal (Float64): Taxa nominal interpolada.
- inflacao_implicita (Float64): Inflação implícita (breakeven).
Notes
A inflação implícita é calculada contra a curva nominal informada. Se essa curva for DI Futuro, o resultado representa a implícita contra DI, não uma inflação soberana prefixada pura.
Examples:
Busca as taxas de NTN-B para uma data de referência. Estas são TIRs e as taxas zero são calculadas a partir delas.
Busca as taxas de ajuste do DI Futuro para a mesma data de referência:
Calcula a inflação implícita na data de referência:
>>> yd.ntnb.implicitas(
... data_liquidacao="19-06-2026",
... vencimentos_tir=df_ntnb["data_vencimento"],
... taxas_tir=df_ntnb["taxa_indicativa"],
... vencimentos_nominais=df_di["data_vencimento"],
... taxas_nominais=df_di["taxa_ajuste"],
... )
shape: (15, 6)
┌─────────────────┬────────────┬───────────────┬────────────────┬──────────────┬────────────────────┐
│ data_vencimento ┆ dias_uteis ┆ taxa_tir_real ┆ taxa_zero_real ┆ taxa_nominal ┆ inflacao_implicita │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ date ┆ i64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞═════════════════╪════════════╪═══════════════╪════════════════╪══════════════╪════════════════════╡
│ 2026-08-15 ┆ 41 ┆ 0.1115 ┆ 0.1115 ┆ 0.141339 ┆ 0.026846 │
│ 2027-05-15 ┆ 226 ┆ 0.085733 ┆ 0.085642 ┆ 0.145795 ┆ 0.055407 │
│ 2028-08-15 ┆ 541 ┆ 0.089683 ┆ 0.08971 ┆ 0.149149 ┆ 0.054545 │
│ 2029-05-15 ┆ 725 ┆ 0.088171 ┆ 0.088129 ┆ 0.149535 ┆ 0.056432 │
│ 2030-08-15 ┆ 1039 ┆ 0.088766 ┆ 0.088759 ┆ 0.149166 ┆ 0.055482 │
│ … ┆ … ┆ … ┆ … ┆ … ┆ … │
│ 2040-08-15 ┆ 3548 ┆ 0.078262 ┆ 0.076087 ┆ 0.14591 ┆ 0.064886 │
│ 2045-05-15 ┆ 4735 ┆ 0.076656 ┆ 0.073931 ┆ null ┆ null │
│ 2050-08-15 ┆ 6050 ┆ 0.075659 ┆ 0.072435 ┆ null ┆ null │
│ 2055-05-15 ┆ 7239 ┆ 0.074658 ┆ 0.07049 ┆ null ┆ null │
│ 2060-08-15 ┆ 8556 ┆ 0.07464 ┆ 0.070832 ┆ null ┆ null │
└─────────────────┴────────────┴───────────────┴────────────────┴──────────────┴────────────────────┘
Source code in pyield/tpf/titulos/ntnb.py
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 | |
pu(vna, cotacao)
Calcula o PU da NTN-B pela metodologia da STN para leilões primários.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
vna
|
float | Decimal
|
Valor nominal atualizado (VNA). |
required |
cotacao
|
float | Decimal
|
Fator de cotação da NTN-B em base 1. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
Decimal |
Decimal
|
Preço da NTN-B truncado em 6 casas decimais. |
References
- Secretaria do Tesouro Nacional. Metodologia de Cálculo dos Títulos Públicos Federais Ofertados nos Leilões Primários. https://crdcj.github.io/PYield/referencias/metodologia-calculo-tpf-stn/
Examples:
>>> from pyield import ntnb
>>> ntnb.pu(4299.160173, 0.993651)
Decimal('4271.864805')
>>> ntnb.pu(4315.498383, 1.006409)
Decimal('4343.156412')
>>> ntnb.pu(1728.4611369, 0.9708139)
Decimal('1678.012540')
Source code in pyield/tpf/titulos/ntnb.py
taxa(data_liquidacao, data_vencimento, vna, pu)
Calcula a TIR implícita de uma NTN-B a partir do preço (PU).
A função inverte numericamente a cadeia pu(vna, cotacao(...)),
encontrando a taxa que zera a diferença entre o preço calculado e o
informado.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação. |
required |
data_vencimento
|
DateLike
|
Data de vencimento. |
required |
vna
|
float | Decimal
|
Valor nominal atualizado (VNA). |
required |
pu
|
float | Decimal
|
Preço unitário (PU) do título. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
float |
float
|
TIR implícita em formato decimal, truncada em oito casas decimais (seis casas em termos percentuais). Retorna NaN em caso de erro. |
Examples:
>>> from pyield import ntnb
>>> ntnb.taxa("31-05-2024", "15-05-2035", 4299.160173, 4271.864805)
0.06149003
>>> ntnb.taxa("15-08-2024", "15-08-2032", 4315.498383, 4343.156412)
0.05929003
>>> ntnb.taxa("21-05-2008", "15-08-2010", 1728.461136, 1781.867128)
0.0523457
Source code in pyield/tpf/titulos/ntnb.py
taxas_zero(data_liquidacao, vencimentos, taxas, incluir_cupons=False)
Calcula as taxas zero da NTN-B usando bootstrap.
O bootstrap determina as taxas zero a partir dos yields dos títulos, resolvendo iterativamente as taxas que descontam os fluxos ao preço.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data_liquidacao
|
DateLike
|
Data de liquidação. |
required |
vencimentos
|
DatesLike
|
Datas de vencimento dos títulos. |
required |
taxas
|
ArrayLike
|
TIRs correspondentes em formato decimal (ex.: 0.10 para 10%). |
required |
incluir_cupons
|
bool
|
Se True, inclui datas intermediárias de cupom. Padrão False. |
False
|
Returns:
| Type | Description |
|---|---|
DataFrame
|
pl.DataFrame: DataFrame com as taxas zero. |
Output Columns
- data_vencimento (Date): Data de vencimento.
- dias_uteis (Int64): Dias úteis entre liquidação e vencimento.
- taxa_zero (Float64): Taxa zero (real).
Examples:
>>> from pyield import ntnb
>>> # Busca as taxas de NTN-B para uma data de referência
>>> df = ntnb.dados("16-08-2024")
>>> # Calcula as taxas zero considerando a liquidação na data de referência
>>> ntnb.taxas_zero(
... data_liquidacao="16-08-2024",
... vencimentos=df["data_vencimento"],
... taxas=df["taxa_indicativa"],
... )
shape: (14, 3)
┌─────────────────┬────────────┬───────────┐
│ data_vencimento ┆ dias_uteis ┆ taxa_zero │
│ --- ┆ --- ┆ --- │
│ date ┆ i64 ┆ f64 │
╞═════════════════╪════════════╪═══════════╡
│ 2025-05-15 ┆ 185 ┆ 0.063893 │
│ 2026-08-15 ┆ 502 ┆ 0.066141 │
│ 2027-05-15 ┆ 687 ┆ 0.064087 │
│ 2028-08-15 ┆ 1002 ┆ 0.063057 │
│ 2029-05-15 ┆ 1186 ┆ 0.061458 │
│ … ┆ … ┆ … │
│ 2040-08-15 ┆ 4009 ┆ 0.058326 │
│ 2045-05-15 ┆ 5196 ┆ 0.060371 │
│ 2050-08-15 ┆ 6511 ┆ 0.060772 │
│ 2055-05-15 ┆ 7700 ┆ 0.059909 │
│ 2060-08-15 ┆ 9017 ┆ 0.060652 │
└─────────────────┴────────────┴───────────┘
Caso a liquidação ocorra logo após uma data de cupom, o valor presente dos cupons anteriores pode ser zero:
>>> df = ntnb.dados("15-05-2026")
>>> ntnb.taxas_zero(
... data_liquidacao="18-05-2026",
... vencimentos=df["data_vencimento"],
... taxas=df["taxa_indicativa"],
... incluir_cupons=True,
... )
shape: (137, 3)
┌─────────────────┬────────────┬───────────┐
│ data_vencimento ┆ dias_uteis ┆ taxa_zero │
│ --- ┆ --- ┆ --- │
│ date ┆ i64 ┆ f64 │
╞═════════════════╪════════════╪═══════════╡
│ 2026-08-15 ┆ 64 ┆ 0.102013 │
│ 2026-11-15 ┆ 126 ┆ 0.088186 │
│ 2027-02-15 ┆ 186 ┆ 0.083431 │
│ 2027-05-15 ┆ 249 ┆ 0.081096 │
│ 2027-08-15 ┆ 313 ┆ 0.081005 │
│ … ┆ … ┆ … │
│ 2059-08-15 ┆ 8326 ┆ 0.070508 │
│ 2059-11-15 ┆ 8392 ┆ 0.070524 │
│ 2060-02-15 ┆ 8454 ┆ 0.07053 │
│ 2060-05-15 ┆ 8515 ┆ 0.070547 │
│ 2060-08-15 ┆ 8579 ┆ 0.070553 │
└─────────────────┴────────────┴───────────┘
Notes
O cálculo considera: - Mapear todas as datas de pagamento até o último vencimento. - Interpolar as TIRs nas datas intermediárias. - Calcular a cotação da NTN-B para cada vencimento. - Calcular as taxas zero reais.
Source code in pyield/tpf/titulos/ntnb.py
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 | |
vencimentos(data)
Busca os vencimentos de NTN-B disponíveis para a data de referência.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data
|
DateLike
|
Data da consulta. |
required |
Returns:
| Type | Description |
|---|---|
Series
|
pl.Series: Série de datas de vencimento de NTN-B. |
Examples:
>>> from pyield import ntnb
>>> ntnb.vencimentos("16-08-2024")
shape: (14,)
Series: 'data_vencimento' [date]
[
2025-05-15
2026-08-15
2027-05-15
2028-08-15
2029-05-15
…
2040-08-15
2045-05-15
2050-08-15
2055-05-15
2060-08-15
]