How it works

The four reference sections behind the cockpit: which formulas are standard and which were invented here, the stocks and flows the resource readings rest on, every raw observation with its source, and what keeps it current. The cockpit itself is at /.

Level 1 The indicator register — every formula, and who invented it

21 derived indicators. 9 are standard constructions used the way their publishers intend, 6 are standard ideas adapted (usually by changing the denominator or the reference point to something a Thai household actually faces), and 6 were built here and appear in no literature. The invented ones carry their formula in full precisely because they have no external authority behind them.

Days of import cover

How many days it keeps running
STANDARD L1
formula stock ÷ average daily net imports → days
≤ 15 no buffer ≤ 45 thin ≤ 90 below the IEA line ≤ 180 adequate above deep

What it reads. How long the country runs if imports stopped tomorrow. It makes reserves of wildly different absolute sizes comparable, which raw tonnes never do.

So what, for you. Thailand at 108 days and India at 9.5 are not the same investment. An oil spike passes through India's currency and fuel bill almost immediately; Thailand has three months of absorber. If you hold both, size the India position for the shorter fuse.

Provenance. IEA emergency stockholding obligation — 90 days of NET IMPORTS for member countries. Note the denominator: the IEA uses net imports, while the oil market more often quotes days of forward DEMAND. The two give different answers for the same country and are routinely confused. This register uses net imports and says so on every reading.
th.oil.days_cover · in.oil.days_cover · jp.oil.days_cover · cn.oil.days_cover static inputs

Stocks-to-use ratio

How much grain the world has spare
STANDARD L1
formula ending stocks ÷ total annual use × 100 → %
≤ 20 tight — price spikes likely ≤ 30 snug ≤ 40 comfortable above ample

What it reads. Below roughly 20% grain prices stop responding to demand smoothly and start jumping. World rice is currently comfortable, which is the single best piece of news in the resource picture for a Thai household budget.

So what, for you. Comfortable stocks argue against holding agricultural commodity funds as an inflation hedge right now. The inflation you face is energy and currency, not food.

Provenance. USDA WASDE and FAO AMIS both publish this monthly; it is the grain equivalent of days of cover and one of the oldest agricultural statistics there is.
xx.food.rice_stocks_to_use static inputs

Gold stock-to-flow

Years of gold mining already above ground
STANDARD L1
formula above-ground stock ÷ annual mine production → years
≤ 20 supply can respond ≤ 50 slow to respond above supply is effectively fixed

What it reads. About 67 years. Everything ever mined is still here, and a year of world mining adds roughly 1.5% to it. That one ratio is the entire argument for gold as a monetary asset rather than a commodity: no price rise can conjure meaningful new supply.

So what, for you. This is why a gold allocation is a structural decision, not a trade. It also means the gold price is set by who wants to hold the existing stock, not by mine output news.

Provenance. Popularised by Incrementum AG's In Gold We Trust report. NOT a World Gold Council metric — the WGC publishes the 219,891 t above-ground numerator but does not present the ratio. My first draft credited the WGC and that was wrong.
xx.gold.above_ground · xx.gold.mine_supply static inputs

Refining concentration (HHI)

How few countries do the processing
STANDARD L1
formula Σ (country share)² × 10,000 → index 0–10,000
≤ 1500 competitive ≤ 2500 moderately concentrated ≤ 5000 highly concentrated above single-country control

What it reads. Reserves are spread around the world; the furnaces that turn ore into usable material are not. A country that mines something it cannot process does not control it.

So what, for you. Nothing to trade — this is not priced daily. It is a reason to hold some gold and to check whether your equity funds are concentrated in manufacturers whose input list runs through one country.

Caveat. Computed from China's share alone with the remainder assumed to split evenly, because that is the only share published consistently for all eight minerals. Real residual shares are lumpier, so this understates concentration.
Provenance. USGS (Thomas, Nassar & DeYoung 2022) and the EU Critical Raw Materials methodology. NOT an IEA metric — the IEA publishes a plain top-three share (82% in 2020 rising to 86% in 2024) and uses reverse-HHI only for power-generation fuel mix. I had this attributed to the IEA and it was corrected.
concepts
market concentration

How much of an index sits in a handful of names — and therefore how little diversification an index fund is actually providing.

The rigorous measure is the Herfindahl index, the sum of squared weights, whose reciprocal gives the 'effective number' of holdings: an index of 500 names where the top 10 hold 40% behaves like far fewer than 500 independent bets. Concentration is not a separate risk from a sector risk — it is the mechanism that turns one into a portfolio problem for someone who believes they are diversified.

Read more about market concentration
xx.refine.gallium · xx.refine.rare_earth · xx.refine.graphite · xx.refine.cobalt · xx.refine.lithium · xx.refine.aluminium · xx.refine.copper · xx.refine.nickel static inputs

Gold/oil ratio

Barrels of oil one ounce of gold buys
STANDARD L1
formula gold USD/oz ÷ Brent USD/bbl → barrels per ounce
≤ 15 oil expensive vs gold ≤ 30 historically normal ≤ 50 gold expensive vs oil above extreme — usually a crisis print

What it reads. The cleanest way to separate a monetary story from an energy story. If both gold and oil are rising but the ratio is flat, that is money losing value. If the ratio is falling, it is a genuine energy supply problem.

So what, for you. Directly useful: it tells you whether your gold holding is hedging the thing you actually face. Against a supply-driven oil shock, gold is a poor hedge and energy equity is a better one.

Provenance. A market convention of very long standing with no institutional publisher — no central bank or agency computes it, but every commodity desk watches it.
concepts
percentile

Where today sits in the full range of the past few years. The 90th percentile means only 10% of past readings were higher.

Often the honest alternative to a z-score, because it makes no assumption about the shape of the distribution — it just counts. The cost is that it discards magnitude: the 99th percentile reads the same whether today is a whisker above the old high or double it.

Read more about percentile
xx.commodity.gold · xx.commodity.brent live inputs

US net dollar liquidity

Cash the Fed is leaving in the system
STANDARD L3
formula WALCL − Treasury General Account − overnight reverse repo → USD tn
≤ 0 draining above adding

What it reads. The single best-known proxy for whether money is being added to or drained from markets, read as a 13-week change rather than a level.

So what, for you. Read as a lead, not a signal. When it turns down it has historically pressured emerging market equity — which includes the SET — with a one-to-two month lag. It is a reason to slow down new buying, not to sell.

