Skip to main content

Linear Rates Quantitative Library package for Python

Project description

linerapy

A quantitative libary for linear interest rates - LineRaPy (Pronunciation: /ˈlɪniər paɪ/). The package introduces two types related to the linear rates: YieldCurve and IRS. The YieldCurve can be constructed using the key rates, e.g. tenors and values. The IRS is constructed from the dictionary. The object of type YieldCurve can be queries for dates and zero rates. The object of type IRS can be queries for price and cash flows. The library currently supports US, USGS calendars and a vanilla IRS paying compounded SOFR vs fixed rate.

The library supports USD, EUR, GBP, SGD, JPY and CHF currencies. The corresponding generators are:

  • USD SOFR SW
  • GBP SONIA SW
  • EUR ESTR SW
  • SGD SORA SW
  • JPY TONA SW
  • CHF SARON SW

The valid calendars are US, USSG, EN, TG, SG, JP and CH. Here TG is the TARGET2 calendar. Supported day count conventions are

  • ACT/360
  • ACT/365F
  • ACT/ACT
  • 30/360
  • 30E/360

To price the swap where the coupon already had started compounding, the user needs to provide the fixings. The user should first check the swap object for required fixing dates and provide the rate fixings for those dates.

The curve implements two interpolation methods

  • LinearLogDf
  • LinearRates

By default the LinearLogDf method is used.

Requirements

  • Python 3.12+
  • Windows / Linux

Installation

pip install linerapy

Usage

import linerapy
import datetime
import pandas as pd

if __name__ == '__main__':
    obj_dict = {
        'id': 'USD SOFR',
        'value date': datetime.date(2026, 3, 20),
        'currency': 'USD',
        'instruments': {
            'generator': ['USD SOFR SW', 'USD SOFR SW', 'USD SOFR SW', 'USD SOFR SW'],
            'tenor': ['1M', '1Y', '5Y', '10Y'],
            'quote': [3.65, 3.65, 3.65, 3.65],
            'in use': [True, True, True, True]
        }
    }

    yield_curve = linerapy.YieldCurve(obj_dict)

    print('Discount Factor:', yield_curve.df(datetime.date(2027, 3, 20)))

    df = pd.DataFrame.from_dict({
        'Date': yield_curve.dates(),
        'Zero Rate': yield_curve.rates(),
        'Discount Factor': [yield_curve.df(d) for d in yield_curve.dates()]})
    print(df)

The IRS can be created from the dictionary by providing the necessary input.

    obj_dict = {
        'id': 'IRS_001',
        'effective date': datetime.date(2026, 3, 24),
        'termination date': datetime.date(2031, 3, 24),
        'schedule roll': 'Backward',
        'leg1': {
            'currency': 'USD',
            'notional': 10000,
            'is fixed': True,
            'is paid': True,
            'rate': 0.0365,
            'calendar': 'US',
            'frequency': '6M',
            'day count convention': 'ACT/360',
            'pay lag': 2,
            'accrual adjustment': 'Modified Following',
            'accrual calendar': 'US',
            'pay adjustment': 'Modified Following',
            'pay calendar': 'US'
        },
        'leg2': {
            'currency': 'USD',
            'notional': 10000,
            'is fixed': False,
            'is paid': False,
            'index': 'SOFR',
            'margin': 0.0025,
            'calendar': 'USD',
            'frequency': '3M',
            'day count convention': 'ACT/360',
            'pay lag': 2,
            'accrual adjustment': 'Modified Following',
            'accrual calendar': 'US',
            'pay adjustment': 'Modified Following',
            'pay calendar': 'US'
        }
    }

    irs = linerapy.IRS(obj_dict)
    npv = irs.price(yield_curve)
    print(npv)

    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', None)

    cf = irs.cashflows(yield_curve)

    df = pd.DataFrame.from_dict(cf['Leg1'])
    print(df)
    df = pd.DataFrame.from_dict(cf['Leg2'])
    print(df)

