Construction of the
Crashboard indices
A description of the data, the transformations and the composition rule behind two daily readings of United States financial conditions — and of the several places where the construction is known to be weaker than it looks.
Abstract
Crashboard reduces thirty-four indicators of financial stress, drawn from eight United States government sources, to two daily scalars covering every trading day since 1998. This paper sets out how. Each indicator is derived from one or more published series, expressed in standard deviations against its own expanding history, and bounded by a hyperbolic tangent; discounted by an age penalty measured from its own autocorrelation rather than assumed from its publication schedule; and combined by a confidence-weighted average whose companion statistic reports how much of the panel agrees, discounted by how many indicators are reporting at all. The headline verdict is a rank against the record rather than a threshold on the scale.
Nothing in the construction is fitted to outcomes. About ten distinguishable episodes of financial distress have occurred in the period covered, which is not a sample one can estimate a forecasting model from, and none is estimated. The readings state where today sits against the record; they do not state what follows. The final sections give the measurements that test whether the construction behaves as described, including two that it fails or only partly passes.
Every exhibit below is generated from the published snapshot by scripts/make_whitepaper.py, and can be regenerated. Section 10 says how.
1What the readings claim
A barometer does not forecast the storm. It measures the pressure that precedes one, and a falling glass is something a reasonable person acts on without anyone claiming to know the future. That is the entire claim made here, and it is the only claim the data supports.
The reason is arithmetic rather than modesty. The period covered contains on the order of ten distinguishable episodes of financial distress — 1998, 2000–02, 2007–09, 2010–12, 2015–16, 2018, 2020, 2022, 2023, and whatever the present turns out to have been. Ten is not a sample. A model with thirty-four inputs fitted to ten outcomes would recover the ten outcomes exactly and tell a reader nothing about the eleventh, and the fact that it looked convincing while doing so is precisely the hazard. So nothing here is fitted to outcomes at all: no coefficient is estimated against a crisis, no weight is chosen because it improved a backtest, and no threshold is placed where it would have called a past event.
What is produced instead is a ranking of today against the record. Every input is scored against its own history; the composite is ranked against its own history; the verdict is which fifth of that history today falls in. Each of those steps is a statement about what has already been observed. None is a statement about what happens next.
The score is split into two lenses, both running −1 unfavourable to +1 favourable. Conditions Now answers how things stand today. Conditions Ahead answers how the coming months are shaping up. No indicator appears in both, so when one moves and the other does not, it is because different evidence points in different directions rather than because of an accounting quirk. They are permitted to disagree and the disagreement is often the informative part: in March 2020 the present was acutely stressed while the outlook was supportive, and both readings were correct.
Scope of this paper
Every method described here applies identically to both lenses, but every exhibit reports Conditions Now. That lens is published in full — its reading, its whole panel and its entire record are given away in the app and restated on the today page. Conditions Ahead is the subscription, and a paper that plotted its complete history on an indexed page would hand back what that decision withholds. The forward panel’s composition is described where the architecture is at issue; its readings appear nowhere below.
2Admissible data
The first constraint on this project is not statistical. It is that every series must be freely redistributable, because the readings are published, the underlying snapshot is downloadable, and a dashboard that cannot show its own inputs is asking to be taken on trust. That constraint excludes a great deal of what a stress model would ordinarily reach for — the VIX, credit spread indices, and every major equity index — and several indicators here exist in the shape they do because of it.
| Source | Credential | Series | Typical lag (days) | Licence tier | Feeds |
|---|---|---|---|---|---|
| CFTC Commitments of Traders | none | 7 | 3 | public | readings |
| FDIC BankFind | none | 2 | 0 | public | readings |
| FEMA disaster declarations | none | 1 | 0 | public | readings |
| Federal Reserve Economic Data | free key | 33 | 1 | public | readings |
| OFR Financial Stress Index | none | 4 | 1 | public | readings |
| US Energy Information Administration | free key | 2 | 4 | public | readings |
| US Treasury Fiscal Data | none | 5 | 1 | public | readings |
| USGS earthquake catalogue | none | 1 | 0 | public | readings |
| OECD share prices | free key | 1 | 30 | attribution | reference chart only |
The licence tier is enforced in code rather than remembered. Each series carries a tier set from the publisher’s own metadata at ingest — FRED, for instance, marks copyrighted series with the word copyright in their notes — and the snapshot builder refuses to publish anything that is not verified redistributable. A series whose terms have never been read sits at unknown, and unknown fails the build. This is the right failure in the wrong place if it is discovered late, which is why a source whose credential is absent is skipped entirely rather than registered and left empty: an empty series would sit at unknown and block every snapshot thereafter.
Three further properties of the ingest layer matter to anything computed downstream.
Vintages are kept. Macroeconomic data is revised, sometimes heavily and sometimes years later. Observations are keyed by series, observation date and vintage date, so a reading computed for October 2008 is computed from the figures that existed in October 2008. Without this, every historical reading would silently improve as the statistical agencies corrected themselves, and the record the verdict ranks against would be a record no one could have seen.
Units come from metadata, never from constants. Publishers are not internally consistent: FRED carries the Federal Reserve’s balance sheet and the Treasury’s cash account in millions and the overnight reverse repo balance in billions. Mixing them is a thousandfold error that produces a perfectly plausible chart, so every value is converted to a canonical unit using the publisher’s own units string.
A dark source fails the run. This was learned the expensive way. Five of ten adapters once returned nothing for four days while the build stayed green, because the run’s exit code keyed off whether every source had failed; four still worked, so a total loss of every market price in the model scored “partial” and exited zero, three times a weekday, for four days.
The record, and what precedes it
Ingest reaches back to 1995 and the published record begins in 1998. The gap is deliberate and it is calibration, not content. An indicator scored against its own history has no history at the start of the record: in 2000, under the original arrangement, the average indicator had some forty-seven days behind it and the dot-com crash was being compared against itself. A crash cannot look abnormal when the definition of normal is built from it. Three years of lead-in buys a floor — 1998 is scored against three years of history, 2008 against thirteen, today against thirty-one — and that inhomogeneity is real and is the honest cost of the choice. It cannot be removed by backfilling, because the data does not exist earlier: 1995 is where the broad dollar index begins, and every other input predates it.
A second inhomogeneity is visible in the panel itself.
3From a published series to a reading
Every indicator is the same three steps, differing only in the first: derive a raw quantity from one or more series, score that quantity against its own history, and bound the result. Expressing the common part as data rather than as code repeated thirty-four times is what keeps the interesting part — what is being measured — from being buried in rolling-window boilerplate.
3.1 The calendar
Everything is aligned to a weekday calendar. Each observation is carried forward from the first calendar day on or after its stamp, and staleness is counted in trading days rather than wall-clock days — counted in wall-clock days, an ordinary weekend looked like a three-day outage and halved the panel’s confidence every Monday morning.
Matching is by the latest observation dated on or before this day, never by exact membership of the calendar, and the distinction is larger than it looks. Initial and continued jobless claims are stamped on Saturdays; the policy-uncertainty indices carry weekend dates. Under exact matching every one of those observations was silently discarded, and three indicators ingested perfectly and then contributed nothing whatsoever.
3.2 When a series is late, and when it is dead
A carried-forward value cannot be carried forever. The cutoff is read off each series’ own publication rhythm rather than chosen globally: the ninety-fifth percentile of the gaps between its prints is its longest normal silence, and three of those may pass before it is treated as discontinued. A single global cutoff cannot serve both a daily yield and a quarterly survey, and when one was tried it was fatal to the slow half of the panel — three monthly indicators sat silent most of the time, because the newest observation of a monthly survey is dated some weeks before it is published.
Three cycles rather than one, because late is overwhelmingly the likelier of the two possibilities here. These are official statistics; a monthly survey a quarter overdue is a release calendar slipping, not a discontinued series. Dropping it costs more than carrying it, and the age discount of section 4 is already pricing the wait.
3.3 Derivation
The raw quantity is rarely the published level. A filing count drifts over decades for reasons that have nothing to do with stress; gross Treasury issuance is near zero on most days and enormous on settlement days; positioning is informative for its one-sidedness rather than its direction. Each of those calls for a different shape, and there are fewer shapes than there are indicators.
| Derivation | Uses | What it produces | Indicators |
|---|---|---|---|
| mean_z | 5 | Signed mean of each series' own z-score, in sigma units | Bank Distress, Corporate Credit, Geopolitical Risk, Job Losses, Mortgage Distress |
| level | 4 | One series as published, with nothing done to it | Credit & Leverage, Equity Stress, Recession Probability, Spread Stress |
| mean_ratio_to_trend | 2 | Each series against its own trailing mean, then averaged | Disaster Burden, Fuel & Refining |
| change_over | 1 | Absolute change over `lag` trading days, in the series' own units | Debt Service Cost |
| mean_abs_correlation | 1 | Mean absolute pairwise correlation of daily changes across several series | Correlation Stress |
| mean_pct_change | 1 | Average relative move across several series -- one currency bid is a story, two haven currencies bid together is a vote | Haven Demand |
| smoothed_level | 1 | A trailing mean of one series, where a single print says little | Policy Uncertainty |
| spread | 1 | One series minus another, in the units both are already in | Overnight Funding |
| turbulence | 1 | Fast realised volatility against each series' own slow baseline | Market Turbulence |
Two of those deserve naming, because they encode judgements rather than conveniences. turbulence divides each series’ fast realised volatility by its own slow baseline, which is as close to the VIX as public-domain data allows: implied volatility is licensed, but volatility is a property of a price series rather than of anyone’s index, so it can be computed from Treasury yields, the dollar, oil and the yen and republished freely. And mean_ratio_to_trend takes a per-series sign, because not every input to an indicator points the same way — refinery utilisation rising means demand is strong, while distillate stocks rising means the opposite. Averaged with a common sign, the June 2020 stock build swamped the utilisation collapse and that indicator read +0.83 through the worst demand shock in decades. It now reads −0.94.
3.4 The baseline
A derived quantity is then expressed in standard deviations against its own history, causally: the baseline for any day is everything observed up to and including that day, and nothing after it. The baseline is expanding rather than a fixed trailing window, and the reasoning is worth stating because the alternative is the more common choice.
A fixed window eventually swallows a step. If a quantity moves onto a new plateau and stays there, the trailing baseline rises to meet it and the reading falls back toward nothing — which makes the indicator a measure of acceleration wearing the label of a level. That is not hypothetical: three indicators here had escaped a fixed window one at a time for exactly that reason before the default was changed, one of them because a three-year window would have normalised away a decade-long valuation bubble.
Widening the window changes the verdict on about twelve per cent of days for Conditions Now, and it was checked rather than assumed. Ten years, twenty years and expanding are near enough the same instrument — twenty and expanding differ on 1.4 per cent of days — so once they converge the only question is what to call it, and a fixed window would be claiming a span the data cannot support. A fixed window also schedules a discontinuity: a ten-year baseline loses 2020 in 2030, and every standard deviation in the panel steps down in a week during which nothing happened.
The decision reaches only the outer baseline. Five indicators carry an inner baseline of their own, and the line between those that were widened and those that were not is what the inner baseline is for. A standard that is supposed to hold still must not move: an anchor measured against a five-year rolling mean follows the ship, and expectations sitting well above their long-run level registered as almost no drift at all. But a comparison against what the market has adapted to should move: oil held high for two years is not a shock, because the economy adjusted.
3.5 The bound
Roughly half the panel skips the scoring step entirely. Where a publisher has already produced a standardised index centred on its own historical average — the Chicago Fed’s financial conditions index, the St. Louis Fed’s stress index, a recession probability, the Office of Financial Research’s daily equity stress measure — re-scoring it against a trailing window would throw away the very calibration that makes it comparable across decades. Those are divided by a stated native scale and bounded, and nothing else is done to them.
4Age and confidence
Every reading carries a confidence between zero and one, which is the answer to a question most dashboards never ask: this figure is four days old, so what is it still worth? The answer used to be assumed from the publication schedule, on the reasoning that a series printing weekly should be trusted for about a fortnight. That rule was never checked, and it does not survive being checked.
The failure of the old rule is instructive about a whole class of assumption. Inside the daily group alone, the real drift of a series over five days spanned a factor of 117 — publicly held debt outstanding moved 0.005 of its own spread, the policy-uncertainty index moved 0.535 — and every member of that group was handed the same three-day halflife. Oil against its trend received the same three days as the rate-curve quadrant, so an oil price four days old, which is simply what that series always is, was discounted by sixty per cent for being exactly as current as it ever gets.
Confidence multiplies into both the numerator and the denominator of the weighted average, so a stale indicator is diluted rather than dropped, and the composite does not lurch when a slow series finally prints. In the app, row opacity carries this figure directly: a faint row is stale, not unimportant.
5Weights
Weights are where a barometer like this is most easily and least visibly corrupted. A free parameter per indicator is thirty-four free parameters, and thirty-four free parameters tuned until the output looked right is a fitted model wearing the clothes of a judgement. The defence here is not that the weights are correct. It is that there are only three of them.
| Indicator | Family | Tier | The claim the tier rests on |
|---|---|---|---|
| Market Turbulence | markets under stress | 2 primary | Realized volatility across four markets, daily. |
| Credit & Leverage | markets under stress | 1 full member | The Fed's own broad financing-conditions index. |
| Equity Stress | markets under stress | 1 full member | The OFR's daily equity stress index. |
| Overnight Funding | markets under stress | 1 full member | SOFR against the Fed's own rate. |
| Correlation Stress | markets under stress | 0.5 corroborating | Cross-asset lockstep is a condition of fragility rather than realized dysfunction, and it reads +0.05 same-day against the rest of the panel. |
| Haven Demand | markets under stress | 0.5 corroborating | Yen and franc flows are a proxy for fear, not a measure of markets malfunctioning. |
| Spread Stress | markets under stress | 0.5 corroborating | A second Fed stress aggregate correlating +0.76 with Credit & Leverage. |
| Corporate Credit | damage realized | 1 full member | Delinquencies and charge-offs counted by supervisors from banks' own books. |
| Job Losses | damage realized | 1 full member | Claims and continued claims, weekly and barely revised -- the most timely realized damage available. |
| Bank Distress | damage realized | 0.5 corroborating | Failures are the least ambiguous damage in the panel and also the lumpiest: exactly zero on most days of the record, which is not a full share's worth of information. |
| Disaster Burden | damage realized | 0.5 corroborating | Physical damage, genuinely exogenous to finance. |
| Mortgage Distress | damage realized | 0.5 corroborating | Household credit damage, but quarterly and quiet since 2010. |
| Recession Probability | strain observable | 1 full member | A direct statistical estimate of the economy being in recession now, and the strongest same-day reader in the family at +0.63. |
| Debt Service Cost | strain observable | 0.5 corroborating | The government's own average interest rate -- narrow, fiscal, and slow by construction, since old cheap debt only reprices as it matures. |
| Fuel & Refining | strain observable | 0.5 corroborating | Two EIA series on refinery runs and unsold distillate. |
| Geopolitical Risk | strain observable | 0.5 corroborating | Press coverage of war and security threats. |
| Policy Uncertainty | strain observable | 0.5 corroborating | Press coverage of unsettled policy. |
The previous arrangement set weights by hand to one decimal place across nine distinct values, and it was replaced not because anyone disliked the numbers but because no rule generated them. Regressed on every property the registry publishes — family, cadence, input count, category — they explained R² = 0.17, and adding axes lowered the adjusted figure, which means the extra structure was noise. Three indicators sharing a category, a cadence and a family sat at 1.8, 0.4 and 0.4, and there was no written answer to why.
The move to tiers merges distinctions that were never real and reverses none: across every pair of indicators within a family, 38 orderings were preserved, 34 collapsed into ties, and zero flipped. Every claim the change adds is of the form the difference between 0.7 and 0.8 was never there.
6Composition
Two quantities are computed per lens per day. The first is the reading; the second says how much of the panel supports it.
score = Σ( w · d · n · c ) / Σ( w · c ) agreement = | Σ( w · c · sign(d · n) ) | / Σ( w · c ) × breadth(n) w weight 0.5, 1 or 2 d direction +1, −1, or 0 where the indicator carries its own sign n reading the bounded value, −1 to +1 c confidence 0.5 ^ (staleness / halflife)The score is an ordinary confidence-weighted average, clamped to the interval its terms already occupy. Agreement is the more interesting half. It is 1 when every contributing indicator points the same way and 0 when they are evenly split, and it is what lets the display desaturate toward grey and admit it does not know, rather than showing a confident amber that means nothing. A grey stretch in the history band means the indicators were split, not that nothing happened.
The breadth term is what stops that promise being hollow.
One property of that term is a known overstatement rather than an oversight, and section 8 measures it: breadth counts indicators, and indicators are not independent of one another.
Agreement no longer suppresses the headline verdict, and that is a reversal worth recording. Anything below 0.30 used to become “mixed signals”, which fired on sixty-five per cent of days — so two days in three the instrument declined to say what it thought. Low agreement means the indicators are split, not that the number is doubtful. A narrow crisis is still a crisis: March 2020 was three weeks old and driven by a handful of fast indicators while the slow ones had not yet caught up. Breadth is now reported beside the verdict as a count, which adds information instead of withholding it.
7The verdict
A reading of −0.292 is not a communicable fact. The headline is therefore not the score but its rank against the lens’ own record, and the rank is cut into five bands.
Two properties of this scheme are deliberate and both cost something.
The bands are lopsided. The alarm state covers a twentieth of history, because a crash board that calls one day in five a crisis has taught its reader to ignore it. There were six bands until recently, with a sixth splitting the alarm state at the first percentile; it was retired because on a twenty-eight-year strip it painted three pixel columns of 330, a distinction drawn finer than the screen it is drawn on. The cost is real and worth writing down: three hundred days that used to read as the most severe verdict now read as the second, so the loudest word the instrument owns fires about thirteen times a year rather than three.
The verdict is relative, and says so. Ranking against the record means the most favourable band is reachable in a bubble, and it is. The forward lens hit its calmest value in the entire record days before the fastest drawdown in it. The answer to that is not a better adjective — it is that the two lenses are shown side by side and allowed to contradict each other, so a reader meets the disagreement rather than being told about it afterwards.
8Does it do what it says
Three measurements are run against the construction rather than against the world. They do not ask whether the barometer is right — ten episodes cannot answer that — but whether it behaves the way this document has just described. Two of them found genuine faults, and one of them still reports an unresolved conflict.
8.1 Does each indicator move the composite as much as its weight promised?
| Indicator | Weight | sd of reading | Promised | Delivered | Delivered / promised | Days |
|---|---|---|---|---|---|---|
| Market Turbulence | 2 | 0.434 | 15.4% | 19.1% | 1.24 | 7,493 |
| Job Losses | 1 | 0.514 | 7.7% | 11.3% | 1.47 | 7,493 |
| Corporate Credit | 1 | 0.428 | 7.7% | 9.4% | 1.22 | 7,493 |
| Recession Probability | 1 | 0.234 | 7.7% | 5.1% | 0.67 | 7,493 |
| Mortgage Distress | 0.5 | 0.462 | 3.8% | 5.1% | 1.32 | 7,493 |
| Policy Uncertainty | 0.5 | 0.462 | 3.8% | 5.1% | 1.32 | 7,493 |
| Overnight Funding | 1 | 0.224 | 7.7% | 4.9% | 0.64 | 2,091 |
| Fuel & Refining | 0.5 | 0.432 | 3.8% | 4.7% | 1.23 | 7,493 |
| Correlation Stress | 0.5 | 0.412 | 3.8% | 4.5% | 1.18 | 7,493 |
| Credit & Leverage | 1 | 0.206 | 7.7% | 4.5% | 0.59 | 7,493 |
| Debt Service Cost | 0.5 | 0.402 | 3.8% | 4.4% | 1.15 | 4,952 |
| Bank Distress | 0.5 | 0.387 | 3.8% | 4.3% | 1.11 | 7,493 |
| Haven Demand | 0.5 | 0.373 | 3.8% | 4.1% | 1.07 | 7,493 |
| Equity Stress | 1 | 0.166 | 7.7% | 3.6% | 0.47 | 6,971 |
| Spread Stress | 0.5 | 0.328 | 3.8% | 3.6% | 0.94 | 7,493 |
| Disaster Burden | 0.5 | 0.286 | 3.8% | 3.1% | 0.82 | 7,493 |
| Geopolitical Risk | 0.5 | 0.277 | 3.8% | 3.0% | 0.79 | 7,493 |
This check earns its place by what it caught. Two indicators were holding meaningful shares of the forward lens while contributing almost nothing to its movement, and neither was found by any other test. One averaged an absolute deviation — a quantity that cannot be negative — and passed it through a symmetric bound, so across twenty-eight years it reported a favourable reading on none of them. The other was scored against a trend whose window counted the years before its data began as zeros, which put a five-hundredfold artefact at the start of its record and flattened everything afterwards. Both produced plausible-looking output. Neither produced an error.
8.2 How independent is the panel, really?
8.3 Is each indicator in the right lens?
Lens membership is a hand-assigned judgement, and two headline numbers resting on thirty-four unchecked judgements invite exactly one question: were these placed where they land in order to produce the scores someone wanted? The answer is a repeatable measurement. Each indicator’s signed reading is correlated against Conditions Now computed without that indicator — leave-one-out, because an indicator correlated against a composite it is a term in will confirm its own placement by construction — at the same day and at six months, one year and two years ahead. An indicator whose strongest relationship is with today belongs in the present lens; one whose strongest relationship is with later belongs in the forward lens.
The audit changed real placements. Both press-coverage indices — policy uncertainty and geopolitical risk — sat in the forward lens on the reasoning that coverage of war is not the funding system breaking but a reason it might break. Measured, neither leads anything: their relationship is strongest with the same day and gone within a year. A reading whose relationship is strongest today is describing today, and both moved.
It also reports a conflict that has been published rather than resolved. Bank lending standards audit as coincident, at +0.68 with the same day, and not as forward-looking at all. The indicator is nevertheless held at a full share in the forward lens on the mechanism — loan officers stating in advance that they are making borrowing harder is a term of credit transmitting forward, whatever its correlation profile says — and the conflict is recorded beside it instead of being made to disappear by moving the indicator until the arithmetic agreed.
The limit of this test
Overlapping windows make these correlations far from independent, so there are no p-values here and none should be added. It is a direction-of-evidence check, not a significance test. And it contains a circularity that leave-one-out does not remove: the categories are chosen first, and the test then asks whether an indicator’s timing resembles the aggregate those choices produced. That can find anomalies. It cannot define the classes.
9What the construction cannot do
The following are not caveats added for form. Each is a known property of the thing described above.
It is one opinionated model. Thirty-four indicators is a choice, three weight tiers is a choice, and the two-lens split is a choice. A different panel built on the same principles would produce different numbers, and there is no experiment in this document that would settle which is better.
It measures the United States. Both composites are readings of one financial system. The global panel in the app exists precisely because no composite here can answer where in the world the strain is.
It cannot see what is not published. The redistribution constraint excludes implied volatility and credit spread indices, and the bank-lending survey covers banks only — it says nothing about private credit funds or other non-bank lenders, who are not asked. One indicator exists specifically to watch the lending that the survey cannot see, and it has data only since 2015, which makes it the least-tested series in the panel.
The early record is thinner than the recent one. Fourteen indicators rather than seventeen, and three years of baseline rather than thirty. The agreement term prices the first; nothing prices the second.
Agreement is overstated in a crisis, by the measurement in section 8.2, and is left that way for a stated reason.
The checks only check what they were told to check
Every gate in this project is narrow on purpose, and a green run means the questions it was given were answered — not that the thing it guards is right. Three of them were confidently wrong in a single afternoon, in three different ways, and the shapes are worth recognising.
A gate can excuse the thing it exists to catch. A type-size check skipped any size written as an expression, so when most of a screen moved to a computed scale it went on printing ok while checking almost nothing.
A gate can pass every version of a claim, including the false ones. The site-copy check verifies the disclaimer, the counts and the privacy claims. It has no view on a sentence about those numbers, so when one panel’s sign was turned over it kept passing a page that told the reader the figures were shown as published when every one had been negated.
A gate can be wrong in the direction that corrupts the thing it checks. A number-spelling helper had no row for the teens, so it would have refused a page that correctly said “fourteen days” while looking for “-four”. The natural response to a red build is to edit the page — so the check would have manufactured the error it exists to prevent, and gone green afterwards. That failure direction is worse than having no check at all, and it existed in two copies of the same function.
The habit that found all three was looking at the artefact — the running app, the served page — rather than at the exit code.
10Reproduction
This page is prose by hand and exhibits by machine. Every figure and table above sits between a pair of HTML comments, and a single script computes them from the published snapshot and writes them into the page. The prose is never touched by the script; the exhibits are never edited by hand.
python3 scripts/make_whitepaper.py rewrite every exhibit python3 scripts/make_whitepaper.py --check fail if the page has drifted python3 scripts/make_whitepaper.py --list name the exhibits and markers python3 scripts/make_whitepaper.py --only recordThe arrangement exists for two reasons. The first is that this site serves no JavaScript at all — its content security policy is default-src 'none' — so a page that drew its own charts at runtime would ship thirteen empty boxes and log nothing to say why. The second is that a caption ages. When the snapshot moves, the numbers written under these figures become the previous release’s numbers while continuing to look authoritative, and --check is what turns that from something a reader might notice into something the build refuses to ship.
The measurements are separated from the drawing on purpose, in scripts/whitepaper/: the record is read in one module, measured in a second, drawn in a third, and arranged into exhibits in a fourth. A figure can be rescaled, redrawn or replaced by a table without touching the claim underneath it, which is what makes this document adjustable later rather than rewritten. Several of the measurements reported above — the effective-dimensionality figures in particular — existed only as sentences in source comments before this paper was written, which is precisely the arrangement that lets a number go quietly false.
There is no install step. The pipeline and these scripts use the Python standard library only, and the input is the snapshot that ships inside the app, which is under version control — so a clean checkout can rebuild every exhibit on this page and compare the result against what is served.
Data sources are listed in Exhibit 1 and attributed in the app’s about screen. This product uses FHFA data but is neither endorsed nor certified by FHFA. Further reading: the guide explains how to read the display; the today page publishes the current Conditions Now reading and the panel behind it.
Important
Crashboard is provided for educational and entertainment purposes only. It is not financial, investment, tax or legal advice, and it is not a recommendation to buy, sell or hold any security or other asset.
Nothing here is personalised to your circumstances. The author is not a licensed financial adviser, broker or investment professional. Consult a qualified professional before making any financial decision.
The readings are one opinionated model built from public data. That data may be delayed, revised, incomplete or wrong, and the model may be wrong even when the data is right. The readings describe conditions as they are measured now and rank them against the record. Past readings are not indicative of future results, and no reading is a forecast.
Provided without warranty of any kind. You are solely responsible for any decision you make.