Pular para conteúdo

NTN-B Principal

Precificação de NTN-B Principal pelas regras do Tesouro Direto.

cotacao(data_liquidacao, data_vencimento, taxa_tir)

Calcula a cotação da NTN-B Principal em base 1 pelo método do Tesouro Direto.

Parameters:

Name Type Description Default
data_liquidacao DateLike

Data de liquidação.

required
data_vencimento DateLike

Data de vencimento.

required
taxa_tir float | Decimal

Taxa interna de retorno anualizada do título.

required

Returns:

Name Type Description
Decimal Decimal

Cotação em base 1, truncada em 6 casas decimais.

Examples:

>>> from pyield import ntnbp
>>> ntnbp.cotacao("02-12-2025", "15-05-2029", 0.0777)
Decimal('0.774630')
Source code in pyield/tpf/titulos/ntnbp.py
def cotacao(
    data_liquidacao: DateLike,
    data_vencimento: DateLike,
    taxa_tir: float | Decimal,
) -> Decimal:
    """
    Calcula a cotação da NTN-B Principal em base 1 pelo método do Tesouro Direto.

    Args:
        data_liquidacao: Data de liquidação.
        data_vencimento: Data de vencimento.
        taxa_tir: Taxa interna de retorno anualizada do título.

    Returns:
        Decimal: Cotação em base 1, truncada em 6 casas decimais.

    Examples:
        >>> from pyield import ntnbp
        >>> ntnbp.cotacao("02-12-2025", "15-05-2029", 0.0777)
        Decimal('0.774630')
    """
    if any_is_empty(data_liquidacao, data_vencimento, taxa_tir):
        return Decimal("NaN")

    dias_uteis = du.contar(data_liquidacao, data_vencimento)
    anos_uteis = utils.truncar(dias_uteis / 252, 14)
    fator_desconto = 1 / (1 + float(taxa_tir)) ** anos_uteis
    return truncar_decimal(fator_desconto, 6)

dv01(data_liquidacao, data_vencimento, taxa_tir, pu)

Calcula o DV01 (Dollar Value of 01) da NTN-B Principal 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_tir float

Taxa interna de retorno anualizada do título.

required
pu float | Decimal

PU usado como base para o cálculo.

required

Returns:

Name Type Description
float float

DV01 (Dollar Value of 01), variação de preço para 1 bp.

Examples:

>>> from pyield import ntnbp as bp
>>> cot = bp.cotacao("02-12-2025", "15-05-2029", 0.0777)
>>> pu = bp.pu(4567.033825, cot)
>>> bp.dv01("02-12-2025", "15-05-2029", 0.0777, pu)
1.120055806382451
Source code in pyield/tpf/titulos/ntnbp.py
def dv01(
    data_liquidacao: DateLike,
    data_vencimento: DateLike,
    taxa_tir: float,
    pu: float | Decimal,
) -> float:
    """
    Calcula o DV01 (Dollar Value of 01) da NTN-B Principal em R$.

    Representa a variação do PU informado para um aumento de 1 bp (0,01%) na
    taxa.

    Args:
        data_liquidacao (DateLike): Data de liquidação.
        data_vencimento (DateLike): Data de vencimento.
        taxa_tir (float): Taxa interna de retorno anualizada do título.
        pu: PU usado como base para o cálculo.

    Returns:
        float: DV01 (Dollar Value of 01), variação de preço para 1 bp.

    Examples:
        >>> from pyield import ntnbp as bp
        >>> cot = bp.cotacao("02-12-2025", "15-05-2029", 0.0777)
        >>> pu = bp.pu(4567.033825, cot)
        >>> bp.dv01("02-12-2025", "15-05-2029", 0.0777, pu)
        1.120055806382451
    """
    if any_is_empty(data_liquidacao, data_vencimento, taxa_tir, pu):
        return float("nan")

    dias_uteis = du.contar(data_liquidacao, data_vencimento)
    anos_uteis = utils.truncar(dias_uteis / 252, 14)
    fator_preco = (1 + taxa_tir) ** anos_uteis
    fator_preco_1bp = (1 + taxa_tir + 0.0001) ** anos_uteis
    return float(pu) * (1 - fator_preco / fator_preco_1bp)