Caveat. Widely followed enough that its predictive power is partly arbitraged away.
Provenance. A MARKET CONVENTION, not a Fed publication. The Fed publishes WALCL, WTREGEN and RRPONTSYD separately and does not endorse the subtraction. The originator of the construction could not be verified; it is in wide use without a clear first author.
concepts
credit impulse

The change in the flow of new credit, as a share of the economy. It leads actual activity by roughly two to three quarters, which is why it is watched instead of loan totals.

Read more about credit impulse
z-score

How unusual today's reading is compared with its own history, measured in standard deviations. 0 = perfectly normal, ±1 = mildly unusual, ±2 = happens about 5% of the time, ±3 = rare.

z = (today − mean) ÷ standard deviation, both taken over a chosen lookback window. Two things about that make it weaker than it looks. The window is a judgement call, not a fact — this dashboard uses ~1250 observations for dailies (five years) and shortens it where the publisher carries less history, and a different window gives a different answer for the same day. And the ±2 ≈ 5% rule assumes a bell curve, which financial series emphatically do not follow: they have fat tails, so genuinely extreme readings arrive far more often than the normal distribution predicts. Read a z-score as a ranking, not a probability.

Read more about z-score
us.fed.walcl · us.fed.tga · us.fed.rrp live inputs

2s10s term spread

Whether the bond market expects trouble
STANDARD L1
formula 10-year Treasury yield − 2-year Treasury yield → pp
≤ 0 inverted ≤ 0.5 flat above positive

What it reads. Inversion has preceded most US recessions, with a long and variable lag.

So what, for you. Too slow to act on alone. Its use here is as one input to the growth axis of the regime map, which is what actually drives the recommendations.

Provenance. Estrella & Mishkin (1996); published continuously by the New York Fed as a recession probability model.
concepts
duration

How sensitive an asset's price is to interest-rate changes. Long-duration assets — 30-year bonds, unprofitable growth stocks, infrastructure — fall hardest when rates rise.

Formally the weighted-average time to receiving an asset's cash flows, which is why it applies to equities at all: a company whose profits arrive in a decade is mathematically a long bond, and is discounted like one. It is also why the AI complex and the bond market are more correlated than they look — both are priced off the same discount rate.

Read more about duration
spread

The difference between two interest rates. Widening spreads mean rising perceived risk.

In credit it is the extra yield a borrower pays over a government bond of similar maturity — compensation for default risk and for illiquidity, and those two are not separable from the outside. That matters when reading a widening: it can mean the market thinks default is likelier, or merely that the paper has become harder to sell.

Read more about spread
z-score

How unusual today's reading is compared with its own history, measured in standard deviations. 0 = perfectly normal, ±1 = mildly unusual, ±2 = happens about 5% of the time, ±3 = rare.

z = (today − mean) ÷ standard deviation, both taken over a chosen lookback window. Two things about that make it weaker than it looks. The window is a judgement call, not a fact — this dashboard uses ~1250 observations for dailies (five years) and shortens it where the publisher carries less history, and a different window gives a different answer for the same day. And the ±2 ≈ 5% rule assumes a bell curve, which financial series emphatically do not follow: they have fat tails, so genuinely extreme readings arrive far more often than the normal distribution predicts. Read a z-score as a ranking, not a probability.

Read more about z-score
us.rates.10y · us.rates.2y live inputs

US 10-year real yield

The return on cash after inflation
STANDARD L1
formula 10-year TIPS yield → %
≤ 0 negative — everything else looks attractive ≤ 1.5 mild ≤ 2.5 restrictive above punishing for long-duration assets

What it reads. The hurdle rate for every other asset on earth, and the single biggest driver of the gold price after the dollar.

So what, for you. Above 2.5% is the level at which holding cash starts genuinely competing with owning growth equities. It is also the standard argument against gold — which is why gold rising through a high real yield, as it has, is worth noticing.

Provenance. US Treasury TIPS constant-maturity series, published daily (FRED DFII10).
concepts
real yield

An interest rate after subtracting expected inflation — the return that actually buys you more goods.

Read more about real yield
duration

How sensitive an asset's price is to interest-rate changes. Long-duration assets — 30-year bonds, unprofitable growth stocks, infrastructure — fall hardest when rates rise.

Formally the weighted-average time to receiving an asset's cash flows, which is why it applies to equities at all: a company whose profits arrive in a decade is mathematically a long bond, and is discounted like one. It is also why the AI complex and the bond market are more correlated than they look — both are priced off the same discount rate.

Read more about duration
us.rates.10y_real live inputs

Cover gap vs the 90-day line

Days above or below the international standard
ADAPTED L1
formula days of cover − 90 → days
≤ -60 critically short ≤ 0 short of the standard ≤ 60 compliant above well provisioned

What it reads. One signed number per country, comparable across countries that report differently.

So what, for you. Thailand is +18 and India is −80.5. That gap is the reason a single oil shock produces two very different equity outcomes across two markets a non-specialist would lump together as 'Asia'.

Provenance. The 90-day obligation is the IEA's. The subtraction is not novel. Renamed from 'Reserve Adequacy Spread' because that collided with the IMF's established Assessing Reserve Adequacy (ARA) metric, which is about FX reserves and is a different thing. Also note ARA and months-of-import-cover are two distinct metrics and must not be conflated — an error I nearly shipped.
th.oil.days_cover · in.oil.days_cover · jp.oil.days_cover · cn.oil.days_cover static inputs

Official absorption of mine supply

Share of new gold that central banks take
ADAPTED L1
formula central-bank net purchases ÷ annual mine supply × 100 → %
≤ 10 central banks are marginal ≤ 20 meaningful official bid above official buying sets the price

What it reads. Above roughly 20%, official institutions rather than jewellers or investors are setting the marginal gold price — and central banks are famously price-insensitive buyers.

So what, for you. The most under-appreciated fact in the resource data: 2025 official buying FELL 21% and gold still made a record. Something other than central banks is bidding, which makes the rally less structurally safe than the 'central banks are buying' story implies.

Provenance. Derived from World Gold Council data, not a WGC-published series. The WGC frames central-bank demand against TOTAL demand; this uses mine supply as the denominator, which is the harder test and the more interesting one.
xx.gold.cb_purchases · xx.gold.mine_supply static inputs

