# Turn-of-Month Forward Attribution — Pin (pre-registered 2026-08-01, panel item B5)

**Status: BINDING LABELS ON A RUNNING EXPERIMENT — report-only, never gates.**
The live momentum book selects its 50 names on the first trading day of each
month (the "day-1 schedule"), and that schedule is the **rank-1-of-8**
start-day draw: `thales start-day-sweep` (2026-07-05, corrected engine)
showed the same signal gives frozen-window Sharpe 0.795 on day-1 but
**mean 0.093, median −0.107, range [−0.324, 0.795]** across the eight
monthly-schedule start days — five of eight negative, only near-boundary
starts positive. Two readings fit: a real **turn-of-month structure**
(returns clustering at month boundaries — plausibly pension/payroll flows)
that near-boundary schedules genuinely capture, or plain **schedule luck**.
The live book is already running the decisive forward experiment, unlabeled.
This memo pins the labels, the judged statistic, and the three admissible
verdicts — before any phase-conditioned number exists. It changes no
trading behavior and feeds no gate, ever.

**Attestation.** No phase-conditioned read of the live track preceded this
pin. Basis, recorded 2026-08-01: the only day-of-month machinery in the repo
is the backtest sweep knob (`engine.py` `day_of_month`, gated, default off);
the turn-of-month entries in RESEARCH.md are **backtest schedule analyses**
— the 2026-05-29 AFK arc (pre-audit engine, and it assumed a live cadence
that was later corrected) and the 2026-07-05 start-day-sweep quoted above —
none touches the live return series by phase; repo search shows no
live-phase consumer and the operator's research log records none. Nobody —
including the author of this memo — computes any phase-conditioned live
statistic before the month-12 evaluation.

---

## 1. The pinned phase

