# REBAL01 — 60/40 rebalancing pressure on US100, intraday (PREREG)

**Frozen:** 2026-10-10, committed to git before any market data was read. **Author:** Claude. **Approved:** Kaloyan ("run both", 2026-10-10 18:09 UTC).
**Trial:** +1 (one hypothesis, zero free parameters; every number below comes from the paper or from the project's standing rules).
[withheld: a line that refers to the lab's private live strategy]
[withheld: a line that refers to the lab's private live strategy]
After the freeze nothing changes. Any change = new prereg.

## 1. Source and hypothesis
- Harvey, Mazzoleni, Melone (2025), "The Unintended Consequences of Rebalancing", NBER WP 33554, §5 / Table 7.
  External rule, sample 1997-09..2023-03, Sharpe 1.08 gross, alpha t ~ 5.3, absent 1961–1997.
- Hypothesis: when a simulated 60/40 S&P 500 / 10Y Treasury portfolio is overweight equities, balanced and pension funds
  sell equities the next day and push US100 down in the regular session; the opposite when underweight.
- **Prior lab tests of the family (disclosed):** P102 (end-of-month equity/bond rebalancing, killed as underpowered, n = 24–48),
  X-TILTEOM (month-end SPY/TLT front-run, daily closes, t = 3.48 on 260 trades, unpromotable and venue-blocked),
  P65 (Friday afternoon rebalancing drift), LETF01 (leveraged-ETF rebalance flow). None used the daily Threshold signal,
  none traded US100 intraday on the true clock. The Calendar leg overlaps X-TILTEOM / P102, so it is also reported alone.
  The sign may not be flipped after the fact.

## 2. Signal (daily closes through day t, trade on day t+1)
Data: SPY adjusted close and IEF adjusted close (Yahoo). Trading day = a date present in both series. FRED `DGS10` is a sanity
check only (correlation of IEF daily return with −Δyield; reported, not a gate). Portfolios start at 60/40 on the first common
date (IEF starts 2002-07); everything before 2005-03-01 is burn-in.
- `w` = equity weight at the close of day t, **before** that day's rebalance.
- **Threshold_t:** for each δ in {0.0%, 0.1%, …, 2.5%} (26 bands) a portfolio is rebalanced to 60% at the close of any day on
  which |w − 0.60| > δ. Band signal = w_δ,t − 0.60. Threshold_t = mean over the 26 bands.
- **Calendar_t:** w − 0.60 of a portfolio rebalanced to 60% at the close of the last trading day of each month.
- **C_t:** sign(−Calendar_t) if t is one of the last 5 trading days of its month; sign(Calendar_{t−4}) if t is the first trading day
  of a month (t−4 = four trading days earlier); 0 otherwise.
- **W_t = 0.5 × (−Threshold_t / 0.015) + 0.5 × C_t**, clipped to [−1, +1].
- Trade on t+1: direction = sign(W_t), size = |W_t| × base risk. W_t = 0 → no trade.
- t is the signal day (close), the trade is always the next trading day. Month ends are known in advance from the exchange calendar.

## 3. Execution
[withheld: a line that refers to the lab's private live strategy]
- Entry: open of the 09:35 ET one-minute bar. If 09:35 is inside ±10 min of a Tier-1 USD release, the first allowed minute after.
  (Standard release times are 08:30, 10:00 and 14:00 ET, so 09:35 is never inside a window; no historical calendar is needed.
  For the report-only 10:00 entry the entry is 10:11 ET on every day.)
- Exit: open of the 15:45 ET bar. No overnight.
- Stop: 1.0 × daily ATR(14) from the entry price. ATR = Wilder ATR(14) of the instrument's own regular-session daily bars
  (09:30–15:59 ET; true range uses the previous session close), through day t. If the stop price trades in any bar from the
  entry bar to the 15:44 bar, the trade is booked at −1 stop distance. No take-profit. One trade per day.
- **R of a trade = |W_t| × direction × (exit − entry) / ATR − cost.** 1R = the base risk; the stop is 1 ATR.
- Day is used only if its regular session has ≥ 360 one-minute bars and the 09:35 and 15:45 bars exist. Skipped days are counted.
- **Cost (CFD):** |W_t| × 0.5 × (spread of the entry minute + spread of the exit minute) / ATR, spread = ask_open − bid_open of that
  bar in the file; 0 commission. Where the file has no bid/ask (before 2012-03), the lab model: 1.70 pt round trip at the
  reference price, scaled by price level (IDMOM02 convention). 2x = double.
- **Second source:** NQ futures, LSE `NQ.F` 1m, 2016-06..2026-10-09, same rule, ATR from its own bars.
  Cost = 1 tick (0.25 pt) slip per side + $1.50 per MNQ round trip (0.75 pt) = 1.25 pt round trip.

## 4. Samples
- Full: 2005-03-01 .. 2026-10-09 or the last day in the CFD file, whichever is earlier (CFD).
- Out-of-authors OOS: trade dates 2023-03-18 .. end.
- Halves: 2005–2015 / 2016–2026.

## 5. Gates (t = mean / sd × √n over traded days, R as defined in §3)
- **K1 (SCREEN):** full CFD, net 1x, t ≥ 2.0 and mean > 0.
- **K2:** OOS net 1x t > 1.0, same sign.
- **K3:** full CFD at 2x cost, t > 1.0.
[withheld: a line that refers to the lab's private live strategy]
[withheld: a line that refers to the lab's private live strategy]
- **K5:** random-200 placebo: the W series is shuffled across the eligible trade dates 200 times; p = (1 + #{t_perm ≥ t_obs}) / 201 < 0.05 (net 1x).
- **K6:** both halves net 1x mean > 0.
- **K7:** NQ 2016–2026, futures cost, same sign and t > 1.0.
- All seven pass → FLAG (forward paper only). Any fail → KILL / REJECT. FAIL ANYWHERE = FAIL.
- **Promotion** needs t ≥ 3.43 + OOS + LEAN (RULES §2 / §8). The report only states whether it was reached.
- Smell test: t > 5 is treated as a bug until the lag and join checks pass.

## 6. Report-only (not gates)
- Close-to-close US100 variant (sign(W_t) × |W_t| × return from the 15:59 close of t to the 15:59 close of t+1): how much is overnight.
- Threshold-only (W = clip(−Threshold/0.015)) and Calendar-only (W = C_t).
- Entry 10:00 ET (10:11 by the news rule).
- Flip-all bug check (flipped gross must be negative if the original is positive).
- Leak test (CLAUDE.md §5b.11): signal at lag 0 (same-day, lookahead), lag 1 (the spec), lag 2.
- Bar phase −3..+3 min (§5b.9). Join integrity asserted before every merge (§5b.10).
- Always-long / always-short on the same days (drift). By-year table.

## 7. Forbidden after the freeze
Other bands, other weights, a 70/30 target, a window other than 5 days, other entry or exit times, filters.

## 8. Power
One trade on almost every day: about 5,300 trades on the CFD file. SD of R is expected near 0.3–0.4 (size |W| < 1, stop 1 daily ATR).
t = 2 needs a mean of about +0.010R; t = 3.43 needs about +0.017R. The out-of-authors window (~890 days) can show t > 1 only
for a mean above about +0.012R.

## 9. Files
`_rebal01.py`, `_rebal01_trades.csv` (timestamp, W, R, cost), `_rebal01.out`. Verdict goes to `CANDIDATES.md`; trial ledger +1.