SET–Brent rolling correlation

How much Thai stocks follow the oil price
ADAPTED L1
formula rolling 260-observation Pearson correlation of Δ%SET and Δ%Brent → correlation −1…+1
≤ -0.2 SET is an oil hedge ≤ 0.2 no relationship above SET moves with oil

What it reads. Thailand imports oil, so intuition says the SET should fall when oil rises. In practice the index is heavy in PTT and energy-linked names, so the relationship is often the opposite of the intuition. This measures which one is true right now.

So what, for you. Decides whether your SET holding is already an oil hedge or needs one. If the correlation is positive, buying an energy fund on top of a SET position is doubling a bet you already have.

Provenance. LSEG/FTSE Russell already publishes rolling oil betas for APAC equity markets including Thailand, so the idea is not new — I had this labelled INVENTED and the check overturned it. What is mine is the construction: a 12-month rolling Pearson correlation of daily PERCENTAGE CHANGES (not levels, which would be spurious), computed inside the pipeline so it updates with everything else.
th.equity.set · xx.commodity.brent live inputs

Resource endowment score

How well supplied a country is, 0–100
ADAPTED L1
formula mean of min-max normalised (arable land per person, inverse fuel import share, days of cover) → score 0–100
≤ 30 dependent ≤ 60 mixed above well endowed

What it reads. A slow structural ranking, not a market signal. It moves once a year at most.

So what, for you. Useful for deciding where a decade-long allocation sits, not what to do this quarter. Indonesia and Malaysia score well; Singapore and Japan score badly and compensate with capital and institutions, which this score cannot see.

Caveat. Deliberately crude — three inputs, equal weights. Treat as a ranking, not a measurement.
Provenance. SolAbility's GSCI Natural Capital Index is a published normalised 0–100 resource composite and is the structural precursor; the World Bank's Changing Wealth of Nations is the monetary one. Downgraded from INVENTED after the check found both. Mine is narrower: min-max across the ten mandate countries on inputs already in the registry.
th.land.arable_pc · th.energy.import_share · th.oil.days_cover live inputs

US stock–bond return correlation

Whether bonds are diversifying shares
INVENTED L1
formula 60-observation Pearson correlation of daily S&P 500 returns and a DGS10 bond proxy, where bond r ≈ −7 × Δyield + yield ÷ 252 → correlation −1…+1
≤ -0.2 bonds diversify equities ≤ 0.2 relationship unstable ≤ 0.5 diversification weakened above stocks and bonds falling together

What it reads. Negative means bonds have tended to rise when shares fell. Positive means the two have moved together, so a conventional stock–bond portfolio is carrying less diversification than its labels imply.

So what, for you. This belongs in the hero row because it answers whether the portfolio's main shock absorber is working now. A positive reading argues for treating cash and explicit inflation protection as separate diversifiers instead of assuming bonds will do both jobs.

Caveat. The bond leg is an approximation with duration fixed at 7; it omits convexity, coupon timing and changes in the cheapest-to-deliver bond. Read the direction and regime, not the second decimal place.
Provenance. No publisher prints this exact series. The equity leg is the S&P 500. The bond leg is a duration-7 total-return proxy reconstructed from the Federal Reserve's DGS10 yield, because a yield level is not a bond return. The approximation is standard fixed-income arithmetic; combining that proxy with a rolling correlation here is this project's construction.
concepts
duration

How sensitive an asset's price is to interest-rate changes. Long-duration assets — 30-year bonds, unprofitable growth stocks, infrastructure — fall hardest when rates rise.

Formally the weighted-average time to receiving an asset's cash flows, which is why it applies to equities at all: a company whose profits arrive in a decade is mathematically a long bond, and is discounted like one. It is also why the AI complex and the bond market are more correlated than they look — both are priced off the same discount rate.

Read more about duration
us.equity.spx · us.rates.10y live inputs

Baht Import Burden Index

What the world costs, in baht
INVENTED L1
formula (0.60 × energy index + 0.40 × food index) × (USDTHB ÷ 35.3), base 2016 = 100 → index 2016 = 100
≤ 90 cheap world ≤ 110 normal ≤ 140 expensive above squeeze

What it reads. Dollar commodity indices understate what a Thai household pays, because the baht usually weakens in the same move that lifts oil. This multiplies the two so the compounding is visible in one line.

So what, for you. When this is rising fast, two things follow for you personally: your cost of living is going up before the CPI print says so, and unhedged foreign-currency assets are quietly protecting you. It is an argument for holding some savings outside the baht, not for trading anything.

Provenance. No published equivalent found. The nearest cousin is the IMF's Commodity Terms of Trade index (PCTOT, IMF WP/19/21), but PCTOT is deflated to real USD and weighted by NET exports; this is import-only and denominated in the local currency, which is what makes it read like a household's experience rather than a country's trade account.
xx.index.energy · xx.index.food · th.fx.usdthb live inputs

Physical Tightness Premium

Is it expensive because it is scarce?
INVENTED L1
formula z(price, 5y) − z(inventory, 5y) → z difference
≤ -1 well supplied ≤ 1 balanced ≤ 2 tight above genuinely scarce

What it reads. High price with full warehouses is a positioning or tariff story and tends to reverse. High price with empty warehouses is real scarcity and tends to persist. The subtraction is what separates them.

So what, for you. Tells you whether an oil spike is likely to fade before it reaches your electricity bill. Only a genuinely scarce spike justifies changing anything in a portfolio.

Caveat. Needs EIA_API_KEY for the weekly inventory series. The annual static inventory figures cannot be z-scored — five observations is not a distribution.
Provenance. No published equivalent as a z-score construction. The canonical precursor is the theory of storage / convenience yield (Kaldor 1939, Working 1949, Brennan 1958), which reaches the same conclusion through the futures curve rather than through inventories directly.
xx.commodity.wti · us.oil.commercial planned inputs

Chokepoint-Adjusted Growth Signal

Copper's growth message, discounted for distortion
INVENTED L1
formula z(copper, 5y) × d, where d = 1 − min(1, |COMEX÷LME − 1| ÷ 2) → adjusted z
≤ -1 demand contracting ≤ -0.25 cooling ≤ 0.25 flat above expanding

What it reads. At the current 1.85x COMEX/LME ratio the discount factor is 0.575 — copper's growth signal is being marked down by 42.5% because a large part of the price is a border, not a factory.

