Skip to content

ROTE engine

ID MOD-106
System SD06
Repo bank-risk-platform
Build status Not started
Deployed No

What it does

MOD-106 computes daily ROTE (Return on Tangible Equity) at three levels: per product per customer (facility-level), per product across the portfolio (product-level), and per customer across all their holdings (customer-level). Results feed MOD-105 (eligibility — ROTE hurdle gate) and executive dashboards via Snowflake.

Why it exists

Governance. CON-006 requires that products persistently below the ROTE hurdle rate are flagged to the product governance board. Without a systematic calculation this obligation is manual, inconsistent, and difficult to evidence to the regulator.

Commercial. Return on tangible equity is the primary capital efficiency metric used by the board to evaluate product portfolio performance. Facility-level ROTE shows whether individual credit exposures are generating adequate return relative to the regulatory capital they consume. Customer-level ROTE tells the bank whether a given customer relationship is profitable in aggregate — informing product selection in MOD-107 (NBP engine) and pricing adjustments.

ROTE formula

Facility ROTE =  (NIM Revenue − ECL Provision − Operating Cost Allocation)
                 ─────────────────────────────────────────────────────────
                     Allocated Regulatory Capital (RWA × CET1 floor)

Where:
  NIM Revenue               = from MOD-086 FTP grid (product interest income minus transfer price cost)
  ECL Provision             = from MOD-031 (expected credit loss for this exposure)
  Operating Cost Allocation = configurable cost coefficient per product class (bps of balance)
  Allocated Regulatory Capital = product exposure × RWA risk weight (from MOD-033) × CET1 floor (config)

Tangible equity is approximated as RWA × CET1 minimum ratio, configured per jurisdiction: NZ uses 6% per RBNZ requirements; AU uses 4.5% plus applicable buffers per APRA requirements. This gives a consistent capital allocation across the portfolio without requiring a full internal capital adequacy model.

Data model

-- rote.facility_rote (Snowflake — written daily by MOD-106)
CREATE TABLE rote.facility_rote (
  party_id                     VARCHAR NOT NULL,
  product_id                   VARCHAR NOT NULL,
  account_id                   VARCHAR NOT NULL,
  jurisdiction                 VARCHAR NOT NULL,
  nim_revenue                  NUMBER(18,6) NOT NULL,
  ecl_provision                NUMBER(18,6) NOT NULL,
  operating_cost_allocation    NUMBER(18,6) NOT NULL,
  allocated_regulatory_capital NUMBER(18,6) NOT NULL,
  rote_annualised              NUMBER(8,6) NOT NULL,   -- e.g. 0.1234 = 12.34%
  hurdle_rate                  NUMBER(8,6) NOT NULL,
  below_hurdle                 BOOLEAN NOT NULL,
  calculation_date             DATE NOT NULL,
  model_version                VARCHAR NOT NULL
);

-- rote.customer_rote (Snowflake — daily roll-up across all customer facilities)
CREATE TABLE rote.customer_rote (
  party_id                  VARCHAR NOT NULL,
  jurisdiction              VARCHAR NOT NULL,
  total_nim_revenue         NUMBER(18,6) NOT NULL,
  total_ecl_provision       NUMBER(18,6) NOT NULL,
  total_operating_cost      NUMBER(18,6) NOT NULL,
  total_allocated_capital   NUMBER(18,6) NOT NULL,
  customer_rote_annualised  NUMBER(8,6) NOT NULL,
  calculation_date          DATE NOT NULL,
  PRIMARY KEY (party_id, calculation_date)
);

Hurdle rate framework

Each product class has a configured ROTE hurdle rate stored in product_eligibility.eligibility_rules.rote_hurdle_rate and read by both MOD-105 and MOD-106 at calculation time. Representative hurdle rates: personal loan 15%, everyday account 8%, term deposit 10%. Rates are set by the product governance board and updated through a controlled configuration change process.

If a facility's annualised ROTE falls below the configured hurdle for 90 consecutive calendar days, the record is written with below_hurdle = true. MOD-105 reads this flag at eligibility evaluation time — products in a persistent below-hurdle state have their ROTE gate fail for new offers until the product is repriced or the hurdle rate is formally revised. An alert is sent to the product governance board via MOD-076 when a product first enters or exits a below-hurdle state.

Customer-level roll-up

Customer ROTE is computed as the sum of all facility-level net returns (NIM revenue minus ECL provision minus operating cost allocation) divided by total allocated regulatory capital across all the customer's holdings. This produces a single capital-efficiency figure for the entire customer relationship.

MOD-107 (NBP engine) consumes customer ROTE as an input to next best product scoring. Customers with low overall ROTE are prioritised for upsell opportunities in higher-returning product categories, subject to eligibility gating by MOD-105.

Events

MOD-106 publishes rote.facility_rote_calculated to the bank-risk-platform EventBridge bus after each daily batch run completes. The event carries summary statistics: below-hurdle count by product class, average annualised ROTE by product class, and calculation date. This event is consumed by MOD-105 to refresh the ROTE gate state for the following day's eligibility evaluations.


Module dependencies

Depends on

Module Title Required? Contract Reason
MOD-031 ECL calculation & GL posting Required ECL provision from MOD-031 is a required input to the ROTE numerator calculation.
MOD-033 RWA & capital ratio engine Required RWA-based regulatory capital from MOD-033 is the denominator in the ROTE calculation (tangible equity = RWA × CET1 ratio).
MOD-086 Funds transfer pricing engine Required NIM attribution by product from MOD-086 is the primary revenue input to the ROTE numerator.
MOD-104 AWS shared infrastructure bootstrap Required MOD-104 provisions the S3 Iceberg bucket (Snowflake external tables), KMS key, and bank-risk-platform EventBridge bus ARN. Required before this module can be deployed.
MOD-102 Snowflake account configuration & governance Required Snowflake account, BANK_{ENV}_RISK database, BANK_DBT_ROLE, and warehouse must exist before this module can create its schema or run dbt models.

Required by

Module Title As Contract
MOD-107 Next best product engine Optional enhancement

Policies satisfied

Policy Title Mode How
CON-006 Product suitability and governance CALC Computes product-level and customer-level ROTE as a governance input to product eligibility and pricing decisions — products persistently below hurdle are flagged for product governance board review.
CRE-001 Credit Risk Management Policy CALC Risk-adjusted return calculated using RWA-based regulatory capital, ECL provision, and NIM attribution — providing a capital-efficiency view of credit product performance.

Capabilities satisfied

(No capabilities mapped)


Part of SD06 — Snowflake Analytics & Risk Platform Compiled 2026-05-22 from source/entities/modules/MOD-106.yaml