Skip to main content

A Python library for analysis of fixed income instruments in Brazil

Project description

PyPI version Made with Python License

PYield: Brazilian Fixed Income Toolkit

PYield is a Python library for analyzing Brazilian fixed income instruments. It fetches and processes data from ANBIMA, BCB, IBGE and B3, returning Polars DataFrames for fast, type-safe data pipelines.

Installation

pip install pyield

Quick Start

import pyield as yd

# Business days (foundation of all calculations)
yd.bday.count("02-01-2025", "15-01-2025")  # -> 9
yd.bday.offset("29-12-2023", 1)            # -> datetime.date(2024, 1, 2)

# DI Futures curve
df = yd.futures("31-05-2024", "DI1")
# Columns: TradeDate, TickerSymbol, ExpirationDate, BDaysToExp, SettlementRate, ...

# Rate interpolation (flat forward, 252 bdays/year convention)
interp = yd.Interpolator("flat_forward", df["BDaysToExp"], df["SettlementRate"])
interp(45)       # -> 0.04833...
interp([30, 60]) # -> pl.Series with interpolated rates

# Treasury bond pricing
yd.ntnb.quotation("31-05-2024", "15-05-2035", 0.061490)  # -> 99.3651

# BCB indicators
yd.bc.selic_over("31-05-2024")  # -> 0.000414...

A Colab notebook with more examples is available:

Open In Colab

Core Building Blocks

Business Days (bday)

The bday module is the foundation of PYield. All date calculations (pricing, duration, forward rates) depend on accurate business day counting with Brazilian holidays.

from pyield import bday

# Count business days (start inclusive, end exclusive)
bday.count("29-12-2023", "02-01-2024")  # -> 1

# Offset by N business days
bday.offset("29-12-2023", 1)  # -> datetime.date(2024, 1, 2)

# Adjust non-business day to next business day
bday.offset("30-12-2023", 0)  # -> datetime.date(2024, 1, 2)

# Generate business day range
bday.generate("22-12-2023", "02-01-2024")
# -> Series: [2023-12-22, 2023-12-26, 2023-12-27, 2023-12-28, 2023-12-29, 2024-01-02]

# Check if date is business day
bday.is_business_day("25-12-2023")  # -> False (Christmas)

All functions support vectorized operations with lists, Series, or arrays.

Rate Interpolation (Interpolator)

The Interpolator class interpolates interest rates using the 252 business days/year convention standard in Brazil.

from pyield import Interpolator

known_bdays = [30, 60, 90]
known_rates = [0.045, 0.05, 0.055]

# Flat forward interpolation (market standard)
interp = Interpolator("flat_forward", known_bdays, known_rates)
interp(45)  # -> 0.04833...

# Linear interpolation
linear = Interpolator("linear", known_bdays, known_rates)
linear(45)  # -> 0.0475

# Vectorized
interp([15, 45, 75])  # -> pl.Series with 3 rates

# Extrapolation (disabled by default, returns NaN)
interp(100)  # -> nan
Interpolator("flat_forward", known_bdays, known_rates, extrapolate=True)(100)  # -> 0.055

Forward Rates (forward, forwards)

Calculate forward rates from spot curves:

from pyield import forward, forwards

# Single forward rate between two points
forward(bday1=10, bday2=20, rate1=0.05, rate2=0.06)  # -> 0.0700952...

# Vectorized forward curve from spot rates
bdays = [10, 20, 30]
rates = [0.05, 0.06, 0.07]
forwards(bdays, rates)  # -> Series: [0.05, 0.070095, 0.090284]

Modules Overview

Module Purpose
bday Business day calendar with Brazilian holidays
futures B3 futures data (DI1, DDI, FRC, DAP, DOL, WDO, IND, WIN)
Interpolator Rate interpolation (flat_forward, linear)
forward / forwards Forward rate calculation
ltn, ntnb, ntnf, lft, ntnc Treasury bond pricing and analytics
anbima ANBIMA data (TPF prices, yield curves, IMA indices)
bc BCB indicators (SELIC, PTAX, repo rates, VNA)
ipca Inflation data (historical and projections)
today / now Current date/time in Brazil (America/Sao_Paulo)

Treasury Bonds

from pyield import ltn, ntnb, ntnf

# Fetch ANBIMA indicative rates
ltn.data("23-08-2024")   # -> DataFrame with LTN bonds
ntnb.data("23-08-2024")  # -> DataFrame with NTN-B bonds

# Calculate bond quotation (base 100)
ntnb.quotation("31-05-2024", "15-05-2035", 0.061490)  # -> 99.3651
ntnb.quotation("31-05-2024", "15-08-2060", 0.061878)  # -> 99.5341

# DI spreads (bps=True multiplies by 10,000)
ntnf.di_spreads("30-05-2025", bps=True)
# -> DataFrame: BondType, MaturityDate, DISpread

Futures Data

from pyield import futures

# DI1 (Interbank Deposit Futures)
futures("31-05-2024", "DI1")

# Other contracts: DDI, FRC, DAP, DOL, WDO, IND, WIN
futures("31-05-2024", "DAP")

# Intraday data (when market is open)
futures("16-01-2025", "DI1")  # Returns live data if called during trading hours

Date Handling

PYield accepts flexible date inputs (DateLike):

  • Strings: "31-05-2024", "31/05/2024", "2024-05-31"
  • datetime.date, datetime.datetime
  • pandas.Timestamp, numpy.datetime64

Scalar functions return datetime.date. Vectorized functions return polars.Series.

Null handling: scalar functions return float('nan') for missing inputs (propagates through calculations). Vectorized functions propagate null element-wise.

from pyield import ntnb, bday

ntnb.quotation(None, "15-05-2035", 0.06149)  # -> nan
bday.count(["01-01-2024", None], "01-02-2024")  # -> Series: [22, null]

Polars Migration (v0.40.0+)

All functions return Polars DataFrames/Series. To convert to Pandas:

df_pandas = df.to_pandas(use_pyarrow_extension_array=True)

Documentation

Full documentation: crdcj.github.io/PYield

Tests

pytest pyield --doctest-modules

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyield-0.42.6.tar.gz (110.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyield-0.42.6-py3-none-any.whl (148.0 kB view details)

Uploaded Python 3

File details

Details for the file pyield-0.42.6.tar.gz.

File metadata

  • Download URL: pyield-0.42.6.tar.gz
  • Upload date:
  • Size: 110.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pyield-0.42.6.tar.gz
Algorithm Hash digest
SHA256 31562cd060fa5d3efbe532550cfed79c6886640d3e049aa06f187163fa624364
MD5 530fb1146a9630caa2fa37d33bcdaf08
BLAKE2b-256 f93297d44d108b653a5f0fb16403be706619691a71067c5d10ce18127f4ee6e8

See more details on using hashes here.

File details

Details for the file pyield-0.42.6-py3-none-any.whl.

File metadata

  • Download URL: pyield-0.42.6-py3-none-any.whl
  • Upload date:
  • Size: 148.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pyield-0.42.6-py3-none-any.whl
Algorithm Hash digest
SHA256 3af648473429505abffbb67912fdeaced93d46bed6e9a9dc97def9c5d6250a75
MD5 6b8dcbd71ffcea49a46cfb4fa7e38ec3
BLAKE2b-256 bbc15d8562d5828dc70f797e48800e8538a27dcd5c3f4f863774a635db6be43f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page