How it works

Rates Intelligence, in plain English

For your closing date and loan, the dashboard shows what locking now, floating to close, or floating with a trigger actually cost across the last two years of real daily lock rates, bad case included, under CIL’s own lock terms. The call beside it is a cost-of-regret default, not a forecast. No rate forecast drives either one.

What the dashboard does

Every time you load it, the page shows:

  • Action (left) — a LOCK / FLOAT call from a 6-factor asymmetric-risk rule (mortgage-rate level, momentum, MBS spread, Fed cycle, vol term structure, credit stress). It is a cost-of-regret default, not a forecast, so it carries no confidence label.
  • What each choice costs (right, since September 9, 2026) — for your closing date, loan amount and product, the measured cost of locking now, floating to close, or floating with a trigger (plus locking with a float-down, when the lender terms include one; CIL’s do not): expected, bad case (P95) and best case (P5), in basis points and dollars, from every daily-issued window of actual Optimal Blue lock rates over the trailing ~2 years, under CIL’s disclosed lock terms. No model.
  • Rate-moving events — the real Fed decision days, CPI/jobs/GDP/PCE release dates and 10/20/30-year Treasury auctions inside a 45-day lock window, from the official schedules.
  • Model internals (collapsed) — the two direction models (V1.2 calibrated, V1.5 regime-conditional) and the rule engine’s factor panel. Demoted from the hero after the pre-registered 90-day check found no demonstrated live skill; published for transparency only.

The call and the cost panel are the borrower-facing surface. Everything else on this page is detail: how the panel is built, the rule behind the call, the data sources, and the record of the models we tested and stopped relying on, including the legacy 7-factor index.

Model health & abstention (updated November 3, 2026 · v1.5.7)

The 90-day check ran on September 9, 2026 (45 days late — the reminder fired 33 times). Verdict: fails to establish live skill.

Across 70 scored 30-day calls (only 3 independent windows) V1.2 and V1.5 each hit 21.4%against validated baselines of 57.7% / 58.0%, in a period when rates rose 85.7% of the time — the constant down-caller diagnosed on July 2 persisted. V1.2’s probabilities still beat a constant forecast (Brier 0.295 vs 0.314); V1.5’s did not (0.385). The action tier emitted LOCK on 70 of 70 briefs — identical to always-lock, 0.000 bps of measured value-add. On 3 independent windows that is not a rigorous disproof, but it is not evidence of skill either, and the instrument could not mature (~1 independent window per 43 days). So: the models stay frozen (a successor is a NEW pre-registration, never an edit), the direction tier moved to the collapsed “model internals”, the headline became the measured cost of each choice, scoring moved to the daily lock-rate index with an explicit independent-window count, and the next review is an evidence gate (10 independent windows per horizon), never a calendar date again.

Our public commitment is that the track record builds in public — including when it’s bad. The first ~10 weeks of live scoring ran well below the models’ validated baselines (details on the dashboard’s track-record tile and in the accuracy feed), in a specific, mechanically identifiable regime: the models select their coefficients from the Fed’s trailing 12-month path, and since spring 2026 that trailing read (“cutting”) has conflicted with what the forward futures market prices (hike risk). Three things changed as a result — none of them the models themselves, which stayed frozen through the review above:

  • Abstention. While the trailing and forward Fed reads conflicted, the Direction zone and the daily brief stopped headlining a probability and said why. Abstention cuts both ways — it is not a prediction that rates rise. The September 9 demotion went further: no surface headlines a direction probability now. The raw model values stay in the /api/rates feed for transparency; the public embed feed no longer carries them.
  • Harder scoring. The accuracy feed now publishes the honest independent sample size (daily predictions score against overlapping 30-day windows, which overstates the raw count), Brier probability scores against trivial-baseline benchmarks, corrected bucket calibration, and a realized-regret score for every LOCK/FLOAT recommendation against always-lock and always-float baselines.
  • Measured asymmetry. We backtested the lock/float regret trade-off across 2003–2026. At a 30-day horizon, the bad-tail cost of floating (~41–48bps at the 95th percentile) exceeds the bad-tail cost of locking early (~29–34bps) by about 1.4×; at 45–60 day horizons in rising-rate regimes the float tail exceeds 100bps. Earlier copy quoted the long-horizon number as if it applied at 30 days — it doesn’t, and the framing here and in the daily brief now matches the measurement.

