{ "cells": [ { "cell_type": "markdown", "id": "190ddc20", "metadata": {}, "source": [ "### Master Trust Example\n", "\n", "\n", "Deal need to have a `BondGroup` to be qualifed as `Master Trust` deal.\n", "\n", "In the run assumption, the new issue bond will be `inserted` into that `BondGroup` by `BondGroup Name`\n", "\n", "In this example, the bond group name is `A`, which has a syntax as:\n", "\n", "\n", " (, )\n" ] }, { "cell_type": "code", "execution_count": null, "id": "b734278e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Connecting engine server -> http://localhost:8081\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mConnecting engine server -> \u001b[0m\u001b[1;4;35mhttp://localhost:8081\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Connected, local lib:0.28.7, server:0.28.21\n",
       "
\n" ], "text/plain": [ "✅\u001b[1;32mConnected, local li\u001b[0m\u001b[1;32mb:0\u001b[0m\u001b[1;32m.\u001b[0m\u001b[1;32m28.7\u001b[0m\u001b[1;32m, server:\u001b[0m\u001b[1;32m0.28\u001b[0m\u001b[1;32m.\u001b[0m\u001b[1;32m21\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from absbox import Generic,API,EnginePath,readBondsCf\n", "\n", "test01 = 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", " ,{'assets':[[\"Mortgage\"\n", " ,{\"originBalance\":2200,\"originRate\":[\"fix\",0.045],\"originTerm\":30\n", " ,\"freq\":\"Monthly\",\"type\":\"Level\",\"originDate\":\"2021-02-01\"}\n", " ,{\"currentBalance\":2200\n", " ,\"currentRate\":0.08\n", " ,\"remainTerm\":20\n", " ,\"status\":\"current\"}]]}\n", " ,((\"acc01\",{\"balance\":0}),)\n", " ,((\"A\",{\"A-1\":\n", " {\"balance\":400\n", " ,\"rate\":0.09\n", " ,\"originBalance\":400\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2021-06-15\"\n", " ,\"rateType\":{\"Fixed\":0.08}\n", " ,\"bondType\":{\"Sequential\":None}\n", " ,\"maturityDate\":\"2025-01-01\"}\n", " ,\"A-2\":\n", " {\"balance\":600\n", " ,\"rate\":0.08\n", " ,\"originBalance\":600\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2021-06-15\"\n", " ,\"rateType\":{\"Fixed\":0.08}\n", " ,\"bondType\":{\"Sequential\":None}\n", " ,\"maturityDate\":\"2026-01-01\"}\n", " })\n", " ,(\"B\",{\"balance\":1000\n", " ,\"rate\":0.0\n", " ,\"originBalance\":1000\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2020-01-03\"\n", " ,\"rateType\":{\"Fixed\":0.00}\n", " ,\"bondType\":{\"Equity\":None}\n", " }))\n", " ,((\"trusteeFee\",{\"type\":{\"fixFee\":30},\"feeStart\":\"2021-06-15\"}),)\n", " ,{\"amortizing\":[\n", " [\"payFee\",\"acc01\",['trusteeFee']]\n", " ,[\"accrueAndPayIntByGroup\",\"acc01\",\"A\",\"byStartDate\"]\n", " ,[\"payPrinByGroup\",\"acc01\",\"A\",\"byStartDate\"]\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", " ,(\"PreClosing\",\"Amortizing\")\n", " )\n", " \n", "localAPI = API(EnginePath.LOCAL,check=False)" ] }, { "cell_type": "markdown", "id": "029c3154", "metadata": {}, "source": [ "#### Issuance by ganrantee\n", "\n", "User can specify a series of bond issuance events. All these events are going to be executed.\n", "\n", "\n", " (\"issueBond\", (\"date1\",\"bondGroupName\", \"accountName\", )\n", " , (\"date2\",\"bondGroupName\", \"accountName\", )\n", " , ...\n", " )" ] }, { "cell_type": "code", "execution_count": 185, "id": "1bfaabcc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Warning Message from server:\n",
       "\n",
       "
\n" ], "text/plain": [ "Warning Message from server:\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fundingPlan = [(\"2022-04-02\",\"A\",\"acc01\"\n", " ,{\"balance\":600\n", " ,\"rate\":0.08\n", " ,\"name\":\"A-3\"\n", " ,\"originBalance\":600\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2022-04-02\"\n", " ,\"rateType\":{\"Fixed\":0.08}\n", " ,\"bondType\":{\"Sequential\":None}\n", " ,\"maturityDate\":\"2026-01-01\"}\n", " )]\n", "\n", "r = localAPI.run(test01\n", " ,runAssump = [\n", " (\"issueBond\",*fundingPlan)\n", " ]\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 186, "id": "8870327a", "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", " \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", "
BondGroupAB
BondA-1A-2A-3-
Fieldbalanceinterestprincipalratecashbalanceinterestprincipalratecashbalanceinterestprincipalratecashbalanceinterestprincipalratecash
date
2022-02-20369.5724.6030.430.0955.03600.0032.830.000.0832.83NaNNaNNaNNaNNaN1000.00.00.000.0
2022-03-20257.942.55111.630.09114.18600.003.680.000.083.68NaNNaNNaNNaNNaN1000.00.00.000.0
2022-04-200.001.97257.940.09259.91148.194.07451.810.08455.88600.002.070.000.072.071000.00.00.000.0
2022-05-20NaNNaNNaNNaNNaN34.750.97113.440.08114.41600.003.450.000.073.451000.00.00.000.0
2022-06-20NaNNaNNaNNaNNaN0.000.2334.750.0834.98520.693.5679.310.0782.871000.00.00.000.0
\n", "
" ], "text/plain": [ "BondGroup A \\\n", "Bond A-1 A-2 \n", "Field balance interest principal rate cash balance interest \n", "date \n", "2022-02-20 369.57 24.60 30.43 0.09 55.03 600.00 32.83 \n", "2022-03-20 257.94 2.55 111.63 0.09 114.18 600.00 3.68 \n", "2022-04-20 0.00 1.97 257.94 0.09 259.91 148.19 4.07 \n", "2022-05-20 NaN NaN NaN NaN NaN 34.75 0.97 \n", "2022-06-20 NaN NaN NaN NaN NaN 0.00 0.23 \n", "\n", "BondGroup \\\n", "Bond A-3 \n", "Field principal rate cash balance interest principal rate cash \n", "date \n", "2022-02-20 0.00 0.08 32.83 NaN NaN NaN NaN NaN \n", "2022-03-20 0.00 0.08 3.68 NaN NaN NaN NaN NaN \n", "2022-04-20 451.81 0.08 455.88 600.00 2.07 0.00 0.07 2.07 \n", "2022-05-20 113.44 0.08 114.41 600.00 3.45 0.00 0.07 3.45 \n", "2022-06-20 34.75 0.08 34.98 520.69 3.56 79.31 0.07 82.87 \n", "\n", "BondGroup B \n", "Bond - \n", "Field balance interest principal rate cash \n", "date \n", "2022-02-20 1000.0 0.0 0.0 0 0.0 \n", "2022-03-20 1000.0 0.0 0.0 0 0.0 \n", "2022-04-20 1000.0 0.0 0.0 0 0.0 \n", "2022-05-20 1000.0 0.0 0.0 0 0.0 \n", "2022-06-20 1000.0 0.0 0.0 0 0.0 " ] }, "execution_count": 186, "metadata": {}, "output_type": "execute_result" } ], "source": [ "readBondsCf(r['bonds']).loc[\"2022-02-20\":\"2022-06-20\"]" ] }, { "cell_type": "code", "execution_count": 187, "id": "7c9bd0ce", "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", "
balancechangememo
date
2022-04-02717.86600.00<IssuanceProceeds:A-3>
2022-04-20717.860.00<SeqPayFee:trusteeFee>
2022-04-20709.75-8.11<PayInt:A>
2022-04-200.00-709.75<PayPrin:A>
2022-04-200.000.00<PayPrin:B>
2022-04-200.000.00<PayYield:B>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2022-04-02 717.86 600.00 \n", "2022-04-20 717.86 0.00 \n", "2022-04-20 709.75 -8.11 \n", "2022-04-20 0.00 -709.75 \n", "2022-04-20 0.00 0.00 \n", "2022-04-20 0.00 0.00 " ] }, "execution_count": 187, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['accounts']['acc01'].loc[\"2022-04-01\":\"2022-04-28\"]" ] }, { "cell_type": "code", "execution_count": 188, "id": "013deb53", "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", " \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", "
balanceinterestprincipalratecashintDueintOverIntfactormemo
date
2022-04-20600.002.070.000.072.07001.000000[<PayInt:A-3>, <PayPrin:A-3>]
2022-05-20600.003.450.000.073.45001.000000[<PayInt:A-3>, <PayPrin:A-3>]
2022-06-20520.693.5679.310.0782.87000.867817[<PayInt:A-3>, <PayPrin:A-3>]
2022-07-20405.822.99114.870.07117.86000.676367[<PayInt:A-3>, <PayPrin:A-3>]
2022-08-20290.382.41115.440.07117.85000.483967[<PayInt:A-3>, <PayPrin:A-3>]
2022-09-20174.251.72116.130.07117.85000.290417[<PayInt:A-3>, <PayPrin:A-3>]
2022-10-2057.391.00116.860.07117.86000.095650[<PayInt:A-3>, <PayPrin:A-3>]
2022-11-200.000.3457.390.0757.73000.000000[<PayInt:A-3>, <PayPrin:A-3>]
\n", "
" ], "text/plain": [ " balance interest principal rate cash intDue intOverInt \\\n", "date \n", "2022-04-20 600.00 2.07 0.00 0.07 2.07 0 0 \n", "2022-05-20 600.00 3.45 0.00 0.07 3.45 0 0 \n", "2022-06-20 520.69 3.56 79.31 0.07 82.87 0 0 \n", "2022-07-20 405.82 2.99 114.87 0.07 117.86 0 0 \n", "2022-08-20 290.38 2.41 115.44 0.07 117.85 0 0 \n", "2022-09-20 174.25 1.72 116.13 0.07 117.85 0 0 \n", "2022-10-20 57.39 1.00 116.86 0.07 117.86 0 0 \n", "2022-11-20 0.00 0.34 57.39 0.07 57.73 0 0 \n", "\n", " factor memo \n", "date \n", "2022-04-20 1.000000 [, ] \n", "2022-05-20 1.000000 [, ] \n", "2022-06-20 0.867817 [, ] \n", "2022-07-20 0.676367 [, ] \n", "2022-08-20 0.483967 [, ] \n", "2022-09-20 0.290417 [, ] \n", "2022-10-20 0.095650 [, ] \n", "2022-11-20 0.000000 [, ] " ] }, "execution_count": 188, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['bonds']['A']['A-3']" ] }, { "cell_type": "markdown", "id": "e1df0962", "metadata": {}, "source": [ "#### Issue new bonds by predicate\n", "\n", "| new after Hastructure: 0.29.x\n", "\n", "User can supply a series of bond issuance event which has a prefix of `Condition` . Then engine will execute the issuance of bonds if the `Condition` evaluates to `True`\n", "\n", "syntax\n", "\n", " (\"date1\",
 ,\"bondGroupName\", \"accountName\", , None, None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "id": "12da1a3b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "
Warning Message from server:\n",
       "Failed to issue to bond groupA:If L (CurrentBondBalanceOf [\"A\"]) 600.00\n",
       "
\n" ], "text/plain": [ "Warning Message from server:\n", "\u001b[1;33mFailed to issue to bond groupA:If L \u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33mCurrentBondBalanceOf \u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m\"A\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m \u001b[0m\u001b[1;33m600.00\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bondToBeIssue = {\"balance\":600\n", " ,\"rate\":0.08\n", " ,\"name\":\"A-3\"\n", " ,\"originBalance\":600\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2022-04-02\"\n", " ,\"rateType\":{\"Fixed\":0.08}\n", " ,\"bondType\":{\"Sequential\":None}\n", " ,\"maturityDate\":\"2026-01-01\"}\n", "\n", "bondToBeIssue2 = bondToBeIssue | {\"name\":\"A-4\"}\n", "bondToNotIssue = bondToBeIssue | {\"name\":\"A-0\"}\n", "\n", "fundingPlan = [(\"2022-04-02\",\"A\",\"acc01\",bondToBeIssue)\n", " ,(\"2022-07-19\",[(\"bondBalance\",\"A\"),\"<\",600],\"A\",\"acc01\",bondToBeIssue2,None,None)\n", " ,(\"2022-07-19\",[(\"bondBalance\",\"A\"),\"<\",600],\"A\",\"acc01\",bondToNotIssue,None,None)\n", " ]\n", "\n", "r = localAPI.run(test01\n", " ,runAssump = [\n", " (\"issueBond\",*fundingPlan)\n", " ]\n", " ,read=True)" ] }, { "cell_type": "markdown", "id": "d5d7929d", "metadata": {}, "source": [ "In this example, the first bond `bondToBeIssue2` will be issued, becasue the condition `(bondBalance, \"A\") < 600` evaluates to `True`. But the bond `bondNotIssue` won't be issued as the condition `(bondBalance, \"A\") < 600` won't be `True` as, the bond group balance just get increased by 600 by issuing the bond `A-4`" ] }, { "cell_type": "code", "execution_count": 190, "id": "7d21e43d", "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", " \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", "
BondA-1A-2A-3A-4
Fieldbalanceinterestprincipalratecashbalanceinterestprincipalratecashbalanceinterestprincipalratecashbalanceinterestprincipalratecash
date
2021-07-26400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2021-08-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2021-09-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2021-10-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2021-11-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ "Bond A-1 A-2 \\\n", "Field balance interest principal rate cash balance interest principal \n", "date \n", "2021-07-26 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-08-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-09-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-10-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-11-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "\n", "Bond A-3 A-4 \\\n", "Field rate cash balance interest principal rate cash balance interest \n", "date \n", "2021-07-26 0.08 0.0 NaN NaN NaN NaN NaN NaN NaN \n", "2021-08-20 0.08 0.0 NaN NaN NaN NaN NaN NaN NaN \n", "2021-09-20 0.08 0.0 NaN NaN NaN NaN NaN NaN NaN \n", "2021-10-20 0.08 0.0 NaN NaN NaN NaN NaN NaN NaN \n", "2021-11-20 0.08 0.0 NaN NaN NaN NaN NaN NaN NaN \n", "\n", "Bond \n", "Field principal rate cash \n", "date \n", "2021-07-26 NaN NaN NaN \n", "2021-08-20 NaN NaN NaN \n", "2021-09-20 NaN NaN NaN \n", "2021-10-20 NaN NaN NaN \n", "2021-11-20 NaN NaN NaN " ] }, "execution_count": 190, "metadata": {}, "output_type": "execute_result" } ], "source": [ "readBondsCf(r['bonds'])['A'].head()" ] }, { "cell_type": "markdown", "id": "1326ee95", "metadata": {}, "source": [ "#### Issue new bonds by overriding `Balance`\n", "\n", "What if the size of issuance depends on a `Formula` instead of a hard code amount ? \n", "\n", "User can override the bond balance by supplying a `Formula` in the tuple\n", "\n", "syntax\n", "\n", " (\"date1\",
 ,\"bondGroupName\", \"accountName\", , , None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "id": "f9336f0c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "
Warning Message from server:\n",
       "\n",
       "
\n" ], "text/plain": [ "Warning Message from server:\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bondToBeIssue = {\"balance\":600\n", " ,\"rate\":0.08\n", " ,\"name\":\"A-3\"\n", " ,\"originBalance\":600\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2022-04-02\"\n", " ,\"rateType\":{\"Fixed\":0.08}\n", " ,\"bondType\":{\"Sequential\":None}\n", " ,\"maturityDate\":\"2026-01-01\"}\n", "\n", "sizeOfBondBalance = (\"excess\", (\"poolBalance\",), (\"bondBalance\",\"A\"))\n", "\n", "\n", "fundingPlan = [\n", " (\"2022-07-18\",[(\"bondBalance\",\"A\"),\"<\",600],\"A\",\"acc01\"\n", " , bondToBeIssue\n", " , sizeOfBondBalance,None)\n", " ]\n", "\n", "r = localAPI.run(test01\n", " ,runAssump = [\n", " (\"issueBond\",*fundingPlan)\n", " ,(\"inspect\"#,[[\"CustomDate\",\"2022-07-18\"],sizeOfBondBalance]\n", " ,[[\"CustomDate\",\"2022-07-18\"],(\"poolBalance\",)]\n", " ,[[\"CustomDate\",\"2022-07-18\"],(\"bondBalance\",\"A\")]\n", " )\n", " ]\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 192, "id": "3a6c90fd", "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", " \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", "
BondA-1A-2A-3
Fieldbalanceinterestprincipalratecashbalanceinterestprincipalratecashbalanceinterestprincipalratecash
date
2021-07-26400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaN
2021-08-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaN
2021-09-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaN
2021-10-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaN
2021-11-20400.00.00.00.090.0600.00.00.00.080.0NaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ "Bond A-1 A-2 \\\n", "Field balance interest principal rate cash balance interest principal \n", "date \n", "2021-07-26 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-08-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-09-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-10-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "2021-11-20 400.0 0.0 0.0 0.09 0.0 600.0 0.0 0.0 \n", "\n", "Bond A-3 \n", "Field rate cash balance interest principal rate cash \n", "date \n", "2021-07-26 0.08 0.0 NaN NaN NaN NaN NaN \n", "2021-08-20 0.08 0.0 NaN NaN NaN NaN NaN \n", "2021-09-20 0.08 0.0 NaN NaN NaN NaN NaN \n", "2021-10-20 0.08 0.0 NaN NaN NaN NaN NaN \n", "2021-11-20 0.08 0.0 NaN NaN NaN NaN NaN " ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "readBondsCf(r['bonds'])['A'].head()" ] }, { "cell_type": "code", "execution_count": 193, "id": "02909d7d", "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", "
<CurrentBondBalanceOf:A><CurrentPoolBalance>
Date
2021-03-011000.000.00
2022-07-18519.751570.39
\n", "
" ], "text/plain": [ " \n", "Date \n", "2021-03-01 1000.00 0.00\n", "2022-07-18 519.75 1570.39" ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from absbox import unifyTs\n", "\n", "unifyTs(r['result']['inspect'].values())" ] }, { "cell_type": "markdown", "id": "8e935a2c", "metadata": {}, "source": [ "Now , it should issue with balance of `1050.64`" ] }, { "cell_type": "code", "execution_count": 194, "id": "2d1d31ee", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1050.64" ] }, "execution_count": 194, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1570.39 - 519.75" ] }, { "cell_type": "markdown", "id": "081eaea7", "metadata": {}, "source": [ "We can inspect on that day, we had the bond proceed with value of `1050.64`" ] }, { "cell_type": "code", "execution_count": 195, "id": "75969953", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "balance 1168.5\n", "change 1050.64\n", "memo \n", "Name: 2022-07-18, dtype: object" ] }, "execution_count": 195, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['accounts']['acc01'].loc[\"2022-07-18\"]" ] }, { "cell_type": "code", "execution_count": 196, "id": "bffe3ea6", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "balance 405.7\n", "interest 0.4\n", "principal 644.94\n", "rate 0.07\n", "cash 645.34\n", "intDue 0\n", "intOverInt 0\n", "factor 0.386146\n", "memo [, ]\n", "Name: 2022-07-20, dtype: object" ] }, "execution_count": 196, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['bonds']['A'][\"A-3\"].loc[\"2022-07-20\"]" ] }, { "cell_type": "code", "execution_count": 197, "id": "907ee94c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1050.64" ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ "644.94 + 405.70" ] }, { "cell_type": "markdown", "id": "062bb3e9", "metadata": {}, "source": [ "#### Issue new bonds by overriding `Rate`\n", "\n", "Other than overriding the balance, we can override the `rate` as well \n", "\n", "Here, we have using a formula to describle the bond issuance rate." ] }, { "cell_type": "code", "execution_count": 198, "id": "cdcafeb2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Warning Message from server:\n",
       "\n",
       "
\n" ], "text/plain": [ "Warning Message from server:\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bondToBeIssue = {\"balance\":600\n", " ,\"rate\":0.08\n", " ,\"name\":\"A-3\"\n", " ,\"originBalance\":600\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2022-04-02\"\n", " ,\"rateType\":{\"Fixed\":0.08}\n", " ,\"bondType\":{\"Sequential\":None}\n", " ,\"maturityDate\":\"2026-01-01\"}\n", "\n", "newBondRate = (\"*\", (\"poolWaRate\",), (\"const\",1.1))\n", "\n", "\n", "fundingPlan = [\n", " (\"2022-07-18\",[(\"bondBalance\",\"A\"),\"<\",600],\"A\",\"acc01\"\n", " , bondToBeIssue\n", " , (\"const\",300) , newBondRate)\n", " ]\n", "\n", "r = localAPI.run(test01\n", " ,runAssump = [\n", " (\"issueBond\",*fundingPlan)\n", " ,(\"inspect\"#,[[\"CustomDate\",\"2022-07-18\"],sizeOfBondBalance]\n", " ,[[\"CustomDate\",\"2022-07-18\"],(\"poolBalance\",)]\n", " ,[[\"CustomDate\",\"2022-07-18\"],(\"bondBalance\",\"A\")]\n", " )\n", " ]\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 199, "id": "d94fb79c", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
balanceinterestprincipalratecashintDueintOverIntfactormemo
date
2022-07-20300.000.140.000.0880.14001.000000[<PayInt:A-3>, <PayPrin:A-3>]
2022-08-20290.542.249.460.08811.70000.968467[<PayInt:A-3>, <PayPrin:A-3>]
2022-09-20174.862.17115.680.088117.85000.582867[<PayInt:A-3>, <PayPrin:A-3>]
2022-10-2058.261.26116.600.088117.86000.194200[<PayInt:A-3>, <PayPrin:A-3>]
2022-11-200.000.4358.260.08858.69000.000000[<PayInt:A-3>, <PayPrin:A-3>]
\n", "
" ], "text/plain": [ " balance interest principal rate cash intDue intOverInt \\\n", "date \n", "2022-07-20 300.00 0.14 0.00 0.088 0.14 0 0 \n", "2022-08-20 290.54 2.24 9.46 0.088 11.70 0 0 \n", "2022-09-20 174.86 2.17 115.68 0.088 117.85 0 0 \n", "2022-10-20 58.26 1.26 116.60 0.088 117.86 0 0 \n", "2022-11-20 0.00 0.43 58.26 0.088 58.69 0 0 \n", "\n", " factor memo \n", "date \n", "2022-07-20 1.000000 [, ] \n", "2022-08-20 0.968467 [, ] \n", "2022-09-20 0.582867 [, ] \n", "2022-10-20 0.194200 [, ] \n", "2022-11-20 0.000000 [, ] " ] }, "execution_count": 199, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['bonds']['A'][\"A-3\"]" ] }, { "cell_type": "markdown", "id": "5671a163", "metadata": {}, "source": [ "Here, we set the new issue bond rate as `110%` of pool weighted average rate " ] }, { "cell_type": "code", "execution_count": 200, "id": "9c54db55", "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", " \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", "
BalancePrincipalInterestPrepaymentDefaultRecoveryLossWACBorrowerNumPrepayPenaltyCumPrincipalCumPrepayCumDelinqCumDefaultCumRecoveryCumLoss
Date
2021-06-152200.00.00.000000.08NoneNone0.000000
2021-06-302200.00.00.000000.08NoneNone0.000000
2021-07-312200.00.00.000000.08NoneNone0.000000
2021-08-312200.00.00.000000.08NoneNone0.000000
2021-09-302200.00.00.000000.08NoneNone0.000000
\n", "
" ], "text/plain": [ " Balance Principal Interest Prepayment Default Recovery Loss \\\n", "Date \n", "2021-06-15 2200.0 0.0 0.0 0 0 0 0 \n", "2021-06-30 2200.0 0.0 0.0 0 0 0 0 \n", "2021-07-31 2200.0 0.0 0.0 0 0 0 0 \n", "2021-08-31 2200.0 0.0 0.0 0 0 0 0 \n", "2021-09-30 2200.0 0.0 0.0 0 0 0 0 \n", "\n", " WAC BorrowerNum PrepayPenalty CumPrincipal CumPrepay \\\n", "Date \n", "2021-06-15 0.08 None None 0.0 0 \n", "2021-06-30 0.08 None None 0.0 0 \n", "2021-07-31 0.08 None None 0.0 0 \n", "2021-08-31 0.08 None None 0.0 0 \n", "2021-09-30 0.08 None None 0.0 0 \n", "\n", " CumDelinq CumDefault CumRecovery CumLoss \n", "Date \n", "2021-06-15 0 0 0 0 \n", "2021-06-30 0 0 0 0 \n", "2021-07-31 0 0 0 0 \n", "2021-08-31 0 0 0 0 \n", "2021-09-30 0 0 0 0 " ] }, "execution_count": 200, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['pool']['flow'].head()" ] } ], "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 }