Skip to main content
← Risk Engine Validation & Stress Testing Report

Data Provenance

Sources, inputs, timestamps, and queries behind all benchmark results in this report.

Risk Engine Benchmarks

Engine: Production risk engine March 2026 release, endpoint /loan_risk

Run dates:

BenchmarkTimestamp (UTC)MC IterationsRuns
Multi-pool GBM + convergence + model comparison + correlation2026-03-27 00:3810,00024
Convergence (100k)2026-03-27 10:32100,00010
Convergence (1M)2026-03-27 13:431,000,00010
Historical stress event (Oct 10)2026-03-30 13:25N/A (sliding window)2

Parameter Mapping

The risk engine uses collateral ratio parameters internally. The relationship to LTV:

Engine ParamFormulaExampleLTV Equivalent
NCollateral ratio = 1 / LTVN=1.5LTV = 66.7%
LLiquidation collateral ratio = 1 / Liquidation LTVL=1.15Liq LTV = 87.0%
MSet to L + epsilon (no margin call)M=1.1500000001
RRecovery ratio = NR=1.5Same as N

For full definitions, see Glossary — Risk Engine Parameters.

Model Comparison Input (wstETH/USDC)

Executed: 2026-03-27 00:38 UTC

Used for Tests 7.1, 7.2, 7.3a. All four models use the same pool parameters — only the model type and lookback differ.

GBM (stressed):

{
"type": "GBM",
"params": {
"collateral_weights": {"WSTETH": 1.0},
"loan_weights": {"USDC": 1.0},
"loan_value": 1000000,
"L": 1.15,
"M": 1.1500000001,
"N": 1.5,
"R": 1.5,
"loan_duration": 365,
"mc_top_up": 50000,
"model_lookback": 365,
"mc_iter": 10000,
"volatility_shock": 9.0,
"quantile": [0.99, 0.999, 0.9999]
}
}

GBM (no shock): Same as above, volatility_shock omitted from payload.

GARCH: Same parameters, "type": "BETA_GARCH", volatility_shock omitted.

Historical: Same parameters, "type": "HISTORICAL", model_lookback: 730, mc_iter omitted (sliding window, not Monte Carlo).

Correlation Test Input (Test 7.3b)

Executed: 2026-03-27 00:38 UTC

Correlated pair:

{
"type": "GBM",
"params": {
"collateral_weights": {
"WSTETH": 0.5,
"CBETH": 0.5
},
"loan_weights": {"USDC": 1.0},
"loan_value": 1000000,
"L": 1.15,
"M": 1.1500000001,
"N": 1.5,
"R": 1.5,
"loan_duration": 365,
"mc_top_up": 50000,
"model_lookback": 365,
"mc_iter": 10000,
"volatility_shock": 9.0,
"quantile": [0.99, 0.999, 0.9999]
}
}

Uncorrelated pair:

{
"type": "GBM",
"params": {
"collateral_weights": {
"BTC": 0.5,
"DAI": 0.5
},
"loan_weights": {"USDC": 1.0},
"loan_value": 1000000,
"L": 1.3,
"M": 1.3000000001,
"N": 1.7,
"R": 1.7,
"loan_duration": 365,
"mc_top_up": 50000,
"model_lookback": 365,
"mc_iter": 10000,
"volatility_shock": 9.0,
"quantile": [0.99, 0.999, 0.9999]
}
}

Historical Stress Event Input (Test 7.2)

Executed: 2026-03-30 13:25 UTC

With October 10th period:

{
"type": "HISTORICAL",
"params": {
"collateral_weights": {"WSTETH": 1.0},
"loan_weights": {"USDC": 1.0},
"loan_value": 1000000,
"L": 1.15,
"M": 1.1500000001,
"N": 1.5,
"R": 1.5,
"loan_duration": 365,
"mc_top_up": 50000,
"model_lookback": 730,
"quantile": [0.99, 0.999, 0.9999]
}
}

Without October 10th:

{
"type": "HISTORICAL",
"params": {
"collateral_weights": {"WSTETH": 1.0},
"loan_weights": {"USDC": 1.0},
"loan_value": 1000000,
"L": 1.15,
"M": 1.1500000001,
"N": 1.5,
"R": 1.5,
"loan_duration": 365,
"mc_top_up": 50000,
"model_lookback": 730,
"analysis_date": "10-09-2025",
"quantile": [0.99, 0.999, 0.9999]
}
}

Multi-Pool Input (ETH, BTC, cbBTC, wstETH)

Executed: 2026-03-27 00:38 UTC

All pools use volatility_shock: 9.0, mc_iter: 10000, model_lookback: 365.

PoolCollateralLN
ETH/USDC{"ETH": 1.0}1.31.7
BTC/USDC{"BTC": 1.0}1.31.7
cbBTC/USDC{"CBBTC": 1.0}1.31.7
wstETH/USDC{"WSTETH": 1.0}1.151.5

