From 527057c648c1a7000048a673ea8ba60e3760e4de Mon Sep 17 00:00:00 2001 From: Xiaoyu Date: Thu, 2 May 2024 16:10:58 +0800 Subject: [PATCH] add resec nb example --- docs/source/modeling.rst | 2 +- .../nbsample/re_securitization_example.ipynb | 960 ++++++++++++++++++ docs/source/nbsample/runDeal.rst | 3 +- 3 files changed, 963 insertions(+), 2 deletions(-) create mode 100644 docs/source/nbsample/re_securitization_example.ipynb diff --git a/docs/source/modeling.rst b/docs/source/modeling.rst index 35d689a..ac0e00d 100644 --- a/docs/source/modeling.rst +++ b/docs/source/modeling.rst @@ -1354,7 +1354,7 @@ Receivable .. versionadded:: 0.26.5 -``Receivable`` is a type of asset which has a fixed amount of receivable in last period, with optional fee collected at end +``Receivable`` is a type of asset which has a fixed amount of receivable in last period, with optional fee collected at end. It may represent `Invoice` , `Account Receivable` , `Trade Receivable` in the real world. * if No fee was set, the receivable will be paid off at last period without fee. * if there are multiple fee being setup, then ALL fees are sum up and paid off at last period. diff --git a/docs/source/nbsample/re_securitization_example.ipynb b/docs/source/nbsample/re_securitization_example.ipynb new file mode 100644 index 0000000..8e85bae --- /dev/null +++ b/docs/source/nbsample/re_securitization_example.ipynb @@ -0,0 +1,960 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0978bd9d", + "metadata": {}, + "source": [ + "### Run A resecuritization Deal" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "67e1bf5e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Connecting engine server -> https://absbox.org/api/dev\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1;35mConnecting engine server -> \u001b[0m\u001b[1;4;35mhttps://absbox.org/api/dev\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Connected, local lib:0.26.4, server:0.27.10\n",
+       "
\n" + ], + "text/plain": [ + "✅\u001b[1;32mConnected, local li\u001b[0m\u001b[1;32mb:0\u001b[0m\u001b[1;32m.\u001b[0m\u001b[1;32m26.4\u001b[0m\u001b[1;32m, server:\u001b[0m\u001b[1;32m0.27\u001b[0m\u001b[1;32m.\u001b[0m\u001b[1;32m10\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from absbox import API,EnginePath,Generic\n", + "\n", + "localAPI = API(EnginePath.DEV,check=False)" + ] + }, + { + "cell_type": "markdown", + "id": "92e0964f", + "metadata": {}, + "source": [ + "#### What is a ReSec Deal ?" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "005cdf05", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Top Deal\n", + "\n", + "Top Deal\n", + "\n", + "\n", + "\n", + "Child Deal 1\n", + "\n", + "Child Deal 1\n", + "\n", + "\n", + "\n", + "Bond A1\n", + "\n", + "Bond A1\n", + "\n", + "\n", + "\n", + "Child Deal 1->Bond A1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Bond A2\n", + "\n", + "Bond A2\n", + "\n", + "\n", + "\n", + "Child Deal 1->Bond A2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Pool C\n", + "\n", + "Pool C\n", + "\n", + "\n", + "\n", + "Bond A1->Pool C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Pool A\n", + "\n", + "Pool A\n", + "\n", + "\n", + "\n", + "Pool A->Child Deal 1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Pool B\n", + "\n", + "Pool B\n", + "\n", + "\n", + "\n", + "Child Deal 2\n", + "\n", + "Child Deal 2\n", + "\n", + "\n", + "\n", + "Pool B->Child Deal 2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Pool C->Top Deal\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Bond B1\n", + "\n", + "Bond B1\n", + "\n", + "\n", + "\n", + "Child Deal 2->Bond B1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Bond B2\n", + "\n", + "Bond B2\n", + "\n", + "\n", + "\n", + "Child Deal 2->Bond B2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Bond B2->Pool C\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from graphviz import Digraph\n", + "# Create Digraph object\n", + "dot = Digraph()\n", + "dot.node('Top Deal')\n", + "dot.node('Child Deal 1')\n", + "dot.node('Bond A1')\n", + "dot.node('Bond A2')\n", + "\n", + "dot.node(\"Pool A\")\n", + "dot.node(\"Pool B\")\n", + "dot.node(\"Pool C\")\n", + "\n", + "dot.edge(\"Pool B\",'Child Deal 2')\n", + "dot.edge(\"Pool A\",'Child Deal 1')\n", + "dot.edge(\"Pool C\",'Top Deal')\n", + "\n", + "\n", + "dot.edge('Child Deal 1','Bond A1')\n", + "dot.edge('Child Deal 1','Bond A2')\n", + "\n", + "\n", + "dot.node('Child Deal 2')\n", + "dot.node('Bond B1')\n", + "dot.node('Bond B2')\n", + "dot.edge('Child Deal 2','Bond B1')\n", + "dot.edge('Child Deal 2','Bond B2')\n", + "# Add edge between 1 and 2\n", + "dot.edge('Bond A1',\"Pool C\")\n", + "dot.edge('Bond B2',\"Pool C\")\n", + "dot" + ] + }, + { + "cell_type": "markdown", + "id": "96ba58c8", + "metadata": {}, + "source": [ + "In general , Resec deal has a pool of structured tranches, which cashflow comes from other deals." + ] + }, + { + "cell_type": "markdown", + "id": "ff863792", + "metadata": {}, + "source": [ + "##### Underlying Deal\n", + "\n", + "The underlying deal has two tranches. The tranche \"A1\" was bought by \"Top Deal\"." + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "7a8f0158", + "metadata": {}, + "outputs": [], + "source": [ + "test01 = Generic(\n", + " \"underlyingDeal\"\n", + " ,{\"collect\":[\"2022-11-01\" \n", + " ,\"2022-12-01\"] \n", + " ,\"pay\":[\"2022-11-15\" \n", + " ,\"2022-12-15\"] \n", + " ,\"stated\":\"2030-01-01\"\n", + " ,\"poolFreq\":\"MonthEnd\"\n", + " ,\"payFreq\":[\"DayOfMonth\",20]\n", + " }\n", + " ,{'assets':[[\"Mortgage\"\n", + " ,{\"originBalance\":3600,\"originRate\":[\"fix\",0.045],\"originTerm\":30\n", + " ,\"freq\":\"Monthly\",\"type\":\"Level\",\"originDate\":\"2021-02-01\"}\n", + " ,{\"currentBalance\":3600\n", + " ,\"currentRate\":0.08\n", + " ,\"remainTerm\":30\n", + " ,\"status\":\"current\"}]]\n", + " ,'issuanceStat':{\"IssuanceBalance\":2200}}\n", + " ,((\"acc01\",{\"balance\":0}),)\n", + " ,((\"A1\",{\"balance\":1000\n", + " ,\"rate\":0.07\n", + " ,\"originBalance\":1000\n", + " ,\"originRate\":0.07\n", + " ,\"startDate\":\"2022-11-15\"\n", + " ,\"rateType\":{\"Fixed\":0.08}\n", + " ,\"bondType\":{\"Sequential\":None}})\n", + " ,(\"B\",{\"balance\":1000\n", + " ,\"rate\":0.0\n", + " ,\"originBalance\":1000\n", + " ,\"originRate\":0.07\n", + " ,\"startDate\":\"2022-11-15\"\n", + " ,\"rateType\":{\"Fixed\":0.00}\n", + " ,\"bondType\":{\"Equity\":None}\n", + " }))\n", + " ,((\"trusteeFee\",{\"type\":{\"fixFee\":30}}),)\n", + " ,{\"amortizing\":[\n", + " [\"payFee\",\"acc01\",['trusteeFee']]\n", + " ,[\"accrueAndPayInt\",\"acc01\",[\"A1\"]]\n", + " ,[\"payPrin\",\"acc01\",[\"A1\"]]\n", + " ,[\"payPrin\",\"acc01\",[\"B\"]]\n", + " ,[\"payIntResidual\",\"acc01\",\"B\"]\n", + " ]}\n", + " ,[[\"CollectedInterest\",\"acc01\"]\n", + " ,[\"CollectedPrincipal\",\"acc01\"]\n", + " ,[\"CollectedPrepayment\",\"acc01\"]\n", + " ,[\"CollectedRecoveries\",\"acc01\"]]\n", + " ,None\n", + " ,None\n", + " ,None\n", + " ,None\n", + " ,\"Amortizing\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "254953ff", + "metadata": {}, + "source": [ + "##### Top Deal\n", + "\n", + "The top deal bought \n", + "* 100% of tranche A1\n", + "* bought at date \"2022-03-31\", which suggest , tranche cashflow after that date will attribute to Top Deal " + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "7ceec039", + "metadata": {}, + "outputs": [], + "source": [ + "test02 = Generic(\n", + " \"TEST01\"\n", + " ,{\"cutoff\":\"2021-03-01\",\"closing\":\"2021-06-15\",\"firstPay\":\"2021-07-26\"\n", + " ,\"payFreq\":[\"DayOfMonth\",20],\"poolFreq\":\"MonthEnd\",\"stated\":\"2030-01-01\"}\n", + " ,{'deals':\n", + " {(\"A1\",'1 % 1',\"2022-03-31\"):test01}}\n", + " ,((\"acc01\",{\"balance\":0}),)\n", + " ,((\"A1\",{\"balance\":700\n", + " ,\"rate\":0.07\n", + " ,\"originBalance\":700\n", + " ,\"originRate\":0.07\n", + " ,\"startDate\":\"2020-01-03\"\n", + " ,\"rateType\":{\"Fixed\":0.08}\n", + " ,\"bondType\":{\"Sequential\":None}})\n", + " ,(\"B\",{\"balance\":700\n", + " ,\"rate\":0.0\n", + " ,\"originBalance\":700\n", + " ,\"originRate\":0.07\n", + " ,\"startDate\":\"2020-01-03\"\n", + " ,\"rateType\":{\"Fixed\":0.00}\n", + " ,\"bondType\":{\"Equity\":None}\n", + " }))\n", + " ,((\"trusteeFee\",{\"type\":{\"fixFee\":30}}),)\n", + " ,{\"amortizing\":[\n", + " [\"payFee\",\"acc01\",['trusteeFee']]\n", + " ,[\"accrueAndPayInt\",\"acc01\",[\"A1\"]]\n", + " ,[\"payPrin\",\"acc01\",[\"A1\"]]\n", + " ,[\"payPrin\",\"acc01\",[\"B\"]]\n", + " ,[\"payIntResidual\",\"acc01\",\"B\"]\n", + " ]}\n", + " ,[[\"CollectedInterest\",\"acc01\"]\n", + " ,[\"CollectedPrincipal\",\"acc01\"]]\n", + " ,None\n", + " ,None\n", + " ,None\n", + " ,None\n", + " ,(\"PreClosing\",\"Amortizing\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "dc7e8e09", + "metadata": {}, + "source": [ + "#### Inspect Underlying Deal Cashflow\n", + "\n", + "*Optional*\n", + "\n", + "Let's run underlying deal first and get `A1` bond cashflow" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "7fb8facc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Warning Message from server:\n",
+       "Bond B is not paid off\n",
+       "
\n" + ], + "text/plain": [ + "Warning Message from server:\n", + "\u001b[1;33mBond B is not paid off\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
balanceinterestprincipalratecashfactormemo
date
2022-12-15770.175.75229.830.07235.580.77017[<PayInt:A1>, <PayPrin:A1>]
2022-12-20770.170.000.000.070.000.77017[<PayInt:A1>, <PayPrin:A1>]
2023-01-20770.170.000.000.070.000.77017[<PayInt:A1>, <PayPrin:A1>]
2023-02-20647.309.92122.870.07132.790.64730[<PayInt:A1>, <PayPrin:A1>]
2023-03-20517.983.47129.320.07132.790.51798[<PayInt:A1>, <PayPrin:A1>]
2023-04-20388.253.07129.730.07132.800.38825[<PayInt:A1>, <PayPrin:A1>]
2023-05-20257.692.23130.560.07132.790.25769[<PayInt:A1>, <PayPrin:A1>]
2023-06-20126.431.53131.260.07132.790.12643[<PayInt:A1>, <PayPrin:A1>]
2023-07-200.000.72126.430.07127.150.00000[<PayInt:A1>, <PayPrin:A1>]
\n", + "
" + ], + "text/plain": [ + " balance interest principal rate cash factor \\\n", + "date \n", + "2022-12-15 770.17 5.75 229.83 0.07 235.58 0.77017 \n", + "2022-12-20 770.17 0.00 0.00 0.07 0.00 0.77017 \n", + "2023-01-20 770.17 0.00 0.00 0.07 0.00 0.77017 \n", + "2023-02-20 647.30 9.92 122.87 0.07 132.79 0.64730 \n", + "2023-03-20 517.98 3.47 129.32 0.07 132.79 0.51798 \n", + "2023-04-20 388.25 3.07 129.73 0.07 132.80 0.38825 \n", + "2023-05-20 257.69 2.23 130.56 0.07 132.79 0.25769 \n", + "2023-06-20 126.43 1.53 131.26 0.07 132.79 0.12643 \n", + "2023-07-20 0.00 0.72 126.43 0.07 127.15 0.00000 \n", + "\n", + " memo \n", + "date \n", + "2022-12-15 [, ] \n", + "2022-12-20 [, ] \n", + "2023-01-20 [, ] \n", + "2023-02-20 [, ] \n", + "2023-03-20 [, ] \n", + "2023-04-20 [, ] \n", + "2023-05-20 [, ] \n", + "2023-06-20 [, ] \n", + "2023-07-20 [, ] " + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r0 = localAPI.run(test01\n", + " ,poolAssump = None\n", + " ,runAssump = []\n", + " ,read=True)\n", + "\n", + "r0['bonds']['A1']" + ] + }, + { + "cell_type": "markdown", + "id": "149c6eeb", + "metadata": {}, + "source": [ + "##### Note\n", + "User don't have to run underlying deal.\n", + "User just need to run the top deal the engine will run underlying deal automatically\n", + "\n", + "Let's run the top deal with pool assumption tuple start with `ByDealName`" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "80c60a8a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Warning Message from server:\n",
+       "Bond B is not paid off\n",
+       "
\n" + ], + "text/plain": [ + "Warning Message from server:\n", + "\u001b[1;33mBond B is not paid off\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "r = localAPI.run(test02\n", + " ,poolAssump = (\"ByDealName\"\n", + " ,{\"underlyingDeal\":((\"Pool\",(\"Mortgage\",None,None,None,None)\n", + " ,None,None)\n", + " ,[]\n", + " )})\n", + " ,runAssump = []\n", + " ,read=True)" + ] + }, + { + "cell_type": "markdown", + "id": "9b087d58", + "metadata": {}, + "source": [ + "We can inspect the pool cashflow ( actually ,it is bond flow from underlying deal )" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "4c20895b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BalancePrincipalInterest
Date
2022-11-301000.000.000.00
2022-12-31770.17229.835.75
2023-01-31770.170.000.00
2023-02-28647.30122.879.92
2023-03-31517.98129.323.47
2023-04-30388.25129.733.07
2023-05-31257.69130.562.23
2023-06-30126.43131.261.53
2023-07-310.00126.430.72
\n", + "
" + ], + "text/plain": [ + " Balance Principal Interest\n", + "Date \n", + "2022-11-30 1000.00 0.00 0.00\n", + "2022-12-31 770.17 229.83 5.75\n", + "2023-01-31 770.17 0.00 0.00\n", + "2023-02-28 647.30 122.87 9.92\n", + "2023-03-31 517.98 129.32 3.47\n", + "2023-04-30 388.25 129.73 3.07\n", + "2023-05-31 257.69 130.56 2.23\n", + "2023-06-30 126.43 131.26 1.53\n", + "2023-07-31 0.00 126.43 0.72" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r['pool']['flow']['underlyingDeal', 'A1', '1 % 1'].loc[\"2022-11-30\":,]" + ] + }, + { + "cell_type": "markdown", + "id": "e30cde1c", + "metadata": {}, + "source": [ + "#### Set with pool stress\n", + "\n", + "User can set pool performance stress to underlying deal when runnning the top deal.\n", + "\n", + "\n", + "Here, we set underlying pool with `CPR 10%` with deal name `underlyingDeal`" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "496181ed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Warning Message from server:\n",
+       "Bond B is not paid off\n",
+       "
\n" + ], + "text/plain": [ + "Warning Message from server:\n", + "\u001b[1;33mBond B is not paid off\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
balanceinterestprincipalratecashfactormemo
date
2023-04-20384.312.94111.220.07114.160.549014[<PayInt:A1>, <PayPrin:A1>]
2023-05-20274.752.21109.560.07111.770.392500[<PayInt:A1>, <PayPrin:A1>]
2023-06-20165.971.63108.780.07110.410.237100[<PayInt:A1>, <PayPrin:A1>]
2023-07-2058.500.95107.470.07108.420.083571[<PayInt:A1>, <PayPrin:A1>]
2023-08-200.000.3458.500.0758.840.000000[<PayInt:A1>, <PayPrin:A1>]
\n", + "
" + ], + "text/plain": [ + " balance interest principal rate cash factor \\\n", + "date \n", + "2023-04-20 384.31 2.94 111.22 0.07 114.16 0.549014 \n", + "2023-05-20 274.75 2.21 109.56 0.07 111.77 0.392500 \n", + "2023-06-20 165.97 1.63 108.78 0.07 110.41 0.237100 \n", + "2023-07-20 58.50 0.95 107.47 0.07 108.42 0.083571 \n", + "2023-08-20 0.00 0.34 58.50 0.07 58.84 0.000000 \n", + "\n", + " memo \n", + "date \n", + "2023-04-20 [, ] \n", + "2023-05-20 [, ] \n", + "2023-06-20 [, ] \n", + "2023-07-20 [, ] \n", + "2023-08-20 [, ] " + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "poolPerf = (\"Pool\",(\"Mortgage\",None,{\"CPR\":0.1},None,None)\n", + " ,None,None)\n", + "\n", + "rStress = localAPI.run(test02\n", + " ,poolAssump = (\"ByDealName\"\n", + " ,{\"underlyingDeal\":(poolPerf,[])\n", + " })\n", + " ,runAssump = []\n", + " ,read=True)\n", + "\n", + "\n", + "rStress['bonds']['A1'].tail()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7200dcb4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "200312e0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/nbsample/runDeal.rst b/docs/source/nbsample/runDeal.rst index 45d1771..78208ff 100644 --- a/docs/source/nbsample/runDeal.rst +++ b/docs/source/nbsample/runDeal.rst @@ -7,4 +7,5 @@ Run Deals run_deal viewMultipleCfs multiAsset - triggers \ No newline at end of file + triggers + re_securitization_example \ No newline at end of file