So what, for you. Stops you buying cyclicals and ASEAN exporters on a copper rally that is really a tariff trade. When the raw copper z-score and this number disagree, believe this one.

Provenance. No published equivalent. Copper as a growth proxy is ancient; exchange-inventory divergence as a distortion measure is well known to metals desks; multiplying one by a confidence factor derived from the other is the part I have not seen done.
xx.commodity.copper · xx.metals.comex_lme_copper live inputs

Thai Squeeze Index

Cost-of-living pressure at home
INVENTED L3
formula composite of z-scores, weights food 35 / transport fuel 25 / electricity 25 / borrowing 15, every price converted to THB first, scored −100 (pressure) … +100 (relief) → score −100…+100
≤ -40 heavy pressure ≤ -10 pressure ≤ 10 neutral ≤ 40 relief above strong relief

What it reads. The four things that actually move a Thai household's monthly outgoings, in one number, measured in the currency it is paid in. Negative means pressure.

So what, for you. This is a personal-finance number before it is an investment one. Sustained pressure means your real savings rate is falling even if your salary is not, and that argues for holding more of your emergency cash in a form that keeps up — not for taking more investment risk to compensate.

Provenance. No published equivalent. Central banks compute cost-of-living and financial-conditions indices, but not one that converts world commodity prices into local currency first and weights them by the domestic CPI basket for a single household.
xx.index.food · xx.commodity.brent · xx.commodity.lng_asia · th.policy_rate · th.fx.usdthb live inputs

Energy Shock Pass-Through

How much of an oil shock lands here
INVENTED L1
formula (fuel imports as % of merchandise imports ÷ 100) × Δ% energy price index → % of import bill
≤ -1 windfall ≤ 1 immaterial ≤ 3 a real hit above macro-significant

What it reads. A 20% oil move does not mean the same thing in Singapore, Thailand and Malaysia. This scales the world shock by how exposed each country's import bill actually is, which is the number that eventually shows up in the current account and then in the currency.

So what, for you. The bridge from a headline you read to your own currency. A sustained positive reading for Thailand is the earliest warning that the baht has a problem coming — usually one to two quarters before the trade data confirms it.

Provenance. No published equivalent found. The inputs are entirely standard — World Bank TM.VAL.FUEL.ZS.UN and the IMF energy price index — but multiplying a structural import share by a live price change to get a country-specific shock intensity is not a published construction.
th.energy.import_share · xx.index.energy live inputs

Gold in baht

What your gold is actually worth
STANDARD L1
formula gold USD/oz × USDTHB → THB/oz
above level — read the change, not the level

What it reads. Your return on gold is the PRODUCT of the metal and the currency. Gold in baht can rise while gold in dollars falls, and vice versa — and the financial press only ever reports the dollar one.

So what, for you. Judge every gold decision on this line, not the CNBC line. It also explains why gold works as a baht hedge: the same events that weaken the baht usually lift dollar gold, so the two effects compound in your favour.

Provenance. Arithmetic, not an invention — every Thai gold shop quotes it. It is in this register because it is the single most under-appreciated line for a baht-based investor, not because it is clever.
xx.commodity.gold · th.fx.usdthb live inputs

AI credit tail stress (CCC − HY)

What lenders charge the weakest borrowers
ADAPTED L2
formula CCC & lower OAS − HY index OAS, in percentage points → pp
≤ 5 tail is fine ≤ 6.5 normal dispersion ≤ 7.5 lenders backing away from the weak end above tail is shut out

What it reads. Credit usually breaks before equity does, and it breaks at the bottom first. This is the extra yield demanded from the worst-rated borrowers over the high-yield market as a whole. It widens when lenders start declining the weakest deals — which is where the AI build-out's marginal financing actually happens — even while the index looks calm.

So what, for you. You almost certainly do not own CCC paper, so read this as a warning light on everything else rather than a position. When it widens while AI equities hold up, the lenders are disagreeing with the shareholders, and lenders see the cash flows first. Worth doing the breakeven arithmetic before envying the yield: price change on a credit position is roughly −(spread duration × change in spread), so at a spread duration near 3 years the 9.91pp of extra yield is wiped out by about 330bp of widening inside a year. The tail has already moved ~82bp in three months. That is what 'high yield is not high return' means arithmetically. For a Thai investor the transmission is indirect but real: a US AI-credit event tightens global conditions, lifts the dollar and pulls foreign money out of ASEAN — the dollar_pressure gauge is where you would feel it, not this one.

Caveat. Three years of history and no recession in it, so 'a three-year high' is a weaker claimthan it sounds — the series has never been observed through a downturn. The level is less informative than the 3-month change, which is the framework's own guidance. And this is NOT an AI-specific instrument: a widening driven by energy or retail defaults would move it without saying anything about data centres. It is the closest free proxy, not a measurement. Confirm any signal here against issuer-level pricing — Oracle's CDS and neocloud paper — before treating it as an AI-credit event.
Provenance. Adapted from the AI Bubble Early-Warning framework's indicator 8 (AI infrastructure credit stress), which specifies bond/CDS spreads widening 25-50bp as Amber and >100bp as Red. Changed in one decisive way: the framework does not say WHICH spread, and the obvious choice — the high-yield index — is the wrong one. On 2026-07-23 HY OAS was 2.77%, historically tight and unambiguously green on a widening test, while CCC-and-lower was 9.91%. Data-centre SPV and neocloud paper sits in that tail, not in the index. Tracking the GAP catches lenders repricing the weak borrowers while the headline stays calm — the precise failure the framework wants caught, which its own metric would have missed.
concepts
credit dispersion

How far apart the strong and weak borrowers in a market are priced. It widens before an index-level move, because lenders retreat from the worst names first.

An index spread is a weighted average, and averages hide the thing you want. When lenders start declining marginal deals, the refusal shows up as the bottom rating tier repricing while the index barely moves — so a rule keyed to the index reads calm through the early phase. Measured here as CCC OAS − HY OAS. On 2026-07-23 that gap was 7.14pp, the widest in the three years these series exist, while the HY index sat at a comfortable 2.77%.

Read more about credit dispersion
option-adjusted spread

A credit spread with the value of the bond's embedded options stripped out, so bonds with different call features can be compared honestly.