Since then (November 2–3, 2026). The cost panel now prints how often its bad case has held in the replay, and the bad case each daily brief publishes is scored against what that window actually cost. A units error that had overstated the 45- and 60-day lock fees fourfold was fixed. The decision is priced under CIL’s own lock terms instead of industry defaults, and the embed feed no longer sends the frozen models’ direction odds or a confidence label.

Full detail — including what the investigation found, what we explicitly do not claim, and the September 9 verdict — is in the public model changelog (v1.5.2 through v1.5.7 entries).

The two direction models (frozen)

Until September 9, 2026 the page led with two probability models that read where rates were heading. Both are now frozen and sit in the collapsed “model internals” on /rates: the pre-registered live check found no demonstrated skill, so neither the call nor the cost panel depends on them. The descriptions and back-test numbers below are kept for the record.

V1.2 · calibrated logistic

A flat logistic regression on 10 bond-market features (yield slope, vol percentiles, mortgage level, momentum, etc.). Trained on 2003–2018, walk-forward out-of-sample tested on 2019–2026. Reports a single probability that mortgage rates rise over the next 30 days. In the back-test: hit rate 57.7% overall, 62.3% on high-conviction calls (|p − 0.5| > 0.15), within 2.7 percentage points of realized in the 65%+ bucket. Live: 21.4% at the September 9 check.

V1.5 · regime-aware + convexity

Three phase-conditional logistic models (Fed cutting / on hold / hiking) plus a convexity-zone interaction between MOVE and MBS spread that captures the non-linear regime where mortgage rates above ~5.5% behave differently. In the back-test it had the best high-conviction hit rate (67.3%) and held up best in the 2021–22 inflation surge (48.1% vs V1.4’s 45.2%), on the same out-of-sample window as V1.2. Live: 21.4% at the September 9 check.

The live track record is below. The model changelog lists every version tested and rejected (V1.3, V1.6, V1.7, V1.8, all walk-forward-tested), and a successor to these two would be a new pre-registration, never an edit.

The standing call (LOCK / FLOAT)

The LOCK / FLOAT recommendation is not a directional forecast. It’s an asymmetric-risk read: which choice has the lower regret given how the market is set up today?

LOCK by default — and why

The base rate from 23 years of mortgage history: rates moved DOWN over a 30-day window 58% of the time and UP 42% of the time. The asymmetric piece: when rates move against a borrower (up), the cost materializes as monthly payment for the life of the loan. When rates move with a borrower (down) and you locked early, the cost is opportunity (you could have refi’d later). The two costs aren’t the same shape. Most days, the lower-regret default is LOCK.

The recommendation can override LOCK and call FLOAT when a 6-factor ensemble votes strongly for it (float-score ≥ 2.5 of a possible 3.0). The factors:

  • Mortgage rate level — high in 1yr range = compressed downside, room to drop
  • 4-week mortgage momentum — already-falling streak suggests continuation
  • MBS spread + percentile — wide spread = MBS cheap, room to compress
  • Fed cycle phase — cutting vs hiking changes the rate-trajectory base case
  • Vol term structure — 5d/20d ratio > 1.2 is a hard LOCK override (vol breakout)
  • IG credit OAS — credit stress widens MBS spreads independent of Treasuries

In practice that bar has not been met: a July 2026 replay found FLOAT on 0 of 623 days, and all 70 briefs scored at the September 9 check said LOCK. So the call carries no confidence label; it is the standing default, not a read on today’s market. For your own close, the cost panel is the part to read.

Inside the “what each choice costs” panel

This replaced the Borrower Impact panel on September 9, 2026. That panel scaled a 20-day Treasury vol by √21 and a 1.5× “asymmetry multiplier” — a heuristic our own July 2 backfill could not support at a 30-day horizon. The new panel contains no formula of that kind: it is the measured distribution.

How the numbers are built

  1. Take the daily Optimal Blue 30-year conforming lock-rate index (FRED OBMMIC30YF, ~35% of US locks) for the trailing 504 sessions (~2 years).
  2. From every business day, look forward 15, 30, 45 and 60 calendar days (the rate on or before the target date — the lock-expiry convention) and record the whole daily path.
  3. On each path, compute what each choice would have cost under the lender terms shown on the panel: lock now (the lock-period pricing), float to close (the close-date rate plus a short lock), lock + float-down (the option premium, exercised once if rates fell at least the minimum; computed only when the lender offers one, and CIL does not), float with a trigger (float, but lock the remaining period the day the rate rises past the trigger).
  4. Report each choice’s expected, 5th- and 95th-percentile cost in basis points of rate, then convert to 30-year P+I dollars on your loan amount. The product menu swaps in that product’s own current rate.