pu(vna, cotacao)

Calcula o preço (PU) da NTN-B Principal.

Parameters:

Name Type Description Default
vna float | Decimal

Valor nominal atualizado (VNA).

required
cotacao float | Decimal

Cotação da NTN-B Principal em base 1.

required

Returns:

Name Type Description
Decimal Decimal

Preço da NTN-B Principal truncado em 6 casas decimais.

Examples:

>>> from pyield import ntnbp
>>> cot = ntnbp.cotacao("02-12-2025", "15-05-2029", 0.0777)
>>> ntnbp.pu(4567.033825, cot)
Decimal('3537.761411')
Source code in pyield/tpf/titulos/ntnbp.py
def pu(vna: float | Decimal, cotacao: float | Decimal) -> Decimal:
    """
    Calcula o preço (PU) da NTN-B Principal.

    Args:
        vna: Valor nominal atualizado (VNA).
        cotacao: Cotação da NTN-B Principal em base 1.

    Returns:
        Decimal: Preço da NTN-B Principal truncado em 6 casas decimais.

    Examples:
        >>> from pyield import ntnbp
        >>> cot = ntnbp.cotacao("02-12-2025", "15-05-2029", 0.0777)
        >>> ntnbp.pu(4567.033825, cot)
        Decimal('3537.761411')
    """
    if any_is_empty(vna, cotacao):
        return Decimal("NaN")
    vna_decimal = truncar_decimal(vna, 6)
    cotacao_decimal = truncar_decimal(cotacao, 6)
    return truncar_decimal(vna_decimal * cotacao_decimal, 6)

taxa(data_liquidacao, data_vencimento, curva_zero)

Obtém a TIR de mercado da NTN-B Principal pelo método do Tesouro Direto.

A taxa zero correspondente ao vencimento é interpolada por flat-forward e arredondada em quatro casas decimais. Como a NTN-B Principal possui um único fluxo no vencimento, essa taxa zero também é a TIR do título.

A curva pode ser produzida por :func:pyield.ntnbp.taxas_zero. Para cálculos em lote, ela deve ser construída uma única vez e reutilizada entre os títulos.

Parameters:

Name Type Description Default
data_liquidacao DateLike

Data de liquidação usada na construção da curva.

required
data_vencimento DateLike

Data de vencimento da NTN-B Principal.

required
curva_zero DataFrame

DataFrame com as colunas dias_uteis e taxa_zero.

required

Returns:

Name Type Description
float float

TIR de mercado anualizada, arredondada em quatro casas decimais.

Source code in pyield/tpf/titulos/ntnbp.py
def taxa(
    data_liquidacao: DateLike,
    data_vencimento: DateLike,
    curva_zero: pl.DataFrame,
) -> float:
    """
    Obtém a TIR de mercado da NTN-B Principal pelo método do Tesouro Direto.

    A taxa zero correspondente ao vencimento é interpolada por flat-forward e
    arredondada em quatro casas decimais. Como a NTN-B Principal possui um único
    fluxo no vencimento, essa taxa zero também é a TIR do título.

    A curva pode ser produzida por :func:`pyield.ntnbp.taxas_zero`. Para
    cálculos em lote, ela deve ser construída uma única vez e reutilizada entre
    os títulos.

    Args:
        data_liquidacao: Data de liquidação usada na construção da curva.
        data_vencimento: Data de vencimento da NTN-B Principal.
        curva_zero: DataFrame com as colunas ``dias_uteis`` e ``taxa_zero``.

    Returns:
        float: TIR de mercado anualizada, arredondada em quatro casas decimais.
    """
    if any_is_empty(data_liquidacao, data_vencimento):
        return float("nan")

    curva = _normalizar_curva_zero(curva_zero)
    dias_uteis = du.contar(data_liquidacao, data_vencimento)
    taxa_zero = interpolador.Interpolador(
        curva["dias_uteis"],
        curva["taxa_zero"],
        metodo="flat_forward",
    ).interpolar(dias_uteis)
    return round(taxa_zero, 4)