価格フィードバック指標(VIX、ドル指数、実質利回り)が10年zスコアから2年ローリング・パーセンタイルへ移行した理由。CISSエンジンに置き換え済み。
⚠️ SUPERSEDED (2026-05-05). This note describes the retired linear weighted-average DLI (85/5/5/5 group weights, z-score transforms, forward-return backtests). The current engine uses CISS-style quadratic aggregation — see
2026-05-DLI-CISS.md. Kept for historical context only.
Group D indicators (VIX, broad dollar index, 10-year real yield) now use a 2-year rolling percentile rank in place of the 10-year robust z-score. Groups A, B, C continue to use z-scores.
DLI = 0.85·A_zscore + 0.05·B_zscore + 0.05·C_zscore + 0.05·D_percentile_zequiv
Where the percentile is rescaled to z-equivalent units (p − 50) / 16 so it can be averaged with the other groups in the same magnitude space.
The original z-score-only DLI implicitly assumes stable distribution. But the underlying flow indicators have scaled by an order of magnitude:
| Indicator | 2008 | 2026 | Change |
|---|---|---|---|
| Fed BS (WALCL) | $0.9T | $7T | 7.8× |
| TGA balance | ~$50B | ~$700B | 14× |
| ON RRP | $0 | peaked $2.4T | ∞ |
A 10-year rolling MAD adapts somewhat, but z-scores still mix regime epochs and outliers in price-feedback indicators (VIX especially) blow up the signal.
The empirical proof on 11-year SPX/QQQ/IWM/TLT/HYG/GOLD universe at 60d horizon:
| Asset | Pure Z (A85/5/5/5) | Pure percentile | Hybrid (Z for A/B/C, percentile for D) |
|---|---|---|---|
| SPX | +0.72%\* | +0.92%\* | +0.91%\* |
| QQQ | +1.69%\* | +0.29% | +1.81%\* |
| IWM | +2.93% | +1.64%\* | +3.36% |
| TLT | +1.99%\* | −1.21%\* ❌ | +2.49% |
| HYG | +0.64%\* | −0.69%\* ❌ | +0.76%\* |
| GOLD | −1.56%\* ❌ | +0.42% | +0.55% ✓ |
Pure-percentile breaks rate-sensitive (TLT) and credit (HYG) assets because their relationship to liquidity is sensitive to magnitude — a real-yield z-score of +3 means something materially different from +2 for long-duration bonds.
Pure-z keeps GOLD inverted because of VIX/dollar-index outlier feedback.
The hybrid keeps magnitude information where it matters (A/B/C) and compresses outliers where they're mechanical feedback (D). Result: every asset's 60d Δavg improves vs pure-Z, GOLD specifically flips from −1.56%\* to +0.55%.
lib/indicators/config.ts:
export const DLI_GROUP_CONFIG = {
A: { weight: 0.85, transform: 'z', ... },
B: { weight: 0.05, transform: 'z', ... },
C: { weight: 0.05, transform: 'z', ... },
D: { weight: 0.05, transform: 'percentile', ... },
};
export const DLI_PERCENTILE_WINDOW_DAYS = 730; // 2y rolling window
lib/regime/engine.ts:
resolveIndicatorSignal(group, id, series, date) looks up the indicator's z-score with staleness tolerance, then either returns the tightness-aligned z directly (if transform === 'z') or computes its rank percentile within the rolling 730-day window and rescales via (p − 50) / 16.computeSubIndex, computePreviousSubIndex, and calculateDLIHistory Pass 1 all funnel through resolveIndicatorSignal so the transform flag is honored uniformly.The 30-observation minimum protects early-window dates from spurious low-sample percentiles.
DLI_A_MOMENTUM_COEF = 0)5y on-page display will still look weak (2021-2026 is the structurally hardest sub-window), but the underlying formula is now:
python3 /tmp/dli_pct.py (or recreate from this addendum's logic) on whatever indicator-z-score data is available