How it was built
From thirty years of raw speeches to a tested answer, and what the numbers can and cannot tell you.
Source code, data pipeline and testsWhy
Interest rates move every price in finance: bonds, stocks, currencies and mortgages. Central bankers signal where rates are going in their speeches, and fund managers and analysts read them for that signal. There are hundreds a month from dozens of central banks. Tools that score that language exist for the US Federal Reserve; this project covers every central bank in the BIS archive, measures how well the scoring agrees with people, and tests whether it tells you anything about the next decision.
Data
20,690 speeches from the Bank for International Settlements' archive of central bankers' speeches, 1996 to Jun 22, 2026, and 54 newer speeches from the live feeds of the Federal Reserve, ECB, Bank of England, Bank of Canada and Reserve Bank of Australia. The archive has no institution column, so each speech is matched to its central bank from the speaker's title.
Daily policy rates and monthly consumer prices come from the BIS as well. A month's decision is a move of at least 0.10 percentage points in the end-of-month rate.
Reading tone
Only sentences about policy, prices, rates or the real economy can lean one way, so the 671,603 such sentences are scored and the rest left out.
- An answer key from people. The Trillion Dollar Words study labeled 2,480 Federal Reserve sentences by hand. Its test file is used once, for the final score.
- A language model labels a sample. 8,001 sentences, spread across banks, labeled hawkish, dovish or neutral. Three models were compared on the training file; the fastest of the equally accurate ones was kept.
- A small model learns from both. Sentence embeddings and logistic regression, chosen over a word-count baseline by cross-validation grouped by speech. It runs on a laptop CPU, so the whole archive was scored once for free.
- A check outside the Fed. A second model from a different family labeled 150 sentences from 20 other banks; the two agreed 88.7% of the time.
Testing it
Every bank-month holds only what was known by the end of that month: tone from speeches already given, and inflation lagged a month because prices are published a month late. Models predict the next month's decision from past rates and inflation, then again with tone added. They are trained on 1999–2016, chosen on 2017–2019 and tested once on 2020 onward.
Any extra column lets a model fit a little noise, so a placebo test shuffles each bank's tone across months a hundred times. Tone counts only if it beats nearly all of the shuffles.
Limits
- A model reads the tone, not people; single sentences are often misread.
- The human answer key is the Fed's; elsewhere there is only agreement between models.
- Every speaker counts the same; the archive does not say who votes.
- Not causal and not a trading signal: markets price expected decisions in advance.
- Only the five banks with live feeds are current; the rest follow the BIS archive.
Built with
- Data pipeline
- Python, polars, DuckDB, Parquet
- Language models
- DeepSeek V4.1 Flash and GLM 5.3 through an OpenAI-compatible API
- Local model
- fastembed (ONNX Runtime), BAAI/bge-small-en-v1.5, scikit-learn
- Statistics
- SciPy, scikit-learn: grouped cross-validation, gradient boosting, placebo tests
- Scoring in the browser
- ONNX Runtime Web (WebAssembly), the same model file and tokenizer
- API
- FastAPI, Uvicorn, Pydantic, for scoring from Python
- Website
- Next.js, React, TypeScript, Tailwind CSS, shadcn/ui, Recharts
- Quality
- pytest with synthetic data of known answers, ruff, ESLint
About
Built by Mayur Mahavir Bijarniya. The code, the labels and every result are in the repository, so the analysis can be rerun from the raw data. The BIS data is for non-commercial use.