diff --git a/content/python.ipynb b/content/python.ipynb
deleted file mode 100644
index 689e883..0000000
--- a/content/python.ipynb
+++ /dev/null
@@ -1,721 +0,0 @@
-{
- "cells": [
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "# A Python kernel backed by Pyodide\n",
- "\n",
- "![](https://raw.githubusercontent.com/pyodide/pyodide/master/docs/_static/img/pyodide-logo.png)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "import pyodide_kernel\n",
- "pyodide_kernel.__version__"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Simple code execution"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "a = 3"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "a"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "b = 89\n",
- "\n",
- "def sq(x):\n",
- " return x * x\n",
- "\n",
- "sq(b)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "print"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "# Redirected streams"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "import sys\n",
- "\n",
- "print(\"Error !!\", file=sys.stderr)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Error handling"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": true,
- "trusted": true
- },
- "outputs": [],
- "source": [
- "\"Hello\"\n",
- "\n",
- "def dummy_function():\n",
- " import missing_module"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "dummy_function()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Code completion"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### press `tab` to see what is available in `sys` module"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from sys import "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Code inspection"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### using the question mark"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "?print"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### by pressing `shift+tab`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "print("
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Input support"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "name = await input('Enter your name: ')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "'Hello, ' + name"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Rich representation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import display, Markdown, HTML, JSON, Latex"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "## HTML"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "print('Before display')\n",
- "\n",
- "s = '
HTML Title
'\n",
- "display(HTML(s))\n",
- "\n",
- "print('After display')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Markdown"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "Markdown('''\n",
- "# Title\n",
- "\n",
- "**in bold**\n",
- "\n",
- "~~Strikthrough~~\n",
- "''')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Pandas DataFrame"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import numpy as np\n",
- "from string import ascii_uppercase as letters\n",
- "from IPython.display import display\n",
- "\n",
- "df = pd.DataFrame(np.random.randint(0, 100, size=(100, len(letters))), columns=list(letters))\n",
- "df"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Show the same DataFrame "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "df"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## IPython.display module"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import clear_output, display, update_display\n",
- "from asyncio import sleep"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Update display"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "class Square:\n",
- " color = 'PeachPuff'\n",
- " def _repr_html_(self):\n",
- " return '''\n",
- " \n",
- "
''' % self.color\n",
- "square = Square()\n",
- "\n",
- "display(square, display_id='some-square')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "square.color = 'OliveDrab'\n",
- "update_display(square, display_id='some-square')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Clear output"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "print(\"hello\")\n",
- "await sleep(3)\n",
- "clear_output() # will flicker when replacing \"hello\" with \"goodbye\"\n",
- "print(\"goodbye\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "print(\"hello\")\n",
- "await sleep(3)\n",
- "clear_output(wait=True) # prevents flickering\n",
- "print(\"goodbye\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Display classes"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import HTML\n",
- "HTML('''\n",
- " \n",
- "
''')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import Math\n",
- "Math(r'F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import Latex\n",
- "Latex(r\"\"\"\\begin{eqnarray}\n",
- "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n",
- "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n",
- "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n",
- "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n",
- "\\end{eqnarray}\"\"\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import ProgressBar\n",
- "\n",
- "for i in ProgressBar(10):\n",
- " await sleep(0.1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import JSON\n",
- "JSON(['foo', {'bar': ('baz', None, 1.0, 2)}], metadata={}, expanded=True, root='test')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from IPython.display import GeoJSON\n",
- "GeoJSON(\n",
- " data={\n",
- " \"type\": \"Feature\",\n",
- " \"geometry\": {\n",
- " \"type\": \"Point\",\n",
- " \"coordinates\": [11.8, -45.04]\n",
- " }\n",
- " }, url_template=\"http://s3-eu-west-1.amazonaws.com/whereonmars.cartodb.net/{basemap_id}/{z}/{x}/{y}.png\",\n",
- " layer_options={\n",
- " \"basemap_id\": \"celestia_mars-shaded-16k_global\",\n",
- " \"attribution\" : \"Celestia/praesepe\",\n",
- " \"tms\": True,\n",
- " \"minZoom\" : 0,\n",
- " \"maxZoom\" : 5\n",
- " }\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Network requests and JSON"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "import json\n",
- "from js import fetch"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "res = await fetch('https://httpbin.org/get')\n",
- "text = await res.text()\n",
- "obj = json.loads(text) \n",
- "JSON(obj)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Sympy"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "from sympy import Integral, sqrt, symbols, init_printing\n",
- "\n",
- "init_printing()\n",
- "\n",
- "x = symbols('x')\n",
- "\n",
- "Integral(sqrt(1 / x), x)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Magics"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "import os\n",
- "os.listdir()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "%cd /home"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "%pwd"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "current_path = %pwd\n",
- "print(current_path)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "%%writefile test.txt\n",
- "\n",
- "This will create a new file. \n",
- "With the text that you see here."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "%history"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "import time"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "trusted": true
- },
- "outputs": [],
- "source": [
- "%%timeit \n",
- "\n",
- "time.sleep(0.1)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python (Pyodide)",
- "language": "python",
- "name": "python"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "python",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8"
- },
- "orig_nbformat": 4
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/content/rateslib sofr curve.ipynb b/content/rateslib sofr curve.ipynb
new file mode 100644
index 0000000..34e1b35
--- /dev/null
+++ b/content/rateslib sofr curve.ipynb
@@ -0,0 +1,1166 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "59b97624-c832-4d96-ada4-2c1f26d9f1ca",
+ "metadata": {},
+ "source": [
+ "## Construct a SOFR curve and value an IRS\n",
+ "\n",
+ "This notebook illustrates how a SOFR curve can be calibrated against input instruments, then used to price and risk an interest rate swap.\n",
+ "\n",
+ "All code taken from https://rateslib.readthedocs.io/en/1.1.x/z_swpm.html\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "1df0a125-3436-4f35-9304-51b4cf0b86a4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Install rateslib if running on pyodide.\n",
+ "import platform\n",
+ "if platform.system() == 'Emscripten':\n",
+ " import micropip\n",
+ " await micropip.install('rateslib')\n",
+ " package_list = micropip.list()\n",
+ " package_list[\"rateslib\"]\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b4c11275-a75b-41a7-b3e1-06ed10105876",
+ "metadata": {},
+ "source": [
+ "We first set-up the market data inputs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "cb214882-5398-413b-a9c7-e17c4b317117",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Term | \n",
+ " Rate | \n",
+ " Termination | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 1W | \n",
+ " 5.30111 | \n",
+ " 2023-08-28 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2W | \n",
+ " 5.30424 | \n",
+ " 2023-09-05 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3W | \n",
+ " 5.30657 | \n",
+ " 2023-09-11 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 1M | \n",
+ " 5.31100 | \n",
+ " 2023-09-21 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 2M | \n",
+ " 5.34800 | \n",
+ " 2023-10-23 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 3M | \n",
+ " 5.38025 | \n",
+ " 2023-11-21 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 4M | \n",
+ " 5.40915 | \n",
+ " 2023-12-21 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 5M | \n",
+ " 5.43078 | \n",
+ " 2024-01-22 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " 6M | \n",
+ " 5.44235 | \n",
+ " 2024-02-21 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " 7M | \n",
+ " 5.44950 | \n",
+ " 2024-03-21 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " 8M | \n",
+ " 5.44878 | \n",
+ " 2024-04-22 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " 9M | \n",
+ " 5.44100 | \n",
+ " 2024-05-21 | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " 10M | \n",
+ " 5.42730 | \n",
+ " 2024-06-21 | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " 11M | \n",
+ " 5.40747 | \n",
+ " 2024-07-22 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " 12M | \n",
+ " 5.38390 | \n",
+ " 2024-08-21 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 18M | \n",
+ " 5.09195 | \n",
+ " 2025-02-21 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 2Y | \n",
+ " 4.85785 | \n",
+ " 2025-08-21 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 3Y | \n",
+ " 4.51845 | \n",
+ " 2026-08-21 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 4Y | \n",
+ " 4.31705 | \n",
+ " 2027-08-23 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Term Rate Termination\n",
+ "0 1W 5.30111 2023-08-28\n",
+ "1 2W 5.30424 2023-09-05\n",
+ "2 3W 5.30657 2023-09-11\n",
+ "3 1M 5.31100 2023-09-21\n",
+ "4 2M 5.34800 2023-10-23\n",
+ "5 3M 5.38025 2023-11-21\n",
+ "6 4M 5.40915 2023-12-21\n",
+ "7 5M 5.43078 2024-01-22\n",
+ "8 6M 5.44235 2024-02-21\n",
+ "9 7M 5.44950 2024-03-21\n",
+ "10 8M 5.44878 2024-04-22\n",
+ "11 9M 5.44100 2024-05-21\n",
+ "12 10M 5.42730 2024-06-21\n",
+ "13 11M 5.40747 2024-07-22\n",
+ "14 12M 5.38390 2024-08-21\n",
+ "15 18M 5.09195 2025-02-21\n",
+ "16 2Y 4.85785 2025-08-21\n",
+ "17 3Y 4.51845 2026-08-21\n",
+ "18 4Y 4.31705 2027-08-23"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from datetime import datetime as dt\n",
+ "import pandas as pd\n",
+ "import rateslib as rl\n",
+ "\n",
+ "as_of_date = dt(2023, 8, 17)\n",
+ "effective_date = rl.add_tenor(as_of_date, \"2b\", \"F\", \"nyc\")\n",
+ "\n",
+ "data = pd.DataFrame({\n",
+ " \"Term\": [\"1W\", \"2W\", \"3W\", \"1M\", \"2M\", \"3M\", \"4M\", \"5M\", \"6M\", \"7M\", \"8M\", \"9M\", \"10M\", \"11M\", \"12M\", \"18M\", \"2Y\", \"3Y\", \"4Y\"],\n",
+ " \"Rate\": [5.30111, 5.30424, 5.30657, 5.31100, 5.34800, 5.38025, 5.40915, 5.43078, 5.44235, 5.44950, 5.44878, 5.44100, 5.42730, 5.40747, 5.3839, 5.09195, 4.85785, 4.51845, 4.31705],\n",
+ "})\n",
+ "data[\"Termination\"] = [rl.add_tenor(effective_date, tenor, \"F\", \"nyc\") for tenor in data[\"Term\"]]\n",
+ "data\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "132c2b29-ef68-48b2-a19c-8d8555aecbcc",
+ "metadata": {},
+ "source": [
+ "A visual representation of the inputs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "e0f0f53c-3047-4f1c-a489-a78d41ad8acc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pd.Series(data.Rate.values, data.Termination).plot(style='+-');\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9139df3f-31ff-4221-b06f-30e2477e0ea5",
+ "metadata": {},
+ "source": [
+ "### Curve structure\n",
+ "\n",
+ "We create a curve with node dates matching the inputs, give the interpolation information."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "b6bd1a71-dff7-4a15-a17b-54ed45351008",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sofr_curve = rl.Curve(\n",
+ " id=\"sofr_curve\",\n",
+ " convention=\"Act360\",\n",
+ " calendar=\"nyc\",\n",
+ " modifier=\"MF\",\n",
+ " interpolation=\"log_linear\",\n",
+ " nodes={\n",
+ " **{as_of_date: 1.0}, # <- this is today's DF,\n",
+ " **{term_dt.to_pydatetime(): 1.0 for term_dt in data[\"Termination\"]},\n",
+ " }\n",
+ ")\n",
+ "sofr_curve\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d64d3dfe-2c00-4943-80a5-d2dc86663b5e",
+ "metadata": {},
+ "source": [
+ "### Create a Solver\n",
+ "\n",
+ "Calibrate the curve to the input instruments using a Solver."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "1b8c010f-009c-4b20-906f-042820390093",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "SUCCESS: `func_tol` reached after 5 iterations (levenberg_marquardt) , `f_val`: 3.116744256634176e-17, `time`: 0.0655s\n"
+ ]
+ }
+ ],
+ "source": [
+ "instruments = [\n",
+ " rl.IRS(termination=term.to_pydatetime(), \n",
+ " effective=effective_date,\n",
+ " spec=\"usd_irs\",\n",
+ " curves=\"sofr_curve\"\n",
+ " ) for term in data[\"Termination\"]\n",
+ "]\n",
+ "\n",
+ "solver = rl.Solver(\n",
+ " curves=[sofr_curve],\n",
+ " instruments=instruments,\n",
+ " s=data[\"Rate\"],\n",
+ " instrument_labels=data[\"Term\"],\n",
+ " id=\"us_rates\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b06dc8ec-793e-42d6-a919-f57f92ef61a6",
+ "metadata": {},
+ "source": [
+ "### Curve results\n",
+ "\n",
+ "Can now read the discount factors from the calibrated curve."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "580bcf24-378c-4d90-be17-d6e6f37efc8f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Term | \n",
+ " Rate | \n",
+ " Termination | \n",
+ " DF | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 1W | \n",
+ " 5.30111 | \n",
+ " 2023-08-28 | \n",
+ " 0.998382 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2W | \n",
+ " 5.30424 | \n",
+ " 2023-09-05 | \n",
+ " 0.997208 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3W | \n",
+ " 5.30657 | \n",
+ " 2023-09-11 | \n",
+ " 0.996327 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 1M | \n",
+ " 5.31100 | \n",
+ " 2023-09-21 | \n",
+ " 0.994862 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 2M | \n",
+ " 5.34800 | \n",
+ " 2023-10-23 | \n",
+ " 0.990145 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 3M | \n",
+ " 5.38025 | \n",
+ " 2023-11-21 | \n",
+ " 0.985856 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 4M | \n",
+ " 5.40915 | \n",
+ " 2023-12-21 | \n",
+ " 0.981421 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 5M | \n",
+ " 5.43078 | \n",
+ " 2024-01-22 | \n",
+ " 0.976721 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " 6M | \n",
+ " 5.44235 | \n",
+ " 2024-02-21 | \n",
+ " 0.972364 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " 7M | \n",
+ " 5.44950 | \n",
+ " 2024-03-21 | \n",
+ " 0.968194 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " 8M | \n",
+ " 5.44878 | \n",
+ " 2024-04-22 | \n",
+ " 0.963676 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " 9M | \n",
+ " 5.44100 | \n",
+ " 2024-05-21 | \n",
+ " 0.959670 | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " 10M | \n",
+ " 5.42730 | \n",
+ " 2024-06-21 | \n",
+ " 0.955477 | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " 11M | \n",
+ " 5.40747 | \n",
+ " 2024-07-22 | \n",
+ " 0.951395 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " 12M | \n",
+ " 5.38390 | \n",
+ " 2024-08-21 | \n",
+ " 0.947546 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 18M | \n",
+ " 5.09195 | \n",
+ " 2025-02-21 | \n",
+ " 0.926160 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 2Y | \n",
+ " 4.85785 | \n",
+ " 2025-08-21 | \n",
+ " 0.907898 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 3Y | \n",
+ " 4.51845 | \n",
+ " 2026-08-21 | \n",
+ " 0.874241 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 4Y | \n",
+ " 4.31705 | \n",
+ " 2027-08-23 | \n",
+ " 0.842731 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Term Rate Termination DF\n",
+ "0 1W 5.30111 2023-08-28 0.998382\n",
+ "1 2W 5.30424 2023-09-05 0.997208\n",
+ "2 3W 5.30657 2023-09-11 0.996327\n",
+ "3 1M 5.31100 2023-09-21 0.994862\n",
+ "4 2M 5.34800 2023-10-23 0.990145\n",
+ "5 3M 5.38025 2023-11-21 0.985856\n",
+ "6 4M 5.40915 2023-12-21 0.981421\n",
+ "7 5M 5.43078 2024-01-22 0.976721\n",
+ "8 6M 5.44235 2024-02-21 0.972364\n",
+ "9 7M 5.44950 2024-03-21 0.968194\n",
+ "10 8M 5.44878 2024-04-22 0.963676\n",
+ "11 9M 5.44100 2024-05-21 0.959670\n",
+ "12 10M 5.42730 2024-06-21 0.955477\n",
+ "13 11M 5.40747 2024-07-22 0.951395\n",
+ "14 12M 5.38390 2024-08-21 0.947546\n",
+ "15 18M 5.09195 2025-02-21 0.926160\n",
+ "16 2Y 4.85785 2025-08-21 0.907898\n",
+ "17 3Y 4.51845 2026-08-21 0.874241\n",
+ "18 4Y 4.31705 2027-08-23 0.842731"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data[\"DF\"] = [float(sofr_curve[term]) for term in data[\"Termination\"]]\n",
+ "data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ecaa0445-9211-4810-94e1-2123ad914064",
+ "metadata": {},
+ "source": [
+ "### Pricing an Instrument\n",
+ "\n",
+ "We create an Interest Rate Swap to price."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "7fdde96a-2e65-4423-b7fa-fb79199706f4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "irs = rl.IRS(\n",
+ " effective=dt(2023, 11, 21),\n",
+ " termination=dt(2025, 2, 21),\n",
+ " notional=-100e6,\n",
+ " fixed_rate=5.40,\n",
+ " curves=\"sofr_curve\",\n",
+ " spec=\"usd_irs\",\n",
+ ")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c9fb1e26-5b7d-4111-811e-461d03ad1888",
+ "metadata": {},
+ "source": [
+ "Then use the solver to price it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "c428f696-0a6a-4a2a-9646-67484608430c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "456622.09860395174"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pv = irs.npv(solver=solver)\n",
+ "pv.real"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ae18df01-a8db-4183-9940-a24b2fa558d8",
+ "metadata": {},
+ "source": [
+ "### Delta\n",
+ "\n",
+ "The solver can now be used to get delta senstivites,"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "9a6091c0-ea89-4170-b66b-37d2a0b0a586",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " | \n",
+ " local_ccy | \n",
+ " usd | \n",
+ "
\n",
+ " \n",
+ " | \n",
+ " | \n",
+ " display_ccy | \n",
+ " usd | \n",
+ "
\n",
+ " \n",
+ " type | \n",
+ " solver | \n",
+ " label | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " instruments | \n",
+ " us_rates | \n",
+ " 1W | \n",
+ " -5.068355e-01 | \n",
+ "
\n",
+ " \n",
+ " 2W | \n",
+ " 4.448341e-14 | \n",
+ "
\n",
+ " \n",
+ " 3W | \n",
+ " 3.262071e-13 | \n",
+ "
\n",
+ " \n",
+ " 1M | \n",
+ " -6.819837e-13 | \n",
+ "
\n",
+ " \n",
+ " 2M | \n",
+ " 6.608491e-13 | \n",
+ "
\n",
+ " \n",
+ " 3M | \n",
+ " 2.484503e+03 | \n",
+ "
\n",
+ " \n",
+ " 4M | \n",
+ " 2.835389e-13 | \n",
+ "
\n",
+ " \n",
+ " 5M | \n",
+ " -1.242682e-12 | \n",
+ "
\n",
+ " \n",
+ " 6M | \n",
+ " 6.003902e+01 | \n",
+ "
\n",
+ " \n",
+ " 7M | \n",
+ " -6.609346e-01 | \n",
+ "
\n",
+ " \n",
+ " 8M | \n",
+ " 9.208455e-13 | \n",
+ "
\n",
+ " \n",
+ " 9M | \n",
+ " -2.533433e-12 | \n",
+ "
\n",
+ " \n",
+ " 10M | \n",
+ " -1.728135e-12 | \n",
+ "
\n",
+ " \n",
+ " 11M | \n",
+ " -1.077498e-12 | \n",
+ "
\n",
+ " \n",
+ " 12M | \n",
+ " 3.042953e-02 | \n",
+ "
\n",
+ " \n",
+ " 18M | \n",
+ " -1.442208e+04 | \n",
+ "
\n",
+ " \n",
+ " 2Y | \n",
+ " -1.265049e+00 | \n",
+ "
\n",
+ " \n",
+ " 3Y | \n",
+ " 1.130177e-04 | \n",
+ "
\n",
+ " \n",
+ " 4Y | \n",
+ " -1.172195e-08 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "local_ccy usd\n",
+ "display_ccy usd\n",
+ "type solver label \n",
+ "instruments us_rates 1W -5.068355e-01\n",
+ " 2W 4.448341e-14\n",
+ " 3W 3.262071e-13\n",
+ " 1M -6.819837e-13\n",
+ " 2M 6.608491e-13\n",
+ " 3M 2.484503e+03\n",
+ " 4M 2.835389e-13\n",
+ " 5M -1.242682e-12\n",
+ " 6M 6.003902e+01\n",
+ " 7M -6.609346e-01\n",
+ " 8M 9.208455e-13\n",
+ " 9M -2.533433e-12\n",
+ " 10M -1.728135e-12\n",
+ " 11M -1.077498e-12\n",
+ " 12M 3.042953e-02\n",
+ " 18M -1.442208e+04\n",
+ " 2Y -1.265049e+00\n",
+ " 3Y 1.130177e-04\n",
+ " 4Y -1.172195e-08"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "delta = irs.delta(solver=solver)\n",
+ "delta"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8f6e7b43-bdd1-4918-968e-f126306f3ffe",
+ "metadata": {},
+ "source": [
+ "Show the strip delta graphically."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "ef0d5e2b-3a47-4210-b210-a60f7c0156ea",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAHACAYAAACs6xw3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8EUlEQVR4nO3dfVxUdd7/8fcgMKDcaKLcJCrmVnJZa4EllIFtgqWp1ZW6bhpbYaTkDdqNN5XRirp5tW5lspWpZVvWmqWbJprKLxNNXDQ1y25E6EI0K5nUBJTv748enMsRMYxhBvH1fDzO4+Gc85nzOd8RZ95855yjzRhjBAAAcIHz8vQBAAAANAaEIgAAABGKAAAAJBGKAAAAJBGKAAAAJBGKAAAAJBGKAAAAJEnenj6A80lVVZVKSkoUGBgom83m6cMBAAB1YIzRTz/9pIiICHl51T4fRCg6ByUlJYqMjPT0YQAAgN+guLhY7dq1q3U7oegcBAYGSvrlRQ0KCvLw0QAAgLpwOByKjIy0PsdrQyg6B9VfmQUFBRGKAAA4z/zaqS+caA0AACBCEQAAgCRCEQAAgCRCEQAAgCRCEQAAgCRCEQAAgCRCEQAAgCRCEQAAgCRCEQAAgCRCEQAAgKRGEIqmT5+u7t27KzAwUG3bttXAgQP1xRdfONWkpKTIZrM5LT169HCqKS8v14MPPqiQkBC1aNFC/fv317fffutU8+OPP2rYsGEKDg5WcHCwhg0bpsOHDzf0EAEAwHnA46EoNzdXo0aN0qZNm7R69WqdOHFCSUlJOnr0qFNdnz59tH//fmtZsWKF0/axY8dq6dKlevPNN7VhwwYdOXJE/fr108mTJ62aoUOHatu2bfrggw/0wQcfaNu2bRo2bJhbxgkAABo3mzHGePogTvXdd9+pbdu2ys3N1Q033CDpl5miw4cP69133z3jc8rKytSmTRu99tprGjx4sCSppKREkZGRWrFihZKTk7V7925FR0dr06ZNuvbaayVJmzZtUlxcnD7//HNddtllv3psDodDwcHBKisr4z+EBQDgPFHXz2+PzxSdrqysTJJ00UUXOa1fv3692rZtq0svvVSpqak6ePCgtW3r1q2qrKxUUlKStS4iIkJdu3bVxo0bJUl5eXkKDg62ApEk9ejRQ8HBwVbN6crLy+VwOJwWAADQNHl7+gBOZYxRRkaGrr/+enXt2tVaf/PNN+vOO+9Uhw4dtHfvXj322GO68cYbtXXrVtntdpWWlsrX11etWrVy2l9oaKhKS0slSaWlpWrbtm2Nnm3btrVqTjd9+nQ9+eSTLhwhLgQdH33/nJ9TOKNvAxwJAOBcNKpQlJ6erk8//VQbNmxwWl/9lZgkde3aVbGxserQoYPef/993X777bXuzxgjm81mPT71z7XVnGrixInKyMiwHjscDkVGRtZ5PAAA4PzRaL4+e/DBB7Vs2TKtW7dO7dq1O2tteHi4OnTooC+//FKSFBYWpoqKCv34449OdQcPHlRoaKhVc+DAgRr7+u6776ya09ntdgUFBTktAACgafJ4KDLGKD09Xe+8847Wrl2rqKioX33O999/r+LiYoWHh0uSYmJi5OPjo9WrV1s1+/fv186dOxUfHy9JiouLU1lZmT755BOrZvPmzSorK7NqAADAhcvjX5+NGjVK//znP/Xee+8pMDDQOr8nODhY/v7+OnLkiKZOnao77rhD4eHhKiws1KRJkxQSEqLbbrvNqr333ns1fvx4tW7dWhdddJEmTJigK664QjfddJMkqUuXLurTp49SU1P1j3/8Q5I0YsQI9evXr05XngEAgKbN46Fo7ty5kqTExESn9fPnz1dKSoqaNWumHTt26NVXX9Xhw4cVHh6uXr16afHixQoMDLTq//a3v8nb21uDBg3Szz//rD/84Q9asGCBmjVrZtW8/vrrGj16tHWVWv/+/fX88883/CABAECj1+juU9SYcZ8i1AVXnwFA43Le3qcIAADAEwhFAAAAIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIIhQBAABIugBD0QsvvKCoqCj5+fkpJiZGH330kacPCQAANAIXVChavHixxo4dq8mTJ6ugoEA9e/bUzTffrKKiIk8fGgAA8DCbMcZ4+iDc5dprr9XVV1+tuXPnWuu6dOmigQMHavr06b/6fIfDoeDgYJWVlSkoKKghDxXnsY6Pvn/Ozymc0bcBjuT8wusGoKHU9fP7gpkpqqio0NatW5WUlOS0PikpSRs3bjzjc8rLy+VwOJwWAADQNHl7+gDc5dChQzp58qRCQ0Od1oeGhqq0tPSMz5k+fbqefPJJdxwemhBmL34bXjc0VcyCnj8umJmiajabzemxMabGumoTJ05UWVmZtRQXF7vjEAEAgAdcMDNFISEhatasWY1ZoYMHD9aYPapmt9tlt9vdcXgAAMDDLpiZIl9fX8XExGj16tVO61evXq34+HgPHRUAAGgsLpiZIknKyMjQsGHDFBsbq7i4OL344osqKipSWlqapw8NAAB42AUVigYPHqzvv/9emZmZ2r9/v7p27aoVK1aoQ4cOnj40AADgYRdUKJKkkSNHauTIkZ4+DAAA0MhcMOcUAQAAnA2hCAAAQIQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASYQiAAAASR4MRYWFhbr33nsVFRUlf39/XXLJJXriiSdUUVHhVGez2Wos2dnZTjU7duxQQkKC/P39dfHFFyszM1PGGKea3NxcxcTEyM/PT506daqxDwAAcGHz9lTjzz//XFVVVfrHP/6hzp07a+fOnUpNTdXRo0c1a9Ysp9r58+erT58+1uPg4GDrzw6HQ71791avXr20ZcsW7dmzRykpKWrRooXGjx8vSdq7d69uueUWpaamatGiRfr44481cuRItWnTRnfccYd7BgwAABo1j4WiPn36OAWdTp066YsvvtDcuXNrhKKWLVsqLCzsjPt5/fXXdfz4cS1YsEB2u11du3bVnj179MwzzygjI8OaWWrfvr1mz54tSerSpYvy8/M1a9YsQhEAAJDUyM4pKisr00UXXVRjfXp6ukJCQtS9e3dlZ2erqqrK2paXl6eEhATZ7XZrXXJyskpKSlRYWGjVJCUlOe0zOTlZ+fn5qqysrPV4ysvL5XA4nBYAANA0NZpQ9PXXX+u5555TWlqa0/qnnnpKb7/9ttasWaMhQ4Zo/PjxysrKsraXlpYqNDTU6TnVj0tLS89ac+LECR06dKjWY5o+fbqCg4OtJTIysl5jBAAAjZfLQ9HUqVPPeHL0qUt+fr7Tc0pKStSnTx/deeeduu+++5y2TZkyRXFxcerWrZvGjx+vzMxMPf300041NpvN6XH1Sdanrq9LzekmTpyosrIyaykuLq7jqwAAAM43Lj+nKD09XUOGDDlrTceOHa0/l5SUqFevXoqLi9OLL774q/vv0aOHHA6HDhw4oNDQUIWFhVkzQtUOHjwo6f9mjGqr8fb2VuvWrWvtZbfbnb6WAwAATZfLQ1FISIhCQkLqVPu///u/6tWrl2JiYjR//nx5ef36xFVBQYH8/PzUsmVLSVJcXJwmTZqkiooK+fr6SpJycnIUERFhha+4uDgtX77caT85OTmKjY2Vj49P3QcHAACaLI+dU1RSUqLExERFRkZq1qxZ+u6771RaWuo0o7N8+XK99NJL2rlzp77++mu9/PLLmjx5skaMGGHN4AwdOlR2u10pKSnauXOnli5dqqysLOvKM0lKS0vTvn37lJGRod27d+uVV17RvHnzNGHCBI+MHQAAND4euyQ/JydHX331lb766iu1a9fOaVv1+T4+Pj564YUXlJGRoaqqKnXq1EmZmZkaNWqUVRscHKzVq1dr1KhRio2NVatWrZSRkaGMjAyrJioqSitWrNC4ceM0Z84cRURE6Nlnn+VyfAAAYLGZ02/9jFo5HA4FBwerrKxMQUFBnj4cAMB5oOOj75/zcwpn9G2AI7lw1fXzu9Fckg8AAOBJhCIAAAARigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACQRigAAACR5OBR17NhRNpvNaXn00UedaoqKinTrrbeqRYsWCgkJ0ejRo1VRUeFUs2PHDiUkJMjf318XX3yxMjMzZYxxqsnNzVVMTIz8/PzUqVMnZWdnN/j4AADA+cPb0weQmZmp1NRU63FAQID155MnT6pv375q06aNNmzYoO+//1533323jDF67rnnJEkOh0O9e/dWr169tGXLFu3Zs0cpKSlq0aKFxo8fL0nau3evbrnlFqWmpmrRokX6+OOPNXLkSLVp00Z33HGHewcMAAAaJY+HosDAQIWFhZ1xW05Ojj777DMVFxcrIiJCkvQ///M/SklJ0bRp0xQUFKTXX39dx48f14IFC2S329W1a1ft2bNHzzzzjDIyMmSz2ZSdna327dtr9uzZkqQuXbooPz9fs2bNIhQBAABJjeCcopkzZ6p169bq1q2bpk2b5vTVWF5enrp27WoFIklKTk5WeXm5tm7datUkJCTIbrc71ZSUlKiwsNCqSUpKcuqbnJys/Px8VVZW1nps5eXlcjgcTgsAAGiaPBqKxowZozfffFPr1q1Tenq6Zs+erZEjR1rbS0tLFRoa6vScVq1aydfXV6WlpbXWVD/+tZoTJ07o0KFDtR7f9OnTFRwcbC2RkZG/fbAAAKBRc3komjp1ao2Tp09f8vPzJUnjxo1TQkKCrrzySt13333Kzs7WvHnz9P3331v7s9lsNXoYY5zWn15TfZL1udacbuLEiSorK7OW4uLiur4MAADgPOPyc4rS09M1ZMiQs9Z07NjxjOt79OghSfrqq6/UunVrhYWFafPmzU41P/74oyorK62Zn7CwMGtGqNrBgwcl6VdrvL291bp161qP0263O30tBwAAmi6Xh6KQkBCFhIT8pucWFBRIksLDwyVJcXFxmjZtmvbv32+ty8nJkd1uV0xMjFUzadIkVVRUyNfX16qJiIiwwldcXJyWL1/u1CsnJ0exsbHy8fH5TccKAACaFo+dU5SXl6e//e1v2rZtm/bu3au33npL999/v/r376/27dtLkpKSkhQdHa1hw4apoKBAH374oSZMmKDU1FQFBQVJkoYOHSq73a6UlBTt3LlTS5cuVVZWlnXlmSSlpaVp3759ysjI0O7du/XKK69o3rx5mjBhgqeGDwAAGhmPXZJvt9u1ePFiPfnkkyovL1eHDh2Umpqqhx9+2Kpp1qyZ3n//fY0cOVLXXXed/P39NXToUM2aNcuqCQ4O1urVqzVq1CjFxsaqVatWysjIUEZGhlUTFRWlFStWaNy4cZozZ44iIiL07LPPcjk+AACw2Mzpt35GrRwOh4KDg1VWVmbNVAEAcDYdH33/nJ9TOKNvAxzJhauun98ev08RAABAY0AoAgAAEKEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAEqEIAABAkgdD0fr162Wz2c64bNmyxao70/bs7Gynfe3YsUMJCQny9/fXxRdfrMzMTBljnGpyc3MVExMjPz8/derUqcY+AADAhc3bU43j4+O1f/9+p3WPPfaY1qxZo9jYWKf18+fPV58+fazHwcHB1p8dDod69+6tXr16acuWLdqzZ49SUlLUokULjR8/XpK0d+9e3XLLLUpNTdWiRYv08ccfa+TIkWrTpo3uuOOOBhwlAAA4X3gsFPn6+iosLMx6XFlZqWXLlik9PV02m82ptmXLlk61p3r99dd1/PhxLViwQHa7XV27dtWePXv0zDPPKCMjw5pZat++vWbPni1J6tKli/Lz8zVr1ixCEQAAkNSIzilatmyZDh06pJSUlBrb0tPTFRISou7duys7O1tVVVXWtry8PCUkJMhut1vrkpOTVVJSosLCQqsmKSnJaZ/JycnKz89XZWVlrcdUXl4uh8PhtAAAgKap0YSiefPmKTk5WZGRkU7rn3rqKb399ttas2aNhgwZovHjxysrK8vaXlpaqtDQUKfnVD8uLS09a82JEyd06NChWo9p+vTpCg4OtpbTjw0AADQdLg9FU6dOrfUE6uolPz/f6TnffvutVq1apXvvvbfG/qZMmaK4uDh169ZN48ePV2Zmpp5++mmnmtO/bqs+yfrU9XWpOd3EiRNVVlZmLcXFxXV4BQAAwPnI5ecUpaena8iQIWet6dixo9Pj+fPnq3Xr1urfv/+v7r9Hjx5yOBw6cOCAQkNDFRYWZs0IVTt48KCk/5sxqq3G29tbrVu3rrWX3W53+loOAAA0XS4PRSEhIQoJCalzvTFG8+fP1/Dhw+Xj4/Or9QUFBfLz81PLli0lSXFxcZo0aZIqKirk6+srScrJyVFERIQVvuLi4rR8+XKn/eTk5Cg2NrZOPQEAQNPn8XOK1q5dq717957xq7Ply5frpZde0s6dO/X111/r5Zdf1uTJkzVixAhrBmfo0KGy2+1KSUnRzp07tXTpUmVlZVlXnklSWlqa9u3bp4yMDO3evVuvvPKK5s2bpwkTJrh1rAAAoPHy2CX51ebNm6f4+Hh16dKlxjYfHx+98MILysjIUFVVlTp16qTMzEyNGjXKqgkODtbq1as1atQoxcbGqlWrVsrIyFBGRoZVExUVpRUrVmjcuHGaM2eOIiIi9Oyzz3I5PgAAsNjM6bd+Rq0cDoeCg4NVVlamoKAgTx8OAOA80PHR98/5OYUz+jbAkVy46vr57fGvzwAAABoDQhEAAIAIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIIRQAAAJIaOBRNmzZN8fHxat68uVq2bHnGmqKiIt16661q0aKFQkJCNHr0aFVUVDjV7NixQwkJCfL399fFF1+szMxMGWOcanJzcxUTEyM/Pz916tRJ2dnZNXotWbJE0dHRstvtio6O1tKlS102VgAAcH5r0FBUUVGhO++8Uw888MAZt588eVJ9+/bV0aNHtWHDBr355ptasmSJxo8fb9U4HA717t1bERER2rJli5577jnNmjVLzzzzjFWzd+9e3XLLLerZs6cKCgo0adIkjR49WkuWLLFq8vLyNHjwYA0bNkzbt2/XsGHDNGjQIG3evLnhXgAAAHDesJnTp1wawIIFCzR27FgdPnzYaf3KlSvVr18/FRcXKyIiQpL05ptvKiUlRQcPHlRQUJDmzp2riRMn6sCBA7Lb7ZKkGTNm6LnnntO3334rm82mRx55RMuWLdPu3butfaelpWn79u3Ky8uTJA0ePFgOh0MrV660avr06aNWrVrpjTfeqNM4HA6HgoODVVZWpqCgoPq8JACAC0THR98/5+cUzujbAEdy4arr57dHzynKy8tT165drUAkScnJySovL9fWrVutmoSEBCsQVdeUlJSosLDQqklKSnLad3JysvLz81VZWXnWmo0bN9Z6fOXl5XI4HE4LAABomjwaikpLSxUaGuq0rlWrVvL19VVpaWmtNdWPf63mxIkTOnTo0FlrqvdxJtOnT1dwcLC1REZG/oZRAgCA88E5h6KpU6fKZrOddcnPz6/z/mw2W411xhin9afXVH/j54qaM/WvNnHiRJWVlVlLcXHxrw0HAACcp7zP9Qnp6ekaMmTIWWs6duxYp32FhYXVONH5xx9/VGVlpTWrExYWVmM25+DBg5L0qzXe3t5q3br1WWtOnz06ld1ud/raDgAANF3nHIpCQkIUEhLikuZxcXGaNm2a9u/fr/DwcElSTk6O7Ha7YmJirJpJkyapoqJCvr6+Vk1ERIQVvuLi4rR8+XKnfefk5Cg2NlY+Pj5WzerVqzVu3Dinmvj4eJeMBQAAnN8a9JyioqIibdu2TUVFRTp58qS2bdumbdu26ciRI5KkpKQkRUdHa9iwYSooKNCHH36oCRMmKDU11To7fOjQobLb7UpJSdHOnTu1dOlSZWVlKSMjw/rqKy0tTfv27VNGRoZ2796tV155RfPmzdOECROsYxkzZoxycnI0c+ZMff7555o5c6bWrFmjsWPHNuRLAAAAzhMNekl+SkqKFi5cWGP9unXrlJiYKOmX4DRy5EitXbtW/v7+Gjp0qGbNmuX0tdWOHTs0atQoffLJJ2rVqpXS0tL0+OOPO50PlJubq3HjxmnXrl2KiIjQI488orS0NKe+//rXvzRlyhR98803uuSSSzRt2jTdfvvtdR4Pl+QDAM4Vl+R7Xl0/v91yn6KmglAEADhXhCLPOy/uUwQAANBYEIoAAABEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKAIAAJDUwKFo2rRpio+PV/PmzdWyZcsa27dv364//vGPioyMlL+/v7p06aK///3vTjWFhYWy2Ww1lg8++MCpLjc3VzExMfLz81OnTp2UnZ1do9+SJUsUHR0tu92u6OhoLV261KXjBQAA568GDUUVFRW688479cADD5xx+9atW9WmTRstWrRIu3bt0uTJkzVx4kQ9//zzNWrXrFmj/fv3W8uNN95obdu7d69uueUW9ezZUwUFBZo0aZJGjx6tJUuWWDV5eXkaPHiwhg0bpu3bt2vYsGEaNGiQNm/e7PqBAwCA847NGGMausmCBQs0duxYHT58+FdrR40apd27d2vt2rWSfpkpioqKUkFBgbp163bG5zzyyCNatmyZdu/eba1LS0vT9u3blZeXJ0kaPHiwHA6HVq5cadX06dNHrVq10htvvFGncTgcDgUHB6usrExBQUF1eg4A4MLW8dH3z/k5hTP6NsCRXLjq+vnd6M4pKisr00UXXVRjff/+/dW2bVtdd911+te//uW0LS8vT0lJSU7rkpOTlZ+fr8rKyrPWbNy4sdZjKS8vl8PhcFoAAEDT1KhCUV5ent566y3df//91rqAgAA988wz+te//qUVK1boD3/4gwYPHqxFixZZNaWlpQoNDXXaV2hoqE6cOKFDhw6dtaa0tLTW45k+fbqCg4OtJTIy0hXDBAAAjdA5h6KpU6ee8cTnU5f8/PxzPpBdu3ZpwIABevzxx9W7d29rfUhIiMaNG6drrrlGsbGxyszM1MiRI/XXv/7V6fk2m83pcfW3gqeuP1PN6etONXHiRJWVlVlLcXHxOY8LAACcH7zP9Qnp6ekaMmTIWWs6dux4Tvv87LPPdOONNyo1NVVTpkz51foePXro5Zdfth6HhYXVmPE5ePCgvL291bp167PWnD57dCq73S673X4uQwEAAOepcw5FISEhCgkJcdkB7Nq1SzfeeKPuvvtuTZs2rU7PKSgoUHh4uPU4Li5Oy5cvd6rJyclRbGysfHx8rJrVq1dr3LhxTjXx8fEuGAUAADjfnXMoOhdFRUX64YcfVFRUpJMnT2rbtm2SpM6dOysgIEC7du1Sr169lJSUpIyMDGsmp1mzZmrTpo0kaeHChfLx8dFVV10lLy8vLV++XM8++6xmzpxp9UlLS9Pzzz+vjIwMpaamKi8vT/PmzXO6qmzMmDG64YYbNHPmTA0YMEDvvfee1qxZow0bNjTkSwAAAM4TDRqKHn/8cS1cuNB6fNVVV0mS1q1bp8TERL399tv67rvv9Prrr+v111+36jp06KDCwkLr8V/+8hft27dPzZo106WXXqpXXnlFd911l7U9KipKK1as0Lhx4zRnzhxFRETo2Wef1R133GHVxMfH680339SUKVP02GOP6ZJLLtHixYt17bXXNuArAAAAzhduuU9RU8F9igAA54r7FHneeXufIgAAAE8gFAEAAIhQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIIlQBAAAIEny9vQBAADQlBXO6OvpQ0AdMVMEAAAgQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAICkBg5F06ZNU3x8vJo3b66WLVuescZms9VYsrOznWp27NihhIQE+fv76+KLL1ZmZqaMMU41ubm5iomJkZ+fnzp16lRjH5K0ZMkSRUdHy263Kzo6WkuXLnXZWAEAwPmtQUNRRUWF7rzzTj3wwANnrZs/f772799vLXfffbe1zeFwqHfv3oqIiNCWLVv03HPPadasWXrmmWesmr179+qWW25Rz549VVBQoEmTJmn06NFasmSJVZOXl6fBgwdr2LBh2r59u4YNG6ZBgwZp8+bNrh84AAA479jM6VMuDWDBggUaO3asDh8+XPMAbDYtXbpUAwcOPONz586dq4kTJ+rAgQOy2+2SpBkzZui5557Tt99+K5vNpkceeUTLli3T7t27reelpaVp+/btysvLkyQNHjxYDodDK1eutGr69OmjVq1a6Y033qjTOBwOh4KDg1VWVqagoKA6jh4AAHhSXT+/G8U5Renp6QoJCVH37t2VnZ2tqqoqa1teXp4SEhKsQCRJycnJKikpUWFhoVWTlJTktM/k5GTl5+ersrLyrDUbN26s9bjKy8vlcDicFgAA0DR5PBQ99dRTevvtt7VmzRoNGTJE48ePV1ZWlrW9tLRUoaGhTs+pflxaWnrWmhMnTujQoUNnranex5lMnz5dwcHB1hIZGfnbBwoAABq1cw5FU6dOPePJ0acu+fn5dd7flClTFBcXp27dumn8+PHKzMzU008/7VRjs9mcHld/43fq+t9ac/q6U02cOFFlZWXWUlxcXOdxAQCA84v3uT4hPT1dQ4YMOWtNx44df+vxqEePHnI4HDpw4IBCQ0MVFhZWYzbn4MGDkv5vxqi2Gm9vb7Vu3fqsNafPHp3Kbrc7fW0HAACarnMORSEhIQoJCWmIY5EkFRQUyM/Pz7qEPy4uTpMmTVJFRYV8fX0lSTk5OYqIiLDCV1xcnJYvX+60n5ycHMXGxsrHx8eqWb16tcaNG+dUEx8f32BjAQAA549zDkXnoqioSD/88IOKiop08uRJbdu2TZLUuXNnBQQEaPny5SotLVVcXJz8/f21bt06TZ48WSNGjLBmaIYOHaonn3xSKSkpmjRpkr788ktlZWXp8ccft776SktL0/PPP6+MjAylpqYqLy9P8+bNc7qqbMyYMbrhhhs0c+ZMDRgwQO+9957WrFmjDRs21Hk81V/JccI1AADnj+rP7V+94N40oLvvvttIqrGsW7fOGGPMypUrTbdu3UxAQIBp3ry56dq1q5k9e7aprKx02s+nn35qevbsaex2uwkLCzNTp041VVVVTjXr1683V111lfH19TUdO3Y0c+fOrXE8b7/9trnsssuMj4+Pufzyy82SJUvOaTzFxcVnHA8LCwsLCwtL41+Ki4vP+jnvlvsUNRVVVVUqKSlRYGDgWU/QPpXD4VBkZKSKi4sb9N5G9KGPO/u4sxd96EOfxt/Hnb1+Sx9jjH766SdFRETIy6v2a8wa9OuzpsbLy0vt2rX7Tc8NCgpyyw0f6UMfd/ZxZy/60Ic+jb+PO3uda5/g4OBfrfH4fYoAAAAaA0IRAACACEUNzm6364knnmjw+x3Rhz7u7OPOXvShD30afx939mrIPpxoDQAAIGaKAAAAJBGKAAAAJBGKAAAAJBGKAAAAJBGKAAAAJBGKzkvHjh3z9CEAABqZI0eOePoQXMoT4+GSfBc6duyYmjdv3uB9fH19de2116pXr17q1auX4uPjG+R+De4aj7tkZmbWqe7xxx9v4CNxjaY2Hqnpjcld42lqrxt+m6ioKC1cuFA33HBDg/c6cuSIAgICGrSHO8dTjVDkQu4KK6+99ppyc3O1fv16ffPNN/Lz81OPHj2svtdee618fHzq3cdd45Hc86bu5eWliIgItW3bVrX92NtsNv3nP//5zT0k931AuWs8UtMbU1Mbjzt/Fl599dU61Q0fPpw+bu7z8MMPa/bs2XrwwQeVlZXVoDdRdEdgced4qhGKXMhdYeVU3377rdauXavc3FytW7dO+/btk7+/v6677jqtWrWqXvt253jc8aZ+yy23aN26dUpOTtY999yjvn37qlmzZr95f7Vx1weUu8YjNb0xNbXxuPtnISAgQN7e3md97X744Qf6eKDPpk2bdM8998hms+m1117T1VdfXa/91cZdgcVd47EYNIji4mKzcOFCc88995ioqCjj5eVlWrRoYZKSkhqs5549e8yUKVNMUFCQ8fLycum+G3o8N998s/Hz8zMDBgww7733njlx4oRL9nu6kpISk5WVZS699FITFhZmHn74YfP555+7tIe7xmKMe8ZjTNMbU1Mbjzv7REdHm9atW5sxY8aY7du3u3z/9Km/48ePmwkTJhg/Pz9z6623mttuu81pcZW8vDzTpUsXEx0dbbZu3eqy/Z7OXeMxxhhCkRs0VFj5+uuvzcsvv2zuuusu065dOxMYGGiSk5PNtGnTzIYNG1zW53QNNR53valXy83NNSkpKSYwMNDEx8ebY8eOuWzf7h6LMQ07HmOa3pia2njc2WfTpk1mxIgRJjg42MTExJgXXnjBlJWVubQHfX67srIyM3z4cOPv72/uuusuk5KS4rS4kjsCizvHQyhqAA0dVoYPH24iIyNNy5YtTd++fc3MmTPNpk2bGuy3XU+EL3d8eBw7dswsXLjQXHPNNcbf379B3pyMcd8HobvGY0zTG1NTG4+7+yQmJprmzZuboUOHmuPHj9PHg31WrVpl2rVrZ6655hqze/dul+zzbBo6sLh7PIQiF3JXWLHZbKZDhw7mr3/9q9m6daupqqpy6f6ruTt8naoh39Q3btxo7rvvPhMUFGRiY2PNnDlzzI8//uiy/Z+uoT+g3D0eY5remJrKeDzxs2DML6EyMTHReHl5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ISoqyvptes+ePcbLy8u89dZb1vb333/fdOzYsd59xowZY7p27WpWrlxp1q5da3r16uUUTD744ANzySWX1LuPMb8EvbP9fO3YscNlwbW2X5Sq17vi7ygiIsJs3rzZenz8+HEzYMAA061bN/P999+77P30TAF5x44d1uO9e/e6JCCjfghFLuSO2Q5jmuaMx6233moee+yxWrdv27at3r/huGtq2RPTysY07NSyzWYzV1xxhbnqqqtMQECAeeedd5y25+bmmosvvrjeff73f//XdOzY0dxwww0mIyPD+Pv7m+uvv96kpqaaG264wfj6+pr333+/3n1qC0XVqqqqTE5OTr37TJ482bRp08bcd999JioqykycONG0b9/ezJ0712RnZ5vIyEgzbty4evf56aefzKBBg4y3t7ex2WwmPj7efPPNN9b2VatWOYWx+oiIiDDvvvturduXLl3qkq/qQkJCzLx580xhYeEZl/fff98l/15btGhh9uzZ47SusrLSDBw40PpFwxV9qn/xMuaXn3Obzeb0s7x+/XqXzLaifup3yQOchIeHa86cORo4cOAZt2/btk0xMTH17vPzzz/XuFplzpw58vLyUkJCgv75z3/Wu8fpvLy85Ofn53S/iMDAQJWVlblk/w899JCOHj1a6/bOnTvX+x5Ft912m9544w0NGzasxrbnn39eVVVVys7OrlcPSXrggQecru7o2rWr0/aVK1e65Oqz0w0ZMkTXX3+9tm7dqg4dOrh030888YTT49Ovely+fLlLruSKiIhQQUGBZsyYoeXLl8sYo08++UTFxcW67rrr9PHHHys2NrbefTp06HDWS9RtNpt69+5d7z5PPvmk/P39tWnTJt1///165JFHdOWVV+rhhx/WsWPHdOutt+qpp56qd5+AgAAtXrxYx48f14kTJxQQEOC0PSkpqd49qqWmpuruu+/WlClT1Lt3b4WGhspms6m0tFSrV69WVlaWxo4dW+8+MTExKikpqfVn+fDhwzIuuHi6U6dO+vTTT/W73/3OWuft7a23335bd955p/r161fvHpI0YMAA3Xvvvbr77ru1bNkyDR8+XOPHj5eXl5dsNpseeughl/494TfydCprStwx22FM05/xANC4zZgxw4SHh1uz39Uz5OHh4WbmzJku6fHOO++Y1157rdbtP/zwg1mwYEG9+zz88MMmKSnpjNsqKytN//79XfK+feTIEXPfffeZrl27mrS0NFNRUWGefvpp4+vra2w2m0lMTDzr7CXcg/sUudBHH32ko0ePqk+fPmfcfvToUeXn59f7ZofTp0/XRx99pBUrVpxx+8iRI5Wdna2qqqp69cnOzlZkZKT69u17xu2TJ0/WgQMH9PLLL9erD4Dz0969e6370ISFhVn3lzqfnDhxQseOHVNQUNAZt588eVLffvuty2dfqx0/flyVlZXcQ6qRIBQBAFzGVTdapQ88gVAEAHCZ7du36+qrr3b5f0hNH7gDJ1oDAOps2bJlZ91e3/84lT7wJGaKAAB1Vn211Nk+Omw2W71nPOgDT/Dy9AEAAM4f4eHhWrJkiaqqqs64/Oc//6GPB/ugfghFAIA6i4mJOesH+K/NhtCnYfugfjinCABQZ+640Sp94CmcUwQAACC+PgMAAJBEKAIAAJBEKAIAAJBEKAIAAJBEKALQhCQmJmrs2LF1ql2/fr1sNpsOHz5cr54dO3bU7Nmz67UPAI0DoQgAAECEIgAAAEmEIgBN1KJFixQbG6vAwECFhYVp6NChOnjwYI26jz/+WL///e/l5+ena6+9Vjt27HDavnHjRt1www3y9/dXZGSkRo8efdab8AE4fxGKADRJFRUVeuqpp7R9+3a9++672rt3r1JSUmrUPfTQQ5o1a5a2bNmitm3bqn///qqsrJQk7dixQ8nJybr99tv16aefavHixdqwYYPS09PdPBoA7sB/8wGgSbrnnnusP3fq1EnPPvusrrnmGh05ckQBAQHWtieeeEK9e/eWJC1cuFDt2rXT0qVLNWjQID399NMaOnSodfL27373Oz377LNKSEjQ3Llz5efn59YxAWhYzBQBaJIKCgo0YMAAdejQQYGBgUpMTJQkFRUVOdXFxcVZf77ooot02WWXaffu3ZKkrVu3asGCBQoICLCW5ORkVVVVae/evW4bCwD3YKYIQJNz9OhRJSUlKSkpSYsWLVKbNm1UVFSk5ORkVVRU/OrzbTabJKmqqkr333+/Ro8eXaOmffv2Lj9uAJ5FKALQ5Hz++ec6dOiQZsyYocjISElSfn7+GWs3bdpkBZwff/xRe/bs0eWXXy5Juvrqq7Vr1y517tzZPQcOwKP4+gxAk9O+fXv5+vrqueee0zfffKNly5bpqaeeOmNtZmamPvzwQ+3cuVMpKSkKCQnRwIEDJUmPPPKI8vLyNGrUKG3btk1ffvmlli1bpgcffNCNowHgLoQiAE1OmzZttGDBAr399tuKjo7WjBkzNGvWrDPWzpgxQ2PGjFFMTIz279+vZcuWydfXV5J05ZVXKjc3V19++aV69uypq666So899pjCw8PdORwAbmIzxhhPHwQAAICnMVMEAAAgQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAkQhEAAIAk6f8DUufn58mfqpgAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "ccy_delta = delta[\"usd\"][\"usd\"]\n",
+ "pd.Series(ccy_delta.values,\n",
+ " ccy_delta.index.get_level_values(\"label\")).plot.bar();"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "40de5a80-d560-4531-81d1-71bb50f85512",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-11879.936804971858"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "float(ccy_delta.sum())\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "56dd1200-b576-4c0d-9ddc-cf509093c056",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-11896.00857729232"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "irs.analytic_delta(curve=sofr_curve).real\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3f1cb833-1040-4989-b857-374eaa5bb58c",
+ "metadata": {},
+ "source": [
+ "### Gamma\n",
+ "\n",
+ "The solver can also be used to get cross-gamma sensitivities."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "2b95e9a6-5f54-4abe-9e3e-a63d36e81f75",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "np.float64(3.176665278863453)"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "irs.gamma(solver=solver).sum().sum()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "273d7003-2599-455a-84cc-1febc307dbd1",
+ "metadata": {},
+ "source": [
+ "### Cashflows\n",
+ "\n",
+ "Show a summary of cashflows to be paid, or get a more detailed breakdown of cashflow information."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "a551b198-4e15-4c84-abbc-14da068963c7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " local_ccy | \n",
+ " USD | \n",
+ "
\n",
+ " \n",
+ " collateral_ccy | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " payment | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 2024-02-23 | \n",
+ " -7613.744059 | \n",
+ "
\n",
+ " \n",
+ " 2025-02-25 | \n",
+ " 501239.067003 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "local_ccy USD\n",
+ "collateral_ccy NaN\n",
+ "payment \n",
+ "2024-02-23 -7613.744059\n",
+ "2025-02-25 501239.067003"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "irs.cashflows_table(solver=solver)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "7bc73206-3323-4323-b633-7e66150c38cc",
+ "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",
+ " 2023-11-21 | \n",
+ " 2024-02-21 | \n",
+ " 2024-02-23 | \n",
+ " act360 | \n",
+ " 0.255556 | \n",
+ " -100000000.0 | \n",
+ " 0.972076 | \n",
+ " None | \n",
+ " 5.400000 | \n",
+ " NaN | \n",
+ " 1.380000e+06 | \n",
+ " 1.341464e+06 | \n",
+ " 1.0 | \n",
+ " 1.341464e+06 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " FixedPeriod | \n",
+ " Regular | \n",
+ " USD | \n",
+ " 2024-02-21 | \n",
+ " 2025-02-21 | \n",
+ " 2025-02-25 | \n",
+ " act360 | \n",
+ " 1.016667 | \n",
+ " -100000000.0 | \n",
+ " 0.925752 | \n",
+ " None | \n",
+ " 5.400000 | \n",
+ " NaN | \n",
+ " 5.490000e+06 | \n",
+ " 5.082380e+06 | \n",
+ " 1.0 | \n",
+ " 5.082380e+06 | \n",
+ "
\n",
+ " \n",
+ " leg2 | \n",
+ " 0 | \n",
+ " FloatPeriod | \n",
+ " Stub | \n",
+ " USD | \n",
+ " 2023-11-21 | \n",
+ " 2024-02-21 | \n",
+ " 2024-02-23 | \n",
+ " act360 | \n",
+ " 0.255556 | \n",
+ " 100000000.0 | \n",
+ " 0.972076 | \n",
+ " None | \n",
+ " 5.429793 | \n",
+ " 0.0 | \n",
+ " -1.387614e+06 | \n",
+ " -1.348865e+06 | \n",
+ " 1.0 | \n",
+ " -1.348865e+06 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " FloatPeriod | \n",
+ " Regular | \n",
+ " USD | \n",
+ " 2024-02-21 | \n",
+ " 2025-02-21 | \n",
+ " 2025-02-25 | \n",
+ " act360 | \n",
+ " 1.016667 | \n",
+ " 100000000.0 | \n",
+ " 0.925752 | \n",
+ " None | \n",
+ " 4.906978 | \n",
+ " 0.0 | \n",
+ " -4.988761e+06 | \n",
+ " -4.618357e+06 | \n",
+ " 1.0 | \n",
+ " -4.618357e+06 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Type Period Ccy Acc Start Acc End Payment Convention \\\n",
+ "leg1 0 FixedPeriod Stub USD 2023-11-21 2024-02-21 2024-02-23 act360 \n",
+ " 1 FixedPeriod Regular USD 2024-02-21 2025-02-21 2025-02-25 act360 \n",
+ "leg2 0 FloatPeriod Stub USD 2023-11-21 2024-02-21 2024-02-23 act360 \n",
+ " 1 FloatPeriod Regular USD 2024-02-21 2025-02-21 2025-02-25 act360 \n",
+ "\n",
+ " DCF Notional DF Collateral Rate Spread \\\n",
+ "leg1 0 0.255556 -100000000.0 0.972076 None 5.400000 NaN \n",
+ " 1 1.016667 -100000000.0 0.925752 None 5.400000 NaN \n",
+ "leg2 0 0.255556 100000000.0 0.972076 None 5.429793 0.0 \n",
+ " 1 1.016667 100000000.0 0.925752 None 4.906978 0.0 \n",
+ "\n",
+ " Cashflow NPV FX Rate NPV Ccy \n",
+ "leg1 0 1.380000e+06 1.341464e+06 1.0 1.341464e+06 \n",
+ " 1 5.490000e+06 5.082380e+06 1.0 5.082380e+06 \n",
+ "leg2 0 -1.387614e+06 -1.348865e+06 1.0 -1.348865e+06 \n",
+ " 1 -4.988761e+06 -4.618357e+06 1.0 -4.618357e+06 "
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "irs.cashflows(solver=solver)\n"
+ ]
+ }
+ ],
+ "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.12.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}