qbuntuqbuntu
marginalregime_dependent· equity· anomaly· calendar· seasonal

Calendar Effects (US S&P 500)

slug: calendar-effects-us-sp500

Calendar Effects (US S&P 500) backtest. Median Sharpe across 192 parameter sets is +0.20. p-value is 0.35. Max DD is -14.4%. Period: 2022-01-14 to 2026-09-17. Best Sharpe +6.18 is not the representative figure.

Verdict: marginal. Some parameter set has a p-value under 0.10, but the median itself misses promising (Sharpe > 0.5 and p-value < 0.05). Results split across up, flat, and down markets, so the median is not stable.

Performance summary

Sharpe (median)
+0.20
Max DD
-14.4%
Win rate
—
Alpha (ann.)
—
p-value
0.35
backtest period: 2022-01-14 → 2026-09-17
Sharpe across 192 grid runs:median 0.20best 6.18 (not representative)worst -2.86p25–p75 -0.53–1.22

Hypothesis

Tests well-known calendar anomalies: Halloween effect, January effect, Turn-of-Month, and Day-of-Week effects. Applied to S&P 500 constituents.

Why it didn't work

Across 192 grid combinations, median Sharpe=0.20, best=6.18. Primary failure mode: regime_dependent.

Facts (5)

Best grid Sharpe ratio is 6.18 (p=0.039).
period 2022-01-14–2026-09-17; cost=5bps
sharpe_ratio6.18
Median Sharpe across 192 grid runs is 0.20.
Full grid of 192 parameter combinations.
sharpe_ratio0.20
Median Sharpe in DOWN regime is -0.08 across 192 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio-0.08
Median Sharpe in FLAT regime is 0.19 across 192 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio0.19
Median Sharpe in UP regime is 0.98 across 192 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio0.98

Runs (30)

runparamssharpeUPFLATDOWN
effect=halloween, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0000
effect: "halloween"
cost_bps: 5
n_stocks: 5
-0.52-0.80-0.59+0.14
effect=halloween, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0001
effect: "halloween"
cost_bps: 5
n_stocks: 5
-0.43-0.70-0.59+0.14
effect=halloween, holding_days=1, n_stocks=5, cost_bps=10, regime_gate=False
r-calendar-effects-us-sp500-0002
effect: "halloween"
cost_bps: 10
n_stocks: 5
-1.47-1.87-1.57-0.58
effect=halloween, holding_days=1, n_stocks=5, cost_bps=10, regime_gate=True
r-calendar-effects-us-sp500-0003
effect: "halloween"
cost_bps: 10
n_stocks: 5
-1.33-1.68-1.57-0.58
effect=halloween, holding_days=1, n_stocks=20, cost_bps=10, regime_gate=True
r-calendar-effects-us-sp500-0011
effect: "halloween"
cost_bps: 10
n_stocks: 20
-1.42-1.87-2.05-0.12
effect=halloween, holding_days=1, n_stocks=50, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0012
effect: "halloween"
cost_bps: 5
n_stocks: 50
-0.79-1.54-1.12+0.78
effect=halloween, holding_days=5, n_stocks=10, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0020
effect: "halloween"
cost_bps: 5
n_stocks: 10
+0.05-0.87+0.53+0.57
effect=halloween, holding_days=5, n_stocks=50, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0028
effect: "halloween"
cost_bps: 5
n_stocks: 50
-0.27-0.60-0.68+0.72
effect=halloween, holding_days=20, n_stocks=5, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0032
effect: "halloween"
cost_bps: 5
n_stocks: 5
+0.06-0.20+0.54-0.25
effect=halloween, holding_days=20, n_stocks=10, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0037
effect: "halloween"
cost_bps: 5
n_stocks: 10
+0.85+1.90+0.95-0.01
effect=halloween, holding_days=20, n_stocks=50, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0045
effect: "halloween"
cost_bps: 5
n_stocks: 50
+0.59+0.63+0.83+0.17
effect=january, holding_days=1, n_stocks=10, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0053
effect: "january"
cost_bps: 5
n_stocks: 10
+2.90+2.14+2.30+9.47
effect=january, holding_days=1, n_stocks=50, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0061
effect: "january"
cost_bps: 5
n_stocks: 50
+2.32+2.97+0.99+7.53
effect=january, holding_days=5, n_stocks=10, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0069
effect: "january"
cost_bps: 5
n_stocks: 10
+2.46+5.77+2.27—
effect=january, holding_days=5, n_stocks=50, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0077
effect: "january"
cost_bps: 5
n_stocks: 50
+4.53+4.41+3.50—
effect=january, holding_days=20, n_stocks=10, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0085
effect: "january"
cost_bps: 5
n_stocks: 10
+5.24+6.56+6.18—
effect=january, holding_days=20, n_stocks=20, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0088
effect: "january"
cost_bps: 5
n_stocks: 20
+6.18+7.13+6.04—
effect=january, holding_days=20, n_stocks=50, cost_bps=10, regime_gate=False
r-calendar-effects-us-sp500-0094
effect: "january"
cost_bps: 10
n_stocks: 50
+4.42+4.46+6.20—
effect=turn_of_month, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0096
effect: "turn_of_month"
cost_bps: 5
n_stocks: 5
-1.68-1.18-2.86-0.49
effect=turn_of_month, holding_days=1, n_stocks=10, cost_bps=10, regime_gate=False
r-calendar-effects-us-sp500-0102
effect: "turn_of_month"
cost_bps: 10
n_stocks: 10
-2.86-3.42-3.61-0.98
effect=turn_of_month, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0104
effect: "turn_of_month"
cost_bps: 5
n_stocks: 20
-1.49-1.33-2.41-0.32
effect=turn_of_month, holding_days=5, n_stocks=5, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0112
effect: "turn_of_month"
cost_bps: 5
n_stocks: 5
+1.14+1.40+0.82+1.23
effect=turn_of_month, holding_days=5, n_stocks=20, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0120
effect: "turn_of_month"
cost_bps: 5
n_stocks: 20
+1.13+1.54+1.08+0.80
effect=turn_of_month, holding_days=20, n_stocks=5, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0128
effect: "turn_of_month"
cost_bps: 5
n_stocks: 5
+1.32+2.04+0.32+2.18
effect=turn_of_month, holding_days=20, n_stocks=20, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0136
effect: "turn_of_month"
cost_bps: 5
n_stocks: 20
+1.21+1.33+0.48+2.78
effect=day_of_week, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-calendar-effects-us-sp500-0144
effect: "day_of_week"
cost_bps: 5
n_stocks: 5
-0.87-1.41-0.08-1.27
effect=day_of_week, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0145
effect: "day_of_week"
cost_bps: 5
n_stocks: 5
-0.52-0.67-0.08-1.27
effect=day_of_week, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0153
effect: "day_of_week"
cost_bps: 5
n_stocks: 20
-0.03-0.41+0.47-0.55
effect=day_of_week, holding_days=5, n_stocks=5, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0161
effect: "day_of_week"
cost_bps: 5
n_stocks: 5
+0.04+2.90-1.43-1.05
effect=day_of_week, holding_days=5, n_stocks=20, cost_bps=5, regime_gate=True
r-calendar-effects-us-sp500-0169
effect: "day_of_week"
cost_bps: 5
n_stocks: 20
-0.43+2.48-1.20-2.50

Target universe

S&P 500 constituents, ~503 stocks

Related strategies

source: qbuntu-analysis · kabu STATION REST API + J-Quants daily bars
computed asof: 2026-09-24T02:22:17

Related strategies