{ "cells": [ { "cell_type": "markdown", "id": "10f3d4d5", "metadata": {}, "source": [ "### Model Account Sample" ] }, { "cell_type": "code", "execution_count": 1, "id": "1d95c8ab", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Connecting engine server -> https://absbox.org/api/dev\n",
       "
\n" ], "text/plain": [ "Connecting engine server -> \u001b[4;94mhttps://absbox.org/api/dev\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "/home/xiaoyu/repo/AbsBox/lib/python3.13/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'absbox.org'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
✅Connected, local lib:0.46.5, server:0.50.1\n",
       "
\n" ], "text/plain": [ "✅Connected, local li\u001b[1;92mb:0\u001b[0m.\u001b[1;36m46.5\u001b[0m, server:\u001b[1;36m0.50\u001b[0m.\u001b[1;36m1\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from absbox import Generic,API,EnginePath,readAccsCf\n", "\n", "accountSample = 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\":25\n", " ,\"status\":\"current\"}]]}\n", " ,None\n", " ,((\"A1\",{\"balance\":1000\n", " ,\"rate\":0.07\n", " ,\"originBalance\":1000\n", " ,\"originRate\":0.07\n", " ,\"startDate\":\"2020-01-03\"\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\":\"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", " # release excess cash from reserve account\n", " [\"transfer\",\"reserveAcc\",\"acc01\",{\"reserve\":\"excess\"}]\n", " # pay fee & interest\n", " ,[\"payFee\",\"acc01\",['trusteeFee'],{\"support\":[\"account\",\"reserveAcc\"]}]\n", " ,[\"accrueAndPayInt\",\"acc01\",[\"A1\"],{\"support\":[\"account\",\"reserveAcc\"]}]\n", " # release all cash from reserve if A1 is paid off\n", " # otherwise, fill up reserve account \n", " ,[\"IfElse\",[(\"isPaidOff\",\"A1\"),True]\n", " ,[[\"transfer\",\"reserveAcc\",\"acc01\"]]\n", " ,[[\"transfer\",\"acc01\",\"reserveAcc\",{\"reserve\":\"gap\"}]]\n", " ]\n", " # pay principal to A1 & B\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", " ,(\"PreClosing\",\"Amortizing\")\n", " )\n", "\n", "localAPI = API(EnginePath.DEV,check=False)" ] }, { "cell_type": "markdown", "id": "9d902454", "metadata": {}, "source": [ "#### Waterfall to run with" ] }, { "cell_type": "code", "execution_count": 2, "id": "bdde5021", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['transfer', 'reserveAcc', 'acc01', {'reserve': 'excess'}],\n", " ['payFee', 'acc01', ['trusteeFee'], {'support': ['account', 'reserveAcc']}],\n", " ['accrueAndPayInt', 'acc01', ['A1'], {'support': ['account', 'reserveAcc']}],\n", " ['IfElse',\n", " [('isPaidOff', 'A1'), True],\n", " [['transfer', 'reserveAcc', 'acc01']],\n", " [['transfer', 'acc01', 'reserveAcc', {'reserve': 'gap'}]]],\n", " ['payPrin', 'acc01', ['A1']],\n", " ['payPrin', 'acc01', ['B']],\n", " ['payIntResidual', 'acc01', 'B']]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "accountSample.waterfall['amortizing']" ] }, { "cell_type": "markdown", "id": "6be22714", "metadata": {}, "source": [ "#### with fixed target amount" ] }, { "cell_type": "code", "execution_count": 3, "id": "8901403c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/xiaoyu/repo/AbsBox/lib/python3.13/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'absbox.org'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", " warnings.warn(\n" ] } ], "source": [ "accountSample.accounts = ((\"acc01\",{\"balance\":0}) # distribution account\n", " ,(\"reserveAcc\",{\"balance\":100\n", " ,\"type\":(\"fix\",100)})) # reserve account\n", "\n", "r = localAPI.run(accountSample\n", " ,poolAssump = (\"Pool\",(\"Mortgage\",None,None,None,None)\n", " ,None\n", " ,None)\n", " ,runAssump = None\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 4, "id": "6d079cda", "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", "
balancechangememo
date
2021-06-300.00.0<Pool:CollectedInterest>
2021-06-300.00.0<Pool:CollectedPrincipal>
2021-06-300.00.0<Pool:CollectedPrepayment>
2021-06-300.00.0<Pool:CollectedRecoveries>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2021-06-30 0.0 0.0 \n", "2021-06-30 0.0 0.0 \n", "2021-06-30 0.0 0.0 \n", "2021-06-30 0.0 0.0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# no cash collected at 06-30\n", "r['accounts']['acc01'].loc[\"2021-06-30\"]" ] }, { "cell_type": "markdown", "id": "19987e35", "metadata": {}, "source": [ "#### Insufficent cash from distribution acccount" ] }, { "cell_type": "code", "execution_count": 5, "id": "c28b6ab3", "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", "
balancechangememo
date
2021-07-260.00.0<Transfer:reserveAcc,acc01>
2021-07-260.00.0<SeqPayFee:trusteeFee>
2021-07-260.00.0<PayInt:A1>
2021-07-260.00.0<Transfer:acc01,reserveAcc>
2021-07-260.00.0<PayPrin:A1>
2021-07-260.00.0<PayPrin:B>
2021-07-260.00.0<PayYield:B>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2021-07-26 0.0 0.0 \n", "2021-07-26 0.0 0.0 \n", "2021-07-26 0.0 0.0 \n", "2021-07-26 0.0 0.0 \n", "2021-07-26 0.0 0.0 \n", "2021-07-26 0.0 0.0 \n", "2021-07-26 0.0 0.0 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['accounts']['acc01'].loc[\"2021-07-26\"]" ] }, { "cell_type": "markdown", "id": "fd262c4a", "metadata": {}, "source": [ "#### Reserve account is helping out" ] }, { "cell_type": "code", "execution_count": 6, "id": "2b77023a", "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", "
balancechangememo
date
2021-07-26100.000.00<Transfer:reserveAcc,acc01>
2021-07-2670.00-30.00<SupportDraw:>
2021-07-2662.14-7.86<SupportDraw:>
2021-07-2662.140.00<Transfer:acc01,reserveAcc>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2021-07-26 100.00 0.00 \n", "2021-07-26 70.00 -30.00 \n", "2021-07-26 62.14 -7.86 \n", "2021-07-26 62.14 0.00 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['accounts']['reserveAcc'].loc[\"2021-07-26\"]" ] }, { "cell_type": "markdown", "id": "94510cab", "metadata": {}, "source": [ "#### A1 is being paid interest" ] }, { "cell_type": "code", "execution_count": 7, "id": "1c28f7d0", "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", "
balanceinterestprincipalratecashintDueintOverIntfactormemo
date
2021-07-261000.07.860.00.077.86001.0<PayInt:A1>
2021-08-201000.04.790.00.074.79001.0<PayInt:A1>
\n", "
" ], "text/plain": [ " balance interest principal rate cash intDue intOverInt \\\n", "date \n", "2021-07-26 1000.0 7.86 0.0 0.07 7.86 0 0 \n", "2021-08-20 1000.0 4.79 0.0 0.07 4.79 0 0 \n", "\n", " factor memo \n", "date \n", "2021-07-26 1.0 \n", "2021-08-20 1.0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['bonds']['A1'].loc[\"2021-07-26\":\"2021-08-26\"]" ] }, { "cell_type": "markdown", "id": "68e3a6f3", "metadata": {}, "source": [ "#### fee is paid" ] }, { "cell_type": "code", "execution_count": 8, "id": "a34bfaf7", "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", "
balancepaymentdue
date
2021-07-260300
2021-08-20000
\n", "
" ], "text/plain": [ " balance payment due\n", "date \n", "2021-07-26 0 30 0\n", "2021-08-20 0 0 0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['fees']['trusteeFee'].loc[\"2021-07-26\":\"2021-08-26\"]" ] }, { "cell_type": "markdown", "id": "7b80655d", "metadata": {}, "source": [ "#### Reserve Account is being fill up" ] }, { "cell_type": "code", "execution_count": 9, "id": "664154d2", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
acc01reserveAcc
balancechangebalancechange
datedaySeq
2021-08-2000.000.0062.140.00
10.000.0062.140.00
20.000.0057.35-4.79
30.000.0057.350.00
40.000.00NaNNaN
50.000.00NaNNaN
60.000.00NaNNaN
2021-08-31014.6614.66NaNNaN
195.8281.16NaNNaN
295.820.00NaNNaN
395.820.00NaNNaN
2021-09-200153.1757.350.00-57.35
1153.170.000.000.00
2147.23-5.940.000.00
347.23-100.00100.00100.00
40.00-47.23NaNNaN
50.000.00NaNNaN
60.000.00NaNNaN
2021-09-30014.1214.12NaNNaN
195.8281.70NaNNaN
295.820.00NaNNaN
395.820.00NaNNaN
2021-10-200191.6495.824.18-95.82
1191.640.004.180.00
2186.16-5.484.180.00
390.34-95.82100.0095.82
40.00-90.34NaNNaN
50.000.00NaNNaN
60.000.00NaNNaN
\n", "
" ], "text/plain": [ " acc01 reserveAcc \n", " balance change balance change\n", "date daySeq \n", "2021-08-20 0 0.00 0.00 62.14 0.00\n", " 1 0.00 0.00 62.14 0.00\n", " 2 0.00 0.00 57.35 -4.79\n", " 3 0.00 0.00 57.35 0.00\n", " 4 0.00 0.00 NaN NaN\n", " 5 0.00 0.00 NaN NaN\n", " 6 0.00 0.00 NaN NaN\n", "2021-08-31 0 14.66 14.66 NaN NaN\n", " 1 95.82 81.16 NaN NaN\n", " 2 95.82 0.00 NaN NaN\n", " 3 95.82 0.00 NaN NaN\n", "2021-09-20 0 153.17 57.35 0.00 -57.35\n", " 1 153.17 0.00 0.00 0.00\n", " 2 147.23 -5.94 0.00 0.00\n", " 3 47.23 -100.00 100.00 100.00\n", " 4 0.00 -47.23 NaN NaN\n", " 5 0.00 0.00 NaN NaN\n", " 6 0.00 0.00 NaN NaN\n", "2021-09-30 0 14.12 14.12 NaN NaN\n", " 1 95.82 81.70 NaN NaN\n", " 2 95.82 0.00 NaN NaN\n", " 3 95.82 0.00 NaN NaN\n", "2021-10-20 0 191.64 95.82 4.18 -95.82\n", " 1 191.64 0.00 4.18 0.00\n", " 2 186.16 -5.48 4.18 0.00\n", " 3 90.34 -95.82 100.00 95.82\n", " 4 0.00 -90.34 NaN NaN\n", " 5 0.00 0.00 NaN NaN\n", " 6 0.00 0.00 NaN NaN" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "readAccsCf(r['accounts']).loc[\"2021-08-20\":\"2021-10-20\"]" ] }, { "cell_type": "markdown", "id": "ac636e68", "metadata": {}, "source": [ "#### When A1 is being paid off" ] }, { "cell_type": "code", "execution_count": 178, "id": "7a6b8d9d", "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", "
balanceinterestprincipalratecashintDueintOverIntfactormemo
date
2022-07-2025.920.6995.140.0795.83000.02592[<PayInt:A1>, <PayPrin:A1>]
2022-08-200.000.1525.920.0726.07000.00000[<PayInt:A1>, <PayPrin:A1>]
\n", "
" ], "text/plain": [ " balance interest principal rate cash intDue intOverInt \\\n", "date \n", "2022-07-20 25.92 0.69 95.14 0.07 95.83 0 0 \n", "2022-08-20 0.00 0.15 25.92 0.07 26.07 0 0 \n", "\n", " factor memo \n", "date \n", "2022-07-20 0.02592 [, ] \n", "2022-08-20 0.00000 [, ] " ] }, "execution_count": 178, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['bonds']['A1'].loc[\"2022-07-20\":\"2022-08-20\"]" ] }, { "cell_type": "markdown", "id": "6074d94c", "metadata": {}, "source": [ "#### Reserve account is releasing" ] }, { "cell_type": "code", "execution_count": 179, "id": "3851172c", "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", "
balancechangememo
date
2022-09-2095.830.00<TransferBy:reserveAcc,acc01,TillSource>
2022-09-2095.830.00<SeqPayFee:trusteeFee>
2022-09-2095.830.00<PayInt:A1>
2022-09-20195.83100.00<Transfer:reserveAcc,acc01>
2022-09-20195.830.00<PayPrin:A1>
2022-09-200.00-195.83<PayPrin:B>
2022-09-200.000.00<PayYield:B>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2022-09-20 95.83 0.00 \n", "2022-09-20 95.83 0.00 \n", "2022-09-20 95.83 0.00 \n", "2022-09-20 195.83 100.00 \n", "2022-09-20 195.83 0.00 \n", "2022-09-20 0.00 -195.83 \n", "2022-09-20 0.00 0.00 " ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r['accounts']['acc01'].loc[\"2022-09-20\"]" ] }, { "cell_type": "markdown", "id": "e9e2530b", "metadata": {}, "source": [ "#### With a formula" ] }, { "cell_type": "code", "execution_count": 10, "id": "50ffaa04", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/xiaoyu/repo/AbsBox/lib/python3.13/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'absbox.org'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", " warnings.warn(\n" ] } ], "source": [ "accountSample.accounts = ((\"acc01\",{\"balance\":0})\n", " ,(\"reserveAcc\",{\"balance\":100\n", " ,\"type\":(\"target\"\n", " ,(\"*\",(\"poolBalance\",),0.02) # \n", " )}))\n", "\n", "r2 = localAPI.run(accountSample\n", " ,poolAssump = (\"Pool\",(\"Mortgage\",None,None,None,None)\n", " ,None\n", " ,None)\n", " ,runAssump = None\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 11, "id": "17a1c063", "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", "
acc01reserveAcc
balancechangebalancechange
datedaySeq
2021-06-1500.000.00NaNNaN
10.000.00NaNNaN
20.000.00NaNNaN
30.000.00NaNNaN
2021-06-3000.000.00NaNNaN
..................
2022-10-20295.820.000.00.0
395.820.000.00.0
495.820.00NaNNaN
50.00-95.82NaNNaN
60.000.00NaNNaN
\n", "

180 rows × 4 columns

\n", "
" ], "text/plain": [ " acc01 reserveAcc \n", " balance change balance change\n", "date daySeq \n", "2021-06-15 0 0.00 0.00 NaN NaN\n", " 1 0.00 0.00 NaN NaN\n", " 2 0.00 0.00 NaN NaN\n", " 3 0.00 0.00 NaN NaN\n", "2021-06-30 0 0.00 0.00 NaN NaN\n", "... ... ... ... ...\n", "2022-10-20 2 95.82 0.00 0.0 0.0\n", " 3 95.82 0.00 0.0 0.0\n", " 4 95.82 0.00 NaN NaN\n", " 5 0.00 -95.82 NaN NaN\n", " 6 0.00 0.00 NaN NaN\n", "\n", "[180 rows x 4 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "readAccsCf(r2['accounts']).loc[:\"2022-10-20\"]" ] }, { "cell_type": "markdown", "id": "d0ca3ebe", "metadata": {}, "source": [ "#### distributioin account is collecting excess cash from reserve account" ] }, { "cell_type": "code", "execution_count": 12, "id": "76a99fef", "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", "
balancechangememo
date
2021-11-20136.5640.74<Transfer:reserveAcc,acc01>
2021-11-20136.560.00<SeqPayFee:trusteeFee>
2021-11-20131.79-4.77<PayInt:A1>
2021-11-2092.70-39.09<Transfer:acc01,reserveAcc>
2021-11-200.00-92.70<PayPrin:A1>
2021-11-200.000.00<PayPrin:B>
2021-11-200.000.00<PayYield:B>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2021-11-20 136.56 40.74 \n", "2021-11-20 136.56 0.00 \n", "2021-11-20 131.79 -4.77 \n", "2021-11-20 92.70 -39.09 \n", "2021-11-20 0.00 -92.70 \n", "2021-11-20 0.00 0.00 \n", "2021-11-20 0.00 0.00 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r2['accounts']['acc01'].loc['2021-11-20']" ] }, { "cell_type": "markdown", "id": "59340280", "metadata": {}, "source": [ "#### With reinvestment setup" ] }, { "cell_type": "markdown", "id": "3e53eb5a", "metadata": {}, "source": [ "#### fix rate" ] }, { "cell_type": "code", "execution_count": 13, "id": "c0dee21e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/xiaoyu/repo/AbsBox/lib/python3.13/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'absbox.org'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", " warnings.warn(\n" ] } ], "source": [ "accountSample.accounts = ((\"acc01\",{\"balance\":0\n", " ,\"interest\":{\"period\":\"QuarterEnd\" # \n", " ,\"rate\":0.05\n", " ,\"lastSettleDate\":\"2022-11-02\"} })\n", " ,(\"reserveAcc\",{\"balance\":100\n", " ,\"type\":(\"target\",(\"*\",(\"poolBalance\",),0.02))}))\n", "\n", "r3 = localAPI.run(accountSample\n", " ,poolAssump = (\"Pool\",(\"Mortgage\",None,None,None,None)\n", " ,None\n", " ,None)\n", " ,runAssump = None\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 202, "id": "e866534d", "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", "
balancechangememo
date
2023-06-300.800.80<BankInterest:>
2023-06-300.800.00<Pool:CollectedRecoveries>
2023-06-300.800.00<Pool:CollectedPrepayment>
2023-06-3094.7493.94<Pool:CollectedPrincipal>
2023-06-3096.631.89<Pool:CollectedInterest>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2023-06-30 0.80 0.80 \n", "2023-06-30 0.80 0.00 \n", "2023-06-30 0.80 0.00 \n", "2023-06-30 94.74 93.94 \n", "2023-06-30 96.63 1.89 " ] }, "execution_count": 202, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r3['accounts']['acc01'].loc[\"2023-06-30\"]" ] }, { "cell_type": "markdown", "id": "dbeff98a", "metadata": {}, "source": [ "#### float rate" ] }, { "cell_type": "code", "execution_count": 15, "id": "76ba5fe9", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/xiaoyu/repo/AbsBox/lib/python3.13/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host 'absbox.org'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", " warnings.warn(\n" ] } ], "source": [ "accountSample.accounts = ((\"acc01\",{\"balance\":0})\n", " ,(\"reserveAcc\",{\"balance\":100\n", " ,\"type\":(\"target\",(\"*\",(\"poolBalance\",),0.02))\n", " ,\"interest\":{\"period\":\"YearEnd\"\n", " ,\"reset\":\"QuarterEnd\"\n", " ,\"index\":\"SOFR3M\"\n", " ,\"spread\":0.02\n", " ,\"rate\":0.03\n", " ,\"lastSettleDate\":\"2020-11-02\"}\n", " }))\n", "\n", "r4 = localAPI.run(accountSample\n", " ,poolAssump = (\"Pool\",(\"Mortgage\",None,None,None,None)\n", " ,None\n", " ,None)\n", " ,runAssump = [(\"interest\",(\"SOFR3M\",0.04))]\n", " ,read=True)" ] }, { "cell_type": "code", "execution_count": 16, "id": "48e3a5e7", "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", "
balancechangememo
date
2021-12-3142.194.75<BankInterest:>
2021-12-3142.190.00<BankInterest:>
\n", "
" ], "text/plain": [ " balance change memo\n", "date \n", "2021-12-31 42.19 4.75 \n", "2021-12-31 42.19 0.00 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r4['accounts']['reserveAcc'].loc[\"2021-12-31\"]" ] }, { "cell_type": "code", "execution_count": null, "id": "d60b4a3e", "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.13.3" } }, "nbformat": 4, "nbformat_minor": 5 }