Metadata-Version: 2.4
Name: fixed-income
Version: 0.1.3
Summary: Python library for analysis of fixed income instruments.
Project-URL: Homepage, https://github.com/siddharthskulkarni/fixed-income
Project-URL: Issues, https://github.com/siddharthskulkarni/fixed-income/issues
Author: Siddharth Kulkarni
License-Expression: MIT
License-File: LICENSE
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX
Classifier: Operating System :: Unix
Classifier: Programming Language :: C
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.9
Requires-Dist: numpy>=1.23
Requires-Dist: scipy>=1.10
Provides-Extra: data
Requires-Dist: qfin-datasets[data]>=0.1.0; extra == 'data'
Provides-Extra: dev
Requires-Dist: build>=1.2; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Requires-Dist: twine>=5.0; extra == 'dev'
Provides-Extra: viz
Requires-Dist: dash>=2.0; extra == 'viz'
Requires-Dist: ipykernel>=6.0; extra == 'viz'
Requires-Dist: jupyter-dash>=0.4; extra == 'viz'
Requires-Dist: matplotlib>=3.8; extra == 'viz'
Requires-Dist: pandas>=2.0; extra == 'viz'
Requires-Dist: plotly>=5.0; extra == 'viz'
Requires-Dist: qfin-datasets[data]>=0.1.0; extra == 'viz'
Requires-Dist: seaborn>=0.13; extra == 'viz'
Description-Content-Type: text/markdown

# fixed-income

## Install

```bash
python3 -m pip install -e .
```

```bash
python3 -m pip install -e '.[data]'   # datasets[data] (FRED, Treasury.gov, NY Fed, CME)
python3 -m pip install -e '.[viz]'    # plotly, dash, matplotlib, …
python3 -m pip install -e '.[dev]'    # pytest, ruff, build
python3 -m pip install -e '.[dev,data,viz]'
```

## Bond risk

```python
from fixed_income import Bond
from fixed_income.risk import macaulay, modified

b = Bond(c=0.05, F=100, T=10, P=95.0)
y = b.ytm()
print(macaulay(b, ytm=y), modified(b, ytm=y))
```

## Nelson–Siegel and NSS on Treasury par

```python
from datasets.data import TreasuryParCurveSource
from fixed_income import NelsonSiegel, NelsonSiegelSvensson

par = TreasuryParCurveSource().fetch()
t = [p.maturity_years for p in par.points]
r = [p.par_yield for p in par.points]

ns = NelsonSiegel(t=t, r=r)
ns.fit()
print("NS tau:", ns.tau)

nss = NelsonSiegelSvensson(t=t, r=r)
nss.fit()
print("NSS tau1/tau2:", nss.tau1, nss.tau2)
```

## SOFR OIS curve, forwards, and Hull–White calibration

```python
from datetime import date
from datasets.data import NyFedSofrSource, CmeSofrSettleBundleSource
from fixed_income import bootstrap_ois_from_sofr, HullWhite, forward_rate_from_discount

as_of = date(2026, 5, 22)
sofr = NyFedSofrSource().fetch(as_of=as_of)
ois = bootstrap_ois_from_sofr(sofr, pillars=[0.25, 0.5, 1.0, 2.0, 5.0])

fwd = forward_rate_from_discount(ois, 0.25, 1.0)
print(f"1y forward (from OIS): {fwd:.4%}")

bundle = CmeSofrSettleBundleSource(trade_date=as_of).fetch(as_of=as_of)
cal = HullWhite.calibrate_to_futures(bundle.sr3, ois)
print(f"HW a={cal.a:.4f}, sigma={cal.sigma:.4f}, RMSE={cal.rmse:.4f}")
```

## Examples

- [`examples/rates_models.ipynb`](examples/rates_models.ipynb)
- [`examples/bonds.ipynb`](examples/bonds.ipynb)

## Dash dashboard

```bash
python3 -m pip install -e '.[viz]'
python3 -c "from fixed_income.viz import create_dash_app; create_dash_app().run_server(debug=True)"
```

## Build / test

```bash
./scripts/build_test.sh
python3 -m pytest tests/test_rates.py -q
```