- **Turn window** = the **last 1** trading day of each calendar month plus
  the **first 3** trading days of the next — the four days bracketing each
  month boundary (which also bracket the live book's selection event).
  **Mid-month** = every other trading day. Each trading day gets exactly one
  label: turn if it is the last trading day of its month or among the first
  three of its month; else mid.
- Trading days per the NYSE calendar (`utils/calendar.py`, backed by
  `pandas_market_calendars`) — weekends and exchange holidays are not days.
- When the evaluation code is eventually built, this definition gets a
  lockstep test (code pinned to this text). No code exists today by design —
  the memo is the deliverable; building the hook now would invite premature
  peeking.

## 2. The judged series

- **Live returns:** daily returns of the momentum sleeve's paper account
  from `data/processed/equity_history.jsonl` (date, equity) — the same
  series the oos-monitor consumes. This lane continues as the comparator
  regardless of the December go-live outcome (the C6 assumption); a go-live
  event does not end or reset this experiment, only gets flagged in the
  report.
- **Active return** = live daily return − SPY daily return, SPY from the
  `close` column (adjusted) of `data/raw/SPY.parquet`. This is the house
  convention (oos-monitor benchmark companion; the C8 registration): a
  simple difference, deliberately estimation-free and unshoppable — "a
  formal alpha regression is deliberately NOT the headline" is already
  pinned in that code.
- **The known bias, signed in advance:** the book runs beta ≈ 0.5, so
  active ≈ alpha − ~0.5 × SPY. If the *market itself* has a positive
  turn-of-month effect, roughly half of it leaks into active returns with a
  **negative** sign — biasing the statistic **against CONFIRMED** and toward
  REFUTED. Accepted: it errs conservative on the claim being tested. To
  keep the mechanism legible, the evaluation must also print — as
  descriptive context that can never alter the verdict — the same turn-vs-
  mid decomposition for (a) SPY itself and (b) the raw (unhedged) live
  returns.
- Days missing from the equity history (a cron that died pre-persist) are
  simply absent; the evaluation reports the missing-day count. The
  broker-truth backfill (`portfolio backfill-equity`) reconstructs the same
  lane and is allowed.

## 3. The judged statistic and its uncertainty

- **Δ = mean(active return | turn days) − mean(active return | mid days)**
  over the decisional window. Units: return per day. Predicted sign under
  the turn-of-month reading: positive.
- **Uncertainty: month-block bootstrap.** Resample the window's **calendar
  months** (the block unit, ≈ 21 trading days — long enough to preserve
  each month's internal turn/mid composition and short-range dependence)
  i.i.d. with replacement to the original month count, recompute Δ each
  time. **Pinned parameters: block = one calendar month; B = 2,000
  resamples; confidence interval = percentile method, 95% two-sided; RNG
  seed = 20260801.** In plain terms: reshuffle whole months 2,000 times and
  ask what range of turn-vs-mid gaps the reshuffles produce.

## 4. The decisional window (and the flagged prelude)

- **Decisional window: 12 clean months from the pin date** — calendar
  2026-08-01 through 2027-07-31; trading days **2026-08-03 (Mon) through
  2027-07-30 (Fri)**. About 48 turn days and ~200 mid days. Edge
  composition, pinned so no one re-derives it later: the July→August 2026
  boundary contributes only its first-3 days (its last-of-July day predates
  the window); the July→August 2027 boundary contributes only 2027-07-30
  (the last trading day of July 2027).
- **The prelude:** the ≈ 35 trading days already accrued on the clean live
  clock (2026-06-11 → 2026-07-31; the panel's "~36"). At evaluation these
  are reported **only as a clearly-flagged prelude section** — they predate
  this pin, so they **never enter Δ, the bootstrap, or the verdict**. They
  are not computed before the evaluation either (§ attestation).
- **Month-24 extension window** (only if triggered by the INSUFFICIENT
  outcome): through 2028-07-31 (a Monday and trading day), same statistic,
  same bootstrap parameters, **no changes of any kind**.

## 5. The three pre-pinned outcomes

From the panel report, verbatim: *"Three pre-pinned outcomes: CONFIRMED
(interval excludes zero, right sign); REFUTED (signed-negative point
estimate - schedule-luck reading adopted); INSUFFICIENT (positive, interval
spans zero - clock extends to a pinned month-24 read, no parameter
changes)."* Operationalized:

- **CONFIRMED:** Δ > 0 and the 95% CI excludes zero. Reading: the day-1
  schedule's edge is turn-of-month structure, to the extent this window can
  see it. Still report-only — CONFIRMED changes no config and passes no
  gate.
- **REFUTED:** Δ ≤ 0 (point estimate; no CI required). Reading adopted: the
  rank-1/8 headline was **schedule luck**; the across-schedule mean is the
  honest planning number. Note the asymmetry is deliberate and conservative:
  REFUTED triggers easily (sign only) and its consequence is the *cautious*
  deployment reading — with the §2 leak this can fire even if a modest real
  effect is masked, and that error costs prudence, not capital.
- **INSUFFICIENT:** Δ > 0 with the CI spanning zero → the clock extends to
  the pinned month-24 read (§4), no parameter changes. At month-24 the same
  three outcomes apply, except INSUFFICIENT becomes terminal:
  **INSUFFICIENT-FINAL**, no reading adopted, no further extension.
- **Termination clause** (pinned now because the paper lane can die: the
  DEGRADED retire rule is live): if the momentum paper lane stops trading
  or its selection schedule changes before a window completes, compute and
  report Δ on the days accrued, verdict **INSUFFICIENT-BY-TERMINATION** —
  no reading adopted.

## 6. Power, printed (do not overclaim)

~48 turn days/year against ~200 mid days. The expected t-statistic is
scale-free (both the effect and the noise scale with the book's volatility):
if a fraction *f* of the full day-1-vs-mean-schedule Sharpe gap
(0.795 − 0.093 ≈ 0.70 annualized) is genuine turn-of-month concentration,

- t ≈ 0.70 × f × √252 ÷ (48 × √(1/48 + 1/200)) ≈ **1.4 × f** at month 12
  (t ≈ 1.4 if the entire gap is structure, ≈ 0.7 at half), ×√2 at month 24
  (≈ 1.0–2.0).

So **t ~ 1 at month 12** (the panel's figure): CONFIRMED at month 12 is
unlikely even if the structure is fully real; **INSUFFICIENT is the modal
outcome**, which is exactly why the month-24 extension is pre-pinned. This
design labels an experiment that is already running for free — it does not
pretend to be a powered test, and no one may quote its non-result as
evidence against the effect.

## 7. Policy decoupling (pinned)

**Deployment planning may adopt the conservative across-schedule mean
(≈ 0.09, the pinned 2026-07-05 sweep's 0.093) as its planning Sharpe at ANY
time, as policy — decoupled from this verdict.** Choosing prudence needs no
experiment: adopting the conservative number neither waits for, prejudges,
nor is revoked by any outcome above. This experiment only ever settles the
*attribution* question, not the planning posture.

## 8. Change discipline and follow-ups

Append-only after today: corrections and context arrive as dated appends
below this line, never edits above it.

- **Follow-up (owner: Dan / the 2027-08 session):** run the month-12
  evaluation after 2027-07-30 — build the small phase-decomposition hook
  then, with the §1 lockstep test pinning it to this memo, and file the
  verdict in RESEARCH.md next to this memo's entry.
- No code ships with this memo, by design.

*Panel-Item: B5 — new-alpha strategist, red-team revisions folded in
(decisional window starts at the pin date, accrued days demoted to a flagged
prelude; phase pinned; bootstrap parameters pinned; attestation; power
stated; verdicts pre-pinned; policy option decoupled).*