Most corporate bonds are callable — the issuer may repay early, which is valuable to the issuer and costly to the holder. A raw spread on a callable bond therefore mixes credit compensation with the price of that option, and two issuers with identical credit quality can show different spreads purely because one has a call and the other does not. OAS values the option with an interest-rate model and removes it, leaving something closer to pure credit. Every ICE BofA series on this dashboard — HY, IG, CCC — is an OAS, which is what makes differencing them defensible.

Read more about option-adjusted spread
spread duration

How much a bond's price moves for a given change in its credit spread — the credit analogue of interest-rate duration.

Price change ≈ −(spread duration × change in spread). It gives you the number that actually matters for a carry trade: the breakeven widening, which is roughly spread ÷ spread duration per year. Worked on this dashboard's own data — CCC-and-lower yields 9.91pp over Treasuries at a spread duration of roughly 3 years, so about 330bp of widening in a year wipes out the entire year's extra income. The tail has widened ~82bp in three months. That is the arithmetic behind 'high yield is not high return'.

Read more about spread duration
z-score

How unusual today's reading is compared with its own history, measured in standard deviations. 0 = perfectly normal, ±1 = mildly unusual, ±2 = happens about 5% of the time, ±3 = rare.

z = (today − mean) ÷ standard deviation, both taken over a chosen lookback window. Two things about that make it weaker than it looks. The window is a judgement call, not a fact — this dashboard uses ~1250 observations for dailies (five years) and shortens it where the publisher carries less history, and a different window gives a different answer for the same day. And the ±2 ≈ 5% rule assumes a bell curve, which financial series emphatically do not follow: they have fat tails, so genuinely extreme readings arrive far more often than the normal distribution predicts. Read a z-score as a ranking, not a probability.

Read more about z-score
us.credit.ccc_oas · us.credit.hy_oas live inputs

AI bubble composite risk score

How stretched the AI build-out looks
ADAPTED L3
formula Σ(category score × weight) ÷ Σ(weight of SCORED categories only) ÷ 2, as a percentage. Unscorable categories are excluded from both sums rather than counted as Green. → % of maximum risk score
≤ 20 expansion supported ≤ 35 speculative excess building ≤ 50 pre-burst conditions emerging above broad deterioration

What it reads. A deliberately crude tally across independent parts of the system, because the framework's central claim is that no single metric calls this — four unrelated things deteriorating together is the signal. Denominating in percent-of-maximum means a score built from four scorable categories is comparable to one built from ten, instead of silently reading low because six were missing.

So what, for you. Momentum matters more than level: a move from 30% to 55% in two months is a louder signal than a year parked at 50%. The framework's critical overrides bypass the score entirely — a hyperscaler cutting capex for return reasons, a frontier lab taking rescue financing, or a large AI-infrastructure borrower failing to refinance is Red on its own, whatever this reads. For a Thai investor the practical response is not to trade the AI complex but to check how much of your supposedly diversified foreign exposure is the same eight stocks.

Caveat. MOSTLY NOT LIVE, and that is the honest state, not a defect to be papered over. Of the framework's ten categories, one (credit) computes daily from free data, two (semis equity, chip output) are proxies for capacity rather than measurements of it, and one (capex) is hand-entered guidance. The six that carry the most information — capex vs AI revenue, capex ÷ operating cash flow, cloud gross margin, depreciation vs gross profit, enterprise renewals, backlog conversion — all come from quarterly filings and none is wired. Treat this as a scaffold with one working leg. See docs/AI_BUBBLE.md.
Provenance. Implements the composite in section 5 of the AI Bubble Early-Warning framework — ten categories, Green 0 / Amber 1 / Red 2, five weighted ×2 and five ×1. Two corrections were needed before it could be used. FIRST, the bands do not fit the scale: max score is 30 (15 weight × 2), but the document's top band starts at 14, so a portfolio scoring Amber on every single category — a uniform 15 — lands in the highest risk band while no category is Red. That cannot be intended. Bands here are expressed as a PERCENTAGE of the maximum attainable, which also keeps them meaningful when categories are unscorable. SECOND, section 1 lists only three bands (0-5, 6-9, 10-13) and section 5 adds a fourth (14+); the four-band version is used.
concepts
capex absorption

Capital spending divided by operating cash flow — how much of the cash a business generates is being consumed by building.

Below roughly 70% a build-out is self-funded and can be slowed at will. Above 90% the incremental dollar is coming from debt or equity issuance, which hands the pace of the build-out to lenders rather than to management. It is the cleanest single measure of whether a boom is internally or externally financed — and an externally financed one ends when funding conditions change, not when demand does.

Read more about capex absorption
useful life

The number of years a company assumes an asset lasts, which sets how fast it is depreciated — and therefore how large reported profits are.

Annual depreciation = cost ÷ useful life, so extending assumed life raises reported profit without changing a single dollar of cash. The sensitivity is large at AI-capex scale: on $725bn of spending, moving servers from a 5-year to a 6-year life cuts annual depreciation by 725/5 − 725/6 ≈ $24bn a year. That is why the assumption is worth reading in the notes to the accounts rather than taking earnings at face value, and why cash flow is the harder number to dress up. It cuts both ways — if accelerators genuinely wear out or go obsolete faster than assumed, the correction lands as an impairment.

Read more about useful life
free cash flow

Cash from operations minus capital spending — what is actually left over, as opposed to accounting profit.

It matters here because depreciation makes reported earnings and cash diverge sharply during a build-out: cash leaves immediately when equipment is bought, while the expense reaches the income statement over years. A company can therefore show healthy and rising earnings while free cash flow goes negative, which is the pattern to watch in a capex boom rather than a contradiction to explain away.

Read more about free cash flow
vendor financing

When a supplier funds its own customer's purchases, so money leaves as investment and returns as revenue.

The accounting can be entirely proper while the economics are circular: reported revenue rises without new end demand, and every downstream metric built on revenue — backlog, order growth, capex-versus-revenue — inherits the distortion. It was a documented feature of the late-1990s telecom build-out and is a live question in AI infrastructure. The diagnostic is not the revenue line but whether the customer could have paid from its own cash flows.

Read more about vendor financing
market concentration

How much of an index sits in a handful of names — and therefore how little diversification an index fund is actually providing.

