Net flow = daily change in shares outstanding × same-day raw market close
This isolates ETF creations/redemptions from price appreciation (USD billions). A share/price inverse-jump guard removes splits from flow.
Daily OHLC is pulled from Alphavantage TIME_SERIES_DAILY_ADJUSTED. Two per-symbol
stores are kept: raw OHLC (used for flow, since flow is a dollar value at the traded price)
and split/dividend-adjusted OHLC (used for returns and realized volatility).
Every fund is tagged by an ordered keyword-rule engine (fund name + benchmark) into one of:
Emerging Markets and International Developed are separated from US equity; Volatility (VIX), Crypto and Leveraged/Inverse are first-class buckets.
For volatility-class funds (VIXY/UVXY/SVXY/VXX …) the detail page shows the VIX index level and realized volatility, and de-emphasizes creation/redemption flow — flow is structurally noisy for products that roll futures and decay.
The rolling-window buttons switch the flow histogram between trailing sums over 1 / 5 / 10 / 21 / 63 / 126 / 252 trading days. YTD is not a rolling window — it is a calendar-year running total that resets each January, so the series sawtooths back to a single day's value at each year boundary.
On the detail page the price pane and the realized-volatility pane share one time axis: zoom, pan and the crosshair stay locked together across both.