First request the fixing dates from the swap. Note that the valuation date is to be passed to the method.

    fixings = irs.required_fixings(datetime.date(2026, 4, 10))

Then pass the fixings to the price or cashflow method of the the swap.

    fixings_data = { 'SOFR':
                         {
                             'dates': fixings['SOFR'],
                             'values': [0.02 for d in fixings['SOFR']]
                         }
    }

    cf = irs.cashflows(yield_curve2, fixings_data)
    pvs = irs.price(yield_curve2, fixings_data)

Similarly, the first order Greeks can be calculated:

    pv01 = irs.risk(yield_curve, fixings_data)
    pv01_df = pd.DataFrame.from_dict(pv01)
    print(pv01_df)

API Reference

dates()

Returns the yield curve's dates.

Returns:

  • list: List of dates.

Example:

>>> yield_curve_.dates()
[datetime.date(2026, 4, 28), datetime.date(2026, 9, 28), datetime.date(2027, 3, 26), datetime.date(2028, 3, 28)]

rates()

Returns the zero rates corresponding to the yield curve's dates.

Returns:

  • list: List of zero rates.

Example:

>>> yield_curve_.rates()
[0.03694890857811573, 0.0366704955510695, 0.03634333943914385, 0.03634104468177242]

cashflows(yc, fixings)

Returns leg-wise cash flows. If the yield curve argument provided, the forward rates are estimated and the cash flows are projected.

Parameters:

  • yc (YieldCurve): An optional yield curve argument.
  • fixings (dict): An optional argument for fixings. If the trade has no past compounding dates, this argument is not required.

Returns:

  • dict: Dictionary of leg-wise cash flows.

Example:

>>> irs.cashflows(yield_curve)
Accrual Start Date Accrual End Date Payment Date  Day Count Fraction    Rate  Notional   Cash Flow  Discount Factor  Cash Flow PV
0         2026-03-24       2026-09-24   2026-09-28            0.511111  0.0365   10000.0  186.555556         0.981029    183.016423
1         2026-09-24       2027-03-24   2027-03-26            0.502778  0.0365   10000.0  183.513889         0.963732    176.858158
2         2027-03-24       2027-09-24   2027-09-28            0.511111  0.0365   10000.0  186.555556         0.946050    176.490961
3         2027-09-24       2028-03-24   2028-03-28            0.505556  0.0365   10000.0  184.527778         0.929063    171.438002
4         2028-03-24       2028-09-25   2028-09-27            0.513889  0.0365   10000.0  187.569444         0.912291    171.117831
5         2028-09-25       2029-03-26   2029-03-28            0.505556  0.0365   10000.0  184.527778         0.895910    165.320226
6         2029-03-26       2029-09-24   2029-09-26            0.505556  0.0365   10000.0  184.527778         0.879823    162.351780
7         2029-09-24       2030-03-25   2030-03-27            0.505556  0.0365   10000.0  184.527778         0.864025    159.436635
8         2030-03-25       2030-09-24   2030-09-26            0.508333  0.0365   10000.0  185.541667         0.848426    157.418456
9         2030-09-24       2031-03-24   2031-03-26            0.502778  0.0365   10000.0  183.513889         0.833275    152.917586

price(yc, fixings)

Values the IRS using the yield curve.

Parameters:

  • yc (YieldCurve): A yield curve argument.
  • fixings (dict): An optional fixings argument. It is only required if the swap has past dates on which it compounds the coupon.

Returns:

  • dict: Dictionary of leg-wise PV and the total NPV.

Example:

>>> npv = irs.price(yield_curve)
{'Leg1 PV': -1676.3660572375327, 'Leg2 PV': 1776.4412024912517, 'NPV': 100.07514525371903}

risk(yc, fixings)

Calculates PV01 for each key rate of the yield curve. The results are leg-wise and the netted value. The sensitivities are calculated for 1bp change. The direction of the leg, e.g. pay or receive, is taken into account when the value is return.