Convergence Input (Tests 2.1)

Executed:

  • 10k — 2026-03-27 00:38 UTC
  • 100k — 2026-03-27 10:32 UTC
  • 1M — 2026-03-27 13:43 UTC

Same ETH/USDC payload repeated 10 times at each iteration count (10k, 100k, 1M):

{
"type": "GBM",
"params": {
"collateral_weights": {"ETH": 1.0},
"loan_weights": {"USDC": 1.0},
"loan_value": 1000000,
"L": 1.3,
"M": 1.3000000001,
"N": 1.7,
"R": 1.7,
"loan_duration": 365,
"mc_top_up": 50000,
"model_lookback": 365,
"volatility_shock": 9.0,
"quantile": [0.99, 0.999, 0.9999]
}
}

Only mc_iter changes: 10000, 100000, or 1000000.

BigQuery Production Data

Snapshot timestamp: 2026-03-27 11:02 UTC

7-Component Scoring (Test 1.2)

Queried: 2026-03-27 11:02 UTC

SELECT
pool_slug,
ROUND(utilization_score, 2) AS util,
ROUND(lp_nakamoto_score, 2) AS lp_nak,
ROUND(lp_max_power_ratio_score, 2) AS lp_max,
ROUND(borrower_nakamoto_score, 2) AS bor_nak,
ROUND(borrower_max_power_ratio_score, 2) AS bor_max,
ROUND(liquidation_buffer_score, 2) AS liq_buf,
ROUND(extreme_event_resilience_score, 2) AS stress,
ROUND(pool_market_score, 3) AS composite
FROM defi_prepared.lending_pool_score
WHERE datetime >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND pool_market_score IS NOT NULL
AND lending_instance_slug = 'aave_v3_eth'
QUALIFY ROW_NUMBER() OVER (
PARTITION BY pool_slug ORDER BY datetime DESC
) = 1
ORDER BY composite DESC

Utilization Examples (Test 3.1)

Queried: 2026-03-27 11:02 UTC

SELECT
s.pool_slug,
ROUND(st.utilization_rate * 100, 1) AS util_pct,
ROUND(s.utilization_score, 4) AS util_score
FROM defi_prepared.lending_pool_score s
JOIN defi_prepared.lending_pool_state st
ON s.pool_id = st.pool_id
AND DATE(s.datetime) = DATE(st.datetime)
WHERE s.datetime >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND st.datetime >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND s.pool_market_score IS NOT NULL
QUALIFY ROW_NUMBER() OVER (
PARTITION BY s.pool_slug ORDER BY s.datetime DESC
) = 1
ORDER BY st.utilization_rate DESC

Borrower Concentration (Test 3.2)

Queried: 2026-03-27 11:02 UTC (data snapshot)

AAVE wstETH — k=1, single dominant borrower

SELECT borrower_address, ROUND(principal_owed_usd, 0) AS principal_usd
FROM defi_prepared.lending_borrower_position
WHERE pool_slug = 'aave_v3_eth_main_wsteth'
AND datetime >= TIMESTAMP('2026-03-27')
QUALIFY ROW_NUMBER() OVER (PARTITION BY borrower_address ORDER BY datetime DESC) = 1
ORDER BY principal_owed_usd DESC LIMIT 5

AAVE CRV — k=2

SELECT borrower_address, ROUND(principal_owed_usd, 0) AS principal_usd
FROM defi_prepared.lending_borrower_position
WHERE pool_slug = 'aave_v3_eth_main_crv'
AND datetime >= TIMESTAMP('2026-03-27')
QUALIFY ROW_NUMBER() OVER (PARTITION BY borrower_address ORDER BY datetime DESC) = 1
ORDER BY principal_owed_usd DESC LIMIT 5

AAVE WBTC — k=10+, fully diversified

SELECT borrower_address, ROUND(principal_owed_usd, 0) AS principal_usd
FROM defi_prepared.lending_borrower_position
WHERE pool_slug = 'aave_v3_eth_main_wbtc'
AND datetime >= TIMESTAMP('2026-03-27')
QUALIFY ROW_NUMBER() OVER (PARTITION BY borrower_address ORDER BY datetime DESC) = 1
ORDER BY principal_owed_usd DESC LIMIT 10

Oracle Scores (Tests 1.1, 4.1, 5)

Queried: 2026-03-27 11:02 UTC (data snapshot)

Per-Feed Scores (Level 1)

SELECT address, oracle_source, score, slug
FROM defi_prepared.lending_oracle_score
ORDER BY score DESC

Market-Level Geometric Mean (Level 2)

SELECT pool_slug, oracle_score, scoring_method
FROM defi_prepared.lending_pool_oracle_score
ORDER BY oracle_score DESC

Composite Aggregation (Test 1.1)

