See what an estimation-error-aware optimizer does differently.
Pick any basket of ASX shares, denoise their covariance with Random Matrix Theory, and compare a classical mean-variance portfolio against a robust minimax version that explicitly prices in how unreliable your return estimates are.
No results yet
Build your share basket on the left, load some price history (demo data works instantly), and run the optimization.
Classical MVO error-maximizer
Robust SOCP Quant 2.0
Weights & inputs by share
Annualized from your loaded price history. Volatility below is each share's own standard deviation (raw, pre-denoising) for reference.
| Ticker | Sector | Ann. return | Ann. volatility | Classical | Robust |
|---|
Share screener
Every share's up-day and down-day returns, summed separately, over the loaded history โ a green bar that reaches further right than the red bar reaches left means gains have outweighed losses (and vice versa). Use this before you trust the optimizer's picks: a high optimizer weight on a share with a weak or negative track record here is usually the estimation-error problem the robust model exists to guard against, not a share worth doubling down on.
| Ticker | Up days | Down days | Win rate | Avg up-day | Avg down-day | Ann. mean return | Verdict |
|---|
Normalized cumulative growth
Rebased to 100 at the start of the loaded window.
Technical overlay
One ticker's real price with Bollinger Bands (20-day SMA ± 2 standard deviations, flags mean-reversion extremes) and a Donchian Channel (20-day rolling high/low, the classic breakout-system channel) overlaid โ a different, complementary lens from Bollinger's mean-reversion framing.
How to read this chart: the white line is the real close price. The dashed teal Bollinger bands narrowing into a "squeeze" often precedes a volatility breakout in either direction; price pressing against an outer band suggests an overbought/oversold extreme, not a signal on its own. The dashed brass Donchian lines mark the highest high / lowest low over the last 20 days โ a fresh push through either edge is what breakout systems treat as a real range break, not noise.
Forecast Cone (Regime-Conditional GBM: P10 / P50 / P90) vs. Trend Line
A Monte Carlo Geometric Brownian Motion forward simulation for the selected ticker, with drift μ and volatility σ taken from the current Hidden-Markov regime's blended state (see the Regime tab) rather than the full-sample average โ so the cone widens or narrows with how Stressed the model currently reads. The dashed trend line is the same drift with volatility set to zero, a purely deterministic reference to compare the stochastic cone against. This is a real, honest spread from the fitted model's own parameters, not a promise of where the price will actually land.
How to read this chart: the solid median (P50) line is the single most likely path; the shaded band between P10 and P90 is where the simulation landed 80% of the time โ wider further out, since uncertainty compounds the longer the horizon. The dashed trend line has no randomness in it at all, so treat any gap between it and the median as the real cost of volatility, not a forecasting disagreement.
Dividend history
Per-share dividend payments, fetched live from this app's own backend (yfinance, with an EODHD fallback server-side). Needs the backend running โ see the note in the Live fetch panel if this errors.
Share classification & franking
โ| Ex-dividend date | Amount |
|---|
Recent news
Latest headlines for the selected share, fetched live from this app's own backend. Summaries and links are re-served as-is from the source, not analyzed or scored by anything in this app.
Where this comes from: every citation named on this tab is peer-reviewed and, in most cases, already running in real institutional systems, not invented for this app. Ledoit-Wolf shrinkage ships as a named estimator in scikit-learn (sklearn.covariance.LedoitWolf); Friedman, Hastie & Tibshirani's Graphical Lasso is likewise a named scikit-learn method (GraphicalLasso); Black-Litterman (Black & Litterman, developed at Goldman Sachs) is built into Bloomberg PORT, MSCI Barra, Axioma and FactSet; Engle won the 2003 Nobel Memorial Prize in Economic Sciences for the ARCH family that DCC-GARCH extends; Meucci, who developed Entropy Pooling, was head of research at Kepos Capital and teaches this material at NYU and Baruch College. Full source list, one technique per row: Methodology tab, section 8.
Eigenvalue spectrum — before & after denoising
Eigenvalues of the correlation matrix, sorted ascending. Anything below the Marchenko–Pastur threshold (dashed line) is treated as estimation noise and flattened to the noise-cluster mean.
Correlation matrix (denoised)
Ledoit-Wolf shrinkage โ a second opinion
A different answer to the same problem RMT denoising solves above: the sample covariance is a noisy estimate, especially when the number of shares isn't tiny relative to how many days of history you've loaded. Ledoit-Wolf (2004) shrinks the sample estimate toward a simplified scaled-identity target, with the shrinkage amount chosen in closed form to minimize expected estimation error โ not a tunable knob. Shown here as a diagnostic; the optimizer itself still uses the RMT-denoised covariance above.
Graphical Lasso โ direct vs. indirect connections
A different question than correlation: which pairs of shares are directly connected, once every other share's influence is controlled for? Two shares can be highly correlated purely because they're both driven by a third (e.g. two miners both moving with the same commodity-price factor) without any direct relationship of their own โ a correlation matrix can't tell those apart, a sparse precision matrix (Friedman, Hastie & Tibshirani 2008) can. Penalty strength is set automatically from how many shares you're estimating relative to how much history you've loaded, the same idea behind the RMT threshold above, not a knob to tune.
DCC-GARCH โ does correlation move over time?
Every estimate above is a single static number for your whole loaded window. This one is genuinely different: each share gets its own GARCH(1,1) volatility process (Engle & Bollerslev), then a second stage lets the CORRELATION between shares drift day to day too (Engle 2002). The real-world pattern this exists to show: correlation usually rises when markets are stressed -- exactly the regime-fragility HRP's macro-role layer is built to hedge against, seen here directly instead of assumed. Heavier to compute than the diagnostics above, so it's opt-in.
Current (latest-day) avg. pairwise correlation
Full-sample static correlation
Tail dependence โ do these shares crash together?
Every correlation-based tool above (including DCC-GARCH) implicitly assumes a Gaussian-shaped relationship, which has essentially zero tail dependence by construction -- even a "highly correlated" Gaussian pair becomes independent again in the extreme tails. Real markets don't work that way: shares usually crash together more than a correlation number alone implies, and more than they rally together. This is a non-parametric estimate (Frahm, Junker & Schmidt 2005) of exactly that, direct from the data, no distributional assumption. A value at or below โ for a given pair is indistinguishable from pure chance; further above it means real crash clustering.
Entropy Pooling โ what if you don't trust the sample?
Every number above trusts your loaded history at face value. This tool does something different: pick a share and state a return you genuinely believe in instead of the sample average, and this finds the LEAST distorted reweighting of your historical days that makes that belief exactly true (Meucci 2008) -- the information-theoretic minimum change needed, not an arbitrary override. The "distortion cost" tells you honestly how much of your own data you're effectively discounting to hold that view.
Distortion cost (relative entropy)
Effective sample size after reweighting
| Ticker | Robust weight (baseline) | Robust weight (under your view) |
|---|
Black-Litterman โ blend a market prior with several of your own views
A different shape of view than Entropy Pooling above: instead of reweighting historical days to match one belief, this starts from a neutral equilibrium return (reverse-optimized from equal weights โ real market-cap data isn't available in this app, so this is a reasonable stand-in, not true market equilibrium) and blends in as many of your own believed returns as you like at once, each with its own confidence (He & Litterman 1999). Check a share, type your believed annual return, and set how confident you are โ a view at low confidence barely moves the result; near-full confidence pins that share's posterior close to your number. Every share you didn't check still shifts too, since the optimizer re-solves the whole basket around the posterior.
What to type: a plain whole-number percentage โ your own guess at what this share will average per year, not per day. If you think BHP will do about 12% a year, check BHP and type 12 (not 0.12). If you think it'll lose money, use a negative number, e.g. -5 for "I expect roughly a 5% loss a year." Confidence is how sure you are in that guess: low confidence barely nudges the result away from the neutral market prior; high confidence pulls the result close to your number.
The two dials below, in plain terms: "Risk-aversion" sets how demanding the neutral starting point is overall โ it doesn't favor one share over another, it just scales every share's equilibrium return up or down together, the way a more nervous market demands a bigger reward for holding risk at all. Leave it at the default (2.5, a standard textbook value) unless you have a specific reason to think the whole market is unusually calm or unusually jumpy right now. "Prior uncertainty" controls how much say your views get: small values (0.01โ0.05) mean the neutral starting point is trusted strongly, so only a high-confidence view moves things much; larger values (up to 0.20) mean the starting point is treated as shakier, so even a middling-confidence view pulls the result substantially. Raise it if you want your own views to carry more real weight; leave it low if you mostly trust the market and only want to nudge a share or two.
| Ticker | Equilibrium prior return | Posterior return | Robust weight (baseline) | Robust weight (posterior) |
|---|
Correlation network (PMFG) โ a denser map than the correlation matrix
A structured, sparse map of this basket's real connections: denser than a Minimum Spanning Tree (which forces every share through one single path, hiding local clustering) while staying planar -- drawable with no lines crossing, a genuine graph-theoretic filter of the full correlation matrix rather than an arbitrary threshold cut. Built as a stacked triangulation: start from the three most mutually correlated shares, then keep inserting whichever remaining share fits most naturally into whichever existing triangle it's closest to.
Connections shown
Most central share
| Share A | Share B | Correlation |
|---|
Rolling correlation โ has this pair's relationship been drifting?
Every correlation number elsewhere in this app (including PMFG above) is one static figure for your whole loaded window. This asks a different question of any two shares in your basket: has their relationship actually been stable, or has it been drifting -- and is its CURRENT level unusual relative to its own recent history? The Z-score compares today's windowed correlation against the mean/std of the rolling series itself, not against zero. Share B isn't limited to your basket -- type any Yahoo ticker (an index, futures contract, or another share) to test it against Share A. The lag slider shifts Share B in time before correlating: a positive lag tests whether Share B's past predicts Share A's present ("does copper lead this miner"), ported from a prototype trading-dashboard script that had this parameter when this app's own version didn't.
Relative strength โ is this share outperforming a benchmark, and is it accelerating?
A classic technical-analysis read (Mansfield-style), genuinely different from the statistical Regime-switching tab below: price relative to a chosen benchmark, not a state model. Ratio = (share price / benchmark price) × 100, smoothed with 50-day and 200-day averages. GREEN = outperforming and accelerating; RED = underperforming and accelerating; AMBER = mixed/transitioning. Needs about 210 trading days of aligned history for the 200-day average to populate -- use the 2-year lookback.
Regime-switching (2-state Gaussian HMM)
Fits a Calm/Stressed Hidden Markov Model to your basket's equal-weighted daily return, via scaled Baum-Welch EM. Only populates when "Estimation mode" in the sidebar is set to Regime-aware.
Where this comes from: detecting Calm/Stressed market states with a hidden Markov model traces back to Hamilton, “A New Approach to the Economic Analysis of Nonstationary Time Series and the Business Cycle,” Econometrica, 1989, applied directly to asset allocation by Ang & Bekaert, Review of Financial Studies, 2002. The fitting algorithm itself — Baum-Welch expectation-maximization — is a decades-old, thoroughly tested numerical method used across speech recognition, genomics, and finance alike, not something built for this app. Regime-based allocation research is published and used in practice by firms such as AQR Capital Management. Full source list: Methodology tab, section 8.
Current regime
Next-period forecast
Effective κ (regime-boosted)
Real-world cross-check: RBA cash rate
—
State-conditional statistics
| State | Ann. mean (proxy) | Ann. volatility (proxy) | Persistence | Expected duration |
|---|
Regime probability over time
Smoothed probability of being in the Stressed state on each day of your loaded history.
Macro โ real RBA, ABS & US data
Monetary policy, inflation, the exchange rate, unemployment, GDP growth, and the US Treasury yield curve are genuine drivers of whether risk assets look bullish or bearish. This tab surfaces real series from the RBA (via the readabs package โ downloads the RBA's own published data, no API key, not a formal API contract), the ABS's own official Data API (data.api.abs.gov.au โ a real free REST/SDMX contract, no key needed), and the Federal Reserve's FRED API (api.stlouisfed.org โ free, but needs a real API key on every request, unlike RBA/ABS). The backend only proxies each raw series, same as Dividends and News; all trend/change interpretation happens here in the browser.
RBA โ Official Cash Rate
Current cash rate
Change
—
RBA โ AUD/USD exchange rate
Current rate
Change
—
ABS โ Consumer Price Index (inflation)
CPI, year-on-year
Change
—
ABS โ Unemployment rate
Unemployment rate
Change
—
ABS โ GDP growth
Quarter-on-quarter, seasonally adjusted โ the raw quarterly print, not annualized.
—
ABS Indicator API — Wage growth
A different ABS product from the CPI/unemployment/GDP cards above (its own API, its own key) — and structurally different too: it only ever serves the single latest published half-year, not a time series, so there's no chart or 3/12-month change here. Average Weekly Earnings (catalogue 6302.0), seasonally adjusted. "Real" wage growth below nets out CPI inflation using the ABS CPI card above, when it's loaded.
Wage growth, year-on-year
Real wage growth
—
US โ Treasury yield curve (recession risk)
The 10-year minus 2-year Treasury spread (T10Y2Y) โ when it goes negative ("inverts"), long-term rates sit below short-term rates, historically one of the more reliable US recession-risk signals. Shown alongside its own two legs (10Y, 2Y) for context, not as separate signals.
10Y–2Y spread
Change
—
AU โ Government bond yield curve
The same 10-year minus 2-year spread, built from Australian Government Bond yields (RBA Table F2) โ the direct AU equivalent of the US card above. RBA doesn't publish this as a pre-built spread series the way FRED does for the US, so it's computed here from the two raw legs.
10Y–2Y spread
Change
—
US vs AU โ do the two curves agree?
Both spreads plotted on the same axis, with a dashed zero line marking the inversion threshold for either. The two economies' bond markets don't always move together โ a real, useful cross-check precisely because they can diverge.
Understanding the yield curve
What it is: a plot of government bond yields across different maturities โ here, just the 2-year and 10-year points. Normally, longer-dated bonds pay a higher yield than shorter-dated ones, since lenders want extra compensation for tying money up for longer and for the greater uncertainty over a decade versus two years.
Why 10Y–2Y specifically: the 2-year yield mostly reflects near-term central-bank policy expectations (where the RBA/Fed will set rates over the next couple of years); the 10-year yield reflects longer-run growth and inflation expectations. Comparing the two is effectively asking "does the bond market expect the next decade to look better or worse than the next two years?"
Why inversion is read as a warning sign: when the spread goes negative, investors are accepting a LOWER yield to lend for 10 years than for 2 โ effectively betting that growth and rates will fall over that time, often because they expect a slowdown or recession ahead. It's the bond market pricing in worse conditions later than now.
An honest caveat, not a rule: in the US, an inversion has preceded most recessions since the 1950s, but the lead time has varied enormously โ anywhere from about 6 months to over 2 years โ and there have been false positives where an inversion didn't lead to a recession at all. Australia's own inversion track record is thinner and less studied than the US's. Treat this as one real, useful input alongside the app's other regime/macro signals, never as a standalone timing tool.
US โ Labor market & inflation
Unemployment rate
Change
—
CPI, year-on-year
Change
—
US โ GDP growth
Quarter-on-quarter, seasonally adjusted annual rate (SAAR) โ the standard US convention, and a genuinely different scale from the ABS GDP card above (plain, non-annualized QoQ%). The two are not directly comparable number-for-number.
—
Cash benchmark โ US savings account APY
Bankrate's national weekly survey of the 10 largest US banks/thrifts โ a real, zero-risk, fully-liquid alternative to investing. A useful floor to weigh a basket's expected return against, not a rate to beat by a small margin.
Savings account APY
Change
—
Scenario Stress Simulator
Four named scenarios, not four guesses: the first three regress each of your basket's holdings against real historical moves in the relevant macro series (RBA cash rate, ABS CPI, ABS GDP โ the same series above, not invented sensitivity numbers) to get a genuine per-ticker beta, then project it through one clearly-stated hypothetical shock. The fourth reuses your regime-aware run's own already-fitted Stressed-state statistics directly. Needs a completed "Run optimization" (Results tab) first; sample sizes are real but small (basket price history is the limiting factor), so N and correlation are always shown alongside every beta.
1. Rate Shock
2. Inflation Spike
3. Growth Slowdown
4. Historical Stress Regime
5. Historical Crisis Replay
Leading Indicators
Real, well-regarded market and macro signals that historically move before price volatility or a downturn shows up โ synthesized here into one composite read instead of left scattered across tabs. Yield curve reuses the Macro tab's own data if already loaded; nothing here is fetched twice.
Rates & credit
Yield curve
Credit spreads
The bond market's own real-time read on corporate default risk โ spreads often widen before equity earnings reports catch up to real stress. US: Moody's Baa-rated yield minus 10Y Treasury, and the ICE high-yield option-adjusted spread. AU: BBB-rated 5-year corporate yield minus the matching 5-year government bond yield (RBA doesn't publish a spread directly, so it's computed here from the two real legs).
BIS credit-to-GDP gap
The actual Basel III / BIS early-warning indicator regulators use to set bank capital buffers: private-sector credit growth relative to its own long-run trend. When credit grows too far above trend, that gap has preceded most major financial crises by 1–3 years โ arguably a better track record than the yield curve alone. Trend estimated via a Hodrick-Prescott filter (λ=400,000, the BIS convention for credit cycles specifically); this uses the full available history, so the trend for the most recent quarters could still shift slightly as more data arrives โ a real limitation, stated plainly, not hidden.
Sahm Rule (real-time recession trigger)
A simple, well-regarded, real-time US recession indicator (economist Claudia Sahm): the 3-month average unemployment rate rising 0.5 percentage points or more above its own low point over the trailing 12 months. Costs nothing to compute โ pure math on unemployment data this app already fetches for the Macro tab.
Momentum & technical
RSI-14 (Relative Strength Index)
Standard 14-period RSI (Wilder's smoothing) on the S&P 500 and ASX 200. Only overbought (>70) counts toward the caution tally below — it signals elevated risk of a pullback. Oversold (<30) is shown too but NOT counted as a caution: per its own standard interpretation that's a contrarian dip-buying signal, the opposite of a downside warning, and this composite is specifically about downside risk.
Moving average crossover (50/200-day)
The classic "Golden Cross / Death Cross" structural trend signal on the S&P 500 and ASX 200. Only a Death Cross (50-day crosses below 200-day) counts toward the caution tally — a real, historically-recognized bearish regime signal. A Golden Cross is shown but not counted as a caution, same asymmetry-of-direction reasoning as RSI above.
Market breadth
The Advance-Decline Line from your own Leading Indicators framework doc — genuinely the hardest one to get right. No free NYSE/ASX breadth ticker exists anywhere (checked live: ^ADD, ^TRIN, ^NYAD, ^ADVN all 404 on Yahoo), so this is computed server-side from the FULL ASX common-stock universe, counting real daily advancers vs decliners and running a cumulative sum — the standard A/D line construction, not an approximation. That's a genuine 3–5 minute batched fetch across ~2,300 tickers on a cold cache (cached 90 minutes after), so it's deliberately kept OUT of the main "Load leading indicators" button above and given its own trigger here.
Cross-border
Japan 10Y JGB yield momentum
Bank of Japan policy-normalization risk: a fast rise in Japan's 10-year government bond yield has historically preceded leveraged yen carry-trade unwinds, which drain global liquidity and hit high-beta AU/US equities simultaneously. No literature-agreed trigger LEVEL exists for JGB yields (unlike the Sahm Rule or BIS credit-gap), so this uses a momentum threshold instead — our own classification, stated as such: ≥0.25pp rise over the trailing 3 months.
Sector internals
Banking sector relative strength (XLF/SPY)
From Bocky's own research note: financials underperforming the broader index is a real, well-documented early crack — banks led the S&P down for months before the index itself cracked in 2007-08. Not redundant with the credit spreads above (bond-market credit pricing vs. equity-market sector positioning — genuinely different signals). Threshold is a rolling PERCENTILE of this ratio's own trailing 2-year range (bottom 10th percentile), not another flat number — self-calibrating to this ratio's own normal range, the first indicator on this tab built this way. A sibling idea from the same note (HYG/IEI as a second credit-spread proxy) was checked and NOT added: its live daily-change correlation against the real FRED HY OAS spread above came back 0.79 with the cross-correlation peak exactly at zero lag — a same-day mirror, not a leading signal, so it would only have double-counted what the credit-spreads section already measures.
High-Beta/Low-Beta sector ratio (XLY/XLP)
From Bocky's own research note: instead of tracking thousands of individual stock advance/decline counts, track the ratio of a discretionary/cyclical (higher-beta) sector against a defensive (lower-beta) one — Consumer Discretionary (XLY) vs. Consumer Staples (XLP), the standard pair for this read. When high-beta leadership rolls over, breadth is narrowing under the surface before the headline index itself cracks. Not redundant with Banking Relative Strength above — that's one sector against the whole market; this is cyclical vs. defensive, a market-wide risk-appetite tell rather than a financials-specific one. Same rolling-percentile threshold convention (bottom 10th percentile of its own trailing 2-year range), self-calibrating rather than a flat number. The note's own cross-asset confirmation idea (Copper/Gold, bond yield slopes) is already covered by those existing legs elsewhere on this tab, not duplicated here.
China Growth Momentum Composite
China's own real weight in the Australian economy specifically — a China growth scare hits the ASX immediately, not with a lag — is why this gets real weighted-tier treatment rather than one context-only leg. A continuous daily z-score built from 5 real, liquid market prices, standing in for official Chinese statistics (every free source checked turned out stale or invalid). Hard Industrial Core (50%): Copper futures (25%) — electrical grid/manufacturing/smelting demand; Iron ore futures (25%) — blast-furnace utilization, property/infra pipeline. External Trade & Currency Transmission (30%): AUD/USD (15%) — the most liquid FX proxy for Chinese demand via Australia's export exposure; KRW/USD (15%) — Korea's trade balance with China is a real, acute leading indicator for pan-Asian manufacturing. Equity Sentiment (20%): Hang Seng China Enterprises (real ticker: ^HSCE, not ^HSCEI — that one 404s on Yahoo). Each leg is z-scored against its own trailing history (self-calibrating), combined with the weights above; a composite reading at or below −1.5 counts as real, broad-based China-growth stress below. See Composite_Growth_Index.py in the Yield Curve folder for the standalone verification script this matches exactly.
Volatility & currency
VIX term structure (ˆVIX / ˆVIX3M)
The options market's own read on fear, independent of the price/moving-average signals above. Under normal conditions the VIX curve is in contango — near-term volatility priced below 3-month volatility, ratio < 1 — because markets expect calm now and want compensation for uncertainty further out. A flip to backwardation (ratio ≥ 1: near-term fear exceeds 3-month fear) is a real, named, literature-standard acute-stress signal, not a self-calibrating invented threshold — it showed up in 2008, 2020, and 2022. A flat, literature-real threshold, same footing as the Sahm Rule and BIS credit gap above.
US Dollar Index momentum
A surging US dollar tightens global liquidity and historically pressures AUD, emerging markets, and commodity-linked economies specifically — a genuinely different transmission channel from anything else on this tab. No literature-agreed flat trigger level exists for "how strong is too strong," so this uses the same self-calibrating rolling-percentile convention as Banking Relative Strength and the High-Beta/Low-Beta ratio above (top 10th percentile of its own trailing 2-year range), rather than an invented flat number.
Context (not counted in the composite above)
These three are real and worth watching, but none has a universally agreed trigger threshold in the literature the way the indicators above do โ folding them into the caution count would manufacture precision that isn't really there.
Sovereign debt-to-GDP
5Y5Y forward inflation breakeven
The bond market's own forward-looking read on where inflation is expected to average, 5 years out, for the 5 years after that (FRED T5YIFR) — genuinely different from the Sahm Rule and CPI data above, which are both backward-looking. Roughly anchored around 2% through most of the post-2015 period; the real thing worth watching is a sustained drift away from that anchor in either direction (de-anchoring), not the level itself in isolation. No single literature-agreed stress trigger exists the way the Sahm Rule/credit-gap have, so this stays context-only, same honesty standard as debt-to-GDP above.
Cross-asset sentiment
Copper/Gold ratio
A real cross-asset read on institutional risk appetite: copper tracks industrial/growth demand, gold tracks safe-haven demand. A rising ratio favors risk-on; a falling ratio is a real flight-to-safety signal, sometimes visible here before it shows up in equities. No universally-agreed trigger level exists for the ratio itself, so it stays context-only here — copper's own price also does double duty as the industrial-core leg of the China Growth Composite below, a more precise China read than this ratio alone.
Walk-forward backtest
Rolls a training window through your loaded history, refits both models, holds the resulting weights out-of-sample for the test window, then moves on โ so what you see below is realized, not estimated, performance. Needs enough history to cover several train+test cycles.
Where this comes from: rolling a fixed training window forward and testing only on data the model never fit is the standard walk-forward methodology used across quantitative trading, not something invented for this app. Bailey, Borwein, López de Prado & Zhu, “The Probability of Backtest Overfitting,” Journal of Computational Finance, 2016, is the standard reference on why in-sample-only backtests mislead and why walk-forward testing is the real bar; a “Walk-Forward Optimizer” is a named, built-in feature of professional trading platforms such as TradeStation and MultiCharts, and out-of-sample validation is an explicit expectation of bank model-risk frameworks (e.g. the US Federal Reserve's SR 11-7 guidance). Full source list: Methodology tab, section 8.
| CAGR | Ann. volatility | Sharpe | Max drawdown | Avg turnover / rebalance | Cost drag (cum.) |
|---|
Monte Carlo vs. known ground truth
Demo-data only: since the synthetic generator's true underlying returns/covariance are known, this regenerates many noisy draws, estimates from each the way the app normally would, and scores both portfolios against the true parameters โ the statistically honest version of "classical MVO is an error maximizer" (the original prototype tried to show this with a single random seed).
Demo data solves that, honestly: it's synthetic, but built by us, from known true numbers โ so for this one test, we actually know the right answer in advance. This tab redraws that fake-but-realistic data hundreds of times, has both portfolio-building methods try to guess right from each noisy draw, and checks how often each one actually got closer to the real, known truth. It's the closest thing to a fair, repeatable exam for "does the safer method actually work," rather than judging from a single result.
How to read the two numbers below: "Robust wins" is simply the percentage of trials where the safer method finished closer to the true answer โ well above 50% is real evidence it's genuinely better here, not chance. "Mean utility gap" is by how much, on average, plus a range (95% confidence interval) for how sure we are of that โ if that whole range stays on the positive side, that's a real, statistically defensible edge, not a coin flip.
Robust wins (true out-of-sample utility)
Mean utility gap (Robust โ Classical)
Risk, turnover & drawdown โ Classical vs. Robust
How different are the two allocations from your last "Run optimization", and what would each have actually looked like over your loaded price history? Turnover is the one-way fraction of the portfolio that would need to trade to move from Classical into Robust; Sharpe/volatility/max drawdown here come from a static (buy-and-hold, no rebalancing) simulation of each allocation's own weights over the whole loaded window -- a different, complementary number from the Results tab's Sharpe (which comes from the annualized model inputs, not a simulated history).
| Classical | Robust | |
|---|---|---|
| Realized Sharpe (buy & hold, loaded history) | โ | โ |
| Max drawdown | โ | โ |
| Realized annualized volatility | โ | โ |
Weight stability (stationary bootstrap)
Resamples your loaded return history using the Politis & Romano (1994) stationary bootstrap -- random, geometrically-distributed block lengths with circular wrap-around, which removes the artificial edge bias a fixed-length block leaves at the end of the series -- re-estimates and re-solves each time, and shows the 5th–95th percentile range of the resulting weight per share. Tighter bands mean the "optimal" weight is less sensitive to exactly which history you happened to observe.
| Ticker | Classical mean | Classical σ | Robust mean | Robust σ |
|---|
Which estimator is actually most stable?
The same bootstrap trials, scored for two more estimators already used elsewhere in this app -- Ledoit-Wolf shrinkage (Diagnostics tab) and Hierarchical Risk Parity (Basket Finder tab), neither of which needs the sample covariance matrix inverted directly -- reduced to one number per method (mean bootstrap weight std-dev, averaged across tickers) so all four are readable side by side.
Efficient frontier
Sweeps the efficient frontier: risk aversion λ from 0.5 to 10 with κ and the weight cap held at your current sidebar settings, and solves both models at each point. Uses the same denoised covariance as your last "Run optimization". The dashed Capital Allocation Lines run from the risk-free rate through each curve's own tangency (max-Sharpe) portfolio -- the highest-Sharpe mix achievable is always some blend of cash and that one portfolio, never a point further along the curve itself. Triangle markers are your individual shares' own risk/return -- the frontier bowing out above and to the left of them IS diversification, made visible rather than just asserted. The Robust SOCP curve is already a real min-max robust optimization (Goldfarb & Iyengar 2003): it treats the estimated mean return as uncertain within an ellipsoidal confidence region (sized by κ and your sample length) and solves for the best portfolio under that region's worst case, rather than trusting the raw sample mean at face value.
Landmark portfolios
Global Minimum Variance and Maximum Return are real solves at extreme risk-aversion (not just the swept grid's own 0.5/10 endpoints); Maximum Sharpe is the tangency portfolio the CAL lines above touch.
| Classical return | Classical vol | Robust return | Robust vol |
|---|
Michaud (1998) resampled frontier
A single frontier curve is fit to one noisy sample -- small changes in the observed history can move it more than you'd expect. This runs the same stationary bootstrap as the Stability tab, solves the same risk-aversion levels on each resample, and averages the resulting WEIGHT vectors at each level (the real Michaud recipe, not just averaging the chart points) -- producing a smoothed, less-overfit "resampled frontier" plus an honest confidence band showing how much each risk-aversion level's outcome actually varied across resamples.
Basket Finder
Given your currently loaded candidates, finds the most genuinely complementary basket โ one representative per macro role, chosen so the survivors are statistically well-diversified from each other (Hierarchical Risk Parity, Lรณpez de Prado 2016), not just spread across industry sectors. Correlation-based diversification alone is regime-fragile โ assets that look uncorrelated in a calm backtest can spike toward 1 in a real crisis โ so candidates are first grouped by the macro shock they're meant to buffer against, and HRP only picks the best representative within each group.
| Ticker | Macro role |
|---|
Selected basket
| Macro role | Selected ticker | Basket weight |
|---|
Avg. pairwise correlation โ selected basket
Avg. pairwise correlation โ full candidate pool
Effective Number of Bets (ENB)
Nested Clustered Optimization (NCO) โ alternative weights
| Ticker | HRP weight | NCO weight |
|---|
Decision Aid
Translates the other tabs into plain language, and points each investing lens โ Growth, Value, Dividend, Risk Management โ toward what this run actually implies. Everything below is computed from your last "Run optimization," not a separate simulation.
Market regime
Tail-risk read
What this run suggests, by lens
Signal reference โ what feeds each lens, per share
| Ticker | Hawkes cluster | Behavior entropy | Plain read |
|---|
Hawkes cluster: is this share showing a burst of unusually large moves right now, beyond what's normal for it โ the pattern a panic cascade or stop-loss chain leaves behind. Behavior entropy: is its day-to-day behavior orderly, or genuinely noisy and hard to read.
When to sell โ three real signals
This app doesn't track your actual holdings (no accounts, no saved positions), so "how far has your position drifted" is simulated: tell it how long ago you set the Robust model's target weights, and it uses the price history already loaded to show how a buy-and-hold portfolio would have drifted since โ real math, no manual data entry. Combined with a regime de-risk check and a downside review against the model's own risk estimate, plus real recent news per holding for context.
1. Rebalance drift
2. Regime de-risk flag
3. Downside review
Recent news, for context
Real headlines per holding, re-served as-is โ not analyzed or scored by anything in this app, same as the News tab.
Quant 2.0 Portfolio Optimizer โ Analysis Report
A one-page executive summary that pulls together every other tab into plain language โ holdings and dividends, real news catalysts, risk diagnostics, frontier positioning, regime read, time-varying correlation, sell signals, out-of-sample backtest, and strategic recommendations. Run the optimizer first, then generate the report; use Print / PDF above while this tab is active for a clean one-page export.
1. Holdings & dividend profiles
โ
| Ticker | Sector | Divs | Recent payment & trend |
|---|
2. Fundamental drivers & catalysts
Real recent headlines per holding, re-served as-is from this app's own backend โ not analyzed, scored, or rewritten by anything in this app. Follow the source link for the full article.
3. Quantitative risk diagnostics
4. Portfolio construction & diversification
Where this basket sits on the efficient frontier, plus whether the Basket Finder or Entropy Pooling tools were used to help shape it this session.
5. Regime-switching (2-state HMM)
6. Time-varying correlation (DCC-GARCH)
7. When to sell โ three real signals
Rebalance drift, a regime de-risk flag, and a downside review against the model's own risk estimate โ the same three signals as the dedicated Sell Signals tab, using whatever "days since rebalance" setting is set there (default 60).
8. Out-of-sample walk-forward backtest
| Strategy | CAGR | Vol | Sharpe | Max DD | Turnover |
|---|
โ
9. Strategic recommendations
Reliability Guide
This app is built on six real statistical techniques โ Random Matrix Theory denoising, Ledoit-Wolf shrinkage, robust minimax (SOCP) optimization, a regime-switching Hidden Markov Model, CVaR/Expected Shortfall, and empirical tail-dependence copulas. Run as a pipeline: Ledoit-Wolf and RMT clean the raw return data first, the HMM classifies the current market regime, tail-dependence checks for hidden crash-clustering, and Robust SOCP + CVaR combine all of it into a suggested allocation. The Methodology tab has the full formulas; this page is the plain-language version โ what each one actually found on your current basket, right now, and how much you should trust it. Run the optimizer first (Results tab) to populate this.
Overall reliability read
Run the optimizer first to populate this.
Real historical validation โ does Robust actually protect you?
Everything above and below this card explains how the math works. This is different: a real, out-of-sample test of whether it actually helped, run against real historical prices, not a simulation. Tested 2026-08-21 on two independent real baskets with genuine multi-decade history, using this app's own Backtest tab (231 and 212 real monthly rebalances respectively โ the exact same walk-forward engine every "Run backtest" click uses, just pointed at longer real history than a typical live fetch currently reaches).
| Basket | CAGR | Ann. volatility | Sharpe | Max drawdown | |
|---|---|---|---|---|---|
| US cross-asset GLD / SPY / TLT / USO 2006–2026 |
Classical MVO | 10.7% | 18.5% | 0.35 | −40.2% |
| Robust SOCP | 10.9% | 14.3% | 0.47 | −27.8% | |
| AU cross-asset AGVT.AX / GOLD.AX / OOO.AX / VAS.AX 2008–2026 |
Classical MVO | −2.4% | 24.6% | −0.26 | −84.2% |
| Robust SOCP | 4.8% | 10.7% | 0.07 | −21.3% |
On the AU basket in particular, Classical MVO would have lost money over 17+ real years with an -84.2% drawdown โ a real, historical illustration of naive mean-variance optimization's well-documented failure mode (concentrating into whichever asset's trailing estimate happens to look best, right before that asset collapses; this basket includes an oil ETF, which had genuinely severe real drawdowns). Robust SOCP, run on the exact same real data, stayed profitable with a drawdown a quarter to a third the size, on both independent baskets.
What this does and doesn't prove: real, reproducible evidence that the robust optimizer's core idea โ protecting against mean-estimation error โ genuinely reduced real historical drawdowns on two real, independent baskets through the 2008 GFC, the 2020 COVID crash, and the 2022 rate-shock drawdown. It is NOT proof this holds for every possible basket, and past performance โ even 20 real years of it โ is not a guarantee of future results. Both runs used 0% modeled transaction costs. Treat this as real supporting evidence for the app's core method, not a certificate that any specific future portfolio will behave this way.
Why this page says "not a guarantee" so often
This isn't hedging unique to Quant 2.0 โ it's what every serious tool in this space says, because it's true of the math itself, not a weakness of any one implementation. Bloomberg Terminal's PORT risk analytics, Portfolio Visualizer, Vanguard's own advisory materials, and every regulated robo-advisor's onboarding flow all carry some version of the same line โ "past performance doesn't guarantee future results" โ right next to their real, sophisticated output. To a serious user, that phrasing has become almost invisible: expected, standard, the sign a tool understands exactly what its own numbers can and can't promise.
The absence of that line is what would actually be the red flag here โ either a tool that doesn't understand what it's built, or one that's overselling on purpose. Quant 2.0 states it plainly, in the same places those tools do, for the same reason: the historical validation above is real and worth taking seriously, and it sits directly alongside an honest reminder of exactly what it does and doesn't prove โ the way this whole field expects a legitimate tool to present its own results.
The six pillars, applied to your basket
Macro backdrop & portfolio health
Real Reserve Bank of Australia, Australian Bureau of Statistics, and US Federal Reserve (FRED) data โ the same live feed the Macro tab uses โ read here specifically for what it means for how much confidence to put in the statistical analysis above.
Macro shock warnings โ what would hurt this basket
The same real, regression-based Scenario Stress Simulator from the Macro tab, condensed here as a warning list: each holding's actual historical sensitivity to a rate/inflation/growth shock, plus how this basket's own prices really behaved in past crises. Not a forecast โ full per-holding detail lives on the Macro tab.
Portfolio macro exposure by sector
Each holding's real sector, mapped to a plain-language read of what macro factor that sector is structurally most sensitive to โ and a warning if this basket is concentrated in one such factor.
Saved setups
Save your current share basket and model parameters under a name, so you can jump straight back to it later โ a different mix for "Growth," "Defensive," or whatever setups you come back to.
Research history
Every completed run is logged here automatically โ the most recent 50. Reload any of them to bring back that exact basket and parameters and re-run it.
Methodology
Quant 2.0 runs the same class of techniques used in institutional portfolio construction โ random matrix theory, robust minimax optimization, regime-switching risk models, and genuinely out-of-sample validation โ not simplified retail heuristics dressed up to look sophisticated. Every method below is named, explained, and open to inspection: no proprietary black box, no unexplained score. What follows is the real mathematics, in the same terms a quantitative analyst would use to describe it to a colleague.
1. RMT covariance denoising
Historical correlation matrices estimated from a short price history are noisy โ with N assets and T observations, when T isn't much larger than N, most of the eigenvalue spectrum is indistinguishable from what you'd get from pure random data. Random Matrix Theory gives a threshold (the Marchenko–Pastur upper bound, λ_max = (1 + √(N/T))²) below which eigenvalues are assumed to be noise; this app replaces them with their average, then rescales back to a covariance matrix.
2. Classical mean-variance optimization
Solves minimize λ·w'Σw − w'μ subject to full investment and no shorting. It treats the estimated mean return μ as exact โ which is precisely the problem: mean returns are much harder to estimate precisely than covariances, so this formulation systematically overweights whichever assets happen to have the most optimistic estimation error.
3. Robust minimax optimization
Instead of trusting μ exactly, this assumes the true mean lies somewhere in an ellipsoid around it, and optimizes for the worst point in that ellipsoid: minimize λ·w'Σw − w'μ + κ·√(w'Ωw). The ellipsoid's shape, Ω = (252/T)·Σ, is the standard asymptotic covariance of a sample-mean estimator โ so its size is grounded in how much history you actually gave it, not a fixed constant. κ is your dial on how much you distrust the estimate.
4. Solving it without a backend
Both problems are convex. Rather than shipping a server-side SOCP solver, this app solves them with projected gradient descent (backtracking line search + Euclidean projection onto the simplex), validated against a reference cvxpy/ECOS solve to within numerical tolerance. Everything โ eigendecomposition, Cholesky, the optimizer โ runs client-side in plain JavaScript.
5. Walk-forward backtest, Monte Carlo, and bootstrap
The Results tab shows in-sample estimated metrics โ useful, but "the model I fit says it should return X%" is a much weaker claim than "here's what actually would have happened." The Backtest tab rolls a train/test window through history so performance is genuinely out-of-sample. The Monte Carlo tab (demo data only, since it needs a known ground truth to grade against) regenerates many noisy draws from the same underlying process and checks how often the robust portfolio actually wins โ the statistically honest version of what the original robust_mvo_proof.py tried to demonstrate with a single random seed. The Stability tab block-bootstraps your loaded history to show how much the "optimal" weights themselves would move around under a slightly different sample.
6. Real-world data, not illustrative placeholders
Prices, dividends, and news come from this app's own Python backend (server/main.py) โ yfinance first, with an EODHD fallback if Yahoo's upstream ever breaks, both fetched server-side so the browser never has to fight CORS or depend on a public proxy staying online. The Macro tab adds real macroeconomic context on top of that: the Reserve Bank of Australia's official cash rate and AUD/USD exchange rate, the Australian Bureau of Statistics' own CPI, unemployment, and GDP figures via their official Data API, and the equivalent US indicators โ Treasury yield curve, unemployment, inflation, GDP growth, and a real savings-account benchmark โ via the Federal Reserve's FRED API. Every one of those is a live call to the issuing institution's own systems, cached for a bounded period so repeat visits don't hammer the source, and the backend only ever proxies the raw series โ every trend, change, and plain-language read is computed client-side, in the open, the same as everything else in this app.
7. Beyond the optimizer
The robust-vs-classical comparison above is the foundation, not the whole picture. Diagnostics brings in Ledoit-Wolf shrinkage, Graphical Lasso, DCC-GARCH, and tail-dependence copulas to show how your holdings actually move together โ including in the tails, where correlation assumptions usually break down first. Regime-switching fits a real two-state Hidden Markov Model to detect Calm vs. Stressed conditions. Basket Finder uses Hierarchical Risk Parity and Nested Clustered Optimization to build diversified baskets without inverting an ill-conditioned covariance matrix. Decision Aid and the Analysis Report translate all of it โ including the real-world macro data above โ into plain language, so the depth of the analysis doesn't require a finance degree to actually use. Full definitions for every term are in the Glossary tab.
8. Academic provenance & institutional adoption
None of the methods above originated in this app, and none are proprietary to it. Each has a peer-reviewed origin, a documented record of use at real financial institutions, and a place in graduate-level quantitative finance curricula. The table traces every technique this app runs back to its actual source, so it can be checked rather than taken on faith.
| Technique | Academic origin | Institutional / real-world use | Taught in |
|---|---|---|---|
| Mean-variance optimization | H. Markowitz, “Portfolio Selection,” Journal of Finance, 1952 — 1990 Nobel Memorial Prize in Economic Sciences | The foundation of nearly every institutional asset-allocation process in use today | CFA Program curriculum; core module of every finance MBA worldwide |
| RMT covariance denoising | Marchenko & Pastur, 1967; applied to finance by Laloux, Cizeau, Bouchaud & Potters, Physical Review Letters, 1999 | Standard eigenvalue-filtering technique on quantitative risk desks; formalized in J.-P. Bouchaud's (Capital Fund Management) Theory of Financial Risk and Derivative Pricing | Graduate econophysics / mathematical finance programs (e.g. NYU Courant) |
| Ledoit-Wolf shrinkage | Ledoit & Wolf, Journal of Multivariate Analysis, 2004 | Implemented as a named estimator in scikit-learn (sklearn.covariance.LedoitWolf); routine in institutional covariance estimation | Standard in quantitative asset management / financial econometrics graduate courses |
| Graphical Lasso | Friedman, Hastie & Tibshirani, “Sparse Inverse Covariance Estimation with the Graphical Lasso,” Biostatistics, 2008 | Implemented as a named estimator in scikit-learn (sklearn.covariance.GraphicalLasso); a standard tool in genomics and financial network analysis alike | Graduate statistical learning courses (the method appears in Hastie, Tibshirani & Friedman's own Elements of Statistical Learning) |
| Robust minimax (SOCP) optimization | Ben-Tal & Nemirovski robust-optimization framework (1998–2000); applied to portfolios by Goldfarb & Iyengar, Mathematics of Operations Research, 2003 | Textbook reference: Fabozzi, Kolm, Pachamanova & Focardi, Robust Portfolio Optimization and Management (Wiley Finance) | Financial engineering programs (Columbia, CMU, Berkeley IEOR, and equivalents) |
| Regime-switching (Hidden Markov Model) | Hamilton, Econometrica, 1989; applied to allocation by Ang & Bekaert, Review of Financial Studies, 2002 | Regime-based allocation frameworks published and used by firms such as AQR Capital Management | Core material in macro-finance PhD time-series sequences |
| CVaR / Expected Shortfall | Rockafellar & Uryasev, Journal of Risk, 2000 | The Basel Committee's Fundamental Review of the Trading Book (FRTB) made Expected Shortfall the mandatory regulatory risk measure for global banks | Standard in every quantitative risk management master's program |
| Copula-based tail dependence | Sklar, 1959; brought into risk management by Embrechts, McNeil & Straumann, “Correlation and Dependence in Risk Management,” 1999 | Textbook: McNeil, Frey & Embrechts, Quantitative Risk Management (Princeton University Press) | The standard graduate QRM text (Princeton ORFE, ETH Zürich, and equivalents) |
| Hierarchical Risk Parity | López de Prado, Journal of Portfolio Management, 2016 | Author was formerly head of machine learning at AQR Capital Management; HRP ships as a named method in PyPortfolioOpt and Riskfolio-Lib | Advances in Financial Machine Learning (Wiley, 2018), used across financial-engineering programs |
| DCC-GARCH | Engle, Journal of Business & Economic Statistics, 2002 — 2003 Nobel Memorial Prize in Economic Sciences (ARCH family) | NYU Stern's Volatility Institute publishes live DCC-based systemic-risk measures used by researchers and regulators | Standard in financial econometrics graduate sequences |
| Black-Litterman | Black & Litterman, Financial Analysts Journal, 1992 — developed at Goldman Sachs | Built into Bloomberg PORT, MSCI Barra, Axioma and FactSet portfolio-construction tools | Fixture of financial-engineering asset-allocation courses worldwide |
| Entropy Pooling | Meucci, “Fully Flexible Views: Theory and Practice,” Risk, 2008 | Author was formerly head of research at Kepos Capital; used in professional portfolio-construction toolkits (ARPM) | Taught at NYU and Baruch College's financial engineering programs |
| PMFG correlation network | Tumminello, Aste, Di Matteo & Mantegna, PNAS, 2005 | Established network-filtering method in the econophysics research literature | Graduate econophysics / complex-systems coursework |
This table establishes that the mathematics is real and legitimately used elsewhere โ it is a separate question from whether it worked here, on your data. For that, see the Reliability Guide's real historical validation, which tests the app's actual output against real market history rather than citing where the method came from.
A-Z glossary
Every technical term used across this app's tabs, in plain-enough language to look up mid-session. Coexists with the Methodology tab above โ that page explains how the app's own math works; this one defines the vocabulary it's written in.
Believed annual return (Black-Litterman)
Your own guess at what a share will average per year, typed as a plain percentage โ 12 for +12%/yr, -5 for a 5%/yr loss (not 0.12/-0.05). Paired with a confidence level, this is one "view" fed into Black-Litterman.
Beta
A share's sensitivity to overall market moves. Used in this app's demo-data generator to give synthetic shares realistic single-factor risk profiles.
Black-Litterman
Blends a neutral equilibrium expected-return estimate with one or more of your own believed returns, each weighted by how confident you are in it, into a single posterior estimate โ rather than replacing the model's return estimate with a guess entirely, or ignoring your view and trusting the sample average alone.
Block bootstrap
Resamples contiguous blocks of historical trading days โ not single days, which would destroy the autocorrelation real returns have โ to see how much the "optimal" weights themselves would move around under a slightly different sample of the same history. Used by the Stability tab.
CAGR (Compound Annual Growth Rate)
The constant annual return that would turn the starting value into the ending value over the period โ the standard way to compare returns across strategies or time windows of different lengths.
Confidence (Black-Litterman view)
How sure you are in one believed return, from 1โ100%. Low confidence barely nudges the result away from the neutral market baseline; near-100% pins that share's posterior close to your number. It's the dial that decides how much your own opinion outweighs the model's neutral starting guess for that one share โ see also tau, which sets how much say views get overall, not per-share.
Copper/Gold ratio
Copper price divided by gold price โ a real-time cross-asset read on institutional risk appetite. Copper tracks industrial/growth demand; gold tracks safe-haven demand. A rising ratio favors risk-on positioning; a falling ratio is a genuine flight-to-safety signal, sometimes visible here before it shows up in equity prices. See the Leading Indicators tab.
Correlation vs. covariance
Covariance measures how two return series move together, in absolute units. Correlation normalizes that to a unitless −1..+1 scale, so it's comparable across pairs regardless of each share's own volatility.
Credit-to-GDP gap (BIS early-warning indicator)
Private-sector credit, as a percentage of GDP, minus its own estimated long-run trend. The actual Basel III/BIS indicator regulators use to set countercyclical bank capital buffers โ when credit grows too far above trend (BIS's own line: +10 percentage points), it has historically preceded major financial crises by 1–3 years. Computed here via a Hodrick-Prescott filter (λ=400,000, the BIS convention for credit cycles). See the Leading Indicators tab.
Credit spread (leading indicator)
The extra yield a corporate bond pays over a comparable government bond โ a direct market read on default risk. Bond markets often price in corporate stress well before it shows up in equity earnings reports, making a widening spread a genuine early-warning signal. See the Leading Indicators tab.
CVaR (Conditional Value at Risk / Expected Shortfall)
The average loss on the worst α% of days (e.g. the worst 5%) โ not just the boundary of that tail (that's VaR), but the average of everything beyond it. A direct answer to "how bad does bad actually get."
DCC-GARCH
Dynamic Conditional Correlation GARCH. Fits each share's own volatility clustering (GARCH(1,1)) first, then a separate recursion for how correlations between shares evolve day to day โ instead of assuming one fixed correlation matrix holds for a whole sample.
Delta (Black-Litterman risk-aversion)
Scales Black-Litterman's neutral starting point up or down for every share together โ it doesn't favor one share over another, it just reflects how big a reward the whole market seems to demand for holding risk at all. Left at its default (2.5, a standard textbook value) unless you have a specific reason to think the whole market is unusually calm or unusually jumpy right now. Distinct from this app's other risk-aversion dials (lambda, kappa) โ this one only shapes Black-Litterman's own starting guess, not the optimizer's actual risk/return trade-off.
Downside deviation
Like standard deviation, but only counts returns below a target (usually zero) โ doesn't penalize upside volatility the way plain variance does. The basis of the Sortino ratio.
Effective Number of Bets (ENB)
How many genuinely independent "bets" a basket's weights actually represent, once correlation between holdings is accounted for โ a truer diversification read than simply counting how many shares are in the basket.
Efficient frontier
The set of portfolios offering the best possible expected return for each level of risk. Sweeping the risk-aversion dial (lambda) across a range of values and plotting the result traces it out.
Eigenvalue / eigenvector
A covariance matrix's eigenvectors are its principal directions of co-movement; eigenvalues are how much variance each direction explains. RMT denoising works directly on this spectrum.
Entropy pooling
Reweights historical days by the minimum amount needed to make a stated belief (e.g. "I think this share will average 10% a year") exactly hold โ rather than discarding history entirely or guessing a whole new distribution from scratch.
Graphical Lasso
Estimates a sparse precision matrix, revealing which pairs of shares are directly connected once every other share's influence is controlled for. Correlation alone can't distinguish a real direct link from two shares that simply share a common third driver.
Hawkes process
A self-exciting point process, used here to detect whether a share is showing a burst of unusually large moves clustering together right now โ the statistical signature of a panic cascade or a stop-loss chain, distinct from ordinary day-to-day volatility.
HHI (Herfindahl-Hirschman Index)
The sum of squared portfolio weights โ a standard concentration measure. Higher means more concentrated in fewer names; an equally-weighted basket of N shares scores 1/N.
HRP (Hierarchical Risk Parity)
Allocates by first clustering shares into a hierarchy based on correlation, then splitting weight recursively down that tree โ avoids directly inverting a possibly ill-conditioned covariance matrix the way classical mean-variance optimization does. Used by the Basket Finder.
Kappa (κ)
This app's dial on how much you distrust the estimated mean return. Scales the size of the "uncertainty ellipsoid" the robust optimizer defends against โ 0 collapses the robust model to the classical one.
Lambda (λ)
Risk aversion โ how heavily the optimizer penalizes portfolio variance relative to expected return. Higher means a more conservative portfolio.
Ledoit-Wolf shrinkage
Blends the raw sample covariance matrix with a simplified, structured target, weighted by how much the sample size actually supports trusting the raw estimate. An alternative to RMT denoising for the same underlying problem โ the sample covariance is a noisy estimate at realistic window lengths.
Marchenko-Pastur / RMT denoising
Random Matrix Theory gives a threshold below which a covariance matrix's eigenvalues are statistically indistinguishable from pure noise. This app replaces those eigenvalues with their average before using the matrix, rather than trusting numbers that are mostly sampling error.
Max drawdown
The largest peak-to-trough decline over a period โ a direct, intuitive measure of "how bad did it get" that Sharpe ratio or volatility alone don't capture.
Monte Carlo simulation
Regenerates many noisy draws from the same underlying data-generating process (demo data only, since it needs a known ground truth to grade against) and checks how often the robust portfolio actually beats the classical one โ the statistically honest version of testing on a single sample.
NCO (Nested Clustered Optimization)
Clusters correlated shares together, optimizes within each cluster, then optimizes across clusters. Another way (alongside HRP) of avoiding a direct, unstable inversion of the full covariance matrix.
PMFG (Planar Maximally Filtered Graph)
A denser network map of a basket's real correlations than a simple threshold graph, built so it stays planar (drawable without edges crossing) while keeping the strongest, most informative connections.
Precision matrix
The inverse of the covariance matrix. Unlike covariance itself, its off-diagonal entries reveal direct relationships between two variables once every other variable is controlled for โ the basis for Graphical Lasso.
Regime-switching (Hidden Markov Model)
Fits a small number of hidden market "states" (this app uses two: Calm and Stressed), each with its own return and volatility, plus the probabilities of transitioning between them. Lets the optimizer's risk treatment adapt to which regime looks likely next, instead of one static full-sample average.
Robust minimax optimization
Instead of trusting the estimated mean return exactly, assumes the true mean could be anywhere inside an uncertainty ellipsoid around it, and optimizes for the worst point in that ellipsoid โ protects against exactly the estimation error that classical mean-variance optimization is most vulnerable to.
Sahm Rule
A simple, well-regarded, real-time US recession trigger (economist Claudia Sahm): the 3-month average unemployment rate rising 0.5 percentage points or more above its own low point over the trailing 12 months. Historically hasn't given a false positive in the modern data. See the Leading Indicators tab.
Sector-neutral
A comparison made relative to peers in the same sector rather than across the whole universe, so a miner's P/E isn't compared directly against a bank's. Used by the Shares Scanner's factor screener.
Semi-covariance
Like covariance, but computed only from days where returns fell below a threshold (usually zero) โ captures how shares co-move specifically on the downside.
Sovereign debt-to-GDP
A government's total debt divided by the size of its economy. The LEVEL alone isn't a reliable warning sign on its own (Japan carries far higher debt/GDP than most countries without crisis) โ what matters more is the trajectory, and how it interacts with rising bond yields (debt-servicing/rollover stress). Shown on the Leading Indicators tab as real context, not a threshold.
Sharpe ratio
Excess return (over the risk-free rate) divided by volatility โ the standard reward-per-unit-of-risk measure, though it penalizes upside and downside volatility equally.
Sortino ratio
Like Sharpe, but divides excess return by downside deviation instead of total volatility โ a fairer risk-adjusted measure when the two sides of the return distribution aren't symmetric.
STARR ratio
Stable Tail Adjusted Return Ratio. Like Sharpe, but divides excess return by CVaR instead of volatility โ a risk-adjusted measure built specifically around the worst-case-loss framing.
Tail dependence (copula)
Measures whether two shares tend to have their worst days together more often than their ordinary correlation alone would predict. Every correlation-based tool elsewhere in this app assumes a Gaussian-shaped relationship, which has essentially zero tail dependence by construction โ this is the one place checking that assumption directly.
Tau (Black-Litterman prior uncertainty)
Controls how much say your views get, overall โ a different question from any one view's own confidence. Small (0.01โ0.05): the neutral starting point is trusted strongly, so only a high-confidence view moves the result much. Larger (up to 0.20): the starting point is treated as shakier, so even a middling-confidence view pulls the result substantially. Raise it to let your views carry more real weight overall; keep it low if you mostly trust the market baseline and only want to nudge a share or two.
Turnover
How much of a portfolio's value gets bought or sold at each rebalance. Higher turnover means more transaction-cost drag, all else equal.
VaR (Value at Risk)
The loss level that won't be exceeded on all but the worst α% of days โ the boundary of the "bad" tail, as opposed to CVaR, which averages the losses beyond that boundary.
Volatility (annualized)
The standard deviation of returns, scaled from daily to an annual figure (×√252 under the standard iid assumption) so it's comparable across data windows of different lengths.
Walk-forward backtest
Rolls a training window through history, refits both models, holds the resulting weights out-of-sample for a test window, then repeats โ genuinely out-of-sample performance, not an in-sample estimate.
Yield curve
A plot of government bond yields across maturities. This app tracks just the 10-year and 2-year points (for both the US and Australia) and their spread โ the 10Y minus the 2Y โ since that specific comparison is the one most commonly watched as a recession-risk signal. See the Macro tab's own "Understanding the yield curve" panel for the full explanation.
Yield curve inversion
When the 10Y–2Y spread goes negative โ the 10-year bond yields LESS than the 2-year. Read as a warning sign because it means the bond market is accepting a lower long-term return than short-term, effectively betting growth or rates will fall. Historically preceded most US recessions, though the lead time has varied from months to years, and it isn't a perfect signal โ context, not a countdown timer.
Z-score
How many standard deviations a value is from its peer group's mean. This app's factor screener uses sector-neutral, winsorized Z-scores so a single extreme outlier doesn't distort a whole sector's ranking.