Market risk is the risk of losses arising from movements in market prices. For a financial institution, market prices affect virtually everything it holds: the value of bonds changes when interest rates move; equity portfolios rise and fall with...
In This Chapter
- Learning Objectives
- 14.1 What Is Market Risk?
- 14.2 The Basel Framework for Market Risk Capital
- 14.3 Value at Risk: Calculation and Limitations
- 14.4 Interest Rate Risk in the Banking Book (IRRBB)
- 14.5 The Market Risk Reporting Stack
- 14.6 Cornerstone Financial Group: Market Risk Governance Under FRTB
- 14.7 Priya's Perspective: Market Risk in RegTech Advisory
- 14.8 Key Concepts Summary
- Summary
Chapter 14: Market Risk and the Basel Framework in Practice
Learning Objectives
By the end of this chapter, you will be able to:
- Define market risk and describe its principal components: interest rate risk, equity risk, foreign exchange risk, and commodity risk
- Explain the Basel framework's capital requirements for market risk — from the original 1996 Market Risk Amendment through the Fundamental Review of the Trading Book (FRTB)
- Describe Value at Risk (VaR) methodology, its calculation approaches, and its well-documented limitations
- Understand Expected Shortfall (ES) and why regulators replaced VaR with ES in FRTB
- Apply Python to calculate historical VaR and basic portfolio risk metrics
- Identify the market risk management technology stack — from pricing systems to risk aggregation platforms
- Explain the regulatory reporting obligations for market risk, including Pillar 1 capital and Pillar 3 disclosures
14.1 What Is Market Risk?
Market risk is the risk of losses arising from movements in market prices. For a financial institution, market prices affect virtually everything it holds: the value of bonds changes when interest rates move; equity portfolios rise and fall with markets; the local currency value of foreign assets changes with exchange rates; commodity inventories fluctuate with commodity prices.
The Basel Committee defines market risk as "the risk of losses in on- and off-balance sheet positions arising from movements in market prices." This includes:
Interest rate risk in the trading book: The risk that changes in interest rates affect the mark-to-market value of fixed income positions. A bank holding a 10-year government bond will see its value fall if rates rise (and rise if rates fall). The magnitude of this sensitivity is captured by duration — a 10-year bond with a modified duration of 8.5 will lose approximately 8.5% of value for every 100 basis point rise in rates.
Equity risk: The risk that equity prices move adversely. A proprietary trading desk holding equity positions is exposed to single-name movements, sector movements, and broad market beta.
Foreign exchange risk: The risk of losses from changes in exchange rates. Institutions holding assets or liabilities denominated in foreign currencies are exposed to FX movements. A UK bank with USD-denominated loans to US subsidiaries faces FX risk if sterling strengthens.
Commodity risk: The risk of losses from movements in commodity prices — oil, metals, agricultural products, electricity. More relevant to commodity traders and banks active in commodity markets.
Credit spread risk: The risk that the credit spread on a bond (the yield above the risk-free rate reflecting credit quality) widens, reducing the bond's value. A bank holding a corporate bond sees its value fall if the issuer's credit quality is perceived to have deteriorated — even without an actual default.
Volatility risk: Positions in options or other derivatives are sensitive to implied volatility — the market's expectation of future price fluctuation. If implied volatility increases, option prices rise; a bank short volatility through sold options faces losses.
14.1.1 The Trading Book and Banking Book Distinction
A fundamental regulatory distinction governs how market risk capital is calculated: the trading book vs. the banking book.
Trading book instruments are held for trading purposes — intended to be sold in the short term. These are marked-to-market daily. Market risk capital is calculated for trading book positions.
Banking book instruments are held to maturity or are part of the core banking business (loans, deposits). Banking book assets are generally measured at amortized cost, not fair value. They are subject to Interest Rate Risk in the Banking Book (IRRBB) — a separate regulatory framework — rather than market risk capital charges.
The trading book / banking book boundary is a regulatory flashpoint. During the 2008 crisis, some institutions held instruments in the trading book that were effectively illiquid — they could not actually be sold at the mark-to-market price. The FRTB reform tightened the criteria for trading book designation.
14.1.2 Why Market Risk Matters for RegTech
Market risk may seem distant from KYC, AML, and sanctions — the traditional compliance domains. But market risk is central to regulatory compliance:
- Capital adequacy: Market risk capital requirements determine how much capital a bank must hold. Under-estimating market risk means under-capitalization — a regulatory failure.
- Regulatory reporting: Market risk data feeds COREP market risk templates. Accurate, timely risk data is a regulatory reporting obligation.
- Risk governance: Boards must approve market risk appetite statements; risk committees must receive regular market risk reporting.
- Model risk: VaR and ES models used to calculate market risk capital are subject to model risk management requirements (SR 11-7).
- Algorithmic trading controls: Chapter 21 covers algorithmic trading directly; market risk quantification is its foundation.
14.2 The Basel Framework for Market Risk Capital
14.2.1 The 1996 Market Risk Amendment: VaR Enters Regulation
The Basel Committee's 1996 Market Risk Amendment (MRA) introduced market risk capital requirements into the Basel framework. The MRA allowed banks to use internal VaR models to calculate market risk capital — a significant departure from the Basel I approach of standardized rules.
Value at Risk (VaR) became the dominant risk metric: VaR(99%, 10-day) — the maximum loss that would not be exceeded with 99% probability over a 10-day holding period, based on historical market movements. The capital charge was set at 3× the 10-day 99% VaR (the multiplication factor reflecting model uncertainty).
This was the first major instance of regulators accepting institution-built internal models for capital calculation — a pattern that became controversial during the 2008 crisis.
14.2.2 The Internal Models Approach (IMA): Pre-FRTB
Under the pre-FRTB Internal Models Approach, banks could use VaR models for capital calculation, subject to:
- Model approval by the banking supervisor
- Back-testing: daily comparison of VaR forecast to actual P&L. Excessive breaches (more than 4 in a 250-day period) triggered capital multiplier increases
- Stress VaR (SVaR): a VaR calculated using a stressed historical period (typically 2007–2009 or 2001–2002)
- Incremental Risk Charge (IRC): a separate charge for credit spread and default risk in the trading book
The VaR-based regime had well-documented weaknesses: - Tail blindness: VaR says nothing about the magnitude of losses beyond the 99th percentile - Normal distribution assumption: Many VaR models assumed normally distributed returns — but financial returns exhibit fat tails (extreme events more common than the normal distribution predicts) - Historical lookback: If the historical window used to calibrate VaR did not include a crisis period, the model underestimated tail risk - Procyclicality: During calm markets, VaR fell; during stressed markets, VaR surged — creating procyclical capital requirements that amplified rather than dampened stress
14.2.3 FRTB: The Fundamental Review of the Trading Book
The Fundamental Review of the Trading Book (FRTB), finalized in January 2016 and revised in January 2019, represents the most comprehensive reform of market risk capital since 1996. Key changes:
Expected Shortfall replaces VaR: FRTB replaces VaR with Expected Shortfall (ES) at 97.5% confidence — the average loss in the worst 2.5% of scenarios. ES captures the magnitude of tail losses; VaR does not. A 97.5% ES provides approximately the same capital level as 99% VaR for normally distributed returns, but is more sensitive to tail risk.
Liquidity horizons: Different risk factors have different liquidity horizons — how long it would take to exit or hedge a position. FRTB assigns liquidity horizons of 10, 20, 40, 60, or 120 days to different risk factor categories. Less liquid positions receive proportionally larger capital charges.
Tighter IMA eligibility: Under FRTB's Internal Models Approach, models must pass new "Profit & Loss Attribution" (PLA) tests — comparing the model's risk-factor-based P&L to the actual trading desk P&L. Desks that fail PLA tests must use the Standardized Approach for capital calculation. This desk-level granularity is new.
Revised Standardized Approach (SA): The FRTB SA is substantially more risk-sensitive than the pre-FRTB SA — incorporating risk-factor sensitivities (delta, vega, curvature for options) in a way that approximates internal model outputs. The SA can also serve as a floor for IMA capital.
Stricter trading book / banking book boundary: FRTB defines a "trading evidence" requirement for trading book designation — instruments must have documented trading intention, regular mark-to-market, and active management.
FRTB implementation timeline (as of 2024): The Basel Committee finalized FRTB in 2019 for implementation from January 2025. Implementation has been phased differently across jurisdictions. EU implemented FRTB via CRR3 (effective 2025). US implementation timeline remains under development. UK implementation through PRA rules.
14.3 Value at Risk: Calculation and Limitations
14.3.1 VaR: Three Approaches
Historical Simulation VaR: Uses actual historical returns to generate the P&L distribution. Apply the last 250 (or 500) days of daily market movements to the current portfolio; the 1st percentile loss is the 99% VaR.
Advantages: No distribution assumptions; captures non-linearities; captures fat tails present in historical data. Limitations: Depends entirely on the historical window; slow to adapt to regime changes; limited by the history available.
Parametric (Delta-Normal) VaR: Assumes returns are normally distributed. VaR = σ × z × √t, where σ is the portfolio standard deviation, z is the confidence level z-score (2.326 for 99%), and t is the holding period.
Advantages: Fast; analytically tractable; easy to decompose into risk contributions. Limitations: Normal distribution assumption fails for fat-tailed financial returns; linear approximation fails for options.
Monte Carlo VaR: Generate thousands of random scenarios from a specified distribution (or correlated risk factor model); evaluate portfolio P&L under each scenario; take the 1st percentile.
Advantages: Can handle complex non-linearities; flexible distributions; can incorporate correlations. Limitations: Computationally intensive; results depend on the assumed distribution and correlation structure.
14.3.2 Python Implementation: Historical VaR and Expected Shortfall
"""
Market Risk: VaR and Expected Shortfall Calculation
Demonstrates historical simulation approach for a multi-asset portfolio
"""
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import date, timedelta
from typing import Optional
import numpy as np
import pandas as pd
from scipy import stats
@dataclass
class Position:
"""A single position in the trading portfolio."""
instrument_id: str
instrument_name: str
quantity: float # number of units / notional
current_price: float # current mark-to-market price per unit
asset_class: str # 'equity', 'fx', 'rates', 'credit', 'commodity'
currency: str = "GBP"
@property
def market_value(self) -> float:
return self.quantity * self.current_price
@dataclass
class MarketData:
"""
Historical daily returns for risk factors.
In production: sourced from market data vendor (Bloomberg, Refinitiv).
"""
returns: pd.DataFrame # index=date, columns=instrument_ids
prices: pd.DataFrame # index=date, columns=instrument_ids
@classmethod
def from_prices(cls, prices: pd.DataFrame) -> "MarketData":
returns = prices.pct_change().dropna()
return cls(returns=returns, prices=prices)
class HistoricalVaREngine:
"""
Historical Simulation Value at Risk and Expected Shortfall engine.
Methodology:
1. Collect historical returns for each position's risk factor
2. Apply each historical day's return to the current portfolio
3. Sort the resulting P&L distribution
4. Read off VaR and ES at specified confidence levels
"""
def __init__(
self,
positions: list[Position],
market_data: MarketData,
lookback_days: int = 250,
):
self.positions = positions
self.market_data = market_data
self.lookback_days = lookback_days
self._validate_inputs()
def _validate_inputs(self) -> None:
"""Ensure all positions have historical return data."""
missing = [
p.instrument_id
for p in self.positions
if p.instrument_id not in self.market_data.returns.columns
]
if missing:
raise ValueError(f"Missing return data for instruments: {missing}")
def _portfolio_pnl_series(self) -> pd.Series:
"""
Calculate portfolio P&L for each historical day.
P&L = Σ (position market_value × return_on_day_t)
"""
returns = self.market_data.returns.tail(self.lookback_days)
instrument_ids = [p.instrument_id for p in self.positions]
weights = np.array([p.market_value for p in self.positions])
# Filter to our instruments
returns_subset = returns[instrument_ids]
# Portfolio P&L: each day = Σ(weight_i × return_i_t)
portfolio_pnl = returns_subset.values @ weights
return pd.Series(portfolio_pnl, index=returns.index, name="portfolio_pnl")
def historical_var(self, confidence: float = 0.99) -> float:
"""
Historical Simulation VaR at specified confidence level.
Negative return = loss.
"""
pnl = self._portfolio_pnl_series()
var = np.percentile(pnl, (1 - confidence) * 100)
return abs(var) # Return as positive loss figure
def expected_shortfall(self, confidence: float = 0.975) -> float:
"""
Expected Shortfall (CVaR) — average loss in the tail beyond the VaR.
FRTB uses 97.5% ES as the primary risk measure.
"""
pnl = self._portfolio_pnl_series()
cutoff = np.percentile(pnl, (1 - confidence) * 100)
tail_losses = pnl[pnl <= cutoff]
if len(tail_losses) == 0:
return 0.0
return abs(tail_losses.mean())
def var_99_10day(self) -> float:
"""
Regulatory 10-day 99% VaR (pre-FRTB standard).
Approximated as 1-day VaR × √10 (square root of time scaling).
"""
one_day_var = self.historical_var(confidence=0.99)
return one_day_var * np.sqrt(10)
def es_975_10day(self) -> float:
"""
FRTB-style 10-day 97.5% Expected Shortfall.
Scaled by liquidity horizon adjustment (simplified: √10).
"""
one_day_es = self.expected_shortfall(confidence=0.975)
return one_day_es * np.sqrt(10)
def component_var(self, confidence: float = 0.99) -> pd.DataFrame:
"""
Component VaR: each position's contribution to portfolio VaR.
Uses marginal VaR approach.
"""
pnl_series = self._portfolio_pnl_series()
returns = self.market_data.returns.tail(self.lookback_days)
components = []
for pos in self.positions:
pos_pnl = returns[pos.instrument_id] * pos.market_value
covariance = np.cov(pos_pnl, pnl_series)[0, 1]
portfolio_var_raw = pnl_series.var()
if portfolio_var_raw > 0:
marginal_var = (covariance / portfolio_var_raw) * self.historical_var(confidence)
component_var_pct = marginal_var / self.historical_var(confidence) * 100
else:
marginal_var = 0.0
component_var_pct = 0.0
components.append({
"instrument": pos.instrument_name,
"asset_class": pos.asset_class,
"market_value": pos.market_value,
"component_var": marginal_var,
"component_var_pct": component_var_pct,
})
return pd.DataFrame(components).sort_values("component_var_pct", ascending=False)
def backtesting_report(self, confidence: float = 0.99) -> dict:
"""
VaR backtesting: count the number of days where actual loss exceeded VaR.
Basel traffic light system: 0-4 breaches = green; 5-9 = yellow; 10+ = red.
"""
pnl = self._portfolio_pnl_series()
var_estimate = self.historical_var(confidence)
# Rolling: estimate VaR on each day using prior 250 days, check next day
breaches = []
returns = self.market_data.returns
instrument_ids = [p.instrument_id for p in self.positions]
weights = np.array([p.market_value for p in self.positions])
for i in range(250, len(returns)):
window = returns.iloc[i - 250:i][instrument_ids]
window_pnl = window.values @ weights
rolling_var = abs(np.percentile(window_pnl, (1 - confidence) * 100))
actual_pnl = (returns.iloc[i][instrument_ids].values @ weights)
if actual_pnl < -rolling_var:
breaches.append(returns.index[i])
n_breaches = len(breaches)
if n_breaches <= 4:
zone = "GREEN"
elif n_breaches <= 9:
zone = "YELLOW"
else:
zone = "RED"
return {
"n_observations": len(returns) - 250,
"n_breaches": n_breaches,
"breach_rate": n_breaches / max(1, len(returns) - 250),
"expected_breaches": (1 - confidence) * (len(returns) - 250),
"zone": zone,
"breach_dates": breaches,
}
def risk_report(self) -> dict:
"""Comprehensive market risk report."""
return {
"portfolio_market_value": sum(p.market_value for p in self.positions),
"var_99_1day": self.historical_var(0.99),
"var_99_10day": self.var_99_10day(),
"es_975_1day": self.expected_shortfall(0.975),
"es_975_10day": self.es_975_10day(),
"component_var": self.component_var().to_dict(orient="records"),
}
# ── Parametric VaR (for comparison) ──────────────────────────────────────────
def parametric_var(
weights: np.ndarray,
covariance_matrix: np.ndarray,
confidence: float = 0.99,
holding_period: int = 1,
) -> float:
"""
Delta-Normal (parametric) VaR.
Assumes multivariate normal returns.
VaR = z * σ_portfolio * √t
where σ_portfolio = √(w'Σw)
"""
z = stats.norm.ppf(confidence)
portfolio_variance = weights @ covariance_matrix @ weights
portfolio_std = np.sqrt(portfolio_variance)
return z * portfolio_std * np.sqrt(holding_period)
# ── Demo ──────────────────────────────────────────────────────────────────────
def generate_synthetic_market_data(
instruments: list[str],
n_days: int = 500,
seed: int = 42,
) -> MarketData:
"""Generate synthetic daily price and return data for demonstration."""
rng = np.random.default_rng(seed)
# Correlation matrix (simplified)
n = len(instruments)
correlation = np.full((n, n), 0.3)
np.fill_diagonal(correlation, 1.0)
chol = np.linalg.cholesky(correlation)
# Daily returns: slight positive drift, 1.5% daily volatility
raw_returns = rng.normal(0.0003, 0.015, (n_days, n))
correlated_returns = raw_returns @ chol.T
# Build price series from returns
start_prices = rng.uniform(50, 500, n)
prices = np.zeros((n_days + 1, n))
prices[0] = start_prices
for t in range(1, n_days + 1):
prices[t] = prices[t - 1] * (1 + correlated_returns[t - 1])
dates = pd.date_range(end=date.today(), periods=n_days + 1, freq="B")
price_df = pd.DataFrame(prices, index=dates, columns=instruments)
return MarketData.from_prices(price_df)
def run_market_risk_analysis() -> None:
"""Full market risk analysis demonstration."""
instruments = ["GBPUSD", "FTSE100_ETF", "UK_GILT_10Y", "EUR_CORP_BOND", "BRENT_CRUDE"]
market_data = generate_synthetic_market_data(instruments, n_days=500)
positions = [
Position("GBPUSD", "GBP/USD FX Forward", 10_000_000, 1.0, "fx", "GBP"),
Position("FTSE100_ETF", "FTSE 100 ETF", 50_000, 450.0, "equity", "GBP"),
Position("UK_GILT_10Y", "UK Gilt 10Y", 5_000_000, 1.0, "rates", "GBP"),
Position("EUR_CORP_BOND","EUR Corporate Bond", 3_000_000, 1.0, "credit", "EUR"),
Position("BRENT_CRUDE", "Brent Crude Future", 50_000, 80.0, "commodity", "USD"),
]
engine = HistoricalVaREngine(positions, market_data, lookback_days=250)
report = engine.risk_report()
print("=== Market Risk Report ===\n")
print(f"Portfolio Market Value: £{report['portfolio_market_value']:>15,.0f}")
print(f"\n1-Day VaR (99%): £{report['var_99_1day']:>15,.0f}")
print(f"10-Day VaR (99%): £{report['var_99_10day']:>15,.0f}")
print(f"\n1-Day ES (97.5%): £{report['es_975_1day']:>15,.0f}")
print(f"10-Day ES (97.5%): £{report['es_975_10day']:>15,.0f}")
print("\n=== Component VaR ===")
comp_df = pd.DataFrame(report["component_var"])
print(comp_df[["instrument", "market_value", "component_var", "component_var_pct"]].to_string(index=False))
print("\n=== VaR Backtesting ===")
bt = engine.backtesting_report()
print(f"Observations: {bt['n_observations']} | Breaches: {bt['n_breaches']} | Zone: {bt['zone']}")
print(f"Expected breaches (99% confidence): {bt['expected_breaches']:.1f}")
if __name__ == "__main__":
run_market_risk_analysis()
14.3.3 VaR Limitations: Why FRTB Moved to Expected Shortfall
The regulatory shift from VaR to ES reflects hard lessons from the 2008 crisis:
The VaR blind spot: VaR says "you will not lose more than X with 99% probability" — but says nothing about how much you would lose in the 1% of scenarios beyond the threshold. During 2008, the 1% tail was catastrophic. ES, by averaging losses in the tail, forces institutions to think about the magnitude of extreme losses.
Tail dependence: Financial markets exhibit "fat tails" — extreme events occur more frequently than normal distributions predict. The 2008 returns were described by many VaR models as "25 standard deviation events" — which would be essentially impossible if returns were truly normally distributed. Fat tails were not adequately captured.
Model gaming: Because VaR was used for regulatory capital calculation, institutions had incentives to build models that minimized VaR without necessarily reducing actual risk. Some complex structured positions could achieve low VaR by hiding risk in correlations or in the tail beyond the 99th percentile.
Procyclicality: VaR models calibrated to recent history produce low estimates during calm markets. Low VaR means lower capital requirements, allowing institutions to expand their books. When crisis strikes, VaR surges, forcing institutions to shed positions — amplifying the downturn.
14.4 Interest Rate Risk in the Banking Book (IRRBB)
14.4.1 IRRBB: The Other Side of Rate Risk
While market risk capital (FRTB) covers interest rate risk in the trading book, Interest Rate Risk in the Banking Book (IRRBB) is a separate and equally important risk. Banks transform maturities — borrowing short-term deposits to fund long-term loans — creating an inherent exposure to interest rate movements.
When rates rise, the bank's interest income may increase (if variable-rate loans reprice faster than fixed-rate deposits), or decrease (if fixed-rate loans dominate). The bank's economic value of equity (EVE) — the net present value of all future cash flows — also changes when rates move.
IRRBB standard shocks (as defined by the Basel IRRBB standard, 2016): - Parallel rate shock up / down: all maturities shift by the same amount - Short rates shock up / down: short-term rates shift more than long-term - Flattener: short rates rise while long rates fall - Steepener: short rates fall while long rates rise
Institutions calculate EVE sensitivity and Net Interest Income (NII) sensitivity under each shock. The Basel standard requires a minimum 200 basis point parallel shock for supervisory comparison.
The UK PRA's supervisory statement SS31/15 on IRRBB requires banks to maintain capital commensurate with their IRRBB exposure — assessed through the Internal Capital Adequacy Assessment Process (ICAAP).
14.4.2 IRRBB Calculation Framework
def calculate_eve_sensitivity(
cash_flows: pd.DataFrame, # columns: 'maturity_days', 'amount', 'bucket'
rate_curve: dict[int, float], # maturity_days -> current rate
shock_bps: float,
) -> float:
"""
Calculate change in Economic Value of Equity under a parallel rate shock.
EVE = Σ (Cash Flow_t / (1 + r_t)^t) for all t
ΔEVE = EVE(shocked) - EVE(base)
"""
def present_value(flows: pd.DataFrame, curve: dict) -> float:
pv = 0.0
for _, row in flows.iterrows():
t_years = row["maturity_days"] / 365
rate = curve.get(row["maturity_days"], 0.03) # fallback to 3%
pv += row["amount"] / (1 + rate) ** t_years
return pv
# Base EVE
base_eve = present_value(cash_flows, rate_curve)
# Shocked rate curve
shocked_curve = {k: v + shock_bps / 10000 for k, v in rate_curve.items()}
shocked_eve = present_value(cash_flows, shocked_curve)
return shocked_eve - base_eve
14.5 The Market Risk Reporting Stack
14.5.1 Technology Architecture for Market Risk
A market risk management system involves multiple technology layers:
Front Office / Pricing Systems: Compute mark-to-market values and Greeks (delta, gamma, vega, theta) for trading positions. These systems — Bloomberg, Murex, Calypso, Finastra Fusion — are the starting point for risk calculations.
Risk Calculation Engine: Aggregates positions from pricing systems; applies risk models (VaR, ES, sensitivity calculations). In large banks, risk engines process hundreds of thousands of positions across asset classes. Vendors: MSCI RiskManager, Axioma, Bloomberg PORT, Numerix.
Risk Data Warehouse: Stores historical P&L, risk metrics, and position data. Supports regulatory reporting, management reporting, and backtesting.
Regulatory Reporting Layer: Maps risk engine outputs to COREP market risk templates (C 24.00–C 32.00 in COREP). Generates XBRL for regulatory submission.
Real-Time Risk Monitoring: Pre-trade and intra-day risk limits monitoring. When a trader attempts to execute a trade, the pre-trade system checks whether the resulting position would exceed authorized risk limits. If so, the trade is blocked or escalated.
14.5.2 COREP Market Risk Templates
Market risk contributes to COREP capital reporting through several templates:
C 18.00: RWA and capital requirements overview — market risk line items C 24.00: Market risk — standardized approach (SA) C 25.00: Interest rate risk, standardized approach C 26.00: Equity risk, standardized approach C 27.00: FX risk, standardized approach C 28.00: Commodity risk, standardized approach C 29.00: VaR model positions (pre-FRTB Internal Models Approach) C 31.00: FRTB Standardized Approach reporting C 32.00: FRTB Internal Models Approach reporting (when approved)
Under FRTB, C 31.00 and C 32.00 are the primary templates. C 31.00 captures sensitivity-based method (SBM) results — the delta, vega, and curvature risk charges by risk class. C 32.00 captures IMA results — ES at different liquidity horizons and risk classes.
14.6 Cornerstone Financial Group: Market Risk Governance Under FRTB
14.6.1 Cornerstone's Trading Operations
Cornerstone Financial Group operates a significant fixed income trading desk — primarily government bonds, corporate bonds, and interest rate derivatives (swaps, options on swaps). Cornerstone also has FX trading for client hedging and a small commodity desk (primarily serving agricultural sector clients).
As FRTB implementation approached, Cornerstone's Head of Market Risk, Dr. Yuki Tanaka, commissioned a readiness assessment. The findings were sobering.
14.6.2 FRTB Readiness Gaps
Desk-level P&L Attribution Testing: FRTB requires each trading desk to pass a P&L Attribution (PLA) test — comparing the risk-factor-based hypothetical P&L to the actual desk P&L. If the difference is too large, the desk must use the Standardized Approach.
Cornerstone's assessment: three of its seven trading desks would fail the PLA test with the current risk model. The fixed income options desk had significant P&L from volatility dynamics that were not captured in the risk model's risk factors.
Remedy: A 12-month risk model enhancement program — adding stochastic volatility risk factors to the options desk model. Estimated cost: £2.1 million in technology and quant resources.
Non-Modellable Risk Factors (NMRFs): FRTB distinguishes between modellable risk factors (with sufficient market price observations) and non-modellable risk factors (insufficient data). NMRFs receive a capital add-on calculated using stress scenarios rather than historical ES.
Cornerstone's commodity desk had several non-modellable risk factors — specific agricultural commodity basis risks where market price observations were insufficient. These attracted a significant NMRF capital add-on.
Liquidity Horizon Adjustment: Cornerstone's sovereign bond portfolio benefited from the 10-day liquidity horizon (highly liquid). But its corporate bond portfolio included some less liquid high-yield names attracting 40-day or 60-day horizons — substantially increasing the capital charge.
14.6.3 FRTB Capital Impact Analysis
Cornerstone's FRTB capital impact analysis:
| Desk | Pre-FRTB IMA Capital | Post-FRTB SA Capital | Post-FRTB IMA Capital | Delta |
|---|---|---|---|---|
| Rates — G10 government | £12.4M | £18.1M | £9.8M | -£2.6M |
| Rates — Investment grade corporate | £8.2M | £14.3M | £11.5M | +£3.3M |
| Rates — High yield corporate | £6.1M | £11.8M | SA required | +£5.7M* |
| FX — G10 | £3.4M | £4.9M | £2.8M | -£0.6M |
| FX — EM | £4.7M | £8.2M | £5.9M | +£1.2M |
| Options — Rates | £15.3M | £21.4M | PLA failure | +£6.1M* |
| Commodity — Agricultural | £4.2M | £6.8M | £7.4M† | +£3.2M† |
| Total | £54.3M | £85.5M | £37.4M+SA | +~£25M |
*SA required due to PLA failure (Options) or insufficient modellable risk factors (High yield) †Higher than SA due to NMRF add-ons for non-modellable agricultural basis risks
Cornerstone's FRTB implementation would increase market risk capital by approximately £25 million — a material impact on the firm's capital position. This drove investment in the risk model enhancement program to qualify the options desk for IMA rather than defaulting to the higher SA capital charge.
14.7 Priya's Perspective: Market Risk in RegTech Advisory
14.7.1 The Practical Challenge
When Priya Nair engages with clients on market risk, the questions are rarely about VaR theory. They are about data, systems, and governance.
"Most of my market risk clients have adequate models," Priya observes. "The failure modes are in the data pipeline — dirty data flowing from front office systems into the risk engine; manual overrides that don't get captured; positions booked in the wrong desk; market data subscriptions that don't cover all the instruments the desk has started trading."
Common failure modes that Priya encounters:
Position data completeness: The risk engine doesn't receive all positions. New instruments added to a trading desk may not have the necessary risk factor mappings in the engine, causing them to fall out of the risk calculation entirely.
Market data coverage: VaR requires historical prices for every risk factor in the model. When a desk starts trading a new instrument — an exotic interest rate option, a new EM currency pair — the market data feed may not cover it. Risk calculations proceed with a proxy or a fallback, which may not be appropriate.
Stale prices: Illiquid instruments may not have a traded price every day. Risk calculations using yesterday's price (or last week's) for an illiquid position can materially understate risk.
P&L reconciliation gaps: The theoretical P&L from the risk engine (what the model says the portfolio made or lost) rarely exactly matches the actual P&L from the finance system. The difference — the "P&L explain" — should be small and attributable to model approximations. Large, unexplained P&L differences indicate a data or model quality problem — and are precisely what FRTB's PLA test is designed to catch.
14.7.2 The RegTech Opportunity
Priya sees the market risk data management challenge as a RegTech opportunity:
Automated risk factor mapping: When a new instrument is booked, ML-based tools can automatically suggest the appropriate risk factor mapping based on instrument characteristics — reducing the manual effort and error risk.
Real-time data quality monitoring: Tools that flag market data anomalies — unusual price spikes, missing data, stale prices — before they flow into risk calculations.
P&L attribution automation: Systems that automatically decompose the P&L explain into recognized factors (delta, gamma, theta, vega, carry) and flag unexplained residuals exceeding thresholds.
FRTB compliance automation: Given the complexity of FRTB — PLA tests, NMRF identification, liquidity horizon assignment — specialist FRTB technology vendors (Murex, OpenGamma, FIS) provide modular solutions addressing specific FRTB requirements.
14.8 Key Concepts Summary
Market risk is the risk of loss from adverse market price movements. The Basel framework for market risk capital has evolved from the 1996 VaR-based regime through the FRTB reform — replacing VaR with Expected Shortfall, introducing desk-level model approval, and substantially revising the standardized approach.
For RegTech practitioners, market risk presents a distinct challenge: the regulatory requirements are mathematically complex, the technology stack involves specialized pricing and risk systems, and the data quality demands are extremely high. The shift to FRTB amplifies these challenges — desk-level P&L attribution testing exposes any gap between what the risk model thinks the portfolio is doing and what the trading P&L actually shows.
The key insight for compliance and technology teams: market risk is a data problem as much as a model problem. Ensuring position completeness, market data coverage, and P&L reconciliation integrity is often more valuable than optimizing the mathematical sophistication of the risk model itself.
Summary
This chapter traced market risk from its definition through its regulatory treatment and into the practical technology and data challenges of managing it.
- Market risk encompasses interest rate, equity, FX, commodity, credit spread, and volatility risk — arising from the mark-to-market of trading book positions.
- The Basel framework evolved from the 1996 VaR-based regime (Internal Models Approach) through the FRTB reform — replacing 99% VaR with 97.5% ES, introducing liquidity horizons, and implementing desk-level model approval through PLA testing.
- VaR limitations — tail blindness, normal distribution assumptions, procyclicality, and model gaming — motivated the shift to Expected Shortfall.
- IRRBB is the separate risk framework covering interest rate risk in the banking book — measuring EVE and NII sensitivity to rate shocks.
- The market risk technology stack — pricing systems, risk engines, risk data warehouses, regulatory reporting layers — is a complex, interconnected infrastructure where data quality failures can corrupt downstream risk calculations and regulatory reports.
- COREP market risk templates (C 24.00–C 32.00) capture market risk capital under both SA and IMA approaches.
- Practical failure modes — position completeness gaps, stale market data, P&L attribution residuals — are the most common root causes of market risk model and reporting failures.