What the lookback window costs in daily turnover (SPY, 10% target, 2x cap)
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-26, from Volatility Targeting for Position Sizing.
| lookback_window | avg_weight | avg_daily_turnover_pct | days_at_cap_pct |
|---|---|---|---|
| 10-session | 0.81 | 6.84 | 0.7 |
| 21-session | 0.75 | 3 | 0 |
| 63-session | 0.69 | 0.85 | 0 |
| 126-session | 0.66 | 0.42 | 0 |
- Rows × columns
- 4 × 4
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
lookback_window |
text | 4 distinct values (10-session, 126-session, 21-session…) | |
avg_weight |
number | 0.66 to 0.81 | |
avg_daily_turnover_pct |
number | 0.42 to 6.84 | percent |
days_at_cap_pct |
number | 0 to 0.7 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH
px AS
(
SELECT
date AS d,
toFloat64(any(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= subtractYears(today(), 5)
AND date < today()
GROUP BY d
),
px_sorted AS
(
SELECT arraySort(p -> p.1, groupArray((d, c))) AS pts
FROM px
),
rets AS
(
SELECT arrayFilter(x -> abs(x) < 0.4,
arrayMap((a, b) -> log(b.2 / a.2),
arraySlice(pts, 1, length(pts) - 1),
arraySlice(pts, 2))) AS r
FROM px_sorted
),
grid AS
(
SELECT
r,
arrayJoin([10, 21, 63, 126]) AS lb
FROM rets
),
weights AS
(
SELECT
lb,
arrayMap(i -> least(2.0,
0.10 / (arrayReduce('stddevSamp', arraySlice(r, i - lb + 1, lb)) * sqrt(252))),
range(lb, length(r) + 1)) AS w
FROM grid
)
SELECT
concat(toString(lb), '-session') AS lookback_window,
round(arrayAvg(w), 2) AS avg_weight,
round(100 * arrayAvg(arrayMap((a, b) -> abs(b - a),
arraySlice(w, 1, length(w) - 1),
arraySlice(w, 2))), 2) AS avg_daily_turnover_pct,
round(100.0 * arrayCount(x -> x > 1.999, w) / length(w), 1) AS days_at_cap_pct
FROM weights
ORDER BY lb
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.