Acquiring signal…
Acquiring signal…
1, 2, 3, 4, 5
Pick funds, set weights, and watch effective N — the same math from the animation above, running live on real NAV history.
Try it: start all-equity, then add one low-correlation fund and watch what happens to the number on the right.
Pick a few funds below, or tap a preset. Every number on the right updates as you go.
Select at least one fund with a nonzero weight to see stats.
Each square shows how closely two funds move together, scaled to the spread actually present in your current selection. Bright amber = they rise and fall almost in lockstep. Dark teal = one goes its own way. A portfolio that's all bright squares isn't as diversified as it looks.
Educational, not investment advice. Fund names are examples from the dataset, not recommendations.
Fund identities and NAV history are resolved offline against mfapi.in and baked into a static JSON file. Nothing is fetched live — the browser only does arithmetic against a trusted, pre-verified blob.
Correlation, covariance, Jacobi eigen-decomposition, and effective-N all run client-side in plain JS, ported from a Python reference implementation and checked against it — 14/14 tests passing in both languages.
45 funds across 13 categories, 164 months of month-end NAV history (Jan 2013 – Aug 2026), hand-verified scheme codes rather than guessed ones.
25 data-quality and implementation gotchas found and fixed along the way — wrong scheme codes, a 100x face-value consolidation, a Map-vs-object ordering bug — logged in the open.
read GOTCHAS.md