Queried: 2026-03-27 11:02 UTC (data snapshot)

Protocol risk scores from:

SELECT protocol_slug, protocol_name,
ROUND(composite_score, 4) AS composite,
ROUND(final_score, 4) AS final
FROM defi_prepared.protocol_risk_composite_score

Three-dimension composite (Market x Oracle x Protocol) computed as geometric mean from the three queries above.

Stress Sensitivity (Test 10.1)

Executed: 2026-04-10 14:02 UTC

8 runs: GBM (no shock) and GARCH on wstETH/USDC at two LTV configurations, with and without October 10 in the lookback.

Production LTV (N=1.5, L=1.15):

{
"type": "GBM",
"params": {
"collateral_weights": {"WSTETH": 1.0},
"loan_weights": {"USDC": 1.0},
"N": 1.5, "M": 1.1500000001, "L": 1.15, "R": 1.5,
"loan_value": 1000000, "mc_iter": 10000, "mc_top_up": 50000,
"model_lookback": 365, "loan_duration": 365,
"quantile": [0.99, 0.999, 0.9999]
}
}

Stressed LTV (N=1.25, L=1.1): Same as above with N=1.25, M=1.1000000001, L=1.1, R=1.25.

GARCH variants: Same parameters with "type": "BETA_GARCH".

Excludes Oct 10 variants: Add "analysis_date": "10-09-2025" to params.

Depeg Sensitivity (Test 8.2)

Queried: 2026-04-08 UTC

SELECT
asset_slug,
reference_asset_slug,
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', datetime) AS datetime,
ROUND(CAST(stability AS FLOAT64), 4) AS stability,
ROUND((1 - CAST(stability AS FLOAT64)) * 100, 2) AS deviation_pct,
ROUND(CAST(stability_score AS FLOAT64), 4) AS stability_score,
CASE
WHEN CAST(stability AS FLOAT64) <= 0.68 THEN 'Tier 5: Near-collapse (>=32%)'
WHEN CAST(stability AS FLOAT64) <= 0.84 THEN 'Tier 4: Severe depeg (>=16%)'
WHEN CAST(stability AS FLOAT64) <= 0.92 THEN 'Tier 3: Significant depeg (>=8%)'
END AS tier_label
FROM defi_materialized.stability_score_mt
WHERE CAST(stability AS FLOAT64) <= 0.92
ORDER BY CAST(stability AS FLOAT64) ASC

Score trajectory queries used asset_slug and datetime range filters on the same table.

Stale Data Detection (Test 9.1)

Queried: 2026-04-08 UTC

Pipeline track record:

SELECT
MIN(FORMAT_TIMESTAMP('%Y-%m-%d', datetime)) AS earliest_snapshot,
MAX(FORMAT_TIMESTAMP('%Y-%m-%d', datetime)) AS latest_snapshot,
COUNT(DISTINCT DATE(datetime)) AS distinct_days,
COUNT(*) AS total_snapshots
FROM defi_materialized.lending_pool_state_mt
WHERE datetime >= TIMESTAMP('2024-01-01')

Result: Continuous production operation since 2026-01-27.

Precision Audit (Test 9.2)

Queried: 2026-04-08 UTC

Schema type verification:

SELECT column_name, data_type
FROM defi_materialized.INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'lending_pool_state_mt'
AND data_type IN ('BIGNUMERIC', 'STRING', 'INT64', 'JSON')
ORDER BY data_type, ordinal_position

Position table schema:

SELECT column_name, data_type
FROM defi_materialized.INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'lending_lp_position_mt'
AND data_type IN ('BIGNUMERIC', 'STRING')
ORDER BY ordinal_position

Confirmed: uint256 values stored as STRING (lossless), computed rates and USD values stored as BIGNUMERIC (38-digit precision).

API Latency Benchmark (Test 11.1)

Executed: 2026-04-08 20:33 UTC

1,000 requests to the production /loan_risk endpoint.

{
"type": "GBM",
"params": {
"collateral_weights": {"BTC": 1.0},
"loan_weights": {"USDC": 1.0},
"N": 1.7,
"M": 1.3000000001,
"L": 1.3,
"R": 1.7,
"loan_value": 1000000,
"mc_iter": 10000,
"mc_top_up": 50000,
"model_lookback": 90,
"loan_duration": 365,
"volatility_shock": 9.0,
"quantile": [0.99, 0.999, 0.9999]
}
}
ParameterValue
Requests1,000
Successful1,000
Failed0

Alert Latency Benchmark (Test 4.2)

Executed: 2026-03-30 17:44-17:48 UTC

50 consecutive runs of the alert runner pipeline. Each run processed 9 vaults and 50 mock users via Telegram delivery.

ParameterValue
Runs50
Vaults processed9
Mock users50
Delivery channelTelegram (batch sends)
OptimizationsNone (unoptimized baseline)