“Lowest risk” rule (no tuned numbers): among the choices that do not cost more on average than locking now, pick the one with the smallest bad case; ties go to locking. Anchored on locking because, under zero drift, locking and floating tie on average and only fees and the width of the outcome separate them.

Why a trailing window rather than all history: the scale of rate moves is not stable — 2022 was roughly twice as wide as 2025 — so a 2-year window tracks the current regime honestly. The panel prints how many windows sit behind the numbers and roughly how many are independent (a 30-day window overlaps its neighbors).

How reliable the bad case is: replaying this method on every day since 2019, the realized 30-day move ended above that day’s bad case (P95) in about 1 in 11 windows, where an exact P95 would give 1 in 20. The panel prints the current figure for each horizon, beside a range for the bad case itself. Read it as a typical bad case, not a worst case.

Lender terms are CIL’s own lock terms (version and summary shown on the panel); every published decision object and every scored row carries the hash of the terms it used, so history can never be silently re-scored. DSCR / investor rates run 75–100 bps higher than residential; ARMs and prepayment penalties are not modeled. This is a measured cost distribution, not a forecast and not a quote — talk to your loan officer for a binding lock.

Data sources & freshness

Every number on the dashboard traces back to a public source, each dated separately. The freshness panel at the top of /rates shows each source’s latest data point and a state pill (Live / Lagging / Stale) — the headline anchors on the freshest, not the slowest. We don’t collapse different cadences into one misleading “updated X ago” line.

Optimal Blue · Daily lock-rate index (via FRED)

OBMMIC30YF and its product series (FHA, VA, USDA, jumbo, 15-year, conforming by credit profile): the rates borrowers are actually quoted, about 35% of US locks. The headline rate and the whole cost panel come from it.

Cadence: business days, about one day behind.

FRED · Daily Treasury Yields

DGS2, DGS10, DGS30, DFF (Fed Funds Effective).

Cadence: business days, T+1 publish (~5pm ET). “1d ago” on a weekday morning is the healthy state.

Freddie Mac · Primary Mortgage Market Survey

MORTGAGE30US — the 30-year conventional rate, shown as the weekly benchmark beside the daily index.

Cadence: weekly, Thursdays. Up to 7 days old is the normal state until the next print.

FRED · Credit Stress Proxy

BAMLC0A0CM — ICE BofA US Corporate IG OAS. Co-moves ~0.85 with MBS spreads.

Cadence: business days, T+1.

Yahoo Finance · MOVE Index

^MOVE — ICE BofAML MOVE Index, the bond-market VIX. Context on the page and an input to the frozen V1.5 model; the call and the cost panel do not use it.

Cadence: daily close-of-day.

CME · Fed funds futures (via Yahoo)

The ZQ forward strip: the market’s own pricing of the Fed’s path, shown as the forward read beside the trailing Fed-cycle tile.

Cadence: daily, intraday.

Official schedules · Rate-moving events

Fed meeting days (the Fed’s published calendar), CPI, jobs, GDP and PCE release dates (FRED’s release calendar) and 10-, 20- and 30-year Treasury auctions (TreasuryDirect).

Dates as published, never estimated.

Internal · Bond Conditions Index (gundlach_rli)

The legacy 7-factor 0–100 score (described in the next section). Computed each weekday at ~7:00am PT and stored in our database; it is not the lock call. The freshness panel surfaces this as “Bond Conditions Index” with its own age + cadence so a stale daily cron immediately shows up red.

Every source row also carries a 30-day inline sparkline (rising = emerald, falling = blue, flat = gray) so you can scan the trends rather than parse the numbers. The “?” icon next to each label opens a publish-cadence tooltip in plain English.

Supplementary detail

7-Factor Bond Conditions Index (legacy RLI)

The original Rate Lock Index (GUNDLACH) — a 0–100 read of current bond-market conditions distilled from seven factors. It’s a snapshot of conditions, not a 30-day prediction, and it plays no part in the call or the cost panel. It still computes each weekday and sits inside the collapsed model internals on /rates. The band labels and star ratings below are the original tool’s wording, kept for the record; none of them is a recommendation.

The scale