Parameters:

  • yc (YieldCurve): A yield curve argument.
  • fixings (dict): An optional fixings argument. It is only required if the swap has past dates on which it compounds the coupon.

Returns:

  • dict: Dictionary of leg-wise PV01 and the Net PV01 for each key rate.

Example:

>>> pv01 = irs.risk(yield_curve, fixings_data)
  Tenor      Leg1      Leg2       Net
0    1M  0.200487  0.176671  0.377158
1    1Y  7.746666 -6.930656  0.816010
2    5Y  0.000000  0.000000  0.000000
3   10Y  0.000000  0.000000  0.000000

License

MIT License - see LICENSE for details.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

linerapy-0.2.1-cp314-cp314-win_amd64.whl (283.4 kB view details)

Uploaded CPython 3.14Windows x86-64

linerapy-0.2.1-cp314-cp314-manylinux_2_39_x86_64.whl (355.1 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.39+ x86-64

linerapy-0.2.1-cp313-cp313-win_amd64.whl (275.7 kB view details)

Uploaded CPython 3.13Windows x86-64

linerapy-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl (355.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

linerapy-0.2.1-cp312-cp312-win_amd64.whl (275.7 kB view details)

Uploaded CPython 3.12Windows x86-64

linerapy-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl (355.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

File details

Details for the file linerapy-0.2.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: linerapy-0.2.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 283.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for linerapy-0.2.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 21dbe6925e649167c4bc226823dde905ee94a989d45512a4564de5dcd7187411
MD5 600fb687e1084f841ab6d5d2dc4a362f
BLAKE2b-256 e1d01c17b7e0e373eda77e614ac8fd71ccfd4baff85c28e1cd3effe9dfbed012

See more details on using hashes here.

File details

Details for the file linerapy-0.2.1-cp314-cp314-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for linerapy-0.2.1-cp314-cp314-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6b173c1614d62c6e22930f7be737424252578302936d5b3f9a1dcce7a371d325
MD5 399acd33e57b800cf118eb168da9c2f9
BLAKE2b-256 50ac8167236c590c8da7d8db89b4dd131fcdba10c2d9b158bc489f4d97b01251

See more details on using hashes here.

File details

Details for the file linerapy-0.2.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: linerapy-0.2.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 275.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for linerapy-0.2.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 30acd2c9fd5bfc496c1e7afeb9ab23df89b4f8388fb4a73a091cba88d25df39c
MD5 1c6621ca4c2a8c07051c4aecd84d957a
BLAKE2b-256 e1d909b0425a60ef746d9c00bb800bee9b666d8b5a641eefa43c2054ff1c8a01

See more details on using hashes here.

File details

Details for the file linerapy-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for linerapy-0.2.1-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 ed27d31b6f543881079fe2ca9d69780e9c80a6828787797b943a1b14def55b7e
MD5 4bbc91fbd308ea5650ec05e8905b6c8c
BLAKE2b-256 c99d837ff3b9e6707b7ed6417f8bed54df2b4dcbca74b3ef18b31e849da7b4cf

See more details on using hashes here.

File details

Details for the file linerapy-0.2.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: linerapy-0.2.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 275.7 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for linerapy-0.2.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0843eee2a3eeb3a87ee0a9ec699b04dd6ffad62af21b2f62c670f8ddc2f6424a
MD5 831c968261eb09862c32774d3088c7f7
BLAKE2b-256 f72dc9115f822c253e7c5184497ceefddd4777a98ac0a4b524f2619a489845c7

See more details on using hashes here.

File details

Details for the file linerapy-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for linerapy-0.2.1-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 e7bbf56ccb15bc8ada364fd2350a862869ffd7682593b5ca55a88e0509abc9ba
MD5 598e54162e644f6ccbfb7fe1385c7b8c
BLAKE2b-256 1035616e69cbfafe94eab05d78d859bd548cab68fdd155ddeec58a664db8a4bb

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