The rigorous measure is the Herfindahl index, the sum of squared weights, whose reciprocal gives the 'effective number' of holdings: an index of 500 names where the top 10 hold 40% behaves like far fewer than 500 independent bets. Concentration is not a separate risk from a sector risk — it is the mechanism that turns one into a portfolio problem for someone who believes they are diversified.

Read more about market concentration
backlog conversion

How much of the contracted-but-not-yet-delivered order book actually turns into revenue, and how quickly.

Backlog (often reported as RPO) is the most flattering number a company can disclose, because it is a promise rather than a result. The tell is duration: a backlog growing faster than revenue while its average length stretches means deals are being signed further out, which is a weaker claim on the future than the headline implies.

Read more about backlog conversion
net revenue retention

What last year's customers spend this year, after upgrades, downgrades and cancellations. Above 100% means the existing base is growing on its own.

The reason it leads is that it strips out new-customer acquisition, which can mask deterioration for several quarters. First-renewal cohorts are the sharpest read: enthusiasm gets a product bought once, and only usage gets it renewed.

Read more about net revenue retention
us.credit.quality_spread · us.equity.sox · us.semi.ip · ai.capex.hyperscaler planned inputs

Level 1 · physical Stocks, flows, and the ratios between them

This is the layer that answers "how much is there, and how fast is it moving". It is slow data — annual for most of it — which is exactly why it belongs on a dashboard rather than in someone's memory: nobody re-checks India's oil cover in the middle of an oil spike. A stock is how much exists; a flow is how much moves per period; stock divided by flow gives days of cover, which is the only way to compare reserves of wildly different absolute size.

Oil — strategic cover, in days

The 90-day line is the IEA's emergency stockholding obligation for member countries, measured against NET IMPORTS. The oil market more often quotes days of forward DEMAND, which gives a different answer for the same country. This register uses net imports throughout.

country days vs 90-day line source note
Thailand 108 +18 IEA / national, 2026 Legal floor raised 25 → 27 → 32 days during 2026; 108 is total stocks held, not the minimum.
Japan 248 +158 IEA / METI, Mar 2026 The deepest buffer of any large importer, public and private combined.
China 124 +34 estimate from stocks ÷ imports, Dec 2025 China does not publish this. It is computed from reported stocks and import volumes, so treat it as an order of magnitude.
India 9.5 -80.5 IEA / national, 2026 The thinnest cover of any major importer. There is no buffer between a supply shock and the pump.
US Strategic Petroleum Reserve: 284.6mn bbl — 39.2% of its 726.6mn peak fill. Commercial crude stocks add 426.4mn bbl. Below 300mn the US becomes a structural, price-insensitive buyer of crude, which puts a soft floor under the oil price. That is mildly bad for a Thai household budget and mildly good for any energy exposure held.

Gold — the stock that dwarfs its own flow

measure value as of source note
Above-ground stock, all forms 219,891 t 2025 World Gold Council Every ounce ever mined that still exists. The denominator of everything below.
Mine production 3,300 t 2025 World Gold Council Adds 1.50% to the stock in a year. Gold's scarcity is a flow fact, not a stock fact.
Stock-to-flow 67 yr 2025 derived Years of current production already sitting above ground. No other commodity is close.
Central-bank net purchases 863.3 t 2025 World Gold Council 26.2% of all mine supply, bought by buyers who do not sell on price.
Central-bank purchases, prior year 1,092.4 t 2024 World Gold Council 2025 was 21% lower. The official bid is still large but no longer growing.
ETF holdings 4,047 t 30 Jun 2026 World Gold Council Investor gold, which unlike central-bank gold does sell on price.
ETF net flow, latest month -74 t Jun 2026 World Gold Council Outflow. Investors selling while central banks buy is the shape of the last three years.
Thailand official holdings 235 t Jun 2026 WGC / IMF IFS Worth about ฿1,029bn at today's price and exchange rate.
For a baht holder the dollar price is only half the story. Gold is $4,075/oz, which at USD/THB 33.43 is ฿136,214 per ounce. It also buys 35.5 barrels of Brent — the gold/oil ratio, a two-hundred-year-old way of asking whether the monetary metal or the industrial input is the one that has moved.

Refining concentration — the risk that is not priced daily

Reserves are spread around the world. Refining is not. China's share of the processing step, which is where the actual chokepoint sits, averages 66.2% across these eight.

mineral China share basis note
Gallium 99.0% USGS / IEA 2025 Effectively a monopoly. Gallium is a by-product of aluminium and zinc, so production is processing.
Rare-earth separation 86.1% Industry projection to 2030 The IEA puts it near 80% by 2035. Both point the same way.
Synthetic graphite 85.2% Industry projection to 2030 Natural graphite is 70.5% on the same basis.
Cobalt 71.4% Industry projection to 2030 The DR Congo mines it; China refines it. Reserves and control are different maps.
Lithium 60.9% IEA / industry projection The battery input everyone watches, and not the most concentrated one.
Aluminium 60.4% 44,000kt of 72,800kt world smelter output, 2024 The cleanest actual measurement in this group.
Copper 60.0% 2025 estimate Falls to 44.6% on the 2030 projection as capacity is built elsewhere.
Nickel 6.2% Projection to 2030 The exception that proves the rule: Indonesia takes 71.2%, because it banned raw ore exports and forced smelting onshore.

The export-control calendar — the only dated events on this dashboard

measure effective status expiry effect
China 9 Oct 2025 controls — five further elements plus a 0.1% extraterritorial rule 2025-10-09 suspended expires 2026-11-10 The single hardest date in the resource calendar. If the suspension lapses, the 0.1% de-minimis rule reaches non-Chinese manufacturers directly — a supply-chain problem, not a price problem.
China MOFCOM Announcement No. 18 — seven heavy rare earths 2025-04-04 in force no expiry Export flows running roughly 50% below the pre-restriction rate.
China ban on gallium, germanium and antimony exports to the US 2024-12-01 eased expires 2026-11-30 The November 2025 easing was explicitly time-limited.
Indonesia raw nickel ore export ban 2020-01-01 in force no expiry Forced smelting onshore. Indonesia is now about 62% of world mine output and takes 71% of refining — the clearest case of a country converting a reserve into control.
Myanmar / Wa State tin mining suspension 2023-08-01 restarting no expiry Permits secured; shipment resumption not independently confirmed as of July 2026.
China fertilizer export bans and quotas 2026-03-01 in force expires 2026-08-31 Affects up to ~40 Mt. Urea is about 40% above pre-war levels. Fertilizer restrictions reach food prices with a two-season lag, not immediately.
India non-basmati white rice export ban 2023-07-20 lifted no expiry Lifted 28 Sep 2024; minimum export price removed 23 Oct 2024. No reimposition found.
Indonesia CPO export levy raised 10% → 12.5% 2026-03-01 in force no expiry B50 biodiesel delayed and B40 held through 2026 — the two levers pull opposite ways on exportable supply.