MAX FLOAT
FLOAT
NEUT-BULL
NEUTRAL
NEUT-BEAR
LOCK
MAX LOCK
0255075100
ScoreBandStarsWhat it means
0–15MAX FLOAT★★★★★Rates likely to drop — wait on every deal you can
15–35FLOAT★★★★★Bullish bonds — float >21-day deals, keep lock list warm
35–45NEUT-BULL★★★★★Lean float, no strong conviction
45–55NEUTRAL★★★★★No edge — let closing date drive lock timing
55–65NEUT-BEAR★★★★★Lean lock, no strong conviction
65–85LOCK★★★★★Bearish bonds — lock anything closing in 30 days
85–100MAX LOCK★★★★★Rates likely to rise — lock every lockable deal

The seven factors

Each outputs a value between −1 (strong FLOAT) and +1 (strong LOCK). We multiply by the weight, add them up, and convert to the 0–100 scale.

1

Path Deviation

weight 25%

“Is the 10-year Treasury stretched away from its recent trend?”

If the 10y yield is unusually high vs the last 60 days, it's likely to mean-revert down → float. Unusually low → expect a bounce back up → lock.

2

Event Risk

weight 20%

“What's on the Fed / inflation calendar in the next 14 days?”

Fed meetings (1.0×), CPI (0.85×), NFP (0.70×), PCE (0.55×), Treasury auctions (0.30–0.35×). Multiple big events in the window → don't gamble through them → lock.

3

Primary–Secondary Spread

weight 15%

“How much margin are lenders currently baking into the rate?”

Gap between the 30y mortgage and the 10y UST (historical mean ~180 bps). Wide AND tightening = lenders about to pass a rally through → float. Tight = no more buffer left → lock.

4

Volatility Regime

weight 15%

“How jittery are bonds right now?”

MBB's 20-day realized volatility. High vol = unpredictable tape = hedge the event risk → lock. Normal vol = no signal.

5

OAS Momentum

weight 10%

“Is the MBS market richening or cheapening?”

IG Corporate OAS is a clean proxy for mortgage-bond credit spreads (they co-move ~0.85). Tightening → MBS getting bid → rates should follow down → float. Widening → lock.

6

Dealer Flow

weight 8%

“Are Wall Street dealers long or short MBS?”

Regression of MBB returns against duration-matched IEF. When MBB persistently underperforms → dealers long-axis (supply overhang) → eventual compression → float.

7

Technical

weight 7%

“Where is the 10y on its own chart?”

14-day RSI on the 10-year yield. Overbought (RSI > 70) → expect pullback → float. Oversold (RSI < 30) → expect bounce → lock.

How the final number is built

Weighted sum = 0.25·path + 0.20·event + 0.15·spread
+ 0.15·vol + 0.10·oas + 0.08·flow + 0.07·tech
RLI = 50 + 50 × weighted_sum (clamped 0–100)

Factor values are normalized to [−1, +1] before weighting, so a score of 50 means “all signals washed.” 75 means “three-quarters of the way to a strong lock signal.” The dashboard shows every factor’s contribution in bps-of-points so you can see which pulled the score where.

How the star rating works

Stars are a confidence signal, not a magnitude. Two conditions must both be true for 5 stars:

1.
Distance from 50. The score has to be in the tail, not near the middle. Score 50 = coin flip. Score 20 or 80 = conviction.
2.
Factor agreement. At least 70% of the factor weight has to point in the same direction as the score. If 6 of 7 factors are washed and only the 10y RSI is yelling “lock,” the score may be high but agreement is weak — you get 2 or 3 stars, not 5.
StarsRequirement
★★★★★Score ≥ 85 or ≤ 15, ≥70% weight aligned — rare, high-conviction
★★★★★Score ≥ 75 or ≤ 25, ≥60% aligned
★★★★★Score ≥ 65 or ≤ 35, ≥50% aligned
★★★★★Score moderately away from 50
★★★★★Score near 50 — no edge

In the original tool, a 5-star LOCK meant all seven signals pointed the same way and a 1-star NEUTRAL meant no edge either way. Its live direction record, below, is why it no longer drives anything.

Track record — V1.2 / V1.5 (frozen direction models)

Both probability models are walk-forward out-of-sample tested across 23 years (2003-2018 train / 2019-2026 test window). 381 historical predictions per model scored against realized 30-day mortgage moves. These are the historical out-of-sample numbers. The live record contradicts them (see the model-health section above): in the first 129 days of public predictions the high-conviction calls hit 20.5% on 3 independent windows. Back-test scores are context, not a promise; the live ledger is the test.

V1.5 high-conviction · backfill

67.3%

hit rate when |p − 0.5| > 0.15, 2019–2026 out-of-sample

Live: no demonstrated skill — its high-conviction calls have hit far less often (2026-09-09 check).

