Pular para conteúdo

LFT

cotacao(data_liquidacao, data_vencimento, taxa)

Calcula a cotação de uma LFT pela metodologia da STN para leilões primários.

Parameters:

Name Type Description Default
data_liquidacao DateLike

Data de liquidação do título.

required
data_vencimento DateLike

Data de vencimento do título.

required
taxa float | Decimal

Taxa anualizada do título em formato decimal.

required

Returns:

Name Type Description
Decimal Decimal

Fator de cotação em base 1, truncado em 6 casas decimais.

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.

Examples:

Calcula a cotação de uma LFT com taxa de 0,1717%:

>>> from pyield import lft
>>> lft.cotacao(
...     data_liquidacao="24-07-2024",
...     data_vencimento="01-09-2030",
...     taxa=0.001717,  # 0.1717%
... )
Decimal('0.989645')
>>> lft.cotacao("21-05-2008", "07-03-2014", -0.000200009)
Decimal('1.001158')

Entradas nulas retornam Decimal('NaN'):

>>> lft.cotacao(
...     data_liquidacao=None, data_vencimento="01-09-2030", taxa=0.001717
... )
Decimal('NaN')
Source code in pyield/tpf/titulos/lft.py
def cotacao(
    data_liquidacao: DateLike,
    data_vencimento: DateLike,
    taxa: float | Decimal,
) -> Decimal:
    """
    Calcula a cotação de uma LFT pela metodologia da STN para leilões primários.

    Args:
        data_liquidacao: Data de liquidação do título.
        data_vencimento: Data de vencimento do título.
        taxa: Taxa anualizada do título em formato decimal.

    Returns:
        Decimal: Fator de cotação em base 1, truncado em 6 casas decimais.

    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.

    Examples:
        Calcula a cotação de uma LFT com taxa de 0,1717%:
        >>> from pyield import lft
        >>> lft.cotacao(
        ...     data_liquidacao="24-07-2024",
        ...     data_vencimento="01-09-2030",
        ...     taxa=0.001717,  # 0.1717%
        ... )
        Decimal('0.989645')
        >>> lft.cotacao("21-05-2008", "07-03-2014", -0.000200009)
        Decimal('1.001158')

        Entradas nulas retornam Decimal('NaN'):
        >>> lft.cotacao(
        ...     data_liquidacao=None, data_vencimento="01-09-2030", taxa=0.001717
        ... )
        Decimal('NaN')
    """
    if any_is_empty(data_liquidacao, data_vencimento, taxa):
        return Decimal("NaN")
    taxa = utils.normalizar_taxa_precificacao(taxa)
    # Número de dias úteis entre liquidação (inclusivo) e vencimento (exclusivo)
    dias_uteis = du.contar(data_liquidacao, data_vencimento)

    # Número de períodos truncado conforme regras da STN
    anos_truncados = utils.truncar(dias_uteis / 252, 14)

    fator_desconto = 1 / (1 + taxa) ** anos_truncados

    return truncar_decimal(fator_desconto, 6)

dados(data)

Busca as taxas indicativas de LFT para a data de referência na ANBIMA.

Parameters:

Name Type Description Default
data DateLike

Data da consulta.

required

Returns:

Type Description
DataFrame

pl.DataFrame: DataFrame Polars com os dados de LFT.

Output Columns
  • data_referencia (Date): Data de referência dos dados.
  • titulo (String): Tipo do título (ex.: "LFT").
  • 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.
  • prazo_medio (Float64): Prazo médio do título em anos.
  • 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.
  • rentabilidade (Float64): Rentabilidade da LFT sobre o DI.

Examples:

