Thales
← research journal
Aug 1, 2026raw markdown ↗

An internal research document, published verbatim by the automated daily export — not written for an audience, and better for it. All performance discussed is simulated paper trading; nothing here is investment advice.

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).