Skip to main content

pyacm

Python implementation of the ACM Term Premium models

The NominalACM class prices the time series and cross-section of the term structure of interest rates using a three-step linear regression approach. Computations are fast, even with a large number of pricing factors. The object carries all the relevant variables as atributes:

  • The yield curve itself
  • The excess returns from the synthetic zero coupon bonds
  • The principal components of the curve used as princing factors
  • Risk premium parameter estimates
  • Yields fitted by the model
  • Risk-neutral yields
  • Term premium
  • Historical in-sample expected returns
  • Expected return loadings

The RealACM class extends the nominal model to jointly price nominal and real (inflation-linked) yield curves. It decomposes nominal yields into expected real rates, expected inflation, real term premia, inflation risk premia, and a liquidity premium. The state vector combines nominal PCs, orthogonalized real PCs, and an observable liquidity factor. Key attributes include:

  • Nominal and real model-implied yields (miy_n, miy_r)
  • Nominal and real risk-neutral yields (rny_n, rny_r)
  • Nominal and real term premia (tp_n, tp_r)
  • Breakeven inflation and inflation risk premium (breakeven, irp)
  • Forward rate decompositions via forward_rates_ts and forward_rates_cs

Instalation

pip install pyacm

Usage

Nominal

from pyacm import NominalACM

acm = NominalACM(
    curve=yield_curve,
    n_factors=5,
)

The tricky part of using this model is getting the correct data format. The yield_curve dataframe in the expression above requires:

  • Annualized log-yields for zero-coupon bonds
  • Observations (index) must be in either monthly or daily frequency
  • Maturities (columns) must be equally spaced in monthly frequency and start at month 1. This means that you need to construct a bootstraped curve for every date and interpolate it at fixed monthly maturities

Real / Inflation-Linked

from pyacm import RealACM

acm = RealACM(
    nominal_curve=nominal_curve,
    real_curve=real_curve,
    liquidity=liquidity,
    cpi=cpi,
    n_factors_n=3,
    n_factors_r=2,
    selected_maturities_n=[6, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120],
    selected_maturities_r=[24, 36, 48, 60, 72, 84, 96, 108, 120],
)

In addition to the nominal curve requirements above, the RealACM class needs:

  • real_curve: annualized log-yields for real (inflation-linked) zero-coupon bonds. Columns must be consecutive integers in monthly maturities (e.g. 24 to 120)
  • liquidity: a positive pd.Series with an observable liquidity proxy (e.g. fitting errors, relative trading volumes, or a composite index)
  • cpi: a monthly pd.Series with the consumer price index level, used to compute realized inflation
  • selected_maturities_n and selected_maturities_r control which maturities enter the return regressions for the nominal and real curves, respectively

Examples

Nominal

Updated estimates for the US are available on the NY FED website. The file example_us reproduces the original outputs using the same dataset as the authors.

The jupyter notebook example_br contains an example application to the Brazilian DI futures curve that showcases all the available methods and attributes.

DI Term Premium Observed VS Risk Neutral

Real

The file example_real_us replicates the joint Treasury-TIPS decomposition from Abrahams, Adrian, Crump and Moench (2016) using US data.

The jupyter notebook example_real_br applies the RealACM model to Brazilian nominal (LTN/NTN-F) and inflation-linked (NTN-B) yield curves, decomposing yields into expected real rates, expected inflation, real term premia, inflation risk premia, and a liquidity premium.

Real ACM Decomposition

Original Articles

Adrian, Tobias and Crump, Richard K. and Moench, Emanuel, Pricing the Term Structure with Linear Regressions (April 11, 2013). FRB of New York Staff Report No. 340

Abrahams, Michael and Adrian, Tobias and Crump, Richard K. and Moench, Emanuel, Decomposing Real and Nominal Yield Curves (February, 2015). FRB of New York Staff Report No. 570

I would like to thank Emanuel Moench for sharing his original MATLAB code in order to replicate these results.

Citation

Gustavo Amarante (2025). pyacm: Python Implementation of the ACM Term Premium Model. Retrieved from https://github.com/gusamarante/pyacm

Release files for pyacm 2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyacm 2.1
File Size Uploaded
pyacm-2.1.tar.gz 20.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyacm 2.1
File Interpreter ABI Platform
pyacm-2.1-py3-none-any.whl Python 3 none any Details

Total release size:38.5 kB

Release files / pyacm-2.1.tar.gz

Download URL pyacm-2.1.tar.gz
Size 20.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9e6eabc56d847f5093f7a3936476cc071f43ec029a24f6c2d01f1d8eeaee536c
BLAKE2b-256 checksum
How to use checksums
263ae43ba0a89e3acdb73a89daaa6f21cff5bf9f2c6f3979d1c9848da8003cb1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 7, 2026.

Transparency log

Release files / pyacm-2.1-py3-none-any.whl

Download URL pyacm-2.1-py3-none-any.whl
Size 18.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
31931973afd2092f8e968e93cee8517aa0f47314987424992e1d980213ad5735
BLAKE2b-256 checksum
How to use checksums
0f88a5be38f393ed52ea6f9f20207544213511d15dd3c0d5b52af5b1b3a27ff9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.1 This release

2 release files

2.0

2 release files

1.2

2 release files

1.1

2 release files

1.0

2 release files

0.4

2 release files

0.3

2 release files

0.2

2 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page