STRASMORE/EXPLORE 2,707 QUERIES

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.

as of ranking 4×4read in context →
What the lookback window costs in daily turnover (SPY, 10% target, 2x cap) — 4 rows by 4 columns, computed from US exchange, SIP and OPRA data.
lookback_windowavg_weightavg_daily_turnover_pctdays_at_cap_pct
10-session0.816.840.7
21-session0.7530
63-session0.690.850
126-session0.660.420
Rows × columns
4 × 4
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for What the lookback window costs in daily turnover (SPY, 10% target, 2x cap), derived from the stored result.
ColumnTypeRangeNotes
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
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisVolatility Targeting for Position Sizing
One 10% risk budget, six names, six different weights ranking 6×4 → SPY realised volatility by month against a 10% target series 72×4 → Weekly realised volatility and the weight it implied, Nov 2019 to Apr 2020 series 25×4 → Symbols that printed a final daily bar, by year ranking 10×3 → The January 2019 universe, grouped by what happened to each name ranking 9×4 → A 20/50 moving-average crossover on SPY, year by year, against holding ranking 9×4 → See all 2,707 queries →