diff --git a/README.md b/README.md index bcfce6e5..4f22d522 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,26 @@ Check out the [Atoti repository](https://github.com/atoti/atoti) for more info o
  • +Liquidity Risk
    +
    + + + + indicates the licensed version of Atoti is required. + + + + + + + + + +
    NotebooksRelated media
     irrbb πŸ“° Measuring Interest Rate Risk in the Banking Book (IRRBB) with Atoti
    +
    +
    +
  • +
    Market Risk

    diff --git a/notebooks/01-use-cases/README.md b/notebooks/01-use-cases/README.md index a2b5ed3e..7195f585 100644 --- a/notebooks/01-use-cases/README.md +++ b/notebooks/01-use-cases/README.md @@ -23,6 +23,7 @@ Want to try Atoti Python API? You can [register online for an evaluation license Check out the [Atoti repository](https://github.com/atoti/atoti) for more info on Atoti. +
    Financial use cases
    @@ -100,6 +101,26 @@ Check out the [Atoti repository](https://github.com/atoti/atoti) for more info o
  • +Liquidity Risk
    +
    + + + + indicates the licensed version of Atoti is required. + + + + + + + + + +
    NotebooksRelated media
     irrbb πŸ“° Measuring Interest Rate Risk in the Banking Book (IRRBB) with Atoti
    +
    +
    +
  • +
    Market Risk

    diff --git a/notebooks/01-use-cases/finance/README.md b/notebooks/01-use-cases/finance/README.md index 7fbfd6af..08fbcef3 100644 --- a/notebooks/01-use-cases/finance/README.md +++ b/notebooks/01-use-cases/finance/README.md @@ -86,6 +86,26 @@
  • +Liquidity Risk
    +
    + + + + indicates the licensed version of Atoti is required. + + + + + + + + + +
    NotebooksRelated media
     irrbb πŸ“° Measuring Interest Rate Risk in the Banking Book (IRRBB) with Atoti
    +
    +
    +
  • +
    Market Risk

    diff --git a/notebooks/01-use-cases/finance/risk-management/README.md b/notebooks/01-use-cases/finance/risk-management/README.md index 101d4ceb..c16261d0 100644 --- a/notebooks/01-use-cases/finance/risk-management/README.md +++ b/notebooks/01-use-cases/finance/risk-management/README.md @@ -49,6 +49,26 @@
  • +Liquidity Risk
    +
    + + + + indicates the licensed version of Atoti is required. + + + + + + + + + +
    NotebooksRelated media
     irrbb πŸ“° Measuring Interest Rate Risk in the Banking Book (IRRBB) with Atoti
    +
    +
    +
  • +
    Market Risk

    diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/README.md b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/README.md new file mode 100644 index 00000000..5c7758f9 --- /dev/null +++ b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/README.md @@ -0,0 +1,33 @@ +

    + Atoti logo +

    + +

    + GitHub Discussion + Hits + stackoverflow +

    + + +## Financial use cases for Liquidity Risk + + + + + indicates the licensed version of Atoti is required. + + + + + + + + + +
    NotebooksRelated media
     irrbb πŸ“° Measuring Interest Rate Risk in the Banking Book (IRRBB) with Atoti
    + + +
    +

    + Reach out to atoti logo for more information. +

    diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/README.md b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/README.md new file mode 100644 index 00000000..2bb9662b --- /dev/null +++ b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/README.md @@ -0,0 +1,10 @@ +# Interest rate risk in the banking book (IRRBB) + +Credit: This notebook is contributed by [Victor Kwong](https://www.linkedin.com/in/victor-kwong-85318995/), Head of Business Development, in [ActiveViam](https://activeviam.com/) Australia. Victor has extensive experience in financial sector, specialising in risk modelling and technology changes. He has held various quantitative and technology roles across Market risk, Counterparty risk and Balance Sheet management functions in banks. + +The objective of the notebook is to demonstrate how the [APRA APS117](https://www.apra.gov.au/sites/default/files/2022-11/Prudential%20Standard%20APS%20117%20Capital%20Adequacy%20-%20Interest%20Rate%20Risk%20in%20the%20Banking%20Book%20-%20clean.pdf), Interest Rate Risk Banking Book calculation, can be performed within [Atoti](https://atoti.io/). The Atoti solution allows users not only to perform the risk calculation but also allows users to perform data analytics of the expected shortfall number from bank level down to the trade level. With the extension data, user can easily calculate the risk in different hierarchies such as bank’s entity, charts of accounts or banking book desk structure. User can understand simultaneously where the risk come from for example, the product or the risk factor that contribute most risk. + +Furthermore, user can compare the risk results under various APRA behaviour stress assumptions, understand how the cash flows are impacted, hence the sensitivities and risk attribution of it +Under the end-to-end Banking book risk management, this solution can be extended for stress testing, backtesting, theoretical PnL explain, limit management and so on. +At the time of this publication (May 2023), the APS117 IRRBB regulation has not been finalised yet. +For any interests of knowing further about this IRRBB solutions, please reach out to your ActiveViam local representatives. diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/content-atoti-ce/content.mv.db b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/content-atoti-ce/content.mv.db new file mode 100644 index 00000000..9646bb2d Binary files /dev/null and b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/content-atoti-ce/content.mv.db differ diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/content/content.mv.db b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/content/content.mv.db new file mode 100644 index 00000000..ee77c9da Binary files /dev/null and b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/content/content.mv.db differ diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/IRRBBCapitalChargeformula.png b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/IRRBBCapitalChargeformula.png new file mode 100644 index 00000000..19674ce4 Binary files /dev/null and b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/IRRBBCapitalChargeformula.png differ diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/ProspectiveICCformula.png b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/ProspectiveICCformula.png new file mode 100644 index 00000000..84962e7a Binary files /dev/null and b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/ProspectiveICCformula.png differ diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/Simulatedrateformula.png b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/Simulatedrateformula.png new file mode 100644 index 00000000..3973f3a2 Binary files /dev/null and b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/Simulatedrateformula.png differ diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/irrbb.gif b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/irrbb.gif new file mode 100644 index 00000000..b835b110 Binary files /dev/null and b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/img/irrbb.gif differ diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/main.ipynb b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/main.ipynb new file mode 100644 index 00000000..adea29e4 --- /dev/null +++ b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/main.ipynb @@ -0,0 +1,3996 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "37ee5e4b-062a-4d75-986d-968906f3c713", + "metadata": { + "tags": [] + }, + "source": [ + "# AU Interest Rate Risk Banking Book (APS117)\n", + "\n", + "The [Australian Prudential Regulation Authority (APRA)](https://www.apra.gov.au/) published a version of [Interest Rate Risk in Banking Book (IRRBB) capital APS117 requirements](https://www.apra.gov.au/sites/default/files/draft_prudential_standard_aps_117_capital_adequacy_interest_rate_risk_in_the_banking_book.pdf) in November 2022. This Prudential Standard sets out the requirements that banks must meet to ensure it prudently manages interest rate risk in the banking book. \n", + "\n", + "The key requirements of this Prudential Standard are that a bank must:\n", + "\n", + "- have a framework to manage, measure and monitor interest rate risk in the banking book, commensurate with the nature, scale and complexity of its operations; and\n", + "- be approved by APRA to use an internal model for determining its interest rate risk in the banking book capital charge.\n", + "\n", + "This notebook is designed to assist banks to calculate the IRRBB capital charge following the internal model approach documented in the standard. It includes calculations of:\n", + "\n", + "1) the interest rate data\n", + "2) the prospective IRRBB capital Charge\n", + "3) the repricing assumptions\n", + "4) the optionality risk \n", + "\n", + "The solution design should cover documentation, data input, calculation, dashboards design, reporting, limit management, stress test, what-if, data export and alert. \n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "f138e723-60dc-4a43-be5c-541908d98133", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "[1]: APRA Prudential Standard APS117 (Drafted November 2022) \n", + "https://www.apra.gov.au/sites/default/files/2022-11/Prudential%20Standard%20APS%20117%20Capital%20Adequacy%20-%20Interest%20Rate%20Risk%20in%20the%20Banking%20Book%20-%20clean.pdf\n" + ] + }, + { + "cell_type": "markdown", + "id": "7a1abaf7-a6ce-480e-8654-a0b61203b355", + "metadata": {}, + "source": [ + "
    \"Try
    " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "4bd6b165-2b5e-4f60-8db3-403ff002cc28", + "metadata": {}, + "outputs": [], + "source": [ + "# Importing Atoti libraries\n", + "import datetime\n", + "\n", + "import atoti as tt\n", + "from utils import data_processing, tables" + ] + }, + { + "cell_type": "markdown", + "id": "c3ff28c7-9cf6-475a-a2ba-2c4a8686f5d5", + "metadata": {}, + "source": [ + "### Switching between Atoti and Atoti Community Edition \n", + "\n", + " πŸ”› \n", + "\n", + "Switch from Atoti Community Edition to Atoti Python API by updating the below variable to `True`. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "88632822-1e65-429f-8b80-d6fa7b1c7fbb", + "metadata": {}, + "outputs": [], + "source": [ + "atoti_unlock = False" + ] + }, + { + "cell_type": "markdown", + "id": "fa38eab6-bb50-412c-9775-c393a7a68d85", + "metadata": {}, + "source": [ + "By setting the above variable to `True`, we can leverage features not available in the Community Edition, like a text editor in Atoti UI. \n", + "**Want to try Atoti Python API? You can [register online for an evaluation license](https://atoti.io/evaluation-license-request/) and check out how to [unlock all features of Atoti](https://docs.atoti.io/latest/how_tos/unlock_all_features.html).**\n", + "\n", + "Setting the above variable to `False` will continue to use Atoti Community Edition. No additional licensing setup is required." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e9f12fa6-d40a-4925-8fe6-1307eeeb0da3", + "metadata": {}, + "outputs": [], + "source": [ + "app_ext = tt.ADVANCED_APP_EXTENSION if atoti_unlock else {}\n", + "content = \"./content\" if atoti_unlock else \"./content-atoti-ce\"" + ] + }, + { + "cell_type": "markdown", + "id": "351f37d5-852f-4b06-9038-e2bb7fc43e71", + "metadata": {}, + "source": [ + "Loading the trade and contract based information for both market and non-market related items" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1aa720f6-11bc-4a57-8440-3dafb4a47ab8", + "metadata": {}, + "outputs": [], + "source": [ + "session = tt.Session(\n", + " port=9092,\n", + " user_content_storage=content,\n", + " app_extensions=app_ext,\n", + " java_options=[\"-Xms1G\", \"-Xmx16G\"],\n", + ")\n", + "\n", + "tbls = tables.Tables(session)" + ] + }, + { + "cell_type": "markdown", + "id": "872b2e92-97c0-4c36-a564-8373dd2d413a", + "metadata": {}, + "source": [ + "### Data model and cube creation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2c1f92a0-7231-4029-a961-be88d85e1482", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "TradeBase schema\n", + "\n", + "\n", + "\n", + "TradeBase\n", + "TradeBase\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "CashflowKey\n", + "\n", + "String\n", + "\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "TradeID\n", + "\n", + "String\n", + "\n", + "\n", + "RiskFactor\n", + "\n", + "String\n", + "\n", + "\n", + "RiskFactorType\n", + "\n", + "String\n", + "\n", + "\n", + "RiskMeasure\n", + "\n", + "String\n", + "\n", + "\n", + "\n", + "\n", + "NMR Cashflow\n", + "NMR Cashflow\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "CashflowKey\n", + "\n", + "String\n", + "\n", + "\n", + "CashFlowCcy\n", + "\n", + "String\n", + "\n", + "\n", + "CashFlowValues\n", + "\n", + "double[]\n", + "\n", + "\n", + "CashFlowType\n", + "\n", + "String\n", + "\n", + "\n", + "BehaviourOptionalityStressedCF\n", + "\n", + "String\n", + "\n", + "\n", + "BehaviourOptionType\n", + "\n", + "String\n", + "\n", + "\n", + "BehaviourOption\n", + "\n", + "String\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->NMR Cashflow\n", + "\n", + "\n", + "CashflowKey β†’ CashflowKey\n", + "InternalKey β†’ InternalKey\n", + "\n", + "\n", + "\n", + "IRDelta\n", + "IRDelta\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "\n", + "DeltaCcy\n", + "\n", + "String\n", + "\n", + "\n", + "DeltaSensitivities\n", + "\n", + "double[]\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->IRDelta\n", + "\n", + "\n", + "InternalKey β†’ InternalKey\n", + "\n", + "\n", + "\n", + "IRVega\n", + "IRVega\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "\n", + "VegaCcy\n", + "\n", + "String\n", + "\n", + "\n", + "VegaSensitivities\n", + "\n", + "double[]\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->IRVega\n", + "\n", + "\n", + "InternalKey β†’ InternalKey\n", + "\n", + "\n", + "\n", + "TradeAttributes\n", + "TradeAttributes\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "ItemType\n", + "\n", + "String\n", + "\n", + "\n", + "ProductType\n", + "\n", + "String\n", + "\n", + "\n", + "Book\n", + "\n", + "String\n", + "\n", + "\n", + "LegalEntity\n", + "\n", + "String\n", + "\n", + "\n", + "SourceSystem\n", + "\n", + "String\n", + "\n", + "\n", + "Notional\n", + "\n", + "long\n", + "\n", + "\n", + "NotionalCcy\n", + "\n", + "String\n", + "\n", + "\n", + "EconomicValue\n", + "\n", + "long\n", + "\n", + "\n", + "EconomicValueCcy\n", + "\n", + "String\n", + "\n", + "\n", + "Counterparty\n", + "\n", + "String\n", + "\n", + "\n", + "IssueDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "TradeDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "MaturityDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "NextRepriceDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "NextPaymentDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "Compounding Frequency\n", + "\n", + "double\n", + "\n", + "\n", + "FixingType\n", + "\n", + "String\n", + "\n", + "\n", + "RepaymentFrequency\n", + "\n", + "double\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->TradeAttributes\n", + "\n", + "\n", + "AsOfDate β†’ AsOfDate\n", + "InternalKey β†’ InternalKey\n", + "\n", + "\n", + "\n", + "SIDelta\n", + "SIDelta\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "\n", + "SIDeltaCcy\n", + "\n", + "String\n", + "\n", + "\n", + "SIDeltaSensitivities\n", + "\n", + "double[]\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->SIDelta\n", + "\n", + "\n", + "InternalKey β†’ InternalKey\n", + "\n", + "\n", + "\n", + "Tenors\n", + "Tenors\n", + "\n", + "key\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "key\n", + "\n", + "RiskFactor\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "Tenor\n", + "\n", + "int\n", + "\n", + "\n", + "TenorIndex\n", + "\n", + "int\n", + "\n", + "\n", + "TenorName\n", + "\n", + "String\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->Tenors\n", + "\n", + "\n", + "AsOfDate β†’ AsOfDate\n", + "RiskFactor β†’ RiskFactor\n", + "\n", + "\n", + "\n", + "Historical Dates\n", + "Historical Dates\n", + "\n", + "key\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "key\n", + "\n", + "HistoricalDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "HistoricalDateIndex\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "\n", + "TradeBase->Historical Dates\n", + "\n", + "\n", + "AsOfDate β†’ AsOfDate\n", + "\n", + "\n", + "\n", + "Portfolio\n", + "Portfolio\n", + "\n", + "key\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "GroupLevel\n", + "\n", + "String\n", + "\n", + "\n", + "ParentBook\n", + "\n", + "String\n", + "\n", + "\n", + "SubParentBook\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "Book\n", + "\n", + "String\n", + "\n", + "\n", + "Account\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "LegalEntity\n", + "\n", + "String\n", + "\n", + "\n", + "BalanceSheetCategory\n", + "\n", + "String\n", + "\n", + "\n", + "AccrualBasis\n", + "\n", + "String\n", + "\n", + "\n", + "ParentLegalEntity\n", + "\n", + "String\n", + "\n", + "\n", + "Country\n", + "\n", + "String\n", + "\n", + "\n", + "IRRBBDesk\n", + "\n", + "String\n", + "\n", + "\n", + "\n", + "\n", + "TradeAttributes->Portfolio\n", + "\n", + "\n", + "AsOfDate β†’ AsOfDate\n", + "Book β†’ Book\n", + "LegalEntity β†’ LegalEntity\n", + "\n", + "\n", + "\n", + "Historical Risk Factor\n", + "Historical Risk Factor\n", + "\n", + "key\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "key\n", + "\n", + "RiskFactor\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "Tenor\n", + "\n", + "int\n", + "\n", + "\n", + "RFValue\n", + "\n", + "double[]\n", + "\n", + "\n", + "PrevRFValue\n", + "\n", + "double[]\n", + "\n", + "\n", + "\n", + "\n", + "Tenors->Historical Risk Factor\n", + "\n", + "\n", + "AsOfDate β†’ AsOfDate\n", + "RiskFactor β†’ RiskFactor\n", + "Tenor β†’ Tenor\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cube = session.create_cube(tbls.tradeBaseTbl)\n", + "cube.schema" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "681e2275-de22-4782-8e3f-039a93639283", + "metadata": {}, + "outputs": [], + "source": [ + "cube.shared_context[\"queriesResultLimit.intermediateLimit\"] = -1\n", + "cube.shared_context[\"queriesResultLimit.transientLimit\"] = -1" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "33a566f0-9b77-4fe4-b2e8-1eb71a207c06", + "metadata": {}, + "outputs": [], + "source": [ + "data_processing.load_data(session, tbls)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "25a7bfde-ac4e-4d5b-9d37-d2f8d043ad45", + "metadata": {}, + "outputs": [], + "source": [ + "# Define the dimensions of the cube\n", + "h, l, m = cube.hierarchies, cube.levels, cube.measures" + ] + }, + { + "cell_type": "markdown", + "id": "b0bb12b1-0f7f-4037-9125-1ce355b08354", + "metadata": {}, + "source": [ + "## Attachment B - Approved IRRBB models" + ] + }, + { + "cell_type": "markdown", + "id": "5db71005-ac30-4d30-a9cf-a2a26b41a1be", + "metadata": {}, + "source": [ + "### B.4 Classification of banking book items\n", + "For the purpose of calculating its IRRBB capital charge, an ADI must classify banking book items in accordance with paragraphs 5 to 10 of this Attachment." + ] + }, + { + "cell_type": "markdown", + "id": "9e468ee3-2446-470f-8470-e8fbd150b72c", + "metadata": {}, + "source": [ + "### B.5-6 Market-related items:\n", + "All securities in the banking book excluding debt, Additional Tier 1 Capital and Tier 2 Capital issued by the ADI are classified as market-related items. An ADI must designate each banking book item not covered by the previous sentence as either a market-related item or a non-market-related item. The criterion for making such designations forms part of the approved IRRBB model, must be documented, and any change to it constitutes a model change that requires APRA approval.\n", + "\n", + "Where an ADI holds securities issued in a securitisation:\n", + "a) if the ADI is an originating ADI of the securitisation, as defined in Prudential Standard APS 120 Securitisation, and the ADI treats the securitisation’s underlying assets as on-balance sheet assets of the ADI under Prudential Standard APS 112 Capital Adequacy: Standardised Approach to Credit Risk or Prudential Standard APS 113 Capital Adequacy: Internal Ratings-based Approach to Credit Risk, the ADI must consolidate the balance sheet of the securitisation vehicle with the ADI’s balance sheet for the purpose of this Prudential Standard; or\n", + "b) the ADI must treat the securities as market-related, otherwise.\n", + "\n", + "For the Market-related items, the interest rate risk can be calculated by sensitivities and the historical interest rate movement. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "73392541-c3de-45ae-a446-32a9d171abd9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Define the Tenor bucket names of the analysis\n", + "\n", + "l[\"TenorName\"].order = tt.CustomOrder(\n", + " first_elements=[\n", + " \"Day 1\",\n", + " \"Day 2\",\n", + " \"Day 7\",\n", + " \"Day 14\",\n", + " \"Day 30\",\n", + " \"Day 60\",\n", + " \"Day 90\",\n", + " \"Day 120\",\n", + " \"Day 150\",\n", + " \"Day 180\",\n", + " \"Day 210\",\n", + " \"Day 240\",\n", + " \"Day 270\",\n", + " \"Day 365\",\n", + " \"Day 455\",\n", + " \"Day 545\",\n", + " \"Day 635\",\n", + " \"Day 720\",\n", + " \"Day 900\",\n", + " \"Day 1095\",\n", + " \"Day 1461\",\n", + " \"Day 1825\",\n", + " \"Day 2555\",\n", + " \"Day 3650\",\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "26625984-e476-4bfb-9b85-6abcb916ba0d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Define the Tenor buckets of the analysis\n", + "\n", + "l[\"Tenor\"].order = tt.CustomOrder(\n", + " first_elements=[\n", + " \"1\",\n", + " \"2\",\n", + " \"7\",\n", + " \"14\",\n", + " \"30\",\n", + " \"60\",\n", + " \"90\",\n", + " \"120\",\n", + " \"150\",\n", + " \"180\",\n", + " \"210\",\n", + " \"240\",\n", + " \"270\",\n", + " \"365\",\n", + " \"455\",\n", + " \"545\",\n", + " \"635\",\n", + " \"720\",\n", + " \"900\",\n", + " \"1095\",\n", + " \"1461\",\n", + " \"1825\",\n", + " \"2555\",\n", + " \"3650\",\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "db2a0dd0-0759-46c9-b2cc-718a43e0bc82", + "metadata": {}, + "outputs": [], + "source": [ + "m[\"EconomicValue\"] = tt.agg.sum(tbls.tradeAttributeTbl[\"EconomicValue\"])\n", + "m[\"Notional\"] = tt.agg.sum(tbls.tradeAttributeTbl[\"Notional\"])" + ] + }, + { + "cell_type": "markdown", + "id": "eb92e1c8-7811-453b-9629-042b32777728", + "metadata": { + "tags": [] + }, + "source": [ + "### B.7-11 Non-market-related items:\n", + "\n", + "B.7 A non-market-related item is classified as principal-and-interest if it:\n", + "(a) is a deposit; or\n", + "(b) can be represented to an acceptable level of accuracy as a sequence of principal and interest cash flows. For this purpose, cash flows that are economically equivalent to interest, but are not described as such in the contract, must be treated as interest.\n", + "\n", + "B.8 A derivative that is a non-market-related item should be decomposed, if possible, into notional long and short principal-and-interest items whose combined exposure is the same as that of the derivative. Non-market-related items that are not principal-and-interest are classified as non-principal-and-interest items for the purpose of this Prudential Standard.\n", + "\n", + "B.9 A principal-and-interest item is classified as either:\n", + "a) a non-maturity deposit, which is a deposit that has no specified maturity date and can be withdrawn at any time without notice; or\n", + "b) an other principal-and-interest (OPI) item.\n", + "\n", + "B.10 A core deposit is a component of a portfolio of non-maturity deposits that\n", + "a) has a stable balance; and\n", + "b) pays an interest rate that is managed by the ADI; and does not usually change in response to movements in wholesale market rates.\n", + "An ADI must determine the balance and repricing profile of each core deposit by a method whereby the balance is expected to usually be no more than 90% of the balance of the deposit product, or portfolio of products or parts thereof, in which it lies.\n", + "\n", + "B.11 An ADI may split a banking book item, or a portfolio of such items, into two or more parts, and classify or model each part differently. For the purpose of this Attachment, a reference to a banking book item may also refer to such a part and a reference to a portfolio of banking book items may refer to a portfolio of such parts. An ADI may, with APRA’s approval, treat multiple items arising from different products as a single item.\n", + "\n", + "For the Non-market related items, the interest rate risk can be calculated from the cash profile and convert to the sensitivities by multiplying the basis point present value (BPV). Ideally, the BPV should be calculated from the instruments bootstrapping the curves. For simplity, in the demonstration, the BPV is calculated from a zero curve. The sensitivities can then multiply with the interest rate movement to come up with the interest rate risk." + ] + }, + { + "cell_type": "markdown", + "id": "4b93f4f0-2ead-4ab4-acef-a351e770bd0e", + "metadata": { + "tags": [] + }, + "source": [ + "### B.12-17 Interest rate data\n" + ] + }, + { + "cell_type": "markdown", + "id": "24f15879-5c77-4d31-ad01-fba90709975a", + "metadata": { + "tags": [] + }, + "source": [ + "#### The selection of interest rates data " + ] + }, + { + "cell_type": "markdown", + "id": "25b4f342-56ce-42b8-88de-06bb30adb4a0", + "metadata": {}, + "source": [ + "B.12 For the purpose of this Prudential Standard, a risk factor is a stochastic process indexed by time, whose values are used in calculating economic values of banking book items, and for which negative values are possible. A reference to a risk factor at a specified date designates the random variable indexed by that date, in the process." + ] + }, + { + "cell_type": "markdown", + "id": "5ded3c8d-876b-4a71-8dca-8f1e7cd083d9", + "metadata": {}, + "source": [ + "B.13 For each currency to which an ADI has a material exposure in the banking book, the ADI must identify and collect data to enable modelling of a single, maturity-indexed, collection of risk factors. This is the non-market-related curve or NMR curve for that currency. The risk factors in each NMR curve must correspond to interest rates suitable for discounting cash flows. An ADI may combine currencies to which it has non-material exposures into one or more groups and select a single NMR curve for each group based on rates in a currency, or composite of currencies, broadly reflective of the interest rate characteristics of the group. An ADI may, with APRA’s approval, use more than one NMR curve per currency to which an ADI has non-material exposures in exceptional circumstances." + ] + }, + { + "cell_type": "markdown", + "id": "a687af35-42e6-4350-b2b9-a2625186ef14", + "metadata": {}, + "source": [ + "B.14 An ADI must also identify and collect data to enable modelling of all non-issuer-specific risk factors for which changes in their values can cause material changes in the economic value of the ADI’s market-related items. Where available, different risk factor collections (β€˜curves’) must be used for modelling the yields on different types and grades of debt issuers and different payment frequencies." + ] + }, + { + "cell_type": "markdown", + "id": "78f3dc66-cef9-4b0d-84ba-3645cbb2ed1a", + "metadata": {}, + "source": [ + "#### The historical rates data" + ] + }, + { + "cell_type": "markdown", + "id": "7dc023b3-6319-43aa-b38f-c1427d23e1f2", + "metadata": {}, + "source": [ + "B.15 An ADI must use an observation period of eight years, which is to be constructed as the concatenation of a one-year stressed period and the latest seven-year data period, ending on a date no earlier than three months before the calculation date. The method used to choose the end date of the observation period for each calculation date must be specified. Observation dates are the business days in the observation period. The latest seven-year data period within the eight-year observation period is to be updated annually." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6c1082f0-5cdc-4f9d-bef7-1b50fe2c9b0d", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the historical rate data\n", + "\n", + "m[\"HistoricalDate index\"] = tt.agg.single_value(\n", + " tbls.historicalDateTbl[\"HistoricalDateIndex\"]\n", + ")\n", + "m[\"TenorIndex\"] = tt.agg.single_value(tbls.tenorsTbl[\"TenorIndex\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "fb8a7d29-8bea-48a5-b90a-a329cffd8de8", + "metadata": {}, + "outputs": [], + "source": [ + "# Convert the vector string to be vector value format\n", + "\n", + "m[\"HistRiskFactorValue.VECTOR\"] = tt.agg.single_value(tbls.historicalRFTbl[\"RFValue\"])\n", + "m[\"HistPrevRiskFactorValue.VECTOR\"] = tt.agg.single_value(\n", + " tbls.historicalRFTbl[\"PrevRFValue\"]\n", + ")\n", + "\n", + "m[\"HistRiskFactorValue\"] = m[\"HistRiskFactorValue.VECTOR\"][m[\"HistoricalDate index\"]]\n", + "m[\"HistPrevRiskFactorValue\"] = m[\"HistPrevRiskFactorValue.VECTOR\"][\n", + " m[\"HistoricalDate index\"]\n", + "]\n", + "\n", + "m[\"Ξ” of risk factor.VECTOR\"] = 5 * (\n", + " m[\"HistRiskFactorValue.VECTOR\"] - m[\"HistPrevRiskFactorValue.VECTOR\"]\n", + ")\n", + "\n", + "lenRiskFactor = tt.array.len(m[\"HistRiskFactorValue.VECTOR\"])\n", + "\n", + "m[\"CurrentRiskFactorValue\"] = m[\"HistRiskFactorValue.VECTOR\"][0]\n", + "m[\"SimulatedRate.VECTOR\"] = tt.agg.sum(\n", + " m[\"CurrentRiskFactorValue\"] + m[\"Ξ” of risk factor.VECTOR\"],\n", + " scope=tt.OriginScope(l[\"Tenor\"]),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "93c86ad3-54f8-48a4-8f4c-a2cfad3b9bb6", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[Historical Dates].[HistoricalDate].[AllMember].[2022-11-01]" + ], + "mapping": { + "columns": [ + "ALL_MEASURES", + "[TradeBase].[RiskFactor].[RiskFactor]" + ], + "measures": [ + "[Measures].[HistRiskFactorValue]" + ], + "rows": [ + "[Historical Dates].[HistoricalDate].[HistoricalDate]", + "[Tenors].[Tenor].[Tenor]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Crossjoin(Hierarchize(Descendants({[Historical Dates].[HistoricalDate].[AllMember]}, 1, SELF_AND_BEFORE)), Hierarchize(Descendants({[Tenors].[Tenor].[AllMember]}, 1, SELF_AND_BEFORE))) ON ROWS, NON EMPTY Crossjoin({[Measures].[HistRiskFactorValue]}, Hierarchize(Descendants({[TradeBase].[RiskFactor].[AllMember]}, 1, SELF_AND_BEFORE))) ON COLUMNS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Sample of 1-day Historical Rate Curves", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Sample of 1-day Historical Rate Curves\")" + ] + }, + { + "cell_type": "markdown", + "id": "4df5fc93-f061-4c8d-8d69-faf3d8415469", + "metadata": {}, + "source": [ + "#### The stress period rates data" + ] + }, + { + "cell_type": "markdown", + "id": "5d8a0f04-e99f-4b78-b44e-364cb016fd4c", + "metadata": {}, + "source": [ + "B.16 The one-year stressed period is the period that would result in the largest IRRBB capital charge based on the ADI’s current banking book. An ADI must assess the appropriateness of the choice of stressed period at least annually. If the ADI changes the choice of the stressed period, they must notify and provide supportive analysis to APRA justifying the appropriateness of the change in stressed period." + ] + }, + { + "cell_type": "markdown", + "id": "d89a4e68-c017-4f9b-9d7b-bafa22671b7f", + "metadata": {}, + "source": [ + "B.17 If an ADI materially changes their banking book profile (including the maturity profile for shareholders’ equity), then the ADI must update the eight-year observation period immediately. At the time of the update, the ADI must also perform an assessment of the choice of stressed period, and must notify and provide supportive analysis to APRA justifying the reasons for the change in stressed period if applicable." + ] + }, + { + "cell_type": "markdown", + "id": "417525d9-db60-4b3f-ab68-d37a3b21963a", + "metadata": {}, + "source": [ + "This notebook can be extended by adding an additional stress period table to perform the stressed IRRBB measures. " + ] + }, + { + "cell_type": "markdown", + "id": "1ebd5206-1a9f-4555-b255-5f8a10ee5bb4", + "metadata": { + "tags": [] + }, + "source": [ + "### B.18-23 The prospective IRRBB Capital Charge Calculation" + ] + }, + { + "cell_type": "markdown", + "id": "388ea314-bcf0-496e-b244-641f4dc67265", + "metadata": {}, + "source": [ + "B.18 The economic value of the banking book or augmented banking book (see paragraph 30 of this Attachment) is the sum of the economic values of all items it contains." + ] + }, + { + "cell_type": "markdown", + "id": "f5b12bf5-f2fb-4273-90be-502ce1f158a4", + "metadata": {}, + "source": [ + "B.19 The economic value (EV) of a banking book item, given a set of repricing assumptions and risk factor values, is:\n", + "a) for a non-market-related item, the net present value, as at the calculation date, of expected future notional cash flows (see paragraph 26 of this Attachment), using discount rates from the relevant NMR curve; and\n", + "b) for a market-related item, the fair value of the item, based on the relevant risk factor values." + ] + }, + { + "cell_type": "markdown", + "id": "64466af6-af8e-433c-88a7-a58fd4e7ff7d", + "metadata": {}, + "source": [ + "B.20 An ADI’s prospective IRRBB capital charge is" + ] + }, + { + "attachments": { + "5fa8600b-f4c7-4b91-8dcd-b17739096a1d.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyIAAABdCAYAAABZ0dLXAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAABuUSURBVHhe7d0PcJTlnQfwb8Ic5/UQHY/OuNG2HHKBdqBnSQbnlJsuiSZ10I4TR+0JJHSZHkxRGTnZGIqWFkoubCYcioPIbAxErIhJoUolwQ2xh3aSSaiKvbAx46Rn2IUDlfy5U2izzz3vv913333f3UTwbRK+n5nV8O7u+777vM8+7/Pb932eX5aQQERERERE5KJs/f9ERERERESuYSBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCRERERESuYyBCY9w5tJTnIysry/6RU4bqV1rRPRTTXz8BDbSgPCf5c+eUt2BAfzpVDEPdrWisLcdC03uysuairPpFHOyMylc4GOpGS+MulC/MMb1Pbq+sGq8c7ER0Ahcz/aXFZFVfhxylzhXXopt1bQIzHWvbh9JW7UNLt3MrR0QTAwMRGuOmoaDqMEL+PPVfHn8I/UJAKI/hCNrWAjX3LYR3VT1OTtRgZGoBqrrbEPB65D888FY0o7OyAFO1Z5PFomjf+kPkznoYBz8pwM7BYbWshiPNqPB+jD1ra/B2/1/ZfPEvItr+DMpyZ2HJwSHcvvOkXsZ9CFUUIbpnLR55ux9/yxaDiC5ZtmzWNuFkqEK2aJKnAqF+ra0S4gIibStlw/4DFHofRe1JBiNEExm7FTQOTMGNs2bI/+dhafG3Ex3wbA/mr67ApiKP7Cg/jefbP9GfmIC+MhXXTVb+WICly/4ZHrtvbuwUWtYvwy1rjuOO4C/xzGPFyJ2ivTDbU4jHn1gmT/ozMOvGKeqyBBmEtFTiwVsewpE76tDyzGrckauXcvYNKHi8HH6PB3Nn5cgjQfRlUTqn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" + } + }, + "cell_type": "markdown", + "id": "b97ca39c-99a1-47e0-983c-d660b12d67a5", + "metadata": {}, + "source": [ + "![image.png](attachment:5fa8600b-f4c7-4b91-8dcd-b17739096a1d.png)" + ] + }, + { + "cell_type": "markdown", + "id": "755b84c4-9067-46ba-a547-e97f9c00a7a5", + "metadata": {}, + "source": [ + "where Prospm is the ADI’s estimate of the 97.5 per cent expected shortfall of the prospective loss (The 97.5 per cent expected shortfall is the expected loss conditional on the loss being in the worst 2.5 per cent of potential losses.) under repricing assumptions π‘šβˆˆ{ Central, shorter, longer }, where, for each possible rate scenario 𝑠 in the distribution of rate scenarios, the prospective loss is equal to:" + ] + }, + { + "attachments": { + "b069ea32-efa3-4df2-9918-9750e94a1bad.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxwAAABrCAYAAAD9yITsAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAACDUSURBVHhe7d0PcBPnnTfwr8UNL5MhNJPL3RsJZsIkriE3kNLYpXeJ3xtjJ3LyUvrymgbaF2yomBQukHBljH12geYPNSH26xwpJOQyEhgT0oTKdUNoYidWnKuvc3B2SkPusHVuXtLaFu+U9oLjeUO4WvvurnallbSrP0YrpPX301GK1vqzWj3Ps89v9Ty/p0AQgYiIiIiIyAQ25f+JiIiIiIgyjgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHERERERGZhgEHkVUFB+GpdKCgoCBLNwcqPYMIKm9PlK+Cfg8qdcu4WbfV8PivKO9ORGQ9DDiIiIiIiMg0DDiIrMq2EBs8B+CyK/cl9i3wjnwOQRAycJvEp0NvoblmkfLiRNZgK1oHj3cLoqqOy4uRSb16MJXbZQx1t6JG+wZERBbGgIPIwmxzv4Y9xx5HmXIfgYPY2vgKBicyMfDJhtlFldje9ER0UEOU92Zi7soGHGtwKvfFquP5PhqPfIgJ5f61mYOi+7eg6UB0UENEZFUMOIgsbSbs5dvQ0rxcuS92nI424G8O9Weo4yQFNX+NtdXFyj0ii7DNRXnjU2guU0OCD3F049/h0MAnyv1rJQY191WhmhEHEU0DDDiILO8mFG9+Gu7w0KcAenfsQpNvNEMTvG9GSaWTV2rJemaXYPMLezVDn05hR+1++AJXlfvXaM5dqGSwTkTTAAMOoulg9iJsiBr61I296/aiczQTHScbZs8rxGLlHpF1iGV74beihz71Po51O9/AaEai9dmYt+B25d9ERNZVIEgz2IhoGghiYmA/VpRsR6+yBWWt6D+5DcWzee2ByNgnGGhZh5Idp5T7dpQ1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" + } + }, + "cell_type": "markdown", + "id": "eba69a75-a4f6-47ca-a250-906e59afc88e", + "metadata": {}, + "source": [ + "![image.png](attachment:b069ea32-efa3-4df2-9918-9750e94a1bad.png)" + ] + }, + { + "cell_type": "markdown", + "id": "8dad9d5a-40dd-4706-88a1-ac75b35271d5", + "metadata": {}, + "source": [ + "PreShockEV is the EV of item 𝑗 under the central assumptions, using the values of risk factors at the calculation date;" + ] + }, + { + "cell_type": "markdown", + "id": "11651de3-9c95-47ef-ad27-86d2c0487a34", + "metadata": {}, + "source": [ + "PostShockEV is the EV of item 𝑗 calculated using repricing assumptions π‘šπ‘š, together with simulated risk factor values obtained by applying to risk factors at the calculation date, a shock determined for rate scenario 𝑠 in accordance with paragraph 21 of this Attachment;\n", + "π’œ is the augmented banking book (see paragraph 30 of this Attachment);" + ] + }, + { + "cell_type": "markdown", + "id": "25906df5-6231-4bbb-92af-731259b7979b", + "metadata": {}, + "source": [ + "Note that PostShockEV is a random variable, whereas PreShockEV is not." + ] + }, + { + "cell_type": "markdown", + "id": "cbcb4d97-f75e-4803-9728-91b42a0ac8aa", + "metadata": {}, + "source": [ + "#### Historical scenario calculation\n", + "B.21 The distribution of each PostShockEV must be estimated using a simulation method under which:" + ] + }, + { + "cell_type": "markdown", + "id": "b6c45c85-acf1-4239-bdab-9967a83b8cb2", + "metadata": {}, + "source": [ + "a) the ADI designates every risk factor to be either perturbed or derived. This designation forms part of the approved IRRBB model, must be documented, and any change to it constitutes a model change;" + ] + }, + { + "cell_type": "markdown", + "id": "3d337948-89f6-4c99-98fd-73368325caf0", + "metadata": {}, + "source": [ + "b) there is one simulated scenario for each observation date;" + ] + }, + { + "cell_type": "markdown", + "id": "6c817f8a-9dd6-4930-8d35-30bdc751ddc2", + "metadata": {}, + "source": [ + "c) for each perturbed risk factor and observation date, the simulated value of the risk factor to be used in the scenario for that observation date is:" + ] + }, + { + "attachments": { + "68e825a9-dae6-4d32-bc3a-b42a2481642a.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "101dad7a-d624-4f4c-bd10-5283562ddab8", + "metadata": {}, + "source": [ + "![image.png](attachment:68e825a9-dae6-4d32-bc3a-b42a2481642a.png)" + ] + }, + { + "cell_type": "markdown", + "id": "5751c61b-2aa9-4148-b981-3050ae34e868", + "metadata": {}, + "source": [ + "where the simulated value is equal to caluclation date value plus 5 times difference of observation date and 10 business days before the observation date values. " + ] + }, + { + "cell_type": "markdown", + "id": "53604d72-3759-49c9-814b-913fb4b34104", + "metadata": {}, + "source": [ + "d) for each derived risk factor and observation date, the ADI must derive the simulated value of the risk factor at that date to be used in the scenario from the values simulated for other risk factors for the scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b6d64a98-c798-42fd-829f-727a991a65a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Historical Scenario calculation\n", + "\n", + "m[\"Ξ” of risk factor\"] = m[\"Ξ” of risk factor.VECTOR\"][m[\"HistoricalDate index\"]]\n", + "m[\"SimulatedRate\"] = m[\"SimulatedRate.VECTOR\"][m[\"HistoricalDate index\"]]\n", + "\n", + "m[\"Ξ” of risk factor\"].formatter = \"DOUBLE[0.0000000000]\"\n", + "m[\"SimulatedRate\"].formatter = \"DOUBLE[0.0000000000]\"" + ] + }, + { + "cell_type": "markdown", + "id": "7bdda999-60b5-424b-8ea1-1ce4e65f814f", + "metadata": {}, + "source": [ + "**1-year Simulated Historical Cash Rate Scenario**" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "4de0038a-58fe-47c9-bffa-38cc8adb9ace", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "Filter([Historical Dates].[HistoricalDate].[HistoricalDate].Members, IsDate([Historical Dates].[HistoricalDate].CurrentMember.MemberValue) AND (CDate([Historical Dates].[HistoricalDate].CurrentMember.MemberValue) >= CDate(\"2021-11-01T00:00:00\") AND CDate([Historical Dates].[HistoricalDate].CurrentMember.MemberValue) <= CDate(\"2022-11-01T23:59:59\")))", + "[Tenors].[Tenor].[AllMember].[1]", + "[TradeBase].[RiskFactor].[AllMember].[IRAUD-BBSW]" + ], + "mapping": { + "horizontalSubplots": [], + "secondaryValues": [], + "splitBy": [ + "ALL_MEASURES", + "[TradeBase].[RiskFactor].[RiskFactor]" + ], + "values": [ + "[Measures].[SimulatedRate]" + ], + "verticalSubplots": [], + "xAxis": [ + "[Historical Dates].[HistoricalDate].[HistoricalDate]" + ] + }, + "name": "1-year Simulated Historical Cash Rate Shock", + "query": { + "mdx": "SELECT NON EMPTY Crossjoin({[Measures].[SimulatedRate]}, Hierarchize(Descendants({[TradeBase].[RiskFactor].[AllMember]}, 1, SELF_AND_BEFORE))) ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Historical Dates].[HistoricalDate].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "plotly-line-chart" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "1-year Simulated Historical Cash Rate Shock", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"1-year Simulated Historical Cash Rate Shock\")" + ] + }, + { + "cell_type": "markdown", + "id": "54a10ec9-b47f-4def-86cd-35291d0f6a33", + "metadata": {}, + "source": [ + "#### Non-market-related items calculation\n", + "B.22 For non-market-related items, only the risk factor values in the NMR curves that are used to discount notional cash flows may differ between the calculation of Pre-shock and Post-shock EVs for a given set of repricing assumptions (see paragraph 26 of this Attachment). The notional cash flows in the Pre-shock and Post-shock EVs must be the same, other than for items with optionality, and for which APRA has approved a different treatment under paragraph 35 of this Attachment." + ] + }, + { + "cell_type": "markdown", + "id": "2b258186-3ac7-41fd-b81c-7df5165a7990", + "metadata": {}, + "source": [ + "In order to fulfil B.22 and consolidate the calcuation with market related items. This notebook calculates the basis point value for each buckets. Basis point value denotes the changes in the price of a bond given a basis point change in the bond yield. A measure of price volatility of bond prices to 0.01% or 1 basis point change in its yield is called as BPV. The BPV will then apply on the non-market related items cash flows to calculate the sensitivity to the rate movement. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d0bdcc73-0a70-469f-8f06-17b0c8e36d31", + "metadata": {}, + "outputs": [], + "source": [ + "# Tenor expressed as number of years (convention = actual/365)\n", + "\n", + "m[\"Tenor\"] = tt.agg.single_value(tbls.tenorsTbl[\"Tenor\"])\n", + "m[\"TenorPerYear\"] = ((m[\"Tenor\"] * 10000000000) / 365) / 10000000000\n", + "m[\"TenorPerYear\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "3ca34020-9970-473c-b33a-c87bab549467", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Calculate the current discount factors\n", + "\n", + "m[\"DiscountFactors\"] = tt.agg.single_value(\n", + " 1 / (1 + m[\"CurrentRiskFactorValue\"] / 100) ** m[\"TenorPerYear\"],\n", + " scope=tt.OriginScope(l[\"RiskMeasure\"], l[\"RiskFactor\"]),\n", + ")\n", + "\n", + "m[\"DiscountFactors\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "94672ed6-770b-4980-b055-1a678e7673e7", + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate the current discount factors with 1bp bump\n", + "\n", + "bp = 0.01\n", + "m[\"DiscountFactors+1bp\"] = tt.agg.single_value(\n", + " 1 / (1 + (m[\"CurrentRiskFactorValue\"] + bp) / 100) ** m[\"TenorPerYear\"],\n", + " scope=tt.OriginScope(l[\"RiskMeasure\"], l[\"RiskFactor\"]),\n", + ")\n", + "\n", + "m[\"DiscountFactors+1bp\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "69cac85e-dc27-4454-84cc-230472c8a97a", + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate the BPV per $1mil\n", + "\n", + "bpf = 1000000\n", + "m[\"BPV\"] = bpf * (m[\"DiscountFactors+1bp\"] - m[\"DiscountFactors\"])\n", + "m[\"BPV\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "markdown", + "id": "76c30af1-a84c-4e76-8560-af1570e54e52", + "metadata": {}, + "source": [ + "Following table displays the detail of the BPV calculation for each tenors" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "0e9d37e6-0286-4481-849c-2c121b393480", + "metadata": { + "tags": [] + }, + "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", + "
    CurrentRiskFactorValueDiscountFactorsDiscountFactors+1bpBPV
    RiskFactorTenor
    IRAUD-BBSW12.35.9999363633232.9999360956713-.2676519285094
    22.35.9998724907410.9998719554949-.5352461506236
    72.38.9995495914073.9995477190620-1.8723452998026
    142.41.9990876416784.9990838998687-3.7418096202613
    302.48.9979885348964.9979805311762-8.0037201607430
    602.67.9956858684289.9956699267634-15.9416654507138
    902.85.9930948312452.9930710239667-23.8072785136989
    1203.01.9902974960150.9902658916794-31.6043356751727
    1503.17.9872567165659.9872173936816-39.3228842775484
    1803.33.9839753675304.9839284099122-46.9576182463571
    2103.38.9810728068806.9810182096592-54.5972214195389
    2403.42.9781057798714.9780436002826-62.1795887625343
    2703.47.9750749734373.9750052701253-69.7033119690937
    3653.62.9650646593322.9649715333398-93.1259924087380
    4553.63.9564694719537.9563544351028-115.0368508071598
    5453.65.9478841265164.9477475930631-136.5334532679174
    6353.66.9393097517502.9391521348667-157.6168835105696
    7203.68.9312228103014.9310456595989-177.1507025569719
    9003.71.9141373083141.9139199999279-217.3083862191394
    10953.74.8956973081528.8954383363036-258.9718492498338
    14613.84.8599869497754.8596555297250-331.4200504286324
    18253.94.8243021594231.8239057459653-396.4134578090528
    25554.02.7590999435543.7585892858884-510.6576659213990
    36504.13.6671773839049.6665370063715-640.3775334001826
    \n", + "
    " + ], + "text/plain": [ + " CurrentRiskFactorValue DiscountFactors DiscountFactors+1bp \\\n", + "RiskFactor Tenor \n", + "IRAUD-BBSW 1 2.35 .9999363633232 .9999360956713 \n", + " 2 2.35 .9998724907410 .9998719554949 \n", + " 7 2.38 .9995495914073 .9995477190620 \n", + " 14 2.41 .9990876416784 .9990838998687 \n", + " 30 2.48 .9979885348964 .9979805311762 \n", + " 60 2.67 .9956858684289 .9956699267634 \n", + " 90 2.85 .9930948312452 .9930710239667 \n", + " 120 3.01 .9902974960150 .9902658916794 \n", + " 150 3.17 .9872567165659 .9872173936816 \n", + " 180 3.33 .9839753675304 .9839284099122 \n", + " 210 3.38 .9810728068806 .9810182096592 \n", + " 240 3.42 .9781057798714 .9780436002826 \n", + " 270 3.47 .9750749734373 .9750052701253 \n", + " 365 3.62 .9650646593322 .9649715333398 \n", + " 455 3.63 .9564694719537 .9563544351028 \n", + " 545 3.65 .9478841265164 .9477475930631 \n", + " 635 3.66 .9393097517502 .9391521348667 \n", + " 720 3.68 .9312228103014 .9310456595989 \n", + " 900 3.71 .9141373083141 .9139199999279 \n", + " 1095 3.74 .8956973081528 .8954383363036 \n", + " 1461 3.84 .8599869497754 .8596555297250 \n", + " 1825 3.94 .8243021594231 .8239057459653 \n", + " 2555 4.02 .7590999435543 .7585892858884 \n", + " 3650 4.13 .6671773839049 .6665370063715 \n", + "\n", + " BPV \n", + "RiskFactor Tenor \n", + "IRAUD-BBSW 1 -.2676519285094 \n", + " 2 -.5352461506236 \n", + " 7 -1.8723452998026 \n", + " 14 -3.7418096202613 \n", + " 30 -8.0037201607430 \n", + " 60 -15.9416654507138 \n", + " 90 -23.8072785136989 \n", + " 120 -31.6043356751727 \n", + " 150 -39.3228842775484 \n", + " 180 -46.9576182463571 \n", + " 210 -54.5972214195389 \n", + " 240 -62.1795887625343 \n", + " 270 -69.7033119690937 \n", + " 365 -93.1259924087380 \n", + " 455 -115.0368508071598 \n", + " 545 -136.5334532679174 \n", + " 635 -157.6168835105696 \n", + " 720 -177.1507025569719 \n", + " 900 -217.3083862191394 \n", + " 1095 -258.9718492498338 \n", + " 1461 -331.4200504286324 \n", + " 1825 -396.4134578090528 \n", + " 2555 -510.6576659213990 \n", + " 3650 -640.3775334001826 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cube.query(\n", + " m[\"CurrentRiskFactorValue\"],\n", + " m[\"DiscountFactors\"],\n", + " m[\"DiscountFactors+1bp\"],\n", + " m[\"BPV\"],\n", + " levels=[l[\"RiskFactor\"], l[\"Tenor\"]],\n", + " filter=(l[\"RiskFactor\"] == \"IRAUD-BBSW\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7b15d74b-84e7-4a9a-ac3e-bafffb604215", + "metadata": {}, + "source": [ + "#### Market related items calculation\n", + "B.23 For market-related items, Post-shock EVs must be determined using either full revaluation or a sensitivity-based method approved by APRA. Risk factors whose values differ between the calculations of Pre-shock and Post-shock EVs are not limited to discount curves. Where a counterparty to an item, including an ADI customer, may exercise a choice in relation to the item, the ADI must assume the counterparty will exercise the choice in the way that is most adverse to the ADI." + ] + }, + { + "cell_type": "markdown", + "id": "b04e9e96-0c1d-471e-be8e-c2ee6ffb16a1", + "metadata": {}, + "source": [ + "This notebook adopts the sensitivity-based method calculation." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "043d7096-5ffb-40dd-8508-d512bf2d0f7c", + "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", + "
    DeltaSensitivitiesVegaSensitivitiesSIDeltaSensitivities
    ProductType
    Bonds-148,569.68-147,486.36
    FRN-187,590.86
    IRSwap7,827.28
    Swaption-67,723.001,002.13
    XCCYSwap-9,588.02
    \n", + "
    " + ], + "text/plain": [ + " DeltaSensitivities VegaSensitivities SIDeltaSensitivities\n", + "ProductType \n", + "Bonds -148,569.68 -147,486.36\n", + "FRN -187,590.86 \n", + "IRSwap 7,827.28 \n", + "Swaption -67,723.00 1,002.13 \n", + "XCCYSwap -9,588.02 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Decompose the sensitivities vectors to corresponding tenor\n", + "\n", + "m[\"DeltaSensitivities.VECTOR\"] = tt.agg.sum(tbls.irDeltaTbl[\"DeltaSensitivities\"])\n", + "\n", + "m[\"DeltaSensitivities\"] = tt.agg.sum(\n", + " m[\"DeltaSensitivities.VECTOR\"][m[\"TenorIndex\"]],\n", + " scope=tt.OriginScope(l[\"Tenor\"], l[\"RiskFactor\"], l[\"TradeID\"], l[\"ProductType\"]),\n", + ")\n", + "\n", + "m[\"SIDeltaSensitivities.VECTOR\"] = tt.agg.sum(tbls.siDeltaTbl[\"SIDeltaSensitivities\"])\n", + "m[\"SIDeltaSensitivities\"] = tt.agg.sum(\n", + " m[\"SIDeltaSensitivities.VECTOR\"][m[\"TenorIndex\"]],\n", + " scope=tt.OriginScope(l[\"Tenor\"], l[\"RiskFactor\"], l[\"TradeID\"], l[\"ProductType\"]),\n", + ")\n", + "\n", + "m[\"VegaSensitivities.VECTOR\"] = tt.agg.sum(tbls.irVegaTbl[\"VegaSensitivities\"])\n", + "m[\"VegaSensitivities\"] = tt.agg.sum(\n", + " m[\"VegaSensitivities.VECTOR\"][m[\"TenorIndex\"]],\n", + " scope=tt.OriginScope(l[\"Tenor\"], l[\"RiskFactor\"], l[\"TradeID\"], l[\"ProductType\"]),\n", + ")\n", + "\n", + "cube.query(\n", + " m[\"DeltaSensitivities\"],\n", + " m[\"VegaSensitivities\"],\n", + " m[\"SIDeltaSensitivities\"],\n", + " levels=[l[\"ProductType\"]],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "e0cddbbd-212d-47f8-9444-3288bb157a22", + "metadata": {}, + "source": [ + "Following table shows the sensitivities by trades, risk factors and tenor" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "c97a183e-b20e-4800-a3ee-5e4340270083", + "metadata": { + "atoti": { + "widget": { + "mapping": { + "columns": [ + "ALL_MEASURES", + "[TradeBase].[RiskFactor].[RiskFactor]", + "[TradeBase].[TradeID].[TradeID]" + ], + "measures": [ + "[Measures].[DeltaSensitivities]" + ], + "rows": [ + "[Tenors].[Tenor].[Tenor]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Crossjoin({[Measures].[DeltaSensitivities]}, Hierarchize(Descendants({[TradeBase].[RiskFactor].[AllMember]}, 1, SELF_AND_BEFORE)), Hierarchize(Descendants({[TradeBase].[TradeID].[AllMember]}, 1, SELF_AND_BEFORE))) ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Tenors].[Tenor].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "queryContext": [ + { + "key": "mdx.hiddengrandtotals", + "value": "0" + } + ], + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Sensitivities by trades, risk factors and tenor", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Sensitivities by trades, risk factors and tenor\")" + ] + }, + { + "cell_type": "markdown", + "id": "46080c2d-5896-46d2-8c3e-07f670aa37c4", + "metadata": {}, + "source": [ + "### B.24-38 Repricing Assumptions" + ] + }, + { + "cell_type": "markdown", + "id": "19d8c610-570a-4f50-bfc9-ae6f71f5d1b2", + "metadata": {}, + "source": [ + "#### Central assumptions\n", + "B.26 An ADI must have a method of allocating a cash flow profile to each non-market-related item, consisting of a series of notional cash flows and associated dates at which they are assumed to occur." + ] + }, + { + "cell_type": "markdown", + "id": "484c7096-5036-48a8-9f95-8a2603d2e322", + "metadata": {}, + "source": [ + "B.27 The total value at a non-market-related item’s inception date of all its notional cash flows, each discounted using the NMR curve for its currency, must equal the consideration paid to establish the item, or the initial book value of the item if there is no such consideration." + ] + }, + { + "cell_type": "markdown", + "id": "b3ba7b57-52de-4c32-a6ca-ab46a3c82531", + "metadata": {}, + "source": [ + "B.28 The notional cash flows of a principal-and-interest item must be classified into notional principal cash flows and notional interest cash flows. The repricing profile of a principal-and-interest item is the set of notional principal cash flows and associated dates, which are called repricing dates. At any date, the future notional principal cash flows must sum to the principal then outstanding." + ] + }, + { + "cell_type": "markdown", + "id": "1c2672e0-7d93-4de6-baf6-4c1984800318", + "metadata": {}, + "source": [ + "B.29 An ADI must have a documented method of determining the notional interest cash flows of a principal-and-interest item based on its notional principal cash flows, such that:\n", + "a) the notional interest cash flows occur on the dates upon which interest is actually required to be paid under the item, except that a notional interest cash flow associated with any notional principal cash flow occurring on the next business day after the calculation date may occur at the same time as the notional principal cash flow; and\n", + "b) projections of notional interest cash flows may be changed only to the extent that the change is necessitated by changes to the item’s repricing profile." + ] + }, + { + "cell_type": "markdown", + "id": "746cc218-fa66-4cd7-bae9-759915418898", + "metadata": {}, + "source": [ + "B.30 An ADI’s augmented banking book is the ADI’s banking book together with an earnings offset, which is a notional principal and interest item. For the earnings offset, the ADI must choose a repricing profile consisting of at least twelve outgoing notional principal cash flows, spaced evenly over the year following the calculation date, each of magnitude one-twelfth the book value of the banking book at the calculation date. Notional interest cash flows on the earnings offset must be determined in accordance with paragraphs 27 to 29 of this Attachment as if the earnings offset were incepted at the calculation date and a notional principal cash flow occurs, equal to all unpaid, accrued interest at that time." + ] + }, + { + "cell_type": "markdown", + "id": "5dbf4a15-03ba-43a1-9e5d-0fb57ea70a2a", + "metadata": {}, + "source": [ + "B.31 For each type of core deposit, the repricing profile of the portfolio of all core deposits of that type must consist of a non-increasing series of notional principal cash flows spaced evenly over the period from the calculation date to the last in the series, which must be no more than five years after the calculation date." + ] + }, + { + "cell_type": "markdown", + "id": "4a002103-d315-4915-8ea8-d355cdcbff5e", + "metadata": {}, + "source": [ + "B.32 For all non-maturity deposits that are not core deposits, the repricing profile must have only one notional principal cash flow, occurring on the next business day after the calculation date, unless APRA approves an alternative treatment." + ] + }, + { + "cell_type": "markdown", + "id": "c50e9f99-7787-41e3-a22d-81882484884f", + "metadata": {}, + "source": [ + "B.33 An ADI must choose the repricing date of each notional principal cash flow of an OPI item as the earliest date at which:\n", + "a) the ADI has the right to change the interest rate on the principal, or the rate is contractually required to be reset in line with an external benchmark; or\n", + "b) the cash flow will be paid, based on: 1) if the ADI designates the OPI item to have a contractual repricing profile, an assumption that all principal payments occur at the contractually-scheduled dates; 2) if the ADI designates the OPI item to have a behavioural repricing profile, an assumption that the timing of all principal payments will be in line with best estimate expectations in the case of payments that do not attract economic adjustments for the impact of breaking term, and with the contractually scheduled dates for payments that would otherwise attract such economic adjustments." + ] + }, + { + "cell_type": "markdown", + "id": "88c8ba21-9194-46bd-94aa-ae40700bd4d8", + "metadata": {}, + "source": [ + "B.34 An ADI must designate an OPI item to have a repricing profile that is: a) contractual for a deposit, unless agreed otherwise with APRA; and b) behavioural for all non-deposit items, except that: 1) contractual may be used if significant deviation from the contractual repricing profile is not expected; and 2) contractual must be used if there is insufficient relevant data on which to base a behavioural repricing profile." + ] + }, + { + "cell_type": "markdown", + "id": "ab3efecd-06ee-4e5e-9537-fd82ea4575c7", + "metadata": {}, + "source": [ + "B.35 Where an ADI has designated as a non-market-related item any non-linear derivative such as swaptions, caps or floors, whether stand-alone or embedded in other instruments, the ADI must use a method that APRA has explicitly approved to measure IRRBB on that item." + ] + }, + { + "cell_type": "markdown", + "id": "e1077780-c1be-4f49-bfe9-6939a7c2b4a9", + "metadata": {}, + "source": [ + "B.36 An ADI’s repricing assumptions form part of its approved IRRBB model and must be clearly documented, conceptually sound, reasonable and, except where compelling reasons are provided to do otherwise, consistent with historical experience." + ] + }, + { + "cell_type": "markdown", + "id": "0fd08535-db09-4a7b-af9d-cd3987458d7d", + "metadata": {}, + "source": [ + "B.37 APRA may review the appropriateness of an ADI’s repricing assumptions and may require the ADI to use different assumptions for the purpose of determining its IRRBB capital charge." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "3da9fcde-4789-4327-97f4-2a9450937263", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a parameter for Stress Behaviour\n", + "\n", + "cube.create_parameter_hierarchy_from_members(\n", + " \"StressBehaviour\",\n", + " [\"Central\", \"Shorter\", \"Longer\"],\n", + ")\n", + "\n", + "h[\"StressBehaviour\"].slicing = True\n", + "l[\"StressBehaviour\"].order = tt.CustomOrder(\n", + " first_elements=[\"Central\", \"Shorter\", \"Longer\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "37bce7f2-cf5f-4d3f-bf40-2c7d37b9da2b", + "metadata": {}, + "outputs": [], + "source": [ + "# Decompose the non-market related cash flows to tenor\n", + "\n", + "m[\"CashFlowValues.VECTOR\"] = tt.agg.sum(tbls.nmrCashFlowTbl[\"CashFlowValues\"])\n", + "m[\"CashFlow\"] = tt.agg.sum(\n", + " m[\"CashFlowValues.VECTOR\"][m[\"TenorIndex\"]],\n", + " scope=tt.OriginScope(l[\"Tenor\"], l[\"RiskFactor\"], l[\"TradeID\"], l[\"ProductType\"]),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "209e9bcd-6d04-47ab-a029-050aa77d1c2d", + "metadata": {}, + "source": [ + "#### Shorter and longer assumptions\n", + "B.38 The shorter and longer assumptions are used to take account of the most common sources of optionality risk where customer payments differ from what was assumed in a behavioural repricing profile. These assumptions must be the same as the central assumptions for all items except fixed-rate assets, rate locks and core deposits, for which the differences are:" + ] + }, + { + "cell_type": "markdown", + "id": "01f73b67-8706-42f1-92ba-7fb90934519a", + "metadata": {}, + "source": [ + "a) for notional principal cash flows: \n", + "1) each prepayment rate CPR that is used in determining the repricing profile for fixed-rate, non-market-related assets must be determined as:" + ] + }, + { + "attachments": { + "db59a8ae-a437-4fb5-a3ae-55ad584fbb01.png": { + "image/png": "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16OzNoRB7e9t02yLD7Xj29WP4Ir/KH6zY5V9nzsqb+Znc9/yACLHfFhSzt9Rxj9C179+F/9ybCNCg3s0v2dPpYY5SESZ5q/BQwe2A/vacLDf7qs9mj3JUe9n6lrw3APWOULp6qJmA5jEdFslK47x0114uh3wHbgfXgabZYG5SERZrsUNdzbhF01/ws6NP0L7oNOYWXJb/Nw7CH7mQ88ztVha1BHDVFyq/2b++TdLmww2BzuxfaMf8Aem92MINKfwK3Ui0jMGGDz5Y9wp6/2HDzyEe+5cMTsDBYgoixmErWvC7x8u424Vss7p7/wZdmx9H6uCT2LXpqV8ol9G2HwQkV6FB6t++CKGeu5D1YdP4bYmm5HTROSexJRY1+Av14Wx/FBPGffhvYBw0w68OnEbWqO/wV4Gm2WHTziJiIiIyFV8wklERERErmLASURERESuYsBJRERERK5iwElERERErmLASURERESuYsBJRERERK5iwElERERErmLASURERESuYsBJRERERK5iwElERERErmLASURERESuYsBJRERERK5iwElERERErmLASUREREQuAv4fYh2xxsujaj8AAAAASUVORK5CYII=" + } + }, + "cell_type": "markdown", + "id": "3441145f-10b5-4dba-bfbe-531d324cced7", + "metadata": {}, + "source": [ + "![image.png](attachment:db59a8ae-a437-4fb5-a3ae-55ad584fbb01.png)" + ] + }, + { + "cell_type": "markdown", + "id": "d9421ac5-4f66-4fc3-8b2f-7d8052f7c38e", + "metadata": {}, + "source": [ + "where CPR is the corresponding prepayment rate used in the central assumptions, CPRmax is the highest possible prepayment rate, and the factor CPRfac is specified in Table 1;" + ] + }, + { + "cell_type": "markdown", + "id": "ecaeb5d0-349f-493c-a570-c6d329c65f61", + "metadata": { + "tags": [] + }, + "source": [ + "2) each drawdown rate DD that is used in determining the repricing profile for a rate lock must be determined as:" + ] + }, + { + "attachments": { + "c7faffef-de3e-4e6c-b8cb-5b209d15e347.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "f9020eaf-a8e4-4d7c-9b01-8598151c1d0f", + "metadata": {}, + "source": [ + "![image.png](attachment:c7faffef-de3e-4e6c-b8cb-5b209d15e347.png)" + ] + }, + { + "cell_type": "markdown", + "id": "de4a0fc6-d62a-40d2-a1d1-adfc290552a2", + "metadata": {}, + "source": [ + "where DD is the corresponding drawdown rate used in the central assumptions and the factor DDfac is specified Table 1;" + ] + }, + { + "cell_type": "markdown", + "id": "1715f8d3-675a-41c8-ae8b-fb8af52d8e8f", + "metadata": {}, + "source": [ + "3. for a core deposit, the notional principal cash flow at any date 𝑑 that is more than one business day after the calculation date is:" + ] + }, + { + "attachments": { + "c7df3210-bd75-4ca5-952b-9377705d96aa.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "68aaf26f-38de-404e-8842-740cb27f6336", + "metadata": {}, + "source": [ + "![image.png](attachment:c7df3210-bd75-4ca5-952b-9377705d96aa.png)" + ] + }, + { + "cell_type": "markdown", + "id": "677b4895-11d7-4794-8b36-f8cf081bb1c5", + "metadata": {}, + "source": [ + "where NPCF is the corresponding notional principal cash flow for that date in the central assumptions, Wfac is specified in Table 1 and the balance of the principal is assumed to reprice on the next business day after the calculation date." + ] + }, + { + "cell_type": "markdown", + "id": "c08f7447-beb7-4fdd-8350-6acf48261af7", + "metadata": {}, + "source": [ + "b) all notional interest cash flows must be recalculated to be consistent with the revised notional principal cash flows, in accordance with paragraph 29 of this Attachment." + ] + }, + { + "attachments": { + "3797128b-ce29-4068-9188-c40e6ee27fea.png": { + "image/png": "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kg7tfD12B+k6irInDmHCrVP7OY4Q50csaysoQbW7Wx1BRERERHTxDfEbigkwP7AGecZ6bF5fCkeT1rVaB5r2P47lc1aiJuTTea2PCflzB850+vth6J8cqOzE+s1yZfBzOHXms6CgYSwmTk6CEW5U7nwd74Qs9qQrMhVR/Y0rkJ5lEet0ofbNd+AWq/S4D2LL+jcw+YG7kXLib+p83XCLfVuzZi/alM2K87Psp7DollP2v6kCJcsfgfPGOzBDbXqWiIiIiGhISIMo2tX1uOoke3GOZBTLy+vwDlOlnOIXJPueOsnVo86o+EJyWufr5pOH+ZLV+YU6vW89TqtkCVjWKFmsjVLAJtqrpHyjOt28TqpynVMnaLR9CLFsWO2S014omZVtysf2huTslJdslxqteeqxW6R8a5U6XnNOctWVS/lmo3d/lGVfkqqc7ep0Gunk60400jGd02jAdE4jVZz8j0jgg0Lux2EQVxfDTqG64DZkbr4GVmc5+4GgC2r03Fc0mjGd02jAdE4j1RAXeRqmtP4zIqk/QUREREQ0gjGgGDCt/kQk/U8QEREREY1szA4PVNf72L1jH9zm1di4IJknkIiIiIhGNeaHIybXm0hH3Lgf4Q+pJXDuexBp8Tx9RERERDS6sVI2UYzjfUWjAdM5jQZM5zRS8RE7ERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFLU4S1M/nLS4uTv1ERERERMEGMdtFFDMGPaDgjUI0uHhf0WjAdE6jAdM5jVQs8kRERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQEFERERERFFjQHExdTWh2vEiSnJTYSqoRoc6moiIiIhouBqygMLTZENWXJzShFpfgym3BLsde1HdNMyz3x3VKEhOQea8e7C6/Kg6kuhC8ogYtkIJYJX7yZSLEkc93B51csQ60FS9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" + } + }, + "cell_type": "markdown", + "id": "9ec723f3-0c35-4b85-9e73-8332dfe998c8", + "metadata": {}, + "source": [ + "![image.png](attachment:3797128b-ce29-4068-9188-c40e6ee27fea.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "7541625f-10ba-421d-ac02-0abb1c336cdf", + "metadata": {}, + "outputs": [], + "source": [ + "# Summarise the cash flow details by stress scenarios\n", + "m[\"CashFlowValues\"] = tt.filter(\n", + " tt.switch(\n", + " l[\"StressBehaviour\"],\n", + " {\n", + " \"Central\": tt.filter(m[\"CashFlow\"], l[\"BehaviourOption\"] == \"Normal\"),\n", + " \"Shorter\": tt.filter(m[\"CashFlow\"], l[\"BehaviourOption\"] == \"Shorter\"),\n", + " \"Longer\": tt.filter(m[\"CashFlow\"], l[\"BehaviourOption\"] == \"Longer\"),\n", + " },\n", + " default=m[\"CashFlow\"],\n", + " ),\n", + " l[\"BehaviourOptionalityStressedCF\"] == \"Y\",\n", + ") + tt.filter(m[\"CashFlow\"], l[\"BehaviourOptionalityStressedCF\"] != \"Y\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "d768fe98-0d74-460f-9dda-040622fea5f7", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[TradeAttributes].[ProductType].[AllMember].[Australia Fixed Rate Mortgage]", + "[Tenors].[Tenor].[AllMember].[1]" + ], + "mapping": { + "horizontalSubplots": [], + "splitBy": [ + "[StressBehaviour].[StressBehaviour].[StressBehaviour]", + "ALL_MEASURES" + ], + "values": [ + "[Measures].[CashFlowValues]" + ], + "verticalSubplots": [], + "yAxis": [ + "[TradeAttributes].[ProductType].[ProductType]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Hierarchize(Descendants({[TradeAttributes].[ProductType].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS, NON EMPTY Crossjoin([StressBehaviour].[StressBehaviour].[StressBehaviour].Members, {[Measures].[CashFlowValues]}) ON COLUMNS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "style": { + "areAxisTitlesVisible": true, + "measures": { + "CashFlowValues": { + "numberFormat": "billions" + } + } + }, + "widgetKey": "plotly-clustered-bar-chart" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "FixedRateMortgage Cashflow in the first bucket by various behaviour options", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\n", + " \"FixedRateMortgage Cashflow in the first bucket by various behaviour options\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3408abe1-72d8-4174-b1a2-0e0311c954ec", + "metadata": {}, + "source": [ + "##### Calculate the cash flow sensitivities" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "553d14d5-999f-4f1d-b08d-e57220dcfecb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Calculate the cash flow sensitivities\n", + "m[\"CashflowSensitivities\"] = tt.agg.sum(\n", + " m[\"CashFlowValues\"] * m[\"BPV\"] / 1000000,\n", + " scope=tt.OriginScope(l[\"Tenor\"], l[\"RiskFactor\"], l[\"TradeID\"], l[\"ProductType\"]),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "6abd2092-3ff2-409e-9d35-a25b84d2a972", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "{[StressBehaviour].[StressBehaviour].[Central], [StressBehaviour].[StressBehaviour].[Shorter], [StressBehaviour].[StressBehaviour].[Longer]}", + "[TradeBase].[RiskFactor].[AllMember].[IRAUD-BBSW]" + ], + "mapping": { + "horizontalSubplots": [], + "splitBy": [ + "ALL_MEASURES", + "[TradeBase].[RiskFactor].[RiskFactor]", + "[StressBehaviour].[StressBehaviour].[StressBehaviour]" + ], + "values": [ + "[Measures].[CashflowSensitivities]" + ], + "verticalSubplots": [], + "xAxis": [ + "[Tenors].[TenorName].[TenorName]" + ] + }, + "name": "Cashflow sensitivities for Shorter stress scenario", + "query": { + "mdx": "SELECT NON EMPTY Crossjoin({[Measures].[CashflowSensitivities]}, Hierarchize(Descendants({[TradeBase].[RiskFactor].[AllMember]}, 1, SELF_AND_BEFORE)), [StressBehaviour].[StressBehaviour].[StressBehaviour].Members) ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Tenors].[TenorName].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "plotly-clustered-column-chart" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Cashflow sensitivities by stress scenario", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Cashflow sensitivities by stress scenario\")" + ] + }, + { + "cell_type": "markdown", + "id": "86ce87b4-5111-4abb-b383-e70f5609936f", + "metadata": {}, + "source": [ + "##### Combining all market related and non-market related items sensitivities" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "5d0ba9ad-5530-45d2-bbba-bdfee5e8c45b", + "metadata": {}, + "outputs": [], + "source": [ + "# Summarising Sensitivities\n", + "\n", + "m[\"Sensitivities\"] = tt.where(\n", + " ~l[\"RiskFactor\"].isnull(),\n", + " tt.switch(\n", + " l[\"ItemType\"],\n", + " {\n", + " \"Market-related\": (\n", + " m[\"DeltaSensitivities\"]\n", + " + m[\"VegaSensitivities\"]\n", + " + m[\"SIDeltaSensitivities\"]\n", + " ),\n", + " \"Non-Market-related\": m[\"CashflowSensitivities\"],\n", + " },\n", + " ),\n", + ")\n", + "\n", + "m[\"Sensitivities\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "0ba49a52-6ba3-4227-85ac-a494caeefc41", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[TradeBase].[RiskFactor].[AllMember].[IRAUD-BBSW]", + "{[TradeAttributes].[ItemType].[AllMember].[Market-related], [TradeAttributes].[ItemType].[AllMember].[Non-Market-related]}" + ], + "mapping": { + "horizontalSubplots": [], + "sliceBy": [ + "[TradeAttributes].[ProductType].[ProductType]", + "[TradeAttributes].[ItemType].[ItemType]", + "[TradeBase].[RiskFactor].[RiskFactor]" + ], + "values": [ + "[Measures].[Sensitivities]" + ], + "verticalSubplots": [] + }, + "query": { + "mdx": "SELECT NON EMPTY Crossjoin(Hierarchize(Descendants({[TradeAttributes].[ProductType].[AllMember]}, 1, SELF_AND_BEFORE)), Hierarchize(Descendants({[TradeAttributes].[ItemType].[AllMember]}, 1, SELF_AND_BEFORE)), Hierarchize(Descendants({[TradeBase].[RiskFactor].[AllMember]}, 1, SELF_AND_BEFORE))) ON ROWS, NON EMPTY {[Measures].[Sensitivities]} ON COLUMNS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "plotly-pie-chart" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Total Sensitivity by Product Type and one risk factor", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Total Sensitivity by Product Type and one risk factor\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "1574be3e-b005-408b-b84a-79c2a4aeaa57", + "metadata": {}, + "outputs": [], + "source": [ + "# Summarising the sensitivities by risk factors\n", + "\n", + "m[\"SensitivitiesByRF\"] = tt.agg.sum(\n", + " m[\"Sensitivities\"],\n", + " scope=tt.OriginScope(l[\"RiskFactor\"], l[\"ItemType\"]),\n", + ")\n", + "m[\"SensitivitiesByRF\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "markdown", + "id": "8a0c6d89-9d7a-4134-a874-96707042714c", + "metadata": { + "tags": [] + }, + "source": [ + "##### Calculate the historical simulated P&L" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "27874f1c-0626-42c6-9aeb-34bef6ff08c1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Calculate the historical simulated P&L for each historical data date\n", + "m[\"HistoricalPnL\"] = tt.agg.sum(\n", + " tt.where(\n", + " m[\"HistoricalDate index\"] > 0,\n", + " m[\"SensitivitiesByRF\"] * m[\"Ξ” of risk factor\"] * 100,\n", + " ),\n", + " scope=tt.OriginScope(\n", + " l[\"Tenor\"],\n", + " l[\"RiskFactor\"],\n", + " l[\"StressBehaviour\"],\n", + " l[\"HistoricalDate\"],\n", + " l[\"TradeID\"],\n", + " ),\n", + ")\n", + "\n", + "\n", + "m[\"HistoricalPnL\"].formatter = \"DOUBLE[#,###.0000000000000]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "d20f140b-c1d3-42f1-aaf9-afbe0cc80284", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[TradeBase].[TradeID].[AllMember].[Mortgage_56789]", + "[Historical Dates].[HistoricalDate].[AllMember].[2022-11-01]" + ], + "mapping": { + "columns": [ + "ALL_MEASURES", + "[StressBehaviour].[StressBehaviour].[StressBehaviour]" + ], + "measures": [ + "[Measures].[HistoricalPnL]" + ], + "rows": [ + "[Tenors].[Tenor].[Tenor]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Crossjoin({[Measures].[HistoricalPnL]}, [StressBehaviour].[StressBehaviour].[StressBehaviour].Members) ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Tenors].[Tenor].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "style": { + "measures": { + "HistoricalPnL": { + "numberOfDecimals": 2 + } + } + }, + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "One scenario historical PnL for various behaviour assumptions", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"One scenario historical PnL for various behaviour assumptions\")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "5ae11560-49c1-423d-8c31-0229c5d3ca14", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[TradeBase].[RiskFactor].[AllMember].[IRAUD-BBSW]", + "[TradeBase].[TradeID].[AllMember].[MX_1234]" + ], + "mapping": { + "horizontalSubplots": [], + "secondaryValues": [], + "splitBy": [ + "ALL_MEASURES" + ], + "values": [ + "[Measures].[HistoricalPnL]" + ], + "verticalSubplots": [], + "xAxis": [ + "[Historical Dates].[HistoricalDate].[HistoricalDate]" + ] + }, + "name": "Historical simulated PnL across 7-year of one trade ", + "plotly": { + "data": { + "commonTraceOverride": { + "mode": "lines" + } + } + }, + "query": { + "mdx": "SELECT NON EMPTY Hierarchize(Descendants({[Historical Dates].[HistoricalDate].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS, NON EMPTY {[Measures].[HistoricalPnL]} ON COLUMNS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "style": { + "areAxisTitlesVisible": true + }, + "switchedTo": "plotly-clustered-column-chart", + "widgetKey": "plotly-line-chart" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Historical simulated PnL across 7-year of one trade ", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Historical simulated PnL across 7-year of one trade \")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "d445a0b0-fa81-4421-8dd4-5f1d0a149328", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[TradeBase].[TradeID].[AllMember].[Mortgage_56789]", + "{[StressBehaviour].[StressBehaviour].[Shorter], [StressBehaviour].[StressBehaviour].[Longer]}", + "[Historical Dates].[HistoricalDate].[AllMember].[2022-11-01]" + ], + "mapping": { + "columns": [ + "ALL_MEASURES", + "[StressBehaviour].[StressBehaviour].[StressBehaviour]" + ], + "measures": [ + "[Measures].[HistoricalPnL]" + ], + "rows": [ + "[Tenors].[Tenor].[Tenor]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Crossjoin({[Measures].[HistoricalPnL]}, [StressBehaviour].[StressBehaviour].[StressBehaviour].Members) ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Tenors].[Tenor].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [TradeBase] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "style": { + "measures": { + "HistoricalPnL": { + "numberOfDecimals": 3 + } + } + }, + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Historical PnL comparison between Longer and Shorter scenario for Mortgage", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\n", + " \"Historical PnL comparison between Longer and Shorter scenario for Mortgage\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "8ae87f93-e14d-40b2-9505-989952378fb6", + "metadata": {}, + "source": [ + "## Create new cube to compute Historical VaR, Expected Shortfall and IRRBB Capital Charge" + ] + }, + { + "cell_type": "markdown", + "id": "3626c64b-8002-4f60-8953-6a8f120f78b0", + "metadata": {}, + "source": [ + "Atoti supports multiple cubes within a session. We can make use of the aggregated from one cube to create another cube, hence improving performance without having to re-compute on every query. " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "61811305-224f-467a-9468-3d92da201293", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(99696, 10)\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", + "
    InternalKeyAsOfDateStressBehaviourHistoricalDateParentBookSubParentBookBookTradeIDRiskFactorHistoricalPnL
    020221102Cards_6578IRAUD-BBSWDiscount2022-11-02Central2014-11-17CardsCardsCredit CardsCards_6578IRAUD-BBSW15044.315958
    120221102Cards_6578IRAUD-BBSWDiscount2022-11-02Central2014-11-18CardsCardsCredit CardsCards_6578IRAUD-BBSW27221.485925
    220221102Cards_6578IRAUD-BBSWDiscount2022-11-02Central2014-11-19CardsCardsCredit CardsCards_6578IRAUD-BBSW-73796.885226
    320221102Cards_6578IRAUD-BBSWDiscount2022-11-02Central2014-11-20CardsCardsCredit CardsCards_6578IRAUD-BBSW-36313.233678
    420221102Cards_6578IRAUD-BBSWDiscount2022-11-02Central2014-11-21CardsCardsCredit CardsCards_6578IRAUD-BBSW22365.537802
    \n", + "
    " + ], + "text/plain": [ + " InternalKey AsOfDate StressBehaviour \\\n", + "0 20221102Cards_6578IRAUD-BBSWDiscount 2022-11-02 Central \n", + "1 20221102Cards_6578IRAUD-BBSWDiscount 2022-11-02 Central \n", + "2 20221102Cards_6578IRAUD-BBSWDiscount 2022-11-02 Central \n", + "3 20221102Cards_6578IRAUD-BBSWDiscount 2022-11-02 Central \n", + "4 20221102Cards_6578IRAUD-BBSWDiscount 2022-11-02 Central \n", + "\n", + " HistoricalDate ParentBook SubParentBook Book TradeID \\\n", + "0 2014-11-17 Cards Cards Credit Cards Cards_6578 \n", + "1 2014-11-18 Cards Cards Credit Cards Cards_6578 \n", + "2 2014-11-19 Cards Cards Credit Cards Cards_6578 \n", + "3 2014-11-20 Cards Cards Credit Cards Cards_6578 \n", + "4 2014-11-21 Cards Cards Credit Cards Cards_6578 \n", + "\n", + " RiskFactor HistoricalPnL \n", + "0 IRAUD-BBSW 15044.315958 \n", + "1 IRAUD-BBSW 27221.485925 \n", + "2 IRAUD-BBSW -73796.885226 \n", + "3 IRAUD-BBSW -36313.233678 \n", + "4 IRAUD-BBSW 22365.537802 " + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "historicalPnL_df = cube.query(\n", + " m[\"HistoricalPnL\"],\n", + " levels=[\n", + " l[\"InternalKey\"],\n", + " l[\"AsOfDate\"],\n", + " l[\"StressBehaviour\"],\n", + " l[\"HistoricalDate\"],\n", + " l[\"ParentBook\"],\n", + " l[\"SubParentBook\"],\n", + " l[\"Book\"],\n", + " l[\"TradeID\"],\n", + " l[\"RiskFactor\"],\n", + " ],\n", + " timeout=datetime.timedelta(seconds=60),\n", + ").reset_index()\n", + "\n", + "print(historicalPnL_df.shape)\n", + "\n", + "historicalPnL_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "1c8d5dff-1d64-408b-9f1a-35e504de8453", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. of rows: 99696 No. of columns: 10\n" + ] + } + ], + "source": [ + "es_tbl = session.read_pandas(\n", + " historicalPnL_df,\n", + " table_name=\"Expected Shortfall\",\n", + " keys=[\"InternalKey\", \"StressBehaviour\", \"HistoricalDate\"],\n", + ")\n", + "\n", + "# verify the data loaded into the sub-cube is correct\n", + "print(\"No. of rows: \", len(es_tbl), \"No. of columns: \", len(es_tbl.columns))" + ] + }, + { + "cell_type": "markdown", + "id": "b17c7e72-fad4-48cf-99c5-66cd812d1c68", + "metadata": { + "tags": [] + }, + "source": [ + "### Enrich sub-cube with simulated rate value" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "44ecd12b-764e-40bf-86e3-8c688240f612", + "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", + "
    SimulatedRate
    HistoricalDateRiskFactor
    2014-11-17IRAUD-BBSW69.94827
    IRAUD-USD FX46.561282
    IRUSD-SOFR92.087904
    IRVol-AUD-BBSW381.815246
    SI-ABC78.2063
    \n", + "
    " + ], + "text/plain": [ + " SimulatedRate\n", + "HistoricalDate RiskFactor \n", + "2014-11-17 IRAUD-BBSW 69.94827\n", + " IRAUD-USD FX 46.561282\n", + " IRUSD-SOFR 92.087904\n", + " IRVol-AUD-BBSW 381.815246\n", + " SI-ABC 78.2063" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulatedRate_df = cube.query(\n", + " m[\"SimulatedRate\"],\n", + " levels=[l[\"HistoricalDate\"], l[\"RiskFactor\"]],\n", + " timeout=datetime.timedelta(seconds=60),\n", + ")\n", + "simulatedRate_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "7ffe8afb-b38c-4e2b-aeab-7228ed209543", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "simulatedRate_tbl = session.read_pandas(\n", + " simulatedRate_df, table_name=\"Simulated Rate\", keys=[\"HistoricalDate\", \"RiskFactor\"]\n", + ")\n", + "\n", + "es_tbl.join(\n", + " simulatedRate_tbl,\n", + " (es_tbl[\"HistoricalDate\"] == simulatedRate_tbl[\"HistoricalDate\"])\n", + " & (es_tbl[\"RiskFactor\"] == simulatedRate_tbl[\"RiskFactor\"]),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "02d763b1-1b77-40b4-9e39-77fc4ea7dec7", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "Capital Charge schema\n", + "\n", + "\n", + "\n", + "Expected Shortfall\n", + "Expected Shortfall\n", + "\n", + "key\n", + "\n", + "InternalKey\n", + "\n", + "String\n", + "\n", + "\n", + "AsOfDate\n", + "\n", + "LocalDate\n", + "\n", + "key\n", + "\n", + "StressBehaviour\n", + "\n", + "String\n", + "\n", + "key\n", + "\n", + "HistoricalDate\n", + "\n", + "LocalDate\n", + "\n", + "\n", + "ParentBook\n", + "\n", + "String\n", + "\n", + "\n", + "SubParentBook\n", + "\n", + "String\n", + "\n", + "\n", + "Book\n", + "\n", + "String\n", + "\n", + "\n", + "TradeID\n", + "\n", + "String\n", + "\n", + "\n", + "RiskFactor\n", + "\n", + "String\n", + "\n", + "\n", + "HistoricalPnL\n", + "\n", + "double\n", + "\n", + "\n", + "\n", + "\n", + "Simulated Rate\n", + "Simulated Rate\n", + "\n", + "key\n", + "\n", + "HistoricalDate\n", + "\n", + "LocalDate\n", + "\n", + "key\n", + "\n", + "RiskFactor\n", + "\n", + "String\n", + "\n", + "\n", + "SimulatedRate\n", + "\n", + "double\n", + "\n", + "\n", + "\n", + "\n", + "Expected Shortfall->Simulated Rate\n", + "\n", + "\n", + "HistoricalDate β†’ HistoricalDate\n", + "RiskFactor β†’ RiskFactor\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cube_cc = session.create_cube(es_tbl, name=\"Capital Charge\", mode=\"no_measures\")\n", + "cube_cc.schema" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "ba48ef62-8b79-44ae-8a09-5616db4e4855", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "h_cc, l_cc, m_cc = cube_cc.hierarchies, cube_cc.levels, cube_cc.measures\n", + "\n", + "# Setting slicing to true for stress behaviour\n", + "# Historical PnL shouldn't be aggregated across different stress scenarios\n", + "h_cc[\"StressBehaviour\"].slicing = True" + ] + }, + { + "cell_type": "markdown", + "id": "cf8d9e49-5076-41a9-b4c0-0cd84d11ba3d", + "metadata": { + "tags": [] + }, + "source": [ + "The second cube is created with `mode=\"no_measures\"`. Therefore, we have to manually create the measures we needed. " + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "7bf46e19-c91b-4a25-9be7-979eee47718a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "m_cc[\"HistoricalPnL\"] = tt.agg.sum(es_tbl[\"HistoricalPnL\"])\n", + "\n", + "m_cc[\"SimulatedRate\"] = tt.agg.sum(simulatedRate_tbl[\"SimulatedRate\"])\n", + "m_cc[\"SimulatedRate\"].formatter = \"DOUBLE[0.0000000000]\"" + ] + }, + { + "cell_type": "markdown", + "id": "c554b779-5af8-4f73-a79d-ad7eaa342e81", + "metadata": {}, + "source": [ + "### Calculate the historical VaR from the simulated P&L" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "029d252b-d08b-4e4a-8aa5-8b1e46a2cf82", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "m_cc[\"HistoricalVaR\"] = tt.agg.quantile(\n", + " m_cc[\"HistoricalPnL\"],\n", + " 0.05,\n", + " mode=\"simple\",\n", + " interpolation=\"lower\",\n", + " scope=tt.OriginScope(l_cc[\"HistoricalDate\"]),\n", + ")\n", + "\n", + "m_cc[\"HistoricalVaR\"].formatter = \"DOUBLE[#,##0.00]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "87fd3d9b-b033-413d-b113-382eefd6283a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# we remove 1 date due to the current date in the list\n", + "m_cc[\"HistoricalDateCount\"] = (\n", + " tt.agg.sum(\n", + " tt.where((~m_cc[\"HistoricalVaR\"].isnull()), 1),\n", + " scope=tt.OriginScope(l_cc[\"HistoricalDate\"]),\n", + " )\n", + " - 1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "effaa681-b2ba-4d42-b40b-8829801bc0e6", + "metadata": {}, + "source": [ + "### Calculate the Expected Shortfalls" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "bffe9dfb-3ccc-4c4f-9084-9aba8b3138b7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "m_cc[\"ConfidenceLevel\"] = 0.975\n", + "m_cc[\"TailExposures\"] = tt.total(\n", + " tt.math.floor((1 - m_cc[\"ConfidenceLevel\"]) * m_cc[\"HistoricalDateCount\"]),\n", + " h_cc[\"HistoricalDate\"],\n", + ")\n", + "\n", + "m_cc[\"Rank\"] = tt.rank(m_cc[\"HistoricalPnL\"], h_cc[\"HistoricalDate\"])\n", + "\n", + "m_cc[\"ExpectedShortfall\"] = tt.agg.mean(\n", + " tt.where(m_cc[\"Rank\"] <= m_cc[\"TailExposures\"], m_cc[\"HistoricalPnL\"]),\n", + " scope=tt.OriginScope(l_cc[\"HistoricalDate\"]),\n", + ")\n", + "\n", + "m_cc[\"ExpectedShortfall\"].formatter = \"DOUBLE[#,##0.00]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "d31a4cf1-228b-44ec-8f8d-41e3682feabc", + "metadata": { + "tags": [] + }, + "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", + "
    ExpectedShortfall
    RiskFactor
    IRAUD-BBSW-64,314,493.18
    IRAUD-USD FX-6,954,794.41
    IRUSD-SOFR-3,620,922.43
    IRVol-AUD-BBSW-1,241,366.64
    SI-ABC-10,618,838.23
    \n", + "
    " + ], + "text/plain": [ + " ExpectedShortfall\n", + "RiskFactor \n", + "IRAUD-BBSW -64,314,493.18\n", + "IRAUD-USD FX -6,954,794.41\n", + "IRUSD-SOFR -3,620,922.43\n", + "IRVol-AUD-BBSW -1,241,366.64\n", + "SI-ABC -10,618,838.23" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cube_cc.query(m_cc[\"ExpectedShortfall\"], levels=[l_cc[\"RiskFactor\"]])" + ] + }, + { + "cell_type": "markdown", + "id": "51224db7-4f12-4990-a118-2cd4a6a9b0a5", + "metadata": {}, + "source": [ + "**Historical VaR by trades**" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "1225045a-222f-49bb-a920-e76991755fcf", + "metadata": { + "tags": [] + }, + "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", + "
    HistoricalVaR
    TradeID
    Cards_6578-55,793.53
    Deposits_12340.00
    Deposits_4466-162,063,597.33
    Deposits_Core-203,947,727.85
    MX_1234-76,221,641.12
    MX_2346-4,561,787.13
    MX_3457-1,817,397.85
    MX_4578-2,582,156.21
    MX_8988-8,149,325.74
    Mortgage_456780.00
    Mortgage_56789-248,499,673.62
    Receivables_1234-18,294.30
    \n", + "
    " + ], + "text/plain": [ + " HistoricalVaR\n", + "TradeID \n", + "Cards_6578 -55,793.53\n", + "Deposits_1234 0.00\n", + "Deposits_4466 -162,063,597.33\n", + "Deposits_Core -203,947,727.85\n", + "MX_1234 -76,221,641.12\n", + "MX_2346 -4,561,787.13\n", + "MX_3457 -1,817,397.85\n", + "MX_4578 -2,582,156.21\n", + "MX_8988 -8,149,325.74\n", + "Mortgage_45678 0.00\n", + "Mortgage_56789 -248,499,673.62\n", + "Receivables_1234 -18,294.30" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cube_cc.query(m_cc[\"HistoricalVaR\"], levels=[l_cc[\"TradeID\"]])" + ] + }, + { + "cell_type": "markdown", + "id": "59ff9cd4-e014-46e2-9f1a-8a2baf8f694e", + "metadata": {}, + "source": [ + "**Expected Shortfalls by trades**" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "0911d74b-b56d-487e-a56b-4363edd95310", + "metadata": { + "atoti": { + "widget": { + "mapping": { + "columns": [ + "ALL_MEASURES", + "[Expected Shortfall].[StressBehaviour].[StressBehaviour]" + ], + "measures": [ + "[Measures].[ExpectedShortfall]" + ], + "rows": [ + "[Expected Shortfall].[TradeID].[TradeID]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Hierarchize(Descendants({[Expected Shortfall].[TradeID].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS, NON EMPTY Crossjoin({[Measures].[ExpectedShortfall]}, [Expected Shortfall].[StressBehaviour].[StressBehaviour].Members) ON COLUMNS FROM [Capital Charge] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Expected Shortfalls by trade in all behaviour scenario", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Expected Shortfalls by trade in all behaviour scenario\")" + ] + }, + { + "cell_type": "markdown", + "id": "b4af9cef-7105-4b44-8edf-d3c494c45672", + "metadata": {}, + "source": [ + "### Prospective IRRBB Capital Charge (ProspICC)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "e261a3aa-cc0f-4f20-a944-c514ecd53785", + "metadata": {}, + "outputs": [], + "source": [ + "m_cc[\"ProspICC\"] = tt.agg.min(\n", + " m_cc[\"ExpectedShortfall\"],\n", + " scope=tt.SiblingsScope(hierarchy=h_cc[\"StressBehaviour\"]),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "76909249-a676-4da3-b8a8-25030de2fdb1", + "metadata": { + "atoti": { + "height": 97, + "widget": { + "mapping": { + "columns": [ + "ALL_MEASURES" + ], + "measures": [ + "[Measures].[ProspICC]" + ], + "rows": [ + "[Expected Shortfall].[AsOfDate].[AsOfDate]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Hierarchize(Descendants({[Expected Shortfall].[AsOfDate].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS, NON EMPTY {[Measures].[ProspICC]} ON COLUMNS FROM [Capital Charge] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Overall Prospective ICC", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Overall Prospective ICC\")" + ] + }, + { + "cell_type": "markdown", + "id": "9f161535-8885-47dc-a1ba-bd8b81961278", + "metadata": {}, + "source": [ + "### B.39-40 Additional optionality risk\n", + "B.39 An ADI must assess, at inception and at least annually, any risk to which it is exposed to from sources of optionality risk not captured by paragraphs 20 or 35 of this Attachment and determine whether the potential loss from all such sources is material. Where the loss is assessed as material, the ADI must extend its approved IRRBB model to determine a capital charge for those losses, which is the optionality capital charge. That capital charge must meet a soundness standard whereby it is no less than the 97.5 per cent expected shortfall from all such sources over a one-year period. An ADI must also assess new products and variations of existing products as to whether they introduce material additional optionality risk." + ] + }, + { + "cell_type": "markdown", + "id": "5ec56a27-b534-43d1-a667-06d48d318d86", + "metadata": {}, + "source": [ + "B.40 For each independent review conducted in accordance with paragraph 31 of Attachment A to this Prudential Standard, an ADI must assess the materiality of its exposure to sources of optionality risk that are not covered by its approved IRRBB model." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "9c46df50-b16a-4f26-ae47-b2dd8d591bd3", + "metadata": {}, + "outputs": [], + "source": [ + "tbls.setup_capitalCharge_cube()\n", + "data_processing.load_capitalCharge_data(tbls)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "47552121-63c5-4bbb-801f-7083fc6a95c0", + "metadata": {}, + "outputs": [], + "source": [ + "# ICC OCC and OAA calculation\n", + "l_cc[\"ICCcalculationDate\"].order = tt.NaturalOrder(ascending=False)\n", + "l_cc[\"OCCcalculationDate\"].order = tt.NaturalOrder(ascending=False)\n", + "l_cc[\"OAAcalculationDate\"].order = tt.NaturalOrder(ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "f1b053eb-827a-4c11-8ef2-8fbbb5c915d4", + "metadata": {}, + "source": [ + "### B.2-3 IRRBB capital charge" + ] + }, + { + "cell_type": "markdown", + "id": "094350df-8682-4471-90b2-c8da89af4aac", + "metadata": {}, + "source": [ + "B.2 The IRRBB capital charge at a calculation date 𝑑𝑑 is the greater of zero and:" + ] + }, + { + "attachments": { + "e8320495-de82-4023-b949-0f4fd4213d98.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "d9407d87-ebdf-4985-a086-d10ffb271f14", + "metadata": {}, + "source": [ + "![image.png](attachment:e8320495-de82-4023-b949-0f4fd4213d98.png)" + ] + }, + { + "cell_type": "markdown", + "id": "8837c9a8-074b-483b-aebf-4b2f36525053", + "metadata": {}, + "source": [ + "where:\n", + "ICCd, ICCd1, ICCd2, ICCd3 are respectively the prospective IRRBB capital charges at the calculation date and the latest three month-ends, determined in accordance with paragraph 20 of this Attachment;" + ] + }, + { + "cell_type": "markdown", + "id": "70cda79c-4f9c-4ccf-b5f0-83a5f4c6e2e8", + "metadata": {}, + "source": [ + "OCCd is the optionality capital charge at the calculation date, determined in accordance with paragraph 39 of this Attachment; and" + ] + }, + { + "cell_type": "markdown", + "id": "64c0e8cd-3bf8-428b-9c04-5dfa0c3b2ab8", + "metadata": {}, + "source": [ + "OAAd is any other amount that APRA has notified the ADI it must include in the calculation of its IRRBB capital charge, or that has been calculated in accordance with a method specified by APRA." + ] + }, + { + "cell_type": "markdown", + "id": "c1207495-c8c9-4e0d-9651-7f96376fa832", + "metadata": {}, + "source": [ + "B.3 The IRRBB capital charge, as defined in paragraph 2 of this Attachment, excludes embedded loss. Embedded loss is the sum of the differences of the book value and economic value of each banking book item. Unless it has been written off to the ADI’s profit or loss, embedded loss is to be included as a regulatory adjustment (i.e. deduction) from an ADI’s Common Equity Tier 1 Capital under Attachment D of Prudential Standard APS 111 Capital Adequacy: Measurement of Capital. If the embedded loss is negative (i.e. embedded gain), the regulatory adjustment must be set to zero." + ] + }, + { + "cell_type": "markdown", + "id": "d254fca4-cbbd-4418-b5dc-eb7b9da2e8d4", + "metadata": {}, + "source": [ + "#### Overall IRRBB capital charge calculation" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "28964170-57b9-403d-bd08-47e8c275d9c6", + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate the average of the last three IRRBB Capital Charge\n", + "m_cc[\"ICCValue\"] = tt.agg.single_value(tbls.historcialICCTbl[\"ICCValue\"])\n", + "\n", + "m_cc[\"1PeriodLastICCValue\"] = tt.agg.single_value(tbls.historcialICCTbl[\"ICCValue\"])\n", + "m_cc[\"2PeriodLastICCValue\"] = tt.agg.single_value(\n", + " tbls.historcialICCTbl[\"2PeriodLastICCValue\"]\n", + ")\n", + "m_cc[\"3PeriodLastICCValue\"] = tt.agg.single_value(\n", + " tbls.historcialICCTbl[\"3PeriodLastICCValue\"]\n", + ")\n", + "m_cc[\"AvgLast3ICC\"] = tt.agg.single_value(tbls.historcialICCTbl[\"AvgLast3ICC\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "550e03d2-9071-4db5-b7de-ea92fe0f2e9e", + "metadata": { + "atoti": { + "height": 201, + "widget": { + "mapping": { + "columns": [ + "ALL_MEASURES" + ], + "measures": [ + "[Measures].[1PeriodLastICCValue]", + "[Measures].[2PeriodLastICCValue]", + "[Measures].[3PeriodLastICCValue]", + "[Measures].[AvgLast3ICC]" + ], + "rows": [ + "[Historical ICC].[ICCcalculationDate].[ICCcalculationDate]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY {[Measures].[1PeriodLastICCValue], [Measures].[2PeriodLastICCValue], [Measures].[3PeriodLastICCValue], [Measures].[AvgLast3ICC]} ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Historical ICC].[ICCcalculationDate].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [Capital Charge] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "ICC History", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"ICC History\")" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "516153ae-6890-4a2a-b0b5-d67cbc35cdfa", + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate the IRRBB Capital Charge for this period\n", + "m_cc[\"OCCValue\"] = tt.agg.single_value(tbls.optionalityChargeTbl[\"OCCValue\"])\n", + "m_cc[\"LastOCCValue\"] = tt.first(m_cc[\"OCCValue\"], l_cc[\"OCCcalculationDate\"])\n", + "\n", + "m_cc[\"OAAValue\"] = tt.agg.single_value(tbls.otherAPRAAmtTbl[\"OAAValue\"])\n", + "m_cc[\"LastOAAValue\"] = tt.first(m_cc[\"OAAValue\"], l_cc[\"OAAcalculationDate\"])\n", + "\n", + "m_cc[\"CapitalChargeICCcomponent\"] = tt.math.max(m_cc[\"ProspICC\"], m_cc[\"AvgLast3ICC\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "c11b63a9-58fe-476e-92b7-b5139e764397", + "metadata": {}, + "outputs": [], + "source": [ + "m_cc[\"OverallIRRBBCapitalCharge\"] = tt.agg.sum(\n", + " m_cc[\"CapitalChargeICCcomponent\"] + m_cc[\"LastOCCValue\"] + m_cc[\"LastOAAValue\"],\n", + " scope=tt.OriginScope(l_cc[\"AsOfDate\"]),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "6006c13f-c713-4536-89bd-df1a21d024da", + "metadata": { + "atoti": { + "height": 98, + "widget": { + "columnWidths": { + "[Measures].[CapitalChargeICCcomponent]": 177, + "[Measures].[OverallIRRBBCapitalCharge]": 138.859375 + }, + "mapping": { + "columns": [ + "ALL_MEASURES" + ], + "measures": [ + "[Measures].[LastOAAValue]", + "[Measures].[LastOCCValue]", + "[Measures].[CapitalChargeICCcomponent]", + "[Measures].[OverallIRRBBCapitalCharge]" + ], + "rows": [ + "[Expected Shortfall].[AsOfDate].[AsOfDate]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY {[Measures].[LastOAAValue], [Measures].[LastOCCValue], [Measures].[CapitalChargeICCcomponent], [Measures].[OverallIRRBBCapitalCharge]} ON COLUMNS, NON EMPTY Hierarchize(Descendants({[Expected Shortfall].[AsOfDate].[AllMember]}, 1, SELF_AND_BEFORE)) ON ROWS FROM [Capital Charge] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.widget.v0+json": { + "name": "Overall IRRBB Capital Calculation", + "sessionId": "1688356486_V66DYU", + "sessionLocation": { + "https": false, + "port": 9092 + }, + "widgetCreationCode": "session.visualize()" + }, + "text/html": [ + "" + ], + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to build this widget." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "session.visualize(\"Overall IRRBB Capital Calculation\")" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "6546dbed-2b34-4d9b-8a0a-1a67dbdd4387", + "metadata": { + "atoti": { + "widget": { + "filters": [ + "[Trade Base].[AsOfDate].[AllMember].[2022-11-02]" + ], + "mapping": { + "columns": [ + "ALL_MEASURES" + ], + "measures": [ + "[Measures].[Historical VaR]" + ], + "rows": [ + "[Trade Base].[AsOfDate].[AsOfDate]", + "[Portfolio].[Account].[Account]", + "[Trade Base].[TradeID].[TradeID]" + ] + }, + "query": { + "mdx": "SELECT NON EMPTY Crossjoin(Hierarchize(Descendants({[Trade Base].[AsOfDate].[AllMember]}, 1, SELF_AND_BEFORE)), Hierarchize(Descendants({[Portfolio].[Account].[AllMember]}, 1, SELF_AND_BEFORE)), Hierarchize(Descendants({[Trade Base].[TradeID].[AllMember]}, 1, SELF_AND_BEFORE))) ON ROWS, NON EMPTY {[Measures].[Historical VaR]} ON COLUMNS FROM [IRRBB Cube] CELL PROPERTIES VALUE, FORMATTED_VALUE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", + "updateMode": "once" + }, + "serverKey": "default", + "widgetKey": "pivot-table" + } + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.atoti.link.v0+json": { + "path": "", + "sessionLocation": { + "https": false, + "port": 9092 + } + }, + "text/plain": [ + "Open the notebook in JupyterLab with the Atoti extension enabled to see this link." + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.link()" + ] + }, + { + "cell_type": "markdown", + "id": "96a7f087-8f12-4e40-80f7-410e687ed3c3", + "metadata": {}, + "source": [ + "## Conclusion" + ] + }, + { + "cell_type": "markdown", + "id": "2202a8a3-4d4f-455e-9c5b-2c41dd104eb9", + "metadata": {}, + "source": [ + "The notebook has demonstrated how the Interest Rate Risk Banking Book calculation can be performed within Atoti. The Atoti solution assists users to perform the analytics on various calculations within the standards. Through this, users can perform full data analytics of the risk numbers from bank level down to the trade level. \n", + "\n", + "Further data mapping of the trade to the bank’s desk portfolio, charts of accounts hierarchy, user can attribute the risk measures and historical simulated PnL in different hierarchies. Users can explain the source of risk and attribute the capital accordingly. \n", + "\n", + "The solution also demonstrated how users can compare the cash flows, sensitivities and risk results under various APRA behaviour stress assumptions. These can help provide relevant information for risk managment decision. \n", + "\n", + "This solution can be further extended for stress testing, backtesting, theoretical PnL explain, limit management and so on. " + ] + }, + { + "cell_type": "markdown", + "id": "4ceddd76-dc95-4a6d-aab3-ae0d8f426e3b", + "metadata": {}, + "source": [ + "
    \"Try
    " + ] + } + ], + "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.10.11" + }, + "toc-autonumbering": false, + "toc-showcode": false + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/utils/data_processing.py b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/utils/data_processing.py new file mode 100644 index 00000000..dfed7ea5 --- /dev/null +++ b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/utils/data_processing.py @@ -0,0 +1,193 @@ +import uuid +import pandas as pd + + +def getArrayValue(arrValue): + """ + This function takes in a String delimited by ';' and converts it into a Python list containing float values. + + Args: + arrValue: String containing float values delimited by ';'. E.g. 1,2.35;2.35;2.35;2.35;1.85;1.85;1.85; + + Returns: + A list of float values. + """ + arrValue = arrValue.str.split(";") + arrValue = arrValue.apply(lambda x: [float(i) for i in x]) + + return arrValue + + +def load_data(session, tbls): + """ + This function loads data for the tables in the trade cube. + - IRDelta + - IRVega + - SIDelta + - Cashflow + - Historical Risk Factor + - Historical Dates + - Tenors + + Sensitivities data (IRDelta, IRVega, SIDelta, Cashflow) will also be loaded into the TradeBase table. + Historical Risk Factor data will be processed to include the value shifted by 10 historical dates. + + Args: + session: Current Atoti session + tbls: Table object instantiated for session + """ + ############ + # Data loading + ############ + # trade base and trade attributes + tbls.tradeAttributeTbl.load_csv( + "s3://data.atoti.io/notebooks/irrbb/TradeAttributes.csv" + ) + + # Sensitivities - IRDelta, SIDelta, IRVega, Cashflow + # loading sensitivities data will also trigger data loading into TradeBase table + loadSensitivity( + tbls.tradeBaseTbl, + tbls.irDeltaTbl, + "https://data.atoti.io/notebooks/irrbb/IRDelta.csv", + "DeltaSensitivities", + ) + loadSensitivity( + tbls.tradeBaseTbl, + tbls.siDeltaTbl, + "https://data.atoti.io/notebooks/irrbb/SIDelta.csv", + "SIDeltaSensitivities", + ) + loadSensitivity( + tbls.tradeBaseTbl, + tbls.irVegaTbl, + "https://data.atoti.io/notebooks/irrbb/IRVega.csv", + "VegaSensitivities", + ) + loadSensitivity( + tbls.tradeBaseTbl, + tbls.nmrCashFlowTbl, + "https://data.atoti.io/notebooks/irrbb/NMRCashFlow.csv", + "CashFlowValues", + ) + + tbls.portfolioTbl.load_csv("s3://data.atoti.io/notebooks/irrbb/BookParentChild.csv") + + # historical risk factors + histRFDF = process_historical_rf( + "https://data.atoti.io/notebooks/irrbb/HistoricalRiskFactor.csv" + ) + tbls.historicalRFTbl.load_pandas(histRFDF[tbls.historicalRFTbl.columns]) + tbls.historicalDateTbl.load_csv( + "s3://data.atoti.io/notebooks/irrbb/HistoricalDates.csv" + ) + + # analysis hierarchy + tbls.tenorsTbl.load_csv("s3://data.atoti.io/notebooks/irrbb/Tenors.csv") + + +def load_capitalCharge_data(tbls): + """ + This function loads data for the tables in the Capital Charge cube. + - Optionality Charge + - Other APRA Amount + - Historical ICC + + Historical ICC will be processed to derive: + - 1PeriodLastICCValue (ICCValue) + - 2PeriodLastICCValue (ICCValue of the previous day) + - 3PeriodLastICCValue (ICCValue of 2 days ago) + - AvgLast3ICC (Average of the above 3 values) + + Args: + tbls: Table object instantiated for session + """ + tbls.optionalityChargeTbl.load_csv( + "s3://data.atoti.io/notebooks/irrbb/OptionalityCharge.csv" + ) + tbls.otherAPRAAmtTbl.load_csv( + "s3://data.atoti.io/notebooks/irrbb/OtherAPRAAmount.csv" + ) + + hist_icc_df = process_historical_icc( + "https://data.atoti.io/notebooks/irrbb/HistoricalICC.csv" + ) + tbls.historcialICCTbl.load_pandas(hist_icc_df[tbls.historcialICCTbl.columns]) + + +def loadSensitivity(tradeTbl, sensiTbl, filepath, vectorField): + """ + This function pre-process the sensitivity data to load into the TradeBase table as well as the respective sensitivity table. + + Only cashflows will have the column 'CashflowKey'. The rest of the sensitivities will take the default value of '-' for 'CashflowKey'. + + Args: + tradeTbl: Reference for TradeBase table + sensiTbl: Reference for Sensitivity table + filepath: Path to source file + vectorField: The DataFrame column containing the list of values delimited by ';' + """ + + df = pd.read_csv(filepath) + df["AsOfDate"] = pd.to_datetime(df["AsOfDate"]).dt.date + df[vectorField] = getArrayValue(df[vectorField]) + + if "CashflowKey" not in df.columns: + df["CashflowKey"] = "-" + + tradeTbl.load_pandas(df[tradeTbl.columns]) + sensiTbl.load_pandas(df[sensiTbl.columns]) + + +def process_historical_rf(filepath): + """ + This function pre-process the sensitivity data to load into the TradeBase table as well as the respective sensitivity table. + + Only cashflows will have the column 'CashflowKey'. The rest of the sensitivities will take the default value of '-' for 'CashflowKey'. + + Args: + tradeTbl: Reference for TradeBase table + sensiTbl: Reference for Sensitivity table + filepath: Path to source file + vectorField: The DataFrame column containing the list of values delimited by ';' + """ + historical_df = pd.read_csv(filepath) + historical_df["AsOfDate"] = pd.to_datetime(historical_df["AsOfDate"]).dt.date + historical_df["RFValue"] = getArrayValue(historical_df["RFValue"]) + + # note that the date is arranged in descending order + # No previous value for oldest 10 days, therefore we remove the first 10 values of RF + # remove oldest 10 days in historical date as well + historical_df["PrevRFValue"] = historical_df["RFValue"].apply(lambda x: x[10:]) + historical_df["RFValue"] = historical_df["RFValue"].apply(lambda x: x[:-10]) + + return historical_df + + +def process_historical_icc(filepath): + """ + This function computes the 1st, 2nd and 3rd period of the last ICC value and the average of the three values. + + + Historical ICC will be processed to derive: + - 1PeriodLastICCValue (ICCValue) + - 2PeriodLastICCValue (ICCValue of the previous day) + - 3PeriodLastICCValue (ICCValue of 2 days ago) + - AvgLast3ICC (Average of the above 3 values) + + Args: + filepath: Path of the Historical ICC data file + """ + hist_icc_df = pd.read_csv(filepath) + hist_icc_df["AsOfDate"] = pd.to_datetime(hist_icc_df["AsOfDate"]).dt.date + hist_icc_df["ICCcalculationDate"] = pd.to_datetime( + hist_icc_df["ICCcalculationDate"] + ).dt.date + hist_icc_df["1PeriodLastICCValue"] = hist_icc_df["ICCValue"] + hist_icc_df["2PeriodLastICCValue"] = hist_icc_df["ICCValue"].shift(-1) + hist_icc_df["3PeriodLastICCValue"] = hist_icc_df["ICCValue"].shift(-2) + hist_icc_df["AvgLast3ICC"] = hist_icc_df[ + ["1PeriodLastICCValue", "2PeriodLastICCValue", "3PeriodLastICCValue"] + ].mean(axis=1) + + return hist_icc_df diff --git a/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/utils/tables.py b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/utils/tables.py new file mode 100644 index 00000000..5c46ffe0 --- /dev/null +++ b/notebooks/01-use-cases/finance/risk-management/liquidity-risk/irrbb/utils/tables.py @@ -0,0 +1,255 @@ +import atoti as tt + + +class Tables: + """ + This class creates the tables and setup the table relationship required for the IRRBB trade cube on initiation: + - TradeBase + - TradeAttributes + - IRDelta + - IRVega + - SIDelta + - NMR Cashflow + - Historical Risk Factor + - Historical Dates + - Portfolio + + It also allows for the enhancement of the Capital Charge cube with the following tables: + - Optionality Charge + - Historical ICC + - OtherAPRAAmount + + Args: + session: The Atoti session + """ + + def __init__(self, session): + self.session = session + self.setup_trade_tables() + + def setup_trade_tables(self): + """ + This function creates the tables for the trade cube: + - TradeBase + - TradeAttributes + - IRDelta + - IRVega + - SIDelta + - NMR Cashflow + - Historical Risk Factor + - Historical Dates + - Portfolio + """ + self.tradeBaseTbl = self.session.create_table( + name="TradeBase", + types={ + "InternalKey": tt.type.STRING, + "CashflowKey": tt.type.STRING, + "AsOfDate": tt.type.LOCAL_DATE, + "TradeID": tt.type.STRING, + "RiskFactor": tt.type.STRING, + "RiskFactorType": tt.type.STRING, + "RiskMeasure": tt.type.STRING, + }, + keys=["InternalKey", "CashflowKey"], + default_values={"CashflowKey": "-"}, + ) + + self.tradeAttributeTbl = self.session.create_table( + name="TradeAttributes", + types={ + "InternalKey": tt.type.STRING, + "AsOfDate": tt.type.LOCAL_DATE, + "ItemType": tt.type.STRING, + "ProductType": tt.type.STRING, + "Book": tt.type.STRING, + "LegalEntity": tt.type.STRING, + "SourceSystem": tt.type.STRING, + "Notional": tt.type.LONG, + "NotionalCcy": tt.type.STRING, + "EconomicValue": tt.type.LONG, + "EconomicValueCcy": tt.type.STRING, + "Counterparty": tt.type.STRING, + "IssueDate": tt.type.LOCAL_DATE, + "TradeDate": tt.type.LOCAL_DATE, + "MaturityDate": tt.type.LOCAL_DATE, + "NextRepriceDate": tt.type.LOCAL_DATE, + "NextPaymentDate": tt.type.LOCAL_DATE, + "Compounding Frequency": tt.type.DOUBLE, + "FixingType": tt.type.STRING, + "RepaymentFrequency": tt.type.DOUBLE, + }, + keys=["InternalKey"], + ) + + self.irDeltaTbl = self.session.create_table( + name="IRDelta", + types={ + "InternalKey": tt.type.STRING, + "DeltaCcy": tt.type.STRING, + "DeltaSensitivities": tt.type.DOUBLE_ARRAY, + }, + keys=["InternalKey"], + ) + + self.irVegaTbl = self.session.create_table( + name="IRVega", + types={ + "InternalKey": tt.type.STRING, + "VegaCcy": tt.type.STRING, + "VegaSensitivities": tt.type.DOUBLE_ARRAY, + }, + keys=["InternalKey"], + ) + + self.siDeltaTbl = self.session.create_table( + name="SIDelta", + types={ + "InternalKey": tt.type.STRING, + "SIDeltaCcy": tt.type.STRING, + "SIDeltaSensitivities": tt.type.DOUBLE_ARRAY, + }, + keys=["InternalKey"], + ) + + self.nmrCashFlowTbl = self.session.create_table( + name="NMR Cashflow", + types={ + "InternalKey": tt.type.STRING, + "CashflowKey": tt.type.STRING, + "CashFlowCcy": tt.type.STRING, + "CashFlowValues": tt.type.DOUBLE_ARRAY, + "CashFlowType": tt.type.STRING, + "BehaviourOptionalityStressedCF": tt.type.STRING, + "BehaviourOptionType": tt.type.STRING, + "BehaviourOption": tt.type.STRING, + }, + keys=["InternalKey", "CashflowKey"], + ) + + self.historicalRFTbl = self.session.create_table( + name="Historical Risk Factor", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "RiskFactor": tt.type.STRING, + "Tenor": tt.type.INT, + "RFValue": tt.type.DOUBLE_ARRAY, + "PrevRFValue": tt.type.DOUBLE_ARRAY, + }, + keys=["AsOfDate", "RiskFactor", "Tenor"], + ) + + self.historicalDateTbl = self.session.create_table( + name="Historical Dates", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "HistoricalDate": tt.type.LOCAL_DATE, + "HistoricalDateIndex": tt.type.INT, + }, + keys=["AsOfDate", "HistoricalDate"], + ) + + self.portfolioTbl = self.session.create_table( + name="Portfolio", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "GroupLevel": tt.type.STRING, + "ParentBook": tt.type.STRING, + "SubParentBook": tt.type.STRING, + "Book": tt.type.STRING, + "Account": tt.type.STRING, + "LegalEntity": tt.type.STRING, + "BalanceSheetCategory": tt.type.STRING, + "AccrualBasis": tt.type.STRING, + "ParentLegalEntity": tt.type.STRING, + "Country": tt.type.STRING, + "IRRBBDesk": tt.type.STRING, + }, + keys=["AsOfDate", "Book", "LegalEntity"], + ) + + self.tenorsTbl = self.session.create_table( + name="Tenors", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "RiskFactor": tt.type.STRING, + "Tenor": tt.type.INT, + "TenorIndex": tt.type.INT, + "TenorName": tt.type.STRING, + }, + keys=["AsOfDate", "RiskFactor", "Tenor"], + ) + + self.setup_trade_schema() + + def setup_trade_schema(self): + """ + This function sets up the relationship between the tables for trade cube: + """ + self.tradeBaseTbl.join( + self.tradeAttributeTbl, + (self.tradeBaseTbl["InternalKey"] == self.tradeAttributeTbl["InternalKey"]) + & (self.tradeBaseTbl["AsOfDate"] == self.tradeAttributeTbl["AsOfDate"]), + ) + self.tradeBaseTbl.join(self.irDeltaTbl) + self.tradeBaseTbl.join(self.siDeltaTbl) + self.tradeBaseTbl.join(self.irVegaTbl) + self.tradeBaseTbl.join(self.nmrCashFlowTbl) + self.tradeBaseTbl.join(self.tenorsTbl) + self.tradeBaseTbl.join(self.historicalDateTbl) + self.tenorsTbl.join(self.historicalRFTbl) + + self.tradeAttributeTbl.join(self.portfolioTbl) + + def setup_capitalCharge_cube(self): + """ + This class creates the tables required for the Capital Charge cube: + - Optionality Charge + - Historical ICC + - OtherAPRAAmount + """ + self.es_tbl = self.session.tables["Expected Shortfall"] + + self.optionalityChargeTbl = self.session.create_table( + name="Optionality Charge", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "OCCcalculationDate": tt.type.LOCAL_DATE, + "OCCValue": tt.type.DOUBLE, + }, + keys=["AsOfDate", "OCCcalculationDate"], + ) + + self.historcialICCTbl = self.session.create_table( + name="Historical ICC", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "ICCcalculationDate": tt.type.LOCAL_DATE, + "ICCValue": tt.type.DOUBLE, + "1PeriodLastICCValue": tt.type.DOUBLE, + "2PeriodLastICCValue": tt.type.DOUBLE, + "3PeriodLastICCValue": tt.type.DOUBLE, + "AvgLast3ICC": tt.type.DOUBLE, + }, + keys=["AsOfDate", "ICCcalculationDate"], + ) + + self.otherAPRAAmtTbl = self.session.create_table( + name="OtherAPRAAmount", + types={ + "AsOfDate": tt.type.LOCAL_DATE, + "OAAcalculationDate": tt.type.LOCAL_DATE, + "OAAValue": tt.type.DOUBLE, + }, + keys=["AsOfDate", "OAAcalculationDate"], + ) + + self.setup_capitalCharge_schema() + + def setup_capitalCharge_schema(self): + """ + This function sets up the relationship between the tables for Capital charge cube: + """ + self.es_tbl.join(self.optionalityChargeTbl) + self.es_tbl.join(self.historcialICCTbl) + self.es_tbl.join(self.otherAPRAAmtTbl) diff --git a/notebooks/02-technical-tutorials/security-implementation/01-Basic-authentication.ipynb b/notebooks/02-technical-tutorials/security-implementation/01-Basic-authentication.ipynb index 19a64bdf..11f8e842 100644 --- a/notebooks/02-technical-tutorials/security-implementation/01-Basic-authentication.ipynb +++ b/notebooks/02-technical-tutorials/security-implementation/01-Basic-authentication.ipynb @@ -768,7 +768,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 18, "id": "acf35c18-4dc0-4b9a-8c43-b2eb48f0a2e7", "metadata": { "tags": [] @@ -786,7 +786,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "e817bf40-0505-4110-b6ef-6a0b66e15564", "metadata": { "tags": [] @@ -819,7 +819,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "ff86711d-ccc5-4aad-8cf5-5ddf9485d163", "metadata": { "tags": [] @@ -854,7 +854,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "dfee4056-9c6e-43f4-8fb4-9ac330498d07", "metadata": {}, "outputs": [], @@ -889,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "f716fbe1-03ae-4bac-a068-355cf1d75e10", "metadata": {}, "outputs": [], @@ -919,7 +919,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "e39094bc-cade-4ba2-bf33-2bfe3768bd34", "metadata": {}, "outputs": [], @@ -976,7 +976,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "2a37ab9e-44a4-49d6-9a92-c3a4d074adff", "metadata": {}, "outputs": [], @@ -1007,7 +1007,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "2975571f-1fa3-4461-8821-7c411eaf744e", "metadata": {}, "outputs": [], @@ -1056,7 +1056,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "fbc19c1b-7f9e-4384-b468-c997364ff93f", "metadata": {}, "outputs": [ @@ -1073,7 +1073,7 @@ "Open the notebook in JupyterLab with the Atoti extension enabled to see this link." ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1087,7 +1087,7 @@ "id": "a3d4dbae-7fe0-4c8f-b012-f8d6e33c363e", "metadata": {}, "source": [ - "
    \"Try
    " + "
    \"Try
    " ] } ], diff --git a/notebooks/README.md b/notebooks/README.md index 4570b819..92c72373 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -100,6 +100,26 @@ Check out the [Atoti repository](https://github.com/atoti/atoti) for more info o
  • +Liquidity Risk
    +
    + + + + indicates the licensed version of Atoti is required. + + + + + + + + + +
    NotebooksRelated media
     irrbb πŸ“° Measuring Interest Rate Risk in the Banking Book (IRRBB) with Atoti
    +
    +
    +
  • +
    Market Risk