Base metals — where the inventory sits

COMEX warehouses hold 652,200t of copper against the LME's 352,100t — a ratio of 1.85x. Metal piling into American warehouses rather than global ones is a tariff-arbitrage position, not a demand signal, which is why the Chokepoint-Adjusted Growth Signal shrinks copper's weight to 57% of normal. LME tin is at 7,595t, the thinnest inventory in the base-metal complex.

Food

World rice stocks-to-use is 36.4% — comfortable by historical standards, and the reason a rice price spike is not currently a live risk. The Thai-specific number is the other one: Thai 5% broken rice is quoted +12.3% above the Vietnamese equivalent, which is a competitiveness problem rather than a scarcity one, and it drags on the rural economy, the trade balance and eventually the baht.

Level 0 The raw observations, every one of them

This is the audit floor. Nothing appears anywhere above that is not derived from a row on this page. If a figure here is wrong, everything built on it is wrong, which is why each carries its publisher, its series identifier and the date the observation was actually made — not the date it was looked at.

Live · 19 series, re-verified against the publisher's own page on 2026-07-25

series value unit observed source class
Brent crude 114.9 USD/bbl 2026-09-22 fred DCOILBRENTEU LIVE from D1
WTI crude 96.41 USD/bbl 2026-09-22 fred DCOILWTICO LIVE from D1
Henry Hub natural gas 2.90 USD/MMBtu 2026-09-22 fred DHHNGSP LIVE from D1
USD/THB 33.43 THB per USD 2026-09-24 bot DAILY_REF_RATE LIVE from D1
US 10-year Treasury 4.96 % 2026-09-22 fred DGS10 LIVE from D1
US 2-year Treasury 4.71 % 2026-09-22 fred DGS2 LIVE from D1
US 10-year real (TIPS) 2.63 % 2026-09-22 fred DFII10 LIVE from D1
SOFR (US overnight) 3.87 % 2026-09-23 fred SOFR LIVE from D1
VIX 14.21 index 2026-09-22 fred VIXCLS LIVE from D1
US high-yield spread 2.73 % 2026-09-23 fred BAMLH0A0HYM2 LIVE from D1
Broad dollar index 119.5 index 2006=100 2026-09-18 fred DTWEXBGS LIVE from D1
Fed total assets 6,746,548 USD mn 2026-09-16 fred WALCL LIVE from D1
Treasury General Account 877,028 USD mn 2026-09-16 fred WTREGEN LIVE from D1
Overnight reverse repo 0.461 USD bn 2026-09-23 fred RRPONTSYD LIVE from D1
US CCC & lower spread 10.93 % 2026-09-23 fred BAMLH0A3HYC LIVE from D1
US investment-grade spread 0.770 % 2026-09-23 fred BAMLC0A0CM LIVE from D1
Nasdaq 100 30,470 index 2026-09-23 fred NASDAQ100 LIVE from D1
S&P 500 7,706 index 2026-09-23 fred SP500 LIVE from D1
US semiconductor output 191.9 index 2017=100 2026-07-01 fred IPG3344S LIVE from D1

Static · 31 hand-curated values, each with a review-by date

These are things no free API publishes: strategic reserve levels, refining shares, warehouse inventories, central-bank gold buying. They are researched once and reviewed on a schedule rather than polled. VERIFIED means two independent sources agreed; SINGLE means one source; COMPUTED means it was calculated from other published figures. A static value past its review date raises a staleness banner in the running system rather than silently ageing.

series value unit observed source confidence
Gold 4,075 USD/oz 2026-07-31 imf LIVE from D1 — no longer the curated figure
Energy price index 198.7 2016=100 2026-07-01 fred LIVE from D1 — no longer the curated figure
Food price index 131.8 2016=100 2026-07-01 fred LIVE from D1 — no longer the curated figure
JKM LNG (Asia spot) 19.56 USD/MMBtu 2026-07-01 fred LIVE from D1 — no longer the curated figure
Thailand policy rate 1.00 % 2026-09-17 bis LIVE from D1 — no longer the curated figure
SET Index 2,450 index 2026-09-24 derived DERIVED from D1 — no longer the curated figure
US Strategic Petroleum Reserve 284.6 mn bbl 2026-09-18 eia LIVE from D1 — no longer the curated figure
SPR all-time fill 726.6 mn bbl 2010-01-01 static STATIC from D1 — no longer the curated figure
US commercial crude stocks 426.4 mn bbl 2026-09-18 eia LIVE from D1 — no longer the curated figure
Thailand oil cover 108.0 days 2026-01-01 static STATIC from D1 — no longer the curated figure
India oil cover 9.50 days 2026-01-01 static STATIC from D1 — no longer the curated figure
Japan oil cover 248.0 days 2026-03-01 static STATIC from D1 — no longer the curated figure
China oil cover 124.0 days 2025-12-01 static STATIC from D1 — no longer the curated figure
Gold above ground, all forms 219,891 tonnes 2025-12-31 static STATIC from D1 — no longer the curated figure
Gold mine production 3,300 tonnes 2025-12-31 static STATIC from D1 — no longer the curated figure
Central-bank net purchases 863.3 tonnes 2025-12-31 static STATIC from D1 — no longer the curated figure
Central-bank net purchases 1,092 tonnes 2024 World Gold Council VERIFIED review 2027-02
Gold ETF holdings 4,047 tonnes 2026-06-30 World Gold Council VERIFIED review 2026-09
Gold ETF net flow -74.00 tonnes Jun 2026 World Gold Council VERIFIED review 2026-09
Thailand official gold 235.0 tonnes 2026-06-01 static STATIC from D1 — no longer the curated figure
COMEX copper stocks 652,200 tonnes 2026-07-01 static STATIC from D1 — no longer the curated figure
LME copper stocks 352,100 tonnes 2026-07-01 static STATIC from D1 — no longer the curated figure
LME tin stocks 7,595 tonnes 2026-07-01 static STATIC from D1 — no longer the curated figure
China share, gallium refining 99.00 % 2025-12-31 static STATIC from D1 — no longer the curated figure
China share, rare-earth separation 86.10 % 2030-12-31 static STATIC from D1 — no longer the curated figure
China share, synthetic graphite 85.20 % 2030-12-31 static STATIC from D1 — no longer the curated figure
China share, cobalt refining 71.40 % 2030-12-31 static STATIC from D1 — no longer the curated figure
China share, lithium refining 60.90 % 2030-12-31 static STATIC from D1 — no longer the curated figure
China share, copper refining 60.00 % 2025-12-31 static STATIC from D1 — no longer the curated figure
World rice stocks-to-use 36.40 % 2026-06-01 static STATIC from D1 — no longer the curated figure
Thai rice premium vs Vietnam 12.30 % 2026-07-01 static STATIC from D1 — no longer the curated figure

