{ "cells": [ { "cell_type": "markdown", "id": "24af9d0c", "metadata": {}, "source": [ "### Apply Assumption with Obligor By Field" ] }, { "cell_type": "code", "execution_count": 1, "id": "6390f712", "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 API,EnginePath\n", "\n", "localAPI = API(EnginePath.DEV,check=False,lang='english')" ] }, { "cell_type": "markdown", "id": "f8ea0008", "metadata": {}, "source": [ "#### Assets with obligor info\n", "\n", "Let's setup asset with different tags/ids, just plug a map call `obligor` to the asset\n", "\n", " * Asset 1\n", " \n", " * ID: \"1\"\n", " * Tag:[\"A\",\"B\"]\n", " * Field: {\"age\":30,\"creditLevel\":\"A\"}\n", "\n", " * Asset 2\n", " \n", " * ID: \"2\"\n", " * Tag:[\"C\",\"B\"]\n", " * Field: {\"age\":50,\"creditLevel\":\"B\"}" ] }, { "cell_type": "code", "execution_count": 2, "id": "2ff8e928", "metadata": {}, "outputs": [], "source": [ "ob1 = {\n", " \"id\":\"1\",\n", " \"tag\":[\"A\",\"B\"],\n", " \"fields\":{\"age\":30,\"creditLevel\":\"A\"}\n", "} \n", "\n", "ob2 = {\n", " \"id\":\"2\",\n", " \"tag\":[\"C\",\"B\"],\n", " \"fields\":{\"age\":50,\"creditLevel\":\"B\"}\n", "} \n", "\n", "\n", "myAsset1 = [\"Mortgage\"\n", " ,{\"originBalance\": 12000.0\n", " ,\"originRate\": [\"fix\",0.045]\n", " ,\"originTerm\": 120\n", " ,\"freq\": \"monthly\"\n", " ,\"type\": \"level\"\n", " ,\"originDate\": \"2021-02-01\"\n", " ,\"obligor\":ob1\n", " }\n", " ,{\"currentBalance\": 2000.0\n", " ,\"currentRate\": 0.075\n", " ,\"remainTerm\": 80\n", " ,\"status\": \"current\"}]\n", "myAsset2 = [\"Mortgage\"\n", " ,{\"originBalance\": 12000.0\n", " ,\"originRate\": [\"fix\",0.045]\n", " ,\"originTerm\": 120\n", " ,\"freq\": \"monthly\"\n", " ,\"type\": \"level\"\n", " ,\"originDate\": \"2021-02-01\"\n", " ,\"obligor\":ob2\n", " }\n", " ,{\"currentBalance\": 5000.0\n", " ,\"currentRate\": 0.075\n", " ,\"remainTerm\": 80\n", " ,\"status\": \"current\"}]\n", "\n", "myPool = {'assets':[myAsset1,myAsset2],\n", " 'cutoffDate':\"2022-03-01\"}\n", "\n", "ppyAssump = ((\"Mortgage\",None ,{\"CPR\":0.1}, None, None)\n", " ,None\n", " ,None)\n", "defAssump = ((\"Mortgage\",{\"CDR\":0.2} ,None, None, None)\n", " ,None\n", " ,None)" ] }, { "cell_type": "markdown", "id": "0cd1c309", "metadata": {}, "source": [ "#### assumption with obligor fields" ] }, { "cell_type": "markdown", "id": "ef6af022", "metadata": {}, "source": [ "User can set multiple conditions to apply asset assumptions to the ones match" ] }, { "cell_type": "code", "execution_count": 4, "id": "0a778aca", "metadata": { "scrolled": true }, "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" ] }, { "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
2024-06-017000.000.000.000.000.0000.000.075NoneNone0.000.0000.0000.00
2024-07-016825.2466.6643.0717.2490.86090.860.075NoneNone66.6617.24090.86090.86
2024-08-016650.4866.0041.9717.4991.27091.270.075NoneNone132.6634.730182.130182.13
2024-09-016479.2865.3740.8917.1688.67088.670.075NoneNone198.0351.890270.800270.80
2024-10-016314.8364.7739.8616.3083.38083.380.075NoneNone262.8068.190354.180354.18
\n", "
" ], "text/plain": [ " Balance Principal Interest Prepayment Default Recovery \\\n", "Date \n", "2024-06-01 7000.00 0.00 0.00 0.00 0.00 0 \n", "2024-07-01 6825.24 66.66 43.07 17.24 90.86 0 \n", "2024-08-01 6650.48 66.00 41.97 17.49 91.27 0 \n", "2024-09-01 6479.28 65.37 40.89 17.16 88.67 0 \n", "2024-10-01 6314.83 64.77 39.86 16.30 83.38 0 \n", "\n", " Loss WAC BorrowerNum PrepayPenalty CumPrincipal CumPrepay \\\n", "Date \n", "2024-06-01 0.00 0.075 None None 0.00 0.00 \n", "2024-07-01 90.86 0.075 None None 66.66 17.24 \n", "2024-08-01 91.27 0.075 None None 132.66 34.73 \n", "2024-09-01 88.67 0.075 None None 198.03 51.89 \n", "2024-10-01 83.38 0.075 None None 262.80 68.19 \n", "\n", " CumDelinq CumDefault CumRecovery CumLoss \n", "Date \n", "2024-06-01 0 0.00 0 0.00 \n", "2024-07-01 0 90.86 0 90.86 \n", "2024-08-01 0 182.13 0 182.13 \n", "2024-09-01 0 270.80 0 270.80 \n", "2024-10-01 0 354.18 0 354.18 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "AssetLevelAssumption = (\"ByObligor\"\n", " ,(\"ByField\",[(\"creditLevel\",\"in\",[\"A\"]),(\"age\",\"cmp\",\"L\",35)],ppyAssump)\n", " ,(\"ByDefault\",defAssump)\n", " )\n", "\n", "r = localAPI.runPool(myPool\n", " ,poolAssump=AssetLevelAssumption\n", " ,read=True)\n", "\n", "r['PoolConsol']['flow'].head()" ] }, { "cell_type": "markdown", "id": "c6a3fdea", "metadata": {}, "source": [ "Use mulitple `ByField` are allowed" ] }, { "cell_type": "code", "execution_count": 5, "id": "12480a5f", "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" ] }, { "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
2024-06-017000.000.000.000.000.0000.000.075NoneNone0.000.0000.0000.00
2024-07-016825.2466.6643.0717.2490.86090.860.075NoneNone66.6617.24090.86090.86
2024-08-016650.4866.0041.9717.4991.27091.270.075NoneNone132.6634.730182.130182.13
2024-09-016479.2865.3740.8917.1688.67088.670.075NoneNone198.0351.890270.800270.80
2024-10-016314.8364.7739.8616.3083.38083.380.075NoneNone262.8068.190354.180354.18
\n", "
" ], "text/plain": [ " Balance Principal Interest Prepayment Default Recovery \\\n", "Date \n", "2024-06-01 7000.00 0.00 0.00 0.00 0.00 0 \n", "2024-07-01 6825.24 66.66 43.07 17.24 90.86 0 \n", "2024-08-01 6650.48 66.00 41.97 17.49 91.27 0 \n", "2024-09-01 6479.28 65.37 40.89 17.16 88.67 0 \n", "2024-10-01 6314.83 64.77 39.86 16.30 83.38 0 \n", "\n", " Loss WAC BorrowerNum PrepayPenalty CumPrincipal CumPrepay \\\n", "Date \n", "2024-06-01 0.00 0.075 None None 0.00 0.00 \n", "2024-07-01 90.86 0.075 None None 66.66 17.24 \n", "2024-08-01 91.27 0.075 None None 132.66 34.73 \n", "2024-09-01 88.67 0.075 None None 198.03 51.89 \n", "2024-10-01 83.38 0.075 None None 262.80 68.19 \n", "\n", " CumDelinq CumDefault CumRecovery CumLoss \n", "Date \n", "2024-06-01 0 0.00 0 0.00 \n", "2024-07-01 0 90.86 0 90.86 \n", "2024-08-01 0 182.13 0 182.13 \n", "2024-09-01 0 270.80 0 270.80 \n", "2024-10-01 0 354.18 0 354.18 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "AssetLevelAssumption = (\"ByObligor\"\n", " ,(\"ByField\",[(\"creditLevel\",\"in\",[\"A\"]),(\"age\",\"cmp\",\"L\",35)],ppyAssump)\n", " ,(\"ByField\",[(\"age\",\"cmp\",\"G\",35)],defAssump)\n", " )\n", "\n", "r = localAPI.runPool(myPool\n", " ,poolAssump=AssetLevelAssumption\n", " ,read=True)\n", "\n", "r['PoolConsol']['flow'].head()" ] }, { "cell_type": "markdown", "id": "4f51d329", "metadata": {}, "source": [ "User can specify a `Range` for a user field" ] }, { "cell_type": "code", "execution_count": 6, "id": "794be9b4", "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" ] }, { "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
2024-06-017000.000.000.000.000000.075NoneNone0.000.000000
2024-07-016915.2267.5443.6417.240000.075NoneNone67.5417.240000
2024-08-016829.9467.7943.1017.490000.075NoneNone135.3334.730000
2024-09-016744.7368.0542.5717.160000.075NoneNone203.3851.890000
2024-10-016660.1268.3142.0416.300000.075NoneNone271.6968.190000
\n", "
" ], "text/plain": [ " Balance Principal Interest Prepayment Default Recovery Loss \\\n", "Date \n", "2024-06-01 7000.00 0.00 0.00 0.00 0 0 0 \n", "2024-07-01 6915.22 67.54 43.64 17.24 0 0 0 \n", "2024-08-01 6829.94 67.79 43.10 17.49 0 0 0 \n", "2024-09-01 6744.73 68.05 42.57 17.16 0 0 0 \n", "2024-10-01 6660.12 68.31 42.04 16.30 0 0 0 \n", "\n", " WAC BorrowerNum PrepayPenalty CumPrincipal CumPrepay \\\n", "Date \n", "2024-06-01 0.075 None None 0.00 0.00 \n", "2024-07-01 0.075 None None 67.54 17.24 \n", "2024-08-01 0.075 None None 135.33 34.73 \n", "2024-09-01 0.075 None None 203.38 51.89 \n", "2024-10-01 0.075 None None 271.69 68.19 \n", "\n", " CumDelinq CumDefault CumRecovery CumLoss \n", "Date \n", "2024-06-01 0 0 0 0 \n", "2024-07-01 0 0 0 0 \n", "2024-08-01 0 0 0 0 \n", "2024-09-01 0 0 0 0 \n", "2024-10-01 0 0 0 0 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "AssetLevelAssumption = (\"ByObligor\"\n", " ,(\"ByField\",[(\"age\",\"range\",\"II\",25,40)],ppyAssump)\n", " )\n", "\n", "r = localAPI.runPool(myPool\n", " ,poolAssump=AssetLevelAssumption\n", " ,read=True)\n", "\n", "r['PoolConsol']['flow'].head()" ] }, { "cell_type": "markdown", "id": "08036440", "metadata": {}, "source": [ "User can setup a `Not` to negate the condition" ] }, { "cell_type": "code", "execution_count": 7, "id": "cd50ce7e", "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" ] }, { "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
2024-06-017000.000.000.0000000.075NoneNone0.0000000
2024-07-016932.3067.7043.7500000.075NoneNone67.7000000
2024-08-016864.1668.1443.3100000.075NoneNone135.8400000
2024-09-016795.6068.5642.8900000.075NoneNone204.4000000
2024-10-016726.6168.9942.4600000.075NoneNone273.3900000
\n", "
" ], "text/plain": [ " Balance Principal Interest Prepayment Default Recovery Loss \\\n", "Date \n", "2024-06-01 7000.00 0.00 0.00 0 0 0 0 \n", "2024-07-01 6932.30 67.70 43.75 0 0 0 0 \n", "2024-08-01 6864.16 68.14 43.31 0 0 0 0 \n", "2024-09-01 6795.60 68.56 42.89 0 0 0 0 \n", "2024-10-01 6726.61 68.99 42.46 0 0 0 0 \n", "\n", " WAC BorrowerNum PrepayPenalty CumPrincipal CumPrepay \\\n", "Date \n", "2024-06-01 0.075 None None 0.00 0 \n", "2024-07-01 0.075 None None 67.70 0 \n", "2024-08-01 0.075 None None 135.84 0 \n", "2024-09-01 0.075 None None 204.40 0 \n", "2024-10-01 0.075 None None 273.39 0 \n", "\n", " CumDelinq CumDefault CumRecovery CumLoss \n", "Date \n", "2024-06-01 0 0 0 0 \n", "2024-07-01 0 0 0 0 \n", "2024-08-01 0 0 0 0 \n", "2024-09-01 0 0 0 0 \n", "2024-10-01 0 0 0 0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "AssetLevelAssumption = (\"ByObligor\"\n", " ,(\"ByField\",[(\"not\",(\"age\",\"range\",\"II\",25,60))],ppyAssump)\n", " )\n", "\n", "r = localAPI.runPool(myPool\n", " ,poolAssump=AssetLevelAssumption\n", " ,read=True)\n", "\n", "r['PoolConsol']['flow'].head()" ] }, { "cell_type": "code", "execution_count": null, "id": "f03d020b-8430-4117-a445-9bb32c16a5f5", "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 }