>>> from pyield import lft
>>> df_lft = lft.dados("23-08-2024")
Source code in pyield/tpf/titulos/lft.py
def dados(data: DateLike) -> pl.DataFrame:
    """
    Busca as taxas indicativas de LFT para a data de referência na ANBIMA.

    Args:
        data: Data da consulta.

    Returns:
        pl.DataFrame: DataFrame Polars com os dados de LFT.

    Output Columns:
        - data_referencia (Date): Data de referência dos dados.
        - titulo (String): Tipo do título (ex.: "LFT").
        - 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.
        - prazo_medio (Float64): Prazo médio do título em anos.
        - 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.
        - rentabilidade (Float64): Rentabilidade da LFT sobre o DI.

    Examples:
        >>> from pyield import lft
        >>> df_lft = lft.dados("23-08-2024")  # doctest: +SKIP
    """
    df = utils.obter_tpf(data, "LFT")
    if df.is_empty():
        return df

    df = df.with_columns(
        dias_uteis=du.contar_expr("data_referencia", "data_vencimento"),
    )

    df = df.with_columns(
        prazo_medio=pl.col("dias_uteis") / 252,
    )
    df = utils.adicionar_taxa_di(df, data)

    df = df.with_columns(
        rentabilidade=rentabilidade_expr("taxa_indicativa", "taxa_di"),
    )

    return df.select(
        "data_referencia",
        "titulo",
        "codigo_selic",
        "data_base",
        "data_vencimento",
        "dias_uteis",
        "prazo_medio",
        "pu",
        "taxa_compra",
        "taxa_venda",
        "taxa_indicativa",
        "taxa_di",
        "rentabilidade",
    )

pu(vna, cotacao)

Calcula o PU da LFT 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 LFT em base 1.

required

Returns:

Name Type Description
Decimal Decimal

Preço da LFT 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 lft
>>> lft.pu(15785.324502, 0.999291)
Decimal('15774.132706')
>>> lft.pu(3451.2153459, 1.0011589)
Decimal('3455.211852')
Source code in pyield/tpf/titulos/lft.py
def pu(
    vna: float | Decimal,
    cotacao: float | Decimal,
) -> Decimal:
    """
    Calcula o PU da LFT pela metodologia da STN para leilões primários.

    Args:
        vna: Valor nominal atualizado (VNA).
        cotacao: Fator de cotação da LFT em base 1.

    Returns:
        Decimal: Preço da LFT 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 lft
        >>> lft.pu(15785.324502, 0.999291)
        Decimal('15774.132706')
        >>> lft.pu(3451.2153459, 1.0011589)
        Decimal('3455.211852')
    """
    return _calcular_pu(vna, cotacao)

rentabilidade(taxa_lft, taxa_di)

Calcula a rentabilidade da LFT sobre a taxa de DI Futuro.

Parameters:

Name Type Description Default
taxa_lft float

Taxa anualizada da LFT sobre a Selic.

required
taxa_di float

Taxa DI Futuro anualizada (interpolada para o mesmo vencimento da LFT).

required

Returns:

Name Type Description
float float

Rentabilidade da LFT sobre o DI.

Examples:

Calcula a rentabilidade de uma LFT em 28/04/2025:

>>> from pyield import lft
>>> taxa_lft = 0.001124  # 0.1124%
>>> taxa_di = 0.13967670224373396  # 13.967670224373396%
>>> lft.rentabilidade(taxa_lft, taxa_di)
1.008594331960501
Source code in pyield/tpf/titulos/lft.py
def rentabilidade(taxa_lft: float, taxa_di: float) -> float:
    """
    Calcula a rentabilidade da LFT sobre a taxa de DI Futuro.

    Args:
        taxa_lft: Taxa anualizada da LFT sobre a Selic.
        taxa_di: Taxa DI Futuro anualizada (interpolada para o mesmo
            vencimento da LFT).

    Returns:
        float: Rentabilidade da LFT sobre o DI.

    Examples:
        Calcula a rentabilidade de uma LFT em 28/04/2025:
        >>> from pyield import lft
        >>> taxa_lft = 0.001124  # 0.1124%
        >>> taxa_di = 0.13967670224373396  # 13.967670224373396%
        >>> lft.rentabilidade(taxa_lft, taxa_di)
        1.008594331960501
    """
    if any_is_empty(taxa_lft, taxa_di):
        return float("nan")
    # Taxa diária
    fator_lft = (taxa_lft + 1) ** (1 / 252)
    fator_di = (taxa_di + 1) ** (1 / 252)
    return (fator_lft * fator_di - 1) / (fator_di - 1)

rentabilidade_expr(taxa_lft, taxa_di)

Cria expressão Polars para a rentabilidade da LFT sobre o DI.

Parameters:

Name Type Description Default
taxa_lft Expr | str

Nome de coluna ou expressão Polars com a taxa anualizada da LFT sobre a Selic.

required
taxa_di Expr | str

Nome de coluna ou expressão Polars com a taxa DI Futuro anualizada (interpolada para o mesmo vencimento da LFT).