Derived · 15 figures computed on this request, never stored

These are recomputed from whichever observations the model is holding, which is why no value is stored alongside the formula: a stored copy could only ever end up disagreeing with the arithmetic beside it. The "as of" column names the observation date of the curated inputs; when the database supplies a fresher reading the figure recomputes immediately, and the input's own row above shows the newer date.

figure value unit as of formula class
US net dollar liquidity 5.87 USD tn 2026-07-22 WALCL − TGA − RRP, all converted to trillions DERIVED
2s10s term spread 0.250 pp 2026-07-23 10-year yield − 2-year yield DERIVED
10-year inflation breakeven 2.33 % 2026-07-23 10-year nominal − 10-year TIPS DERIVED
Real overnight rate 1.54 % 2026-07-23 SOFR − 10-year breakeven DERIVED
THB carry gap (BOT − Fed) -2.87 pp 2026-07-23 Thai policy rate − SOFR DERIVED
Brent−WTI spread 18.48 USD/bbl 2026-07-20 Brent − WTI DERIVED
Gold in baht 136,214 THB/oz 2026-07-17 gold USD/oz × USD/THB DERIVED
Gold/oil ratio 35.47 bbl per oz 2026-07-20 gold USD/oz ÷ Brent USD/bbl DERIVED
Baht Import Burden Index 162.8 2016=100 2026-07-17 (0.60 × energy + 0.40 × food) × (USDTHB ÷ 35.3) DERIVED
SPR as % of peak fill 39.16 % 2026-07-17 SPR level ÷ 726.6 all-time fill DERIVED
Gold new supply 1.50 % of stock 2025 mine production ÷ above-ground stock DERIVED
Gold stock-to-flow 66.63 years 2025 above-ground stock ÷ mine production DERIVED
Official absorption 26.16 % 2025 central-bank purchases ÷ mine supply DERIVED
COMEX ÷ LME copper 1.85 x w/e 2026-07-17 COMEX stocks ÷ LME stocks DERIVED
Chokepoint discount on copper 0.574 weight w/e 2026-07-17 1 − min(1, |ratio − 1| ÷ 2) DERIVED

Plumbing How this stays current

The instruction was that the reserves and flows data be wired in the same way as everything else, not bolted on. That is what this section demonstrates. All 204 series — market prices, policy rates, World Bank macro and the 37 hand-curated physical statics — live in one registry, are fetched by one runner, are written to one table, and are refreshed on the schedule below. The static resource layer is not a special case: it is a source: "static" adapter that costs zero network calls and rides the ordinary weekday close job. Adding a reserve series is a one-line registry entry, exactly like adding an interest rate.

schedule job sources subrequests note
0 * * * * Hourly · fast tier FRED, Stooq — daily-frequency market series only ~20 calls Skips anything refreshed in the last 50 minutes, so it rewrites nothing.
30 21 * * 1-5 US close, weekdays FRED, Stooq, EIA weeklies, and the whole static resource layer ~29 calls This is the run that carries reserves and flows. The 29 static series cost zero calls — they are read out of the code, not off the internet.
30 10 * * 1-5 Asia close, weekdays Bank of Thailand, BIS policy rates ~9 calls Runs after Asian markets close so the Thai numbers are the day's, not yesterday's.
0 2 3 * * Monthly, 3rd of month IMF SDMX, World Bank, monthly FRED commodities ~22 calls World Bank batches ten countries per call, which is why 70 series cost 7 requests.
manual:fast Refresh button — fast FRED, Stooq daily ~20 calls The dashboard's on-demand button. 5-minute minimum age.
manual:full Refresh button — everything All eight adapters ~60 calls One click covers the whole registry. Each source group runs as its own step of a durable Workflow with its own outbound-call budget, against a ceiling of 1,000 per invocation, so there is no longer anything to ration — the cap that remains is a runaway guard, not a platform limit.

Registry by source

worldbank 70
static 37
fred 33
derived 26
bis 8
cftc 8
ecb 6
eia 6
imf 5
twelvedata 3
bot 1
fedebp 1

Registry by pillar

resource 86
macro 34
commodity 18
rates 14
fx 10
sector 10
sentiment 8
derivative 6
liquidity 6
credit 5
valuation 5
risk 2

86 of 204 series are the resource pillar — the reserves and flows layer is the largest single part of the registry, not an appendix to it.

Why the subrequest column exists. On the Workers Paid plan the platform ceiling is 1,000 outbound calls per invocation, and a sweep of every adapter in the registry is about sixty. So the number in that column is not a ration — it is a runaway guard. Each job declares the most calls it is ever allowed to make, and if the runner reaches that number it stops cleanly, saves what it already has and reports stoppedForBudget rather than continuing. That matters for exactly one failure mode: an adapter that has started looping. You want to learn about it from a saved partial run, not from a bill. The free-tier arrangement this replaced budgeted 45 calls against a ceiling of 50 and needed two presses twenty minutes apart to cover the whole registry; none of that applies now, and the code that did it is gone.

Run it now

Fast sweeps the daily market series — prices, yields, FX, the liquidity components. Full adds the slow layer: World Bank macro, the static resource table and anything monthly. Both write to the same table the cron jobs write to, so a manual run is not a separate path through the code. The admin token is whatever was set with wrangler secret put ADMIN_TOKEN; on a local wrangler dev with no token configured the route accepts localhost without one. It is held in this tab only — nothing here writes it to storage.

idle