V1.2 high-conviction · backfill

62.3%

hit rate when |p − 0.5| > 0.15, 2019–2026 out-of-sample

Live: no demonstrated skill (2026-09-09 check).

Calibration · backfill

2.7 / 6.0 pp

65%+ bucket gap, V1.2 / V1.5, in the backfill

Live: V1.5's probabilities scored worse than a constant forecast (Brier). Backfill calibration did not carry over.

V1.2 · calibrated logistic

  • Overall OOS hit: 57.7% (n=381)
  • High-conviction subset: 62.3%
  • 65%+ bucket: within 2.7 pp of realized
  • Walk-forward train 2003–2018, test 2019–2026

V1.5 · regime-conditional + convexity

  • Overall OOS hit: ~58% (n=381)
  • High-conviction subset: 67.3%
  • 65%+ bucket: within 6.0 pp
  • 2021–22 inflation surge held: 48.1% (vs V1.4 45.2%)

Public commitment: V1.2 and V1.5 are frozen. The 90-day check ran September 9, 2026 and found no demonstrated live skill; a successor is a new pre-registration, never an edit. The next review opens at 10 independent scored windows per horizon on the daily lock-rate index — an evidence gate, not a date.

The live tile renders “accumulating” until 30 days after the first brief, then switches to a scored-vs-baseline view automatically. The discipline is showing the OOS baseline alongside the live number so a regression to the mean — or a real degradation — is visible immediately.

What we tested and rejected (in public)

V1.2 and V1.5 led the page because they beat four other architectures we tested in the same walk-forward OOS window, and the rejected versions stay publicly logged in the changelog. Winning the back-test did not make either model work live: the September 9 check found no demonstrated skill, so both are frozen and the live record, not the back-test, decides what the page relies on.

V1.3 · flat MOVE

Added MOVE Index as a flat 7th feature to V1.2’s logistic. Improved overall hit modestly but over-shot the 65%+ bucket calibration. Disconfirmed. MOVE later entered V1.5 only through its convexity interaction.

V1.6 · ensembling

Stacked V1.2 + V1.5 outputs into a meta-learner. Tested two architectures (logistic + isotonic). Neither beat V1.5 standalone on either overall or high-conviction OOS. Disconfirmed.

V1.7 · rule-based blend

Hand-coded phase weights blending V1.2 (cutting/hold) + V1.5 (hiking) by Fed cycle. Lost the calibration property V1.5 holds across phases. Disconfirmed.

V1.8 · isotonic recalibration

Pool-adjacent-violators on V1.5 raw output. Tightened bucket calibration but flattened high-conviction precision (the headline 67.3%). Net negative. Disconfirmed.

Why we publish this: a back-test that survives four attempts to displace it is still only a back-test, as the live check showed. Every disconfirmation, including that one, is logged with what we tested, what we rejected, and why — full detail in the model changelog on /rates.

Why we pivoted — the 7-factor RLI’s track record

Before V1.2 and V1.5 existed, /rates was a single 0–100 score from the legacy 7-factor RLI tested as a directional forecasting tool. We backfilled its 14- and 30-day directional hit rates against realized mortgage moves — here are the live, ongoing scores. Below 50% on the 14d horizon was the data point that reframed /rates from forecasting to asymmetric-risk recommendation. The 7-factor RLI now lives inside the collapsed model internals as a conditions snapshot, not a directional bet.

14-day horizon · n=110

49%

direction hit rate

Brier: 0.239 (0.25 = coin flip)

Calibration: 1.6★ right vs 1.2★ wrong ✓

30-day horizon · n=98

33%

direction hit rate

Brier: 0.272 (0.25 = coin flip)

Calibration: 1.5★ right vs 1.3★ wrong ✓

We keep the 7-factor scores live and dated for full transparency — if a system claims it’s honest, the disconfirmed numbers should still be visible. The 7-factor index isn’t a directional model now, and it is not an input to the call or the cost panel; it’s a conditions snapshot, published for context.

Share with a client

“Our rate dashboard doesn’t guess where rates are going. For your closing date and loan, it shows what locking now, floating to close, or floating with a trigger actually cost across the last two years of real daily lock rates, bad case included, under our own lock terms. Locking is the standing default because floating into a rate spike has cost more than locking a little early. It’s research, not advice: your loan officer gives you the binding lock.”

Research only · not investment advice. Consult your loan officer for binding rate quotes.
Powered by Chad Investor Lending · NMLS #2636410