{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b1d93c71-25eb-449c-91a5-e6db4f2a0bc0",
"metadata": {},
"outputs": [],
"source": [
"from rateslib import *"
]
},
{
"cell_type": "markdown",
"id": "088785f3-e9c6-4ba7-bed3-e32828e7f8e6",
"metadata": {},
"source": [
"# Valuing Historical Swaps at Today's Date\n",
"\n",
"A common operation is to want to value a swap which has an *effective* date **in the past**.\n",
"To do this, the swap should not be altered in its definition but it likely requires additional pricing information supplied,\n",
"in the form of **fixings**. See *'Cookbook > Working with Fixings'* for more detail on this aspect."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1bb43c38-edbb-4d9e-931b-3547d6aa5666",
"metadata": {},
"outputs": [],
"source": [
"curve = Curve({dt(2024, 7, 3): 1.0, dt(2025, 7, 3): 0.95}, calendar=\"nyc\")\n",
"irs = IRS(dt(2024, 6, 26), \"1m\", spec=\"usd_irs\", curves=curve, fixed_rate=5.00)"
]
},
{
"cell_type": "markdown",
"id": "5e9f197f-cb20-40bb-8dae-f019eecb39e5",
"metadata": {},
"source": [
"This swap cant price directly because today is 3rd July and it started on 26th June and it is missing information on some of the fixings."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2116d1a4-6b1f-47dd-8f74-9524174ff9e8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RFRs could not be calculated, have you missed providing `fixings` or does the `Curve` begin after the start of a `FloatPeriod` including the `method_param` adjustment?\n",
"For further info see: Documentation > Cookbook > Working with fixings.\n"
]
}
],
"source": [
"try: \n",
" irs.npv()\n",
"except ValueError as e:\n",
" print(e)"
]
},
{
"cell_type": "markdown",
"id": "133a2722-6773-4ae3-9484-302eb4aa064c",
"metadata": {},
"source": [
"The SOFR fixings are needed for the following reference value dates in the past (as measured as of 3rd July 2024):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "77690d3c-f3bb-4247-a7b8-5d6a5402216b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[datetime.datetime(2024, 6, 26, 0, 0),\n",
" datetime.datetime(2024, 6, 27, 0, 0),\n",
" datetime.datetime(2024, 6, 28, 0, 0),\n",
" datetime.datetime(2024, 7, 1, 0, 0),\n",
" datetime.datetime(2024, 7, 2, 0, 0)]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_calendar(\"nyc\").bus_date_range(dt(2024, 6, 26), dt(2024, 7, 2))"
]
},
{
"cell_type": "markdown",
"id": "3831942f-9876-496e-af3f-bd85898959f9",
"metadata": {},
"source": [
"Normally these fixings would be populated by some automated data collection service or CSV file upload, but here they have been manually inserted."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "678fea59-91d1-498b-b7bd-238d1ba4042b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2024-06-26 5.34\n",
"2024-06-27 5.34\n",
"2024-06-28 5.33\n",
"2024-07-01 5.40\n",
"2024-07-02 5.35\n",
"dtype: float64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pandas import Series\n",
"sofr_fixings = Series(\n",
" data=[5.34, 5.34, 5.33, 5.40, 5.35],\n",
" index=get_calendar(\"nyc\").bus_date_range(dt(2024, 6, 26), dt(2024, 7, 2))\n",
")\n",
"sofr_fixings"
]
},
{
"cell_type": "markdown",
"id": "68709cea-ab9d-4368-af52-e2ec56742437",
"metadata": {},
"source": [
"The definition of the swap is altered to **also input the fixings** and then it is repriced with the curve, correctly, without raising errors."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "6515b2eb-c713-4d74-85c2-42143d0e1094",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(113.51930516664925)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"irs = IRS(dt(2024, 6, 26), \"1m\", spec=\"usd_irs\", curves=curve, fixed_rate=5.0, leg2_fixings=sofr_fixings)\n",
"irs.npv()"
]
},
{
"cell_type": "markdown",
"id": "e2a34219-5ad4-48c5-887b-cf2ad4a4b9f8",
"metadata": {},
"source": [
"For further visibility on what rates are used to value the floating leg of the swap the **fixings_table** method can be used on the floating leg."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a71c61e2-7af2-478e-b6c1-8f364b40b401",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" notional \n",
" dcf \n",
" rates \n",
" \n",
" \n",
" obs_dates \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 2024-06-26 \n",
" 0.000000e+00 \n",
" 0.002778 \n",
" 5.340000 \n",
" \n",
" \n",
" 2024-06-27 \n",
" 0.000000e+00 \n",
" 0.002778 \n",
" 5.340000 \n",
" \n",
" \n",
" 2024-06-28 \n",
" 0.000000e+00 \n",
" 0.008333 \n",
" 5.330000 \n",
" \n",
" \n",
" 2024-07-01 \n",
" 0.000000e+00 \n",
" 0.002778 \n",
" 5.400000 \n",
" \n",
" \n",
" 2024-07-02 \n",
" 0.000000e+00 \n",
" 0.002778 \n",
" 5.350000 \n",
" \n",
" \n",
" 2024-07-03 \n",
" 1.000477e+06 \n",
" 0.005556 \n",
" 5.059776 \n",
" \n",
" \n",
" 2024-07-05 \n",
" 1.000759e+06 \n",
" 0.008333 \n",
" 5.060131 \n",
" \n",
" \n",
" 2024-07-08 \n",
" 1.001181e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-09 \n",
" 1.001321e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-10 \n",
" 1.001462e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-11 \n",
" 1.001603e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-12 \n",
" 1.001743e+06 \n",
" 0.008333 \n",
" 5.060131 \n",
" \n",
" \n",
" 2024-07-15 \n",
" 1.002166e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-16 \n",
" 1.002307e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-17 \n",
" 1.002448e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-18 \n",
" 1.002588e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-19 \n",
" 1.002729e+06 \n",
" 0.008333 \n",
" 5.060131 \n",
" \n",
" \n",
" 2024-07-22 \n",
" 1.003152e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-23 \n",
" 1.003293e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-24 \n",
" 1.003434e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
" 2024-07-25 \n",
" 1.003575e+06 \n",
" 0.002778 \n",
" 5.059420 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" notional dcf rates\n",
"obs_dates \n",
"2024-06-26 0.000000e+00 0.002778 5.340000\n",
"2024-06-27 0.000000e+00 0.002778 5.340000\n",
"2024-06-28 0.000000e+00 0.008333 5.330000\n",
"2024-07-01 0.000000e+00 0.002778 5.400000\n",
"2024-07-02 0.000000e+00 0.002778 5.350000\n",
"2024-07-03 1.000477e+06 0.005556 5.059776\n",
"2024-07-05 1.000759e+06 0.008333 5.060131\n",
"2024-07-08 1.001181e+06 0.002778 5.059420\n",
"2024-07-09 1.001321e+06 0.002778 5.059420\n",
"2024-07-10 1.001462e+06 0.002778 5.059420\n",
"2024-07-11 1.001603e+06 0.002778 5.059420\n",
"2024-07-12 1.001743e+06 0.008333 5.060131\n",
"2024-07-15 1.002166e+06 0.002778 5.059420\n",
"2024-07-16 1.002307e+06 0.002778 5.059420\n",
"2024-07-17 1.002448e+06 0.002778 5.059420\n",
"2024-07-18 1.002588e+06 0.002778 5.059420\n",
"2024-07-19 1.002729e+06 0.008333 5.060131\n",
"2024-07-22 1.003152e+06 0.002778 5.059420\n",
"2024-07-23 1.003293e+06 0.002778 5.059420\n",
"2024-07-24 1.003434e+06 0.002778 5.059420\n",
"2024-07-25 1.003575e+06 0.002778 5.059420"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"irs.leg2.fixings_table(curve)"
]
},
{
"cell_type": "markdown",
"id": "5db6cd5d-4079-4939-84b2-a38e71b14182",
"metadata": {},
"source": [
"Alternatively the **cashflows** method gives an alternative, holistic perspective."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "3f1ae9a6-52c6-4788-99df-c7fbfb0aa9a5",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" \n",
" Type \n",
" Period \n",
" Ccy \n",
" Acc Start \n",
" Acc End \n",
" Payment \n",
" Convention \n",
" DCF \n",
" Notional \n",
" DF \n",
" Collateral \n",
" Rate \n",
" Spread \n",
" Cashflow \n",
" NPV \n",
" FX Rate \n",
" NPV Ccy \n",
" \n",
" \n",
" \n",
" \n",
" leg1 \n",
" 0 \n",
" FixedPeriod \n",
" Stub \n",
" USD \n",
" 2024-06-26 \n",
" 2024-07-26 \n",
" 2024-07-30 \n",
" act360 \n",
" 0.083333 \n",
" 1000000.0 \n",
" 0.996213 \n",
" None \n",
" 5.000000 \n",
" NaN \n",
" -4166.666667 \n",
" -4150.887045 \n",
" 1.0 \n",
" -4150.887045 \n",
" \n",
" \n",
" leg2 \n",
" 0 \n",
" FloatPeriod \n",
" Stub \n",
" USD \n",
" 2024-06-26 \n",
" 2024-07-26 \n",
" 2024-07-30 \n",
" act360 \n",
" 0.083333 \n",
" -1000000.0 \n",
" 0.996213 \n",
" None \n",
" 5.136741 \n",
" 0.0 \n",
" 4280.617516 \n",
" 4264.406350 \n",
" 1.0 \n",
" 4264.406350 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Type Period Ccy Acc Start Acc End Payment Convention \\\n",
"leg1 0 FixedPeriod Stub USD 2024-06-26 2024-07-26 2024-07-30 act360 \n",
"leg2 0 FloatPeriod Stub USD 2024-06-26 2024-07-26 2024-07-30 act360 \n",
"\n",
" DCF Notional DF Collateral Rate Spread \\\n",
"leg1 0 0.083333 1000000.0 0.996213 None 5.000000 NaN \n",
"leg2 0 0.083333 -1000000.0 0.996213 None 5.136741 0.0 \n",
"\n",
" Cashflow NPV FX Rate NPV Ccy \n",
"leg1 0 -4166.666667 -4150.887045 1.0 -4150.887045 \n",
"leg2 0 4280.617516 4264.406350 1.0 4264.406350 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"irs.cashflows()"
]
},
{
"cell_type": "markdown",
"id": "23a7a3d7-b54a-4d56-923c-5355c4755986",
"metadata": {},
"source": [
"# Valuing Spot Swaps at Future Dates"
]
},
{
"cell_type": "markdown",
"id": "7b032a8e-f514-4aa0-9859-20f64aa55f91",
"metadata": {},
"source": [
"The current design of *rateslib* targets accurate evaluation of instruments at today's date.\n",
"Valuing swaps as of future dates is something that might be required in calculations such as those for XVA or scenario analysis.\n",
"\n",
"Currently *rateslib* does have some limited features to permit this.\n",
"\n",
"As an example suppose today's date is 3rd July 2024 and we construct an 11m IRS with a monthly frequency. A more granular *Curve* is constructed in this example."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "2fddac98-6219-4fad-bb1a-4dbef0628434",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SUCCESS: `func_tol` reached after 3 iterations (levenberg_marquardt), `f_val`: 2.4782111521459966e-12, `time`: 0.0070s\n"
]
}
],
"source": [
"curve = Curve(\n",
" nodes={\n",
" dt(2024, 7, 3): 1.0,\n",
" dt(2024, 8, 3): 1.0,\n",
" dt(2024, 9, 3): 1.0,\n",
" dt(2024, 10, 3): 1.0,\n",
" dt(2024, 11, 3): 1.0,\n",
" dt(2024, 12, 3): 1.0,\n",
" dt(2025, 1, 3): 1.0,\n",
" dt(2025, 2, 3): 1.0,\n",
" dt(2025, 3, 3): 1.0,\n",
" dt(2025, 4, 3): 1.0,\n",
" dt(2025, 5, 3): 1.0,\n",
" dt(2025, 6, 3): 1.0,\n",
" dt(2025, 7, 3): 1.0,\n",
" },\n",
" calendar=\"nyc\",\n",
")\n",
"solver = Solver(\n",
" curves=[curve],\n",
" instruments=[\n",
" IRS(dt(2024, 7, 3), _, spec=\"usd_irs\", curves=curve) for _ in\n",
" [\"1m\", \"2m\", \"3m\", \"4m\", \"5m\", \"6m\", \"7m\", \"8m\", \"9m\", \"10m\", \"11m\", \"1y\"]\n",
" ],\n",
" s=[5.33, 5.33, 5.315, 5.28, 5.25, 5.21, 5.17, 5.15, 5.11, 5.07, 5.04, 5.00]\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "95d915f9-6cf1-4ec3-afeb-69f868bfe9fb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"irs = IRS(dt(2024, 7, 3), \"11m\", \"M\", spec=\"usd_irs\", curves=curve, fixed_rate=5.04)\n",
"irs.npv()"
]
},
{
"cell_type": "markdown",
"id": "c11f5a3a-4c06-4895-9310-00e5b2d8ae1b",
"metadata": {},
"source": [
"### Today's date as the valuation evaluation date\n",
"Today's date, as the evaluation date, is derived from the initial node date of the **discount curve**, i.e. the date at which the discount factor is necessarily set to be equal to 1.0.\n",
"\n",
"The initial node date can be **translated** on a *Curve* to a date in the future as follows."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "cefe6236-b486-43f9-9842-671a8dc11625",
"metadata": {},
"outputs": [],
"source": [
"translated_curve = curve.translate(dt(2024, 10, 15))"
]
},
{
"cell_type": "markdown",
"id": "50164c36-a87a-4b6a-8fa5-b728cb3cb77a",
"metadata": {},
"source": [
"If the swap is then attempted to be priced with this translated *Curve* it will fail for the same reason as the section above - it cannot forecast rates before it starts."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "115636df-4691-40ee-b861-8c883b578141",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RFRs could not be calculated, have you missed providing `fixings` or does the `Curve` begin after the start of a `FloatPeriod` including the `method_param` adjustment?\n",
"For further info see: Documentation > Cookbook > Working with fixings.\n"
]
}
],
"source": [
"try: \n",
" irs.npv(curves=translated_curve)\n",
"except ValueError as e:\n",
" print(e)"
]
},
{
"cell_type": "markdown",
"id": "dfe8ed39-61d0-4035-95ce-46484f10cdc9",
"metadata": {},
"source": [
"However, in this case the fixings are not known because 15th October 2024 is a future date.\n",
"The solution is to supply a separate **forecast curve** and **discount curve**, where the forecast curve is capable of calculating the relevant rates.\n",
"In this case the forecast curve is the very same curve that is created as of today's date.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
"id": "ef36f6c0169544c9"
},
{
"cell_type": "code",
"execution_count": 13,
"id": "59f5bebc-5b32-4df0-bb3c-c8b7ea1f7cc1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"irs.npv(curves=[curve, translated_curve])"
]
},
{
"cell_type": "markdown",
"id": "451bfa76-2034-4454-b354-d4815b69acb0",
"metadata": {},
"source": [
"When the cashflows are analysed, one can visually inspect that any cashflow that is paid before the initial node date of the discount curve is set to zero value. The floating rates are demonstarted here showing that the floating rates have still been correctly forecast for each *FloatPeriod*."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "bbf1b9f2-1d9a-4c97-829a-2c001aa23096",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" \n",
" Type \n",
" Period \n",
" Ccy \n",
" Acc Start \n",
" Acc End \n",
" Payment \n",
" Convention \n",
" DCF \n",
" Notional \n",
" DF \n",
" Collateral \n",
" Rate \n",
" Spread \n",
" Cashflow \n",
" NPV \n",
" FX Rate \n",
" NPV Ccy \n",
" \n",
" \n",
" \n",
" \n",
" leg2 \n",
" 0 \n",
" FloatPeriod \n",
" Regular \n",
" USD \n",
" 2024-07-03 \n",
" 2024-08-05 \n",
" 2024-08-07 \n",
" act360 \n",
" 0.091667 \n",
" -1000000.0 \n",
" 0.000000 \n",
" None \n",
" 5.330000 \n",
" 0.0 \n",
" 4885.833333 \n",
" 0.00000 \n",
" 1.0 \n",
" 0.00000 \n",
" \n",
" \n",
" 1 \n",
" FloatPeriod \n",
" Regular \n",
" USD \n",
" 2024-08-05 \n",
" 2024-09-03 \n",
" 2024-09-05 \n",
" act360 \n",
" 0.080556 \n",
" -1000000.0 \n",
" 0.000000 \n",
" None \n",
" 5.304085 \n",
" 0.0 \n",
" 4272.735240 \n",
" 0.00000 \n",
" 1.0 \n",
" 0.00000 \n",
" \n",
" \n",
" 2 \n",
" FloatPeriod \n",
" Regular \n",
" USD \n",
" 2024-09-03 \n",
" 2024-10-03 \n",
" 2024-10-07 \n",
" act360 \n",
" 0.083333 \n",
" -1000000.0 \n",
" 0.000000 \n",
" None \n",
" 5.235937 \n",
" 0.0 \n",
" 4363.280847 \n",
" 0.00000 \n",
" 1.0 \n",
" 0.00000 \n",
" \n",
" \n",
" 3 \n",
" FloatPeriod \n",
" Regular \n",
" USD \n",
" 2024-10-03 \n",
" 2024-11-04 \n",
" 2024-11-06 \n",
" act360 \n",
" 0.088889 \n",
" -1000000.0 \n",
" 0.996894 \n",
" None \n",
" 5.109967 \n",
" 0.0 \n",
" 4542.193325 \n",
" 4528.08681 \n",
" 1.0 \n",
" 4528.08681 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Type Period Ccy Acc Start Acc End Payment Convention \\\n",
"leg2 0 FloatPeriod Regular USD 2024-07-03 2024-08-05 2024-08-07 act360 \n",
" 1 FloatPeriod Regular USD 2024-08-05 2024-09-03 2024-09-05 act360 \n",
" 2 FloatPeriod Regular USD 2024-09-03 2024-10-03 2024-10-07 act360 \n",
" 3 FloatPeriod Regular USD 2024-10-03 2024-11-04 2024-11-06 act360 \n",
"\n",
" DCF Notional DF Collateral Rate Spread \\\n",
"leg2 0 0.091667 -1000000.0 0.000000 None 5.330000 0.0 \n",
" 1 0.080556 -1000000.0 0.000000 None 5.304085 0.0 \n",
" 2 0.083333 -1000000.0 0.000000 None 5.235937 0.0 \n",
" 3 0.088889 -1000000.0 0.996894 None 5.109967 0.0 \n",
"\n",
" Cashflow NPV FX Rate NPV Ccy \n",
"leg2 0 4885.833333 0.00000 1.0 0.00000 \n",
" 1 4272.735240 0.00000 1.0 0.00000 \n",
" 2 4363.280847 0.00000 1.0 0.00000 \n",
" 3 4542.193325 4528.08681 1.0 4528.08681 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"irs.cashflows(curves=[curve, translated_curve])[12:16]"
]
},
{
"cell_type": "markdown",
"id": "95c992b3-384e-4fac-9f1a-41f08d717b5d",
"metadata": {},
"source": [
"### Plotting Future Value"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "a70d7516-c035-4752-aa41-d55c983ee245",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"fig, ax = plt.subplots(1,1)\n",
"\n",
"def _npv(date):\n",
" t_curve = curve.translate(date)\n",
" return irs.npv(curves=[curve, t_curve])\n",
" \n",
"dates=[\n",
" dt(2024, 7, 4),\n",
" dt(2024, 8, 10),\n",
" dt(2024, 9, 10),\n",
" dt(2024, 10, 10),\n",
" dt(2024, 11, 10),\n",
" dt(2024, 12, 10),\n",
" dt(2025, 1, 10),\n",
" dt(2025, 2, 10),\n",
" dt(2025, 3, 10),\n",
" dt(2025, 4, 10),\n",
" dt(2025, 5, 10),\n",
" dt(2025, 6, 10),\n",
"]\n",
"\n",
"ax.plot(dates, [_npv(_) for _ in dates])"
]
},
{
"cell_type": "markdown",
"source": [
"The general structure of this plot is as described in the section on *'Cash, Collateral and Credit'* in **Pricing and Trading Interest Rate Derivatives**."
],
"metadata": {
"collapsed": false
},
"id": "3abe852e39428fcc"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}