required

Returns:

Type Description
Expr

pl.Expr: Expressão sem alias com a rentabilidade da LFT sobre o DI.

Source code in pyield/tpf/titulos/lft.py
def rentabilidade_expr(
    taxa_lft: pl.Expr | str,
    taxa_di: pl.Expr | str,
) -> pl.Expr:
    """Cria expressão Polars para a rentabilidade da LFT sobre o DI.

    Args:
        taxa_lft: Nome de coluna ou expressão Polars com a taxa anualizada da
            LFT sobre a Selic.
        taxa_di: Nome de coluna ou expressão Polars com a taxa DI Futuro
            anualizada (interpolada para o mesmo vencimento da LFT).

    Returns:
        pl.Expr: Expressão sem alias com a rentabilidade da LFT sobre o DI.
    """
    expr_lft = taxa_lft if isinstance(taxa_lft, pl.Expr) else pl.col(taxa_lft)
    expr_di = taxa_di if isinstance(taxa_di, pl.Expr) else pl.col(taxa_di)
    fator_lft = (expr_lft + 1) ** (1 / 252)
    fator_di = (expr_di + 1) ** (1 / 252)
    return (fator_lft * fator_di - 1) / (fator_di - 1)

taxa(data_liquidacao, data_vencimento, vna, pu)

Calcula a taxa implícita de uma LFT 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

Taxa 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 lft
>>> lft.taxa("24-07-2024", "01-09-2030", 15785.324502, 15621.867466)
0.00171691
>>> lft.taxa("24-07-2024", "01-03-2025", 15785.324502, 15774.132706)
0.00115966
>>> lft.taxa("21-05-2008", "07-03-2014", 3451.215345, 3426.649594)
0.00123443
Source code in pyield/tpf/titulos/lft.py
def taxa(
    data_liquidacao: DateLike,
    data_vencimento: DateLike,
    vna: float | Decimal,
    pu: float | Decimal,
) -> float:
    """
    Calcula a taxa implícita de uma LFT 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.

    Args:
        data_liquidacao: Data de liquidação.
        data_vencimento: Data de vencimento.
        vna: Valor nominal atualizado (VNA).
        pu: Preço unitário (PU) do título.

    Returns:
        float: Taxa 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 lft
        >>> lft.taxa("24-07-2024", "01-09-2030", 15785.324502, 15621.867466)
        0.00171691
        >>> lft.taxa("24-07-2024", "01-03-2025", 15785.324502, 15774.132706)
        0.00115966
        >>> lft.taxa("21-05-2008", "07-03-2014", 3451.215345, 3426.649594)
        0.00123443
    """
    if any_is_empty(data_liquidacao, data_vencimento, vna, pu):
        return float("nan")

    pu_float = float(pu)
    if pu_float <= 0:
        return float("nan")

    def diferenca_preco(taxa: float) -> float:
        preco = _calcular_pu(vna, cotacao(data_liquidacao, data_vencimento, taxa))
        return float(preco) - pu_float

    taxa_encontrada = utils.encontrar_raiz(diferenca_preco)
    return utils.truncar(taxa_encontrada, 8)

vencimentos(data)

Busca os vencimentos 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 disponíveis.

Examples:

>>> from pyield import lft
>>> lft.vencimentos("22-08-2024")
shape: (14,)
Series: 'data_vencimento' [date]
[
    2024-09-01
    2025-03-01
    2025-09-01
    2026-03-01
    2026-09-01

    2029-03-01
    2029-09-01
    2030-03-01
    2030-06-01
    2030-09-01
]
Source code in pyield/tpf/titulos/lft.py
def vencimentos(data: DateLike) -> pl.Series:
    """
    Busca os vencimentos disponíveis para a data de referência.

    Args:
        data: Data da consulta.

    Returns:
        pl.Series: Série de datas de vencimento disponíveis.

    Examples:
        >>> from pyield import lft
        >>> lft.vencimentos("22-08-2024")
        shape: (14,)
        Series: 'data_vencimento' [date]
        [
            2024-09-01
            2025-03-01
            2025-09-01
            2026-03-01
            2026-09-01

            2029-03-01
            2029-09-01
            2030-03-01
            2030-06-01
            2030-09-01
        ]
    """
    return dados(data)["data_vencimento"]