{"slug":"event-driven-vs-vectorized-backtesting","qid":"fill_convention","label":"One rule, two fill conventions: SPY equity curves through 2024","post_title":"Event-Driven vs Vectorized Backtesting","post_url":"/blog/event-driven-vs-vectorized-backtesting#q-fill_convention","columns":["month","same_bar_equity","next_bar_equity","equity_spread"],"rows":[{"month":"2024-01","same_bar_equity":105.5,"next_bar_equity":100.85,"equity_spread":4.65},{"month":"2024-02","same_bar_equity":113.07,"next_bar_equity":102.55,"equity_spread":10.52},{"month":"2024-03","same_bar_equity":118.76,"next_bar_equity":103.28,"equity_spread":15.49},{"month":"2024-04","same_bar_equity":121.01,"next_bar_equity":101.87,"equity_spread":19.14},{"month":"2024-05","same_bar_equity":129.08,"next_bar_equity":105.43,"equity_spread":23.65},{"month":"2024-06","same_bar_equity":134.06,"next_bar_equity":108.17,"equity_spread":25.89},{"month":"2024-07","same_bar_equity":141.11,"next_bar_equity":108.18,"equity_spread":32.93},{"month":"2024-08","same_bar_equity":150.09,"next_bar_equity":110.92,"equity_spread":39.17},{"month":"2024-09","same_bar_equity":156.92,"next_bar_equity":113.76,"equity_spread":43.16},{"month":"2024-10","same_bar_equity":162.94,"next_bar_equity":113.34,"equity_spread":49.6},{"month":"2024-11","same_bar_equity":173.13,"next_bar_equity":117.05,"equity_spread":56.08},{"month":"2024-12","same_bar_equity":177.8,"next_bar_equity":114.6,"equity_spread":63.21}],"shape":"series","sql":"SELECT\n    mark.1                    AS month,\n    round(mark.2, 2)          AS same_bar_equity,\n    round(mark.3, 2)          AS next_bar_equity,\n    round(mark.2 - mark.3, 2) AS equity_spread\nFROM\n(\n    SELECT arrayJoin(month_end_marks) AS mark\n    FROM\n    (\n        SELECT\n            arrayMap(x -> x.1, bars)                                      AS dates,\n            arrayMap(x -> x.2, bars)                                      AS closes,\n            length(bars)                                                  AS n,\n            arrayFilter(i -> (i >= 11)\n                             AND (i <= n - 1)\n                             AND (dates[i] >= toDate('2024-01-01'))\n                             AND (dates[i] <  toDate('2025-01-01')),\n                        range(1, n + 1))                                  AS idx,\n            arrayMap(i -> formatDateTime(dates[i], '%Y-%m'), idx)         AS months,\n            arrayMap(i -> if(closes[i] > arrayAvg(arraySlice(closes, toInt64(i) - 9, 10)),\n                             log(closes[i] / closes[i - 1]), 0.0), idx)   AS same_bar_logs,\n            arrayMap(i -> if(closes[i] > arrayAvg(arraySlice(closes, toInt64(i) - 9, 10)),\n                             log(closes[i + 1] / closes[i]), 0.0), idx)   AS next_bar_logs,\n            arrayMap(c -> 100.0 * exp(c), arrayCumSum(same_bar_logs))     AS same_bar_curve,\n            arrayMap(c -> 100.0 * exp(c), arrayCumSum(next_bar_logs))     AS next_bar_curve,\n            range(1, length(idx) + 1)                                     AS jj,\n            arrayFilter((mo, j) -> (j = length(months)) OR (months[j + 1] != mo),\n                        months, jj)                                       AS end_months,\n            arrayFilter((eq, j) -> (j = length(months)) OR (months[j + 1] != months[j]),\n                        same_bar_curve, jj)                               AS end_same,\n            arrayFilter((eq, j) -> (j = length(months)) OR (months[j + 1] != months[j]),\n                        next_bar_curve, jj)                               AS end_next,\n            arrayZip(end_months, end_same, end_next)                      AS month_end_marks\n        FROM\n        (\n            SELECT arraySort(groupArray((date, close))) AS bars\n            FROM\n            (\n                SELECT\n                    date,\n                    toFloat64(any(close)) AS close\n                FROM global_markets.stocks_daily_aggs\n                WHERE ticker = 'SPY'\n                  AND date >= '2023-12-01'\n                  AND date <  '2025-01-10'\n                GROUP BY date\n            )\n        )\n    )\n)\nORDER BY month","computed_at":"2026-10-04T15:20:28.740142+00:00","elapsed":0.279109246}