A broad snow-streaked Alpine panorama.
All projects

02Quantitative · Individual · 2026, in progress

Repo-Market Pressure Model

Probabilistic forecasting system

What it does
Every afternoon, from public data only, it forecasts what overnight borrowing will cost tomorrow in the U.S. repo market — as a likely range, not a single number. That range is the main goal; it also gives the chance of a pressure day.
Does it work?
Yes, modestly. In a final test written down in advance and run once on 169 trading days of 2026, its forecasts were about 9% more accurate than the simple rule “tomorrow will look like today”, and what happened landed inside its 90% range on 157 of 169 days.
Limits
This is a research forecast of next-day overnight borrowing costs, not a warning system or a tool for managing risk. It has been tested mostly in calm conditions, so it needs re-checking if the market changes sharply. The test year was a calm one, so it says nothing yet about rare crises.

Banks and investment funds borrow trillions of dollars every night against U.S. government bonds, in what is called the repo market. Usually the cost barely moves; on a few days it spikes, as it did in September 2019. I built a forecasting system that uses only public data available the afternoon before to predict tomorrow’s cost as a likely range — and then tested it the hard way, with a final test written down in advance and run once. It passed: a modest but real improvement on the simple rule that tomorrow will look like today. It cannot yet warn of rare crises, and it says so.

Question
Can public data forecast what overnight borrowing will cost tomorrow in the U.S. repo market — as a likely range, not a single number — using only what was known the afternoon before?
My role
Individual. I designed the question, the data rules, the testing method and the working rules for the AI agents, and made every decision on what counts as a result; AI coding agents wrote the code under those rules.
Method
Python · Forecasting with uncertainty ranges · Testing day by day, strictly forward in time · A final test fixed in advance · AI coding agents under written rules
Tools
Python (standard library; numpy and scikit-learn as an optional extra for the machine-learning models) · Git and GitHub Actions · AI coding agents
Protocol
Collect public data → Forecast tomorrow → Score against what happened → Publish, failures included
Evidence
Daily public data from the New York Fed, the Federal Reserve and the U.S. Treasury, 2018 to 2026, each value stamped with when it became public; 2026 kept aside for a single final test.
Result

Forecasts tomorrow’s cost of overnight borrowing as a range, and passed a test written down in advance and run once — while stating plainly that it is not yet a crisis alarm.

2,104
Trading days of data, 2018–2026
19
Public data series
169
Days in the one-shot 2026 test
Output
Open-source Python package with published, reproducible run records on GitHub, a plain-language results page and an interactive explorer.

Phase 3 · Latent reserves and payment needsin progress

Closed for now Phase 1, Public U.S. dataset; phase 2, Forecasting benchmarks and probabilistic ML: closed by decision, with their open items recorded, rather than by meeting their exit tests in full.

Next Phase 4, Repo supply, demand, and market clearing.

Frozen panel 2018-04-03 to 2026-09-03 · updated October 2026

Does it work?

Yes, modestly — and it was tested in a way that could have said no

On most days the cost of overnight borrowing barely moves, so the simple rule “tomorrow will look like today” is very hard to beat. That rule is the benchmark: a forecast that cannot beat it is not worth having.

To keep the test honest, I locked away every day of 2026 before the final model was chosen, wrote down exactly what would be measured, against what, and what would count as a pass — and then ran it once. The model passed.

  • What it does well: it forecasts tomorrow’s likely range more accurately than the simple rule, and its ranges hold about as often as they claim to.
  • Where it falls short: it is not a crisis alarm. On the rarer, sharper jumps it is no better than simple rules, or there are too few such days to tell, and 2026 was too calm a year to test it. The model states this limit in writing beside every result.
  • When I found mistakes in my own earlier results — forecasts that had quietly used week-old data, and a counting error at the threshold for a pressure day — I published corrections and re-ran everything, rather than keep the better-looking numbers.
Fig. 1Forecast against what actually happened, every trading day of the 2026 final test
What happened Forecast Likely range (middle half) 90% range
−30−20−100+10+20+30+40JanFebMarAprMayJunJulAugSep
−200+20+40JFMAMJJAS
Show the numbers
Each trading day of the final test: the actual SOFR − IORB spread and the model's forecast quantiles made at 4 pm the day before, basis points.
DayActual5%25%Forecast (50%)75%95%
2026-01-0210-1.73.64.67.112.2
2026-01-055-1.06.812.421.934.3
2026-01-061-1.23.44.59.113.6
2026-01-070-2.12.54.27.115.2
2026-01-08-1-5.20.81.52.87.4
2026-01-09-1-4.4-0.40.52.012.4
2026-01-12-1-4.4-0.40.12.012.3
2026-01-130-4.6-1.0-0.30.97.5
2026-01-14-1-5.1-0.6-0.01.011.2
2026-01-151-5.7-0.80.00.88.0
2026-01-160-5.0-0.6-0.01.011.2
2026-01-20-1-5.20.60.71.56.0
2026-01-21-2-5.1-0.60.40.810.9
2026-01-22-1-5.6-0.80.00.98.0
2026-01-230-5.7-2.3-1.10.59.4
2026-01-261-5.0-0.60.10.810.8
2026-01-271-5.5-0.90.10.66.2
2026-01-28-1-4.21.72.13.113.1
2026-01-290-4.31.01.31.59.0
2026-01-303-4.5-0.20.21.510.7
2026-02-024-4.4-0.60.10.510.0
2026-02-034-3.21.52.44.413.0
2026-02-040-3.42.13.55.318.1
2026-02-050-3.01.42.94.419.2
2026-02-06-1-4.3-0.21.21.88.4
2026-02-09-2-4.2-0.11.21.98.4
2026-02-100-4.3-1.00.00.86.3
2026-02-110-5.0-1.9-0.30.89.2
2026-02-120-4.0-0.6-0.20.46.3
2026-02-131-4.1-0.01.21.89.1
2026-02-176-3.9-0.50.71.66.8
2026-02-188-3.71.72.33.011.8
2026-02-192-3.03.95.710.522.9
2026-02-2010.64.35.89.620.2
2026-02-231-4.21.93.14.212.0
2026-02-242-3.40.91.82.77.6
2026-02-252-3.61.62.33.011.5
2026-02-262-4.01.12.43.29.1
2026-02-273-3.71.42.23.58.3
2026-03-026-3.81.42.23.26.2
2026-03-035-4.20.92.03.98.0
2026-03-042-0.92.74.87.310.8
2026-03-051-1.81.83.44.99.6
2026-03-060-3.61.11.52.88.7
2026-03-090-3.60.30.62.47.8
2026-03-10-1-4.1-1.0-0.8-0.63.5
2026-03-11-1-3.8-0.4-0.40.45.3
2026-03-120-4.5-1.5-1.4-1.22.5
2026-03-130-4.0-0.9-0.90.35.1
2026-03-165-3.9-0.7-0.4-0.24.5
2026-03-170-4.3-0.8-0.8-0.72.9
2026-03-18-3-1.42.13.35.112.9
2026-03-19-3-4.7-0.7-0.30.23.8
2026-03-20-3-4.8-1.8-1.60.44.9
2026-03-23-3-4.8-1.8-1.60.44.9
2026-03-24-2-5.0-2.3-2.0-1.32.8
2026-03-25-1-4.9-1.8-1.50.44.8
2026-03-260-5.2-2.3-1.6-1.42.5
2026-03-27-2-4.3-0.9-0.8-0.37.2
2026-03-30-2-3.8-1.0-0.11.16.7
2026-03-313-5.5-2.3-1.9-1.03.7
2026-04-010-4.9-1.4-1.4-0.13.7
2026-04-021-3.11.31.42.16.7
2026-04-060-3.7-0.6-0.20.23.9
2026-04-07-3-2.90.10.51.65.2
2026-04-08-6-4.0-0.9-0.20.65.7
2026-04-09-8-6.5-3.0-1.7-1.52.2
2026-04-10-4-10.1-6.8-6.0-4.01.8
2026-04-13-2-12.9-8.6-8.1-5.8-0.2
2026-04-141-9.6-4.6-4.5-3.51.8
2026-04-157-5.9-1.9-1.5-0.83.9
2026-04-162-4.3-0.10.50.58.1
2026-04-170-2.71.92.83.919.4
2026-04-20-2-4.10.31.01.812.7
2026-04-21-2-5.5-1.4-0.9-0.54.5
2026-04-22-1-5.8-1.8-1.6-0.14.8
2026-04-230-6.0-2.3-1.6-1.42.8
2026-04-241-4.8-1.6-1.10.35.7
2026-04-271-4.5-1.0-0.50.56.5
2026-04-28-1-4.5-0.40.40.89.7
2026-04-29-2-4.21.11.63.112.3
2026-04-301-4.3-0.9-0.10.95.4
2026-05-01-1-5.1-1.6-1.10.44.9
2026-05-04-2-3.70.91.53.111.8
2026-05-05-3-5.2-0.7-0.50.66.5
2026-05-06-4-5.2-1.7-1.30.34.9
2026-05-07-5-6.8-2.7-2.4-0.94.3
2026-05-08-5-8.4-4.4-4.1-2.62.6
2026-05-11-5-8.3-4.5-4.1-3.12.1
2026-05-12-5-8.4-4.9-4.5-3.31.4
2026-05-13-6-9.3-5.2-4.5-3.12.5
2026-05-14-9-9.3-5.8-5.0-3.31.3
2026-05-15-10-10.8-7.8-6.4-4.42.2
2026-05-18-12-14.5-8.7-8.2-8.10.3
2026-05-19-14-14.8-10.4-9.9-9.3-0.6
2026-05-20-15-15.3-11.8-11.7-9.7-0.3
2026-05-21-14-17.4-13.3-11.9-11.8-4.7
2026-05-22-10-21.8-15.6-11.9-11.8-3.5
2026-05-26-2-17.3-13.3-11.8-11.5-4.7
2026-05-27-2-14.1-10.4-10.4-9.2-0.9
2026-05-28-3-5.8-3.0-2.3-1.62.8
2026-05-29-2-5.7-3.0-1.71.66.3
2026-06-010-6.5-3.1-2.5-1.45.2
2026-06-02-2-6.3-2.8-2.2-1.22.8
2026-06-03-4-5.5-1.4-1.10.56.5
2026-06-04-3-6.6-3.0-2.4-2.02.0
2026-06-05-2-9.3-5.8-5.0-3.53.4
2026-06-08-2-6.9-3.2-2.3-0.74.7
2026-06-09-5-6.5-3.4-2.6-2.15.8
2026-06-10-6-6.0-2.7-1.6-0.83.8
2026-06-11-5-9.6-6.3-5.5-4.4-0.2
2026-06-120-11.1-7.6-7.0-5.10.9
2026-06-154-9.1-5.7-5.7-4.40.7
2026-06-16-2-4.8-1.0-0.7-0.64.0
2026-06-17-2-4.40.20.91.910.4
2026-06-18-3-7.1-3.7-2.4-1.42.5
2026-06-22-4-6.3-3.2-1.7-0.25.7
2026-06-23-3-7.2-3.2-2.9-2.14.6
2026-06-24-3-9.2-5.4-4.9-3.42.0
2026-06-25-1-8.1-3.7-3.0-1.92.0
2026-06-26-3-6.7-3.1-2.10.44.1
2026-06-29-3-5.5-1.5-0.7-0.13.8
2026-06-303-7.9-3.9-3.1-2.63.1
2026-07-011-7.1-2.3-2.1-2.13.5
2026-07-02-1-2.90.92.53.86.7
2026-07-06-2-3.10.71.41.48.1
2026-07-07-3-4.2-1.6-0.9-0.63.2
2026-07-08-7-7.3-2.8-1.8-0.93.8
2026-07-09-12-7.6-3.5-3.2-2.43.3
2026-07-10-10-11.5-7.7-6.7-4.8-1.1
2026-07-13-5-16.1-11.9-11.5-9.0-0.1
2026-07-14-2-14.3-9.9-9.8-7.4-0.9
2026-07-15-1-8.6-4.9-4.9-3.52.2
2026-07-16-3-6.5-3.5-1.8-1.62.3
2026-07-17-6-4.6-1.7-1.0-0.15.7
2026-07-20-8-5.9-2.9-2.2-1.66.0
2026-07-21-4-10.3-7.3-5.9-4.92.3
2026-07-22-3-12.1-8.2-8.0-5.31.5
2026-07-23-1-8.1-5.2-4.5-3.22.1
2026-07-24-1-6.1-2.5-2.2-1.36.9
2026-07-27-1-4.8-1.3-1.00.15.0
2026-07-280-4.8-1.2-1.0-1.04.1
2026-07-290-4.8-1.2-1.0-0.17.0
2026-07-300-5.6-1.5-0.6-0.43.1
2026-07-311-6.0-2.0-0.8-0.63.9
2026-08-030-4.9-2.0-0.40.96.1
2026-08-041-4.4-1.0-0.5-0.26.8
2026-08-05-1-4.8-0.60.61.16.1
2026-08-060-4.20.10.50.66.9
2026-08-07-3-4.8-0.8-0.10.35.0
2026-08-10-2-4.8-0.60.50.96.0
2026-08-11-1-8.1-4.1-3.0-1.73.2
2026-08-12-3-7.2-2.1-1.1-0.84.5
2026-08-13-3-5.3-1.6-0.8-0.83.3
2026-08-14-3-7.2-3.1-1.9-1.33.9
2026-08-171-7.4-3.7-3.0-1.74.0
2026-08-180-8.0-4.1-3.0-1.73.2
2026-08-19-3-4.60.21.42.28.3
2026-08-20-2-5.5-1.7-0.10.34.2
2026-08-210-7.3-3.1-1.9-1.04.7
2026-08-240-7.2-2.5-1.2-0.85.2
2026-08-251-5.2-1.40.00.55.1
2026-08-26-1-4.8-0.80.60.85.9
2026-08-27-1-5.1-0.50.61.66.5
2026-08-280-4.1-0.9-0.40.35.1
2026-08-313-4.8-1.3-1.2-0.12.6
2026-09-011-4.9-0.9-0.60.84.0
2026-09-020-3.11.93.65.18.1
2026-09-031-3.7-0.00.72.36.6

How to read it. The line is the gap between the market’s overnight borrowing rate and the rate the Federal Reserve pays banks, in basis points (a basis point is a hundredth of a percentage point; 0 means the two are equal). Each afternoon the model forecast the next day’s gap as a range. The orange line is what happened: it stayed inside the 90% range on 157 of 169 days, and the middle forecast was off by about 2.5 bp on a typical day. Dots mark the days it fell outside.

Fig. 2More accurate than “tomorrow will look like today”?
NO BETTER THAN BENCHMARKPublished model, final test. +0.17 bp. range +0.03 to +0.36. 169 days, 2026-01 to 2026-09. pre-registered, run oncePublished model, final test RUN ONCE169 DAYS · 2026-01 to 2026-09+0.17Published model, backtest. +0.43 bp. range +0.19 to +0.74. 1,873 days, 2018-06 to 2025-12Published model, backtest1,873 DAYS · 2018-06 to 2025-12+0.430+0.4+0.8← WORSE  ·  BETTER →
ZERO = NO BETTERPublished model, final test. +0.17 bp. range +0.03 to +0.36. 169 days, 2026-01 to 2026-09. pre-registered, run oncePublished model, final test RUN ONCE169 DAYS · 2026-01 to 2026-09+0.17Published model, backtest. +0.43 bp. range +0.19 to +0.74. 1,873 days, 2018-06 to 2025-12Published model, backtest1,873 DAYS · 2018-06 to 2025-12+0.430+0.8← WORSE  ·  BETTER →

What this says. Each dot is how much smaller the model’s forecast error was than the simple rule’s, with a bar showing how sure that is; anything right of zero is a win. In the 2026 final test, set up in advance and run once, the error was about 9% smaller; over 2018 to 2025, where the model was developed, about 20% smaller. Both bars stay right of zero. The win is real but modest, and in the final test a few unusual days account for much of it.

Fig. 3When it says “90% likely”, is it right 90% of the time?
82%91%96%100%promised 90%Delivered 88.7%, interval 87.2% to 90.1%delivered 88.7%87.2% to 90.1%Of the 211 days the range missed:96 days below the range96 BELOW115 days above the range115 ABOVE
82%90%100%promised 90%Delivered 88.7%, interval 87.2% to 90.1%delivered 88.7%87.2% to 90.1%Of the 211 days the range missed:96 days below the range96 BELOW115 days above the range115 ABOVE

What this says. Over 1,873 past trading days the 90% range caught 88.7% of outcomes — close to its promise — and its misses fall on both sides (96 too low, 115 too high), so it is not quietly biased one way. A range you can take at its word is what makes a forecast usable for planning.

How I built it

A clear question, public data, strict rules — and a team of AI agents I directed

  • The question. Banks and funds borrow trillions of dollars overnight against U.S. Treasury bonds. On a few days, like September 2019, that borrowing suddenly becomes expensive. I asked whether public data could forecast tomorrow’s cost, and the chance of such a pressure day.
  • The data. Eight years of daily public data from the New York Fed, the Federal Reserve and the U.S. Treasury, with every value stamped with the moment it became public — so a forecast can only use what was actually known at 4 pm the day before.
  • The testing. Every model was tested the way it would have been used: day by day, strictly forward in time, against the simple benchmark, with the uncertainty of each comparison measured as well. A year of data was kept aside for one final test.
  • The team. The code was written by AI coding agents working under rules I wrote. I set each piece of work as a short written brief; an automated test suite checks every change; a separate AI reviewer checks the work against the brief; and every judgement call — what counts as a result, what a piece of data means, when the locked data may be opened — comes back to me.
  • The phases. The project runs in stages, each with a written test it must pass. The data and forecasting stages are closed, with their open items written down. The main goal now is a sharper forecast of tomorrow’s range, ahead of the pressure-day probability; and the current stage, estimating how much of the banking system’s cash is actually free to lend, which nobody publishes directly, runs in a companion repository.

What I learned

Skills I bring to a team

  • Forecasting with honest uncertainty: judging a forecast by whether its ranges can be trusted, not just by one number — the core of risk and model-validation work.
  • Working with real financial data: sourcing it from the Federal Reserve, the Treasury and SEC filings, and catching errors in it — one set of fund filings counted the same cash twice.
  • Testing that cannot cheat: no peeking at the future, a year of data locked away for a single final test, and safety checks I proved work by deliberately breaking the code to see them catch it.
  • Leading AI agents: turning a research goal into clear briefs, reviewing what comes back and owning the decisions — the practical side of AI governance.
  • Owning mistakes in public: publishing corrections and keeping the old results on file, so anyone can see what changed and why.
  • Explaining technical work to two audiences: records a specialist can check, and plain summaries like this page.
  • Working with a finance expert: turning his judgement about what the data means into rules the code enforces.
  • Tools: Python, Git and GitHub, automated testing, scikit-learn.

Credit

Financial advisor: Nicholas Beroud

Nicholas Beroud advises on the financial interpretation of the data: which public series carry the funding market’s mechanics, what each one means, and which open questions are questions of finance rather than of code. I designed and led the modelling, the methodology, the governance workflow, the implementation review and the evaluation.

InterpretationWhy this matters outside the project

Banks, funds and corporate treasuries borrow cash overnight against U.S. Treasury bonds. On a few days — September 2019, March 2020 — that borrowing suddenly became expensive. The people exposed to those days do not need a better guess at tomorrow’s rate. They need to know how bad tomorrow could plausibly be, and whether that warning can be trusted.

  • A model can be right on average and still leave you under-prepared on the day that matters. The question to ask of any risk forecast is how often its worst plausible case is actually exceeded — and the honest answer can be that it is not yet fit to warn.
  • A test only counts if it is fixed before the answer is known. The final test’s design was written down and frozen before the locked 2026 days were opened, and the one change made to it was ruled on before the opening, not after.
  • Funding spikes appear to come from the calendar and the plumbing — tax dates, Treasury settlement days, quarter-ends, banks’ cash running close to the minimum they need — more than from recent market mood. Published research on September 2019 points the same way, and that is where the current phase goes: estimating how much of the banking system’s cash is really free to lend.
  • Checking calibration is a governance duty as much as a statistical one. It is the question a model-risk reviewer exists to ask, and this project is built so that the answer is on the record.
Agentic workflowHow the AI agents are governed

The code is written by AI coding agents working inside rules I wrote. A contract says what each change may touch and which files are reserved for people, and automatic checks fail any change that crosses those lines. The agents run unattended, overnight included, as scheduled cloud sessions — and they are built to stop and ask rather than guess.

Review is delegated, in writing. A separate reviewer session — never the one that wrote the change — checks each pull request against its acceptance criteria and the test suite, merges it, and escalates the cases the rules list to me. I set the direction and make the rulings; I do not read every line, and the repository says which merges were mine.

Because the agents post under my account, a comment there does not prove I wrote it. After an agent once relayed a go-ahead I had not given, a pull request that opens locked test data, or changes the live record’s pinned code or the models it logs, must now cite an approval that a CI check confirms I posted myself. This is the problem AI governance faces inside firms — delegation with accountability, audit trails, separation of duties — practised end to end on a real project.

Work runs as directives: short written issues saying what to build, what must not change and how the result will be checked. Each is taken by one AI session as one pull request, and nothing reaches the main line until the full test suite passes. My rulings are kept in the repository as decision records that later work must follow.

Research roadmapBuilt in stages, each with a test it must pass

The completed work establishes a reproducible data and forecasting foundation; the phases below are research extensions, not prerequisites to reading the findings above as a model-risk case study. A phase ends when it meets a written exit test or, where the evidence is incomplete, by a recorded decision that lists what stays open — which is how the dataset and forecasting phases were closed. The status above is generated from the project’s own plan rather than typed here.

  • Phase 0 — Foundations: every result can be rebuilt from a clean copy of the code and the data.
  • Phase 1 — The dataset: public U.S. funding-market data — Federal Reserve rates and balances, Treasury settlements and bill rates, dealer positions — each stamped with the moment it became public.
  • Phase 2 — Forecasting: a model that beats the simple forecast and stays honest about the bad days.
  • Phase 3 — Hidden cash: estimating how much of the banking system’s cash is really free to lend once the buffer banks want to keep is set aside — something nobody publishes directly. This work runs in a companion repository, repo-market-liquidity.
  • Phase 4 — Supply and demand: who lends, who borrows, and where the price settles.
  • Phases 5 to 7 — Research directions: filling data gaps and mapping the links between institutions, a stress-testing engine, and a European version.
Technical methodologyFor readers who want the method
  • Target: the next-business-day predictive distribution of the SOFR–IORB spread in basis points, as five published quantiles, and the probability that the spread closes strictly above +5 and +10 bp, from each input’s latest value public at 16:00 ET on the previous business day. Days above +20 and +50 bp are listed event by event rather than pooled.
  • Data: a versioned point-in-time panel from New York Fed reference rates (SOFR with its percentiles and volume, TGCR, BGCR) and primary-dealer positions, Federal Reserve administered rates and balances (IORB, checked against ALFRED vintages; reserves; the Treasury General Account), Treasury bill rates and settlement data, and calendar columns. Snapshots are immutable and checksummed; every field carries its availability time and release lag; missing values, structural zeros and unavailable cross-sections stay distinct. Series whose history is restated after the fact are refused by the build until their value on the day can be shown.
  • Information rule: each input is read at its latest value public at the decision instant, field by field, with leakage and staleness guards both required to hold. It replaced a derived purge that had left the earlier forecasts about a week stale; those records are archived.
  • Evaluation: as-of rolling-origin backtesting on an expanding window, refitted every 21 scored days on one shared fold grid. September 2019 and March 2020 are frozen as checksummed event windows and scored like other days. Days from 2026 were held back from every comparison until a pre-registered final test opened them once; a live record logs a forecast each business day from pinned code, under a scoring declaration written before any outcome exists.
  • Models: a persistence benchmark, ARX, SETAR threshold regression, rolling-residual intervals, and gradient-boosted quantile regression. The published distribution is calibrated by conformal PID with nested walk-forward selection of its constants, after split-conformal and cross-conformal (CV+) were scored. The pressure probability is read from that distribution and recalibrated out of fold, at one to five days ahead.
  • Scoring: the five-quantile score (mean pinball loss over the published quantiles) and interval coverage; Brier score, Brier skill and CORP reliability at each threshold; paired differences against as-of persistence, a calendar-type climatology and a persistence-logistic model, with stationary-bootstrap intervals, split by regime and by type of day. Where a forecast gave probability zero to an event that happened, the log score is reported as missing rather than clipped.
  • Guards: a leakage test changes every post-forecast observation, refits, and requires a bit-identical forecast; mutation tests prove that each guard fires; every published figure is regenerated from a run record naming its commit and data digest; and a change that opens locked test data or alters the live record must cite an approval that CI confirms the owner posted herself.
  • Stack: a standard-library Python core with no runtime dependencies; the machine-learning model sits behind an optional ml extra (numpy and scikit-learn) and records the library versions it was fitted with.
Fig. 4Every variant against as-of persistence, five-quantile score, basis points
NO BETTER THAN BENCHMARKPublished model, final test. +0.17 bp. range +0.03 to +0.36. 169 days, 2026-01 to 2026-09. pre-registered, run oncePublished model, final test RUN ONCE169 DAYS · 2026-01 to 2026-09+0.17Published model, backtest. +0.43 bp. range +0.19 to +0.74. 1,873 days, 2018-06 to 2025-12Published model, backtest1,873 DAYS · 2018-06 to 2025-12+0.43Machine-learning model, uncalibrated. +0.35 bp. range +0.13 to +0.65. 2,042 days, 2018-06 to 2026-09Machine-learning model, uncalibrated2,042 DAYS · 2018-06 to 2026-09+0.35…with CV+ calibration. +0.27 bp. range +0.04 to +0.57. 2,042 days, 2018-06 to 2026-09…with CV+ calibration2,042 DAYS · 2018-06 to 2026-09+0.270+0.4+0.8← WORSE  ·  BETTER →
ZERO = NO BETTERPublished model, final test. +0.17 bp. range +0.03 to +0.36. 169 days, 2026-01 to 2026-09. pre-registered, run oncePublished model, final test RUN ONCE169 DAYS · 2026-01 to 2026-09+0.17Published model, backtest. +0.43 bp. range +0.19 to +0.74. 1,873 days, 2018-06 to 2025-12Published model, backtest1,873 DAYS · 2018-06 to 2025-12+0.43Machine-learning model, uncalibrated. +0.35 bp. range +0.13 to +0.65. 2,042 days, 2018-06 to 2026-09Machine-learning model, uncalibrated2,042 DAYS · 2018-06 to 2026-09+0.35…with CV+ calibration. +0.27 bp. range +0.04 to +0.57. 2,042 days, 2018-06 to 2026-09…with CV+ calibration2,042 DAYS · 2018-06 to 2026-09+0.270+0.8← WORSE  ·  BETTER →
Show the numbers
Mean improvement in the five-quantile score over as-of persistence, basis points; positive favours the model. Each row on its own window. Interval: 90%, stationary bootstrap.
ApproachDaysWindowGainLowerUpper
Published model, final test1692026-01 to 2026-09+0.1741+0.0293+0.3583
Published model, backtest18732018-06 to 2025-12+0.4268+0.1855+0.7368
Machine-learning model, uncalibrated20422018-06 to 2026-09+0.3510+0.1254+0.6512
…with CV+ calibration20422018-06 to 2026-09+0.2661+0.0400+0.5672
Fig. 5The pressure-day probability against two benchmarks, one to five days ahead
vs calendar base rate, left vs persistence-logistic, right
More than 5 bp above IORB+0.028012345BUSINESS DAYS AHEAD5 bp, 1 day ahead. vs calendar base rate: +0.0219. interval 0.0158 to 0.0282. beats it. 1,873 scored days5 bp, 2 days ahead. vs calendar base rate: +0.0180. interval 0.0120 to 0.0247. beats it. 1,872 scored days5 bp, 3 days ahead. vs calendar base rate: +0.0166. interval 0.0104 to 0.0235. beats it. 1,871 scored days5 bp, 4 days ahead. vs calendar base rate: +0.0141. interval 0.0082 to 0.0206. beats it. 1,870 scored days5 bp, 5 days ahead. vs calendar base rate: +0.0136. interval 0.0075 to 0.0204. beats it. 1,869 scored days5 bp, 1 day ahead. vs persistence-logistic: +0.0068. interval 0.0031 to 0.0107. beats it. 1,873 scored days5 bp, 2 days ahead. vs persistence-logistic: +0.0080. interval 0.0037 to 0.0125. beats it. 1,872 scored days5 bp, 3 days ahead. vs persistence-logistic: +0.0103. interval 0.0053 to 0.0153. beats it. 1,871 scored days5 bp, 4 days ahead. vs persistence-logistic: +0.0057. interval 0.0013 to 0.0105. beats it. 1,870 scored days5 bp, 5 days ahead. vs persistence-logistic: +0.0060. interval 0.0011 to 0.0114. beats it. 1,869 scored daysMore than 10 bp above IORB+0.028012345BUSINESS DAYS AHEAD10 bp, 1 day ahead. vs calendar base rate: +0.0039. interval 0.0015 to 0.0065. beats it. 1,873 scored days10 bp, 2 days ahead. vs calendar base rate: +0.0030. interval 0.0004 to 0.0056. beats it. 1,872 scored days10 bp, 3 days ahead. vs calendar base rate: +0.0024. interval -0.0003 to 0.0053. not distinguishable. 1,871 scored days10 bp, 4 days ahead. vs calendar base rate: +0.0019. interval -0.0008 to 0.0047. not distinguishable. 1,870 scored days10 bp, 5 days ahead. vs calendar base rate: +0.0017. interval -0.0009 to 0.0043. not distinguishable. 1,869 scored days10 bp, 1 day ahead. vs persistence-logistic: +0.0007. interval -0.0010 to 0.0024. not distinguishable. 1,873 scored days10 bp, 2 days ahead. vs persistence-logistic: +0.0028. interval 0.0006 to 0.0053. beats it. 1,872 scored days10 bp, 3 days ahead. vs persistence-logistic: +0.0018. interval -0.0003 to 0.0040. not distinguishable. 1,871 scored days10 bp, 4 days ahead. vs persistence-logistic: −0.0003. interval -0.0022 to 0.0018. not distinguishable. 1,870 scored days10 bp, 5 days ahead. vs persistence-logistic: −0.0003. interval -0.0021 to 0.0015. not distinguishable. 1,869 scored days
More than 5 bp above IORB+0.028012345BUSINESS DAYS AHEAD5 bp, 1 day ahead. vs calendar base rate: +0.0219. interval 0.0158 to 0.0282. beats it. 1,873 scored days5 bp, 2 days ahead. vs calendar base rate: +0.0180. interval 0.0120 to 0.0247. beats it. 1,872 scored days5 bp, 3 days ahead. vs calendar base rate: +0.0166. interval 0.0104 to 0.0235. beats it. 1,871 scored days5 bp, 4 days ahead. vs calendar base rate: +0.0141. interval 0.0082 to 0.0206. beats it. 1,870 scored days5 bp, 5 days ahead. vs calendar base rate: +0.0136. interval 0.0075 to 0.0204. beats it. 1,869 scored days5 bp, 1 day ahead. vs persistence-logistic: +0.0068. interval 0.0031 to 0.0107. beats it. 1,873 scored days5 bp, 2 days ahead. vs persistence-logistic: +0.0080. interval 0.0037 to 0.0125. beats it. 1,872 scored days5 bp, 3 days ahead. vs persistence-logistic: +0.0103. interval 0.0053 to 0.0153. beats it. 1,871 scored days5 bp, 4 days ahead. vs persistence-logistic: +0.0057. interval 0.0013 to 0.0105. beats it. 1,870 scored days5 bp, 5 days ahead. vs persistence-logistic: +0.0060. interval 0.0011 to 0.0114. beats it. 1,869 scored daysMore than 10 bp above IORB+0.028012345BUSINESS DAYS AHEAD10 bp, 1 day ahead. vs calendar base rate: +0.0039. interval 0.0015 to 0.0065. beats it. 1,873 scored days10 bp, 2 days ahead. vs calendar base rate: +0.0030. interval 0.0004 to 0.0056. beats it. 1,872 scored days10 bp, 3 days ahead. vs calendar base rate: +0.0024. interval -0.0003 to 0.0053. not distinguishable. 1,871 scored days10 bp, 4 days ahead. vs calendar base rate: +0.0019. interval -0.0008 to 0.0047. not distinguishable. 1,870 scored days10 bp, 5 days ahead. vs calendar base rate: +0.0017. interval -0.0009 to 0.0043. not distinguishable. 1,869 scored days10 bp, 1 day ahead. vs persistence-logistic: +0.0007. interval -0.0010 to 0.0024. not distinguishable. 1,873 scored days10 bp, 2 days ahead. vs persistence-logistic: +0.0028. interval 0.0006 to 0.0053. beats it. 1,872 scored days10 bp, 3 days ahead. vs persistence-logistic: +0.0018. interval -0.0003 to 0.0040. not distinguishable. 1,871 scored days10 bp, 4 days ahead. vs persistence-logistic: −0.0003. interval -0.0022 to 0.0018. not distinguishable. 1,870 scored days10 bp, 5 days ahead. vs persistence-logistic: −0.0003. interval -0.0021 to 0.0015. not distinguishable. 1,869 scored days
Show the numbers
Benchmark's Brier score minus the model's, with its 90% stationary-bootstrap interval; positive favours the model. Pressure model v1, backtest.
Threshold, benchmark1 day2 days3 days4 days5 days
5 bp, vs calendar base rate+0.0219 (0.0158 to 0.0282)+0.0180 (0.0120 to 0.0247)+0.0166 (0.0104 to 0.0235)+0.0141 (0.0082 to 0.0206)+0.0136 (0.0075 to 0.0204)
10 bp, vs calendar base rate+0.0039 (0.0015 to 0.0065)+0.0030 (0.0004 to 0.0056)+0.0024 (-0.0003 to 0.0053)+0.0019 (-0.0008 to 0.0047)+0.0017 (-0.0009 to 0.0043)
5 bp, vs persistence-logistic+0.0068 (0.0031 to 0.0107)+0.0080 (0.0037 to 0.0125)+0.0103 (0.0053 to 0.0153)+0.0057 (0.0013 to 0.0105)+0.0060 (0.0011 to 0.0114)
10 bp, vs persistence-logistic+0.0007 (-0.0010 to 0.0024)+0.0028 (0.0006 to 0.0053)+0.0018 (-0.0003 to 0.0040)−0.0003 (-0.0022 to 0.0018)−0.0003 (-0.0021 to 0.0015)

What this says. Filled marks are intervals clear of zero. At 5 bp the model beats both benchmarks at every horizon, by a small margin. At 10 bp it beats the calendar base rate only at short horizons and is mostly indistinguishable from the persistence-logistic model. The 2026 final test held too few pressure days to score either threshold, and the rarer 20 and 50 bp days are listed one by one in the records rather than averaged.

19 public series in the panel · 2,104 rows · 2018-04-03 to 2026-09-03

New York Fed 7

  • Broad collateral ratebgcr
  • Primary dealer Treasury holdingsdealer_treasury_position
  • Overnight repo ratesofr
  • Repo rate, 25th percentilesofr_p25
  • Repo rate, 75th percentilesofr_p75
  • Repo volumesofr_volume
  • Treasury collateral ratetgcr

Federal Reserve 3

  • Rate the Fed pays on bank reservesiorb
  • Cash banks hold at the Fedreserve_balances
  • Treasury General Account — the government's cash balancetga

U.S. Treasury 6

  • 13-week Treasury bill ratetbill_13w
  • 4-week Treasury bill ratetbill_4w
  • Treasury settlement, all of ittreasury_settlement
  • Settlement, short-dated billstreasury_settlement_bills
  • Settlement, notes and bondstreasury_settlement_coupons
  • Settlement, the Fed's own roll-offstreasury_settlement_soma

Calendar 3

  • Days to month enddays_to_month_end
  • Quarter endquarter_end
  • Corporate tax datetax_date

2 series refused, on evidence

Money-market fund assets Funds file corrections to past months, so the latest filing is not what stood at the time.

The Fed's overnight reverse repo facility Its published history has been restated after the fact, so today’s version is not what a forecaster would have seen on the day.

BoundaryA research project in progress — not a warning system, not a tool for managing risk or money, and not investment advice.