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.

Skew Stream — Pinned Activation Test (pre-registered 2026-08-01, panel item B4)

Status: BINDING, append-only after today. This memo closes the open clause in the options_skew capture registration (CAPTURES.md): "escalate … only if a residual long-only large-cap signal appears in 12–18 months" named no test, so the mid-2027 evaluator could have chosen whichever definition flattered the preferred outcome. The test is pinned now, while the track is too short to peek at (the placebo-ensemble precedent: pinned at day 22).

Attestation. As of this pin, no skew-vs-return statistic of any kind has ever been computed on the accrued capture. Basis, recorded 2026-08-01: the only readers of the skew JSONL in the repo are the capture writer and the integrity QA (capture-qa) — load_skew() has zero consumers outside data/options_skew.py; RESEARCH.md and the evaluation ledger contain no skew-return join; the operator's research log records none. The full accrual from stream inception (2026-06-09) is therefore legitimately usable as test data: the test is being named before anyone has seen what it would say.

What the thresholds gate: SPENDING, not truth. Passing authorizes buying retail option-chain history (legitimate since the scarcity retirement, memory/options-skew-feasibility 2026-07-21) to run a proper backtest behind a NEW hash-frozen registration and the full SHIP gate. Passing here ships nothing and proves nothing; failing here proves no absence — it closes this shop's wallet and attention on the question, permanently.


1. The hypothesis and its rebuttal, plainly

Under test: steep put skew — downside insurance (out-of-the-money puts) priced rich relative to at-the-money options, a fingerprint of informed sellers — predicts poor stock returns (Xing–Zhang–Zhao 2010).

The rebuttal: Muravyev–Pearson–Pollet show the predictability is largely a stock-borrow-fee artifact: when a stock is hard to borrow, market makers hedging puts must pay the borrow fee, which mechanically steepens the put skew; the associated "alpha" lives in shorting those names — a leg this long-only book cannot trade. The shop owns data on both sides of the argument (the skew capture; the FINRA days-to-cover and Alpaca shortability captures), so the test must both measure the signal and attribute it.

The original design would have conditioned on the binary hard-to-borrow flag. That flag is degenerate on this universe — 0 of 889 Russell-1000 names were hard-to-borrow at the shortability registration — and a conditioning branch that can never fire would launder "artifact not confirmed" out of a test that could not have confirmed it. It is replaced by graded constraint measures (§5) with an explicit UNDECIDABLE clause.

2. The pinned skew measure (real captured fields; no substitutes)

  • Signal = the skew field of data/options_skew.jsonl, defined at capture as iv_put_25d − iv_atm_call: the implied volatility of the ~25-delta put minus that of the at-the-money call, on the single expiry nearest 30 days out (window 20–45 days), as computed by data/options_skew.py:compute_skew. Present since stream inception 2026-06-09. Higher = steeper put skew (puts rich); the predicted relation to future returns is therefore negative.
  • The later cs_* smile fields (captured since 2026-06-10) are not admissible alternates. No re-derived variant, transform, smoothing, or z-scoring may be substituted at evaluation. Rank statistics (§4) make winsorization moot, so none is applied.
  • Duplicates: if a (date, symbol) pair appears more than once (heal re-runs append), the last row in file order wins.
  • No liquidity filter: every row with a finite skew enters. The capture's own leg-matching already excludes unquotable names; adding a contract-count floor now would be an extra knob with no pre-stated need.

3. The pinned weekly panel

  • Signal dates: within each ISO calendar week (Mon–Sun), the last capture date carrying ≥ 400 valid skew rows (roughly half the ~890-name daily recovery — a partial, mid-crash capture cannot stand in for the cross-section). A week with no qualifying date is skipped (missing, never interpolated).
  • Cross-section: all valid rows on the signal date. The capture universe IS the production Russell-1000 run list at capture time — no retroactive membership edits.
  • Forward return for signal date s with next signal date s′: adjusted close(first trading day after s′) ÷ adjusted close(first trading day after s) − 1, per name. Skipping one day before measuring mirrors the repo's .shift(1) no-lookahead convention (the 19:00Z snapshot can land in-market); chaining each window to the next signal date makes consecutive returns non-overlapping by construction. If s′ − s exceeds 10 trading days (a dead-cron stretch), the observation is dropped rather than becoming one giant-horizon week.
  • Return source: the close column (Tiingo-adjusted) of the owned frozen store data/raw/, read at evaluation time — the single resolution point the whole apparatus uses. Vendor re-basing rescales a name's entire past by a constant, so week-over-week return ratios are stable. Names missing the forward close (delisted mid-window) are dropped from that observation — this biases against finding the effect (the crash tail is where steep-skew blowups live); accepted for a screen and stated here so it cannot be discovered later.

4. The three pinned statistics (the whole family — nothing else counts)

S1 — PRIMARY: weekly cross-sectional rank-IC. Per signal date, the Spearman rank correlation (do names rank the same on both lists?) between skew and forward return across the cross-section. This is the information coefficient ("IC"): one number per week saying whether steep-skew names underperformed that week. Judged statistic: t = mean(IC) ÷ sd(IC, ddof=1) × √N over all N weeks from 2026-06-09 through the checkpoint date. Predicted sign: negative. Chosen as primary for power: ~890 names × ~54 weeks is the largest sample any owned consumer can produce.

S2 — SECONDARY: the momentum-top-100 de-selection spread — the only sanctioned consumer (a defensive de-selection filter on the momentum sleeve), measured directly. Per signal date:

  1. Rank the universe by the production momentum composite exactly as features/indicators.py computes it under the momentum sleeve's pinned config (strategy.momentum: lookback 252, skip 5, smoothness_window 21, smoothness_weight 0.5; .shift(1) convention; prices from data/raw). Take the top 100.
  2. Among the top 100 with valid skew that week (require ≥ 50, else the week is skipped for S2), the steepest-skew quintile = the ⌈n_valid/5⌉ highest-skew names. Vetoed set = top-50 names in that quintile. Replacement set = the same count of highest-momentum names from ranks 51–100 not themselves in the quintile.
  3. Spread = equal-weight forward return of the vetoed set − same for the replacement set. Weeks where the veto binds zero names are skipped, and the bind rate is reported (a filter that never binds is vacuous — the same vacuity discipline as the shortability registration).

Judged statistic: t of the mean weekly spread, as in S1. Predicted sign: negative (vetoed names underperform their replacements). Reported with its confidence interval as the economics read; it is not expected to carry power (§7).

S3 — CONDITIONING: days-to-cover decile contrast (the artifact test). Days-to-cover = short interest ÷ average daily volume — how many days shorts would need to buy back; a graded how-crowded-is-the-short-side measure, from the owned FINRA capture (data/short_interest/<settlement>.parquet, column days_to_cover). Knowledge rule: a partition is usable on signal dates ≥ its settlement_date + 9 business days (published ~T+7; +2 cushion — the same publication-lag discipline item A4 demands of the engine hook). Per signal date, deciles (ten equal buckets by rank) of days-to-cover within the joined cross-section; contrast = IC within the top decile (most constrained) − IC within deciles 1–5 pooled (unconstrained half). Judged statistic: t of the mean weekly contrast. Negative = the effect concentrates in constrained names (supports the borrow-fee-artifact reading); positive = concentrates in unconstrained names (supports a clean signal).

  • Decidability floors: a week counts only if the top decile holds ≥ 30 names with valid skew and return and the pooled half ≥ 150. If fewer than half of otherwise-valid weeks pass, S3 is declared UNDECIDABLE-ON-THIS-UNIVERSE for that checkpoint: the attribution question was not answerable here, and the evaluation may NEVER report it as "artifact not confirmed". The family shrinks to S1/S2; the per-test bar does not loosen.

Attribution companions (outside the family, report-only, same floors): the margin-requirement tail (data/shortability/, names with maintenance_margin_requirement > 30 — known n ≈ 4 in-universe at pin time, so expected UNDECIDABLE, stated now so its silence cannot be spun), and item B2's option-implied borrow-fee wedge if and only if B2's own registration has validated it (or graded it usable-as-ranks) by the checkpoint — if B2 is unbuilt or unvalidated, the branch is simply ABSENT and its absence carries zero evidential weight.

5. The decision rule (both checkpoints, verbatim)

  • Family: exactly S1, S2, S3. Bar: |t| ≥ 2.4.
  • Authorization (either checkpoint): S1 or S2 clearing the bar in the predicted (negative) direction, or S3 clearing it in either direction (its sign is the attribution and both signs are informative). A wrong-sign S1/S2 clearing 2.4 does NOT authorize — chasing a flipped sign is the instability trap the feasibility memo warned about; it is recorded as an anomaly, nothing more.
  • What authorization means: the operator MAY buy retail chain history (the dollars are Dan's call — panel §6.4); any purchased-history study runs behind a NEW hash-frozen registration and the full SHIP gate. If the authorizing statistic is S3 in the negative (artifact) direction, the purchase memo must state in its first paragraph that it would be testing the constraint channel — redundancy with the free FINRA days-to-cover screen is the live risk.
  • Why 2.4: with three looks, per-test p ≈ 0.008 (one-sided, S1/S2) + 0.016 (two-sided, S3) gives a false-authorization rate ≈ 3.3% per checkpoint by union bound — the conventional ~5% family bar, held with room. The two checkpoints share their data (the second contains the first), so the combined rate across both looks stays well under the naive doubling.
  • Checkpoints: data through 2027-06-30 (month ~12), evaluated after that date; data through 2027-12-31 (month 18), evaluated after that date. Nothing between, nothing before, nothing after — no interim computation of any of these statistics is permitted (the daily capture-qa integrity checks touch no returns and do not count).

6. The kill, verbatim

Below the bar at both checkpoints → the stream demotes to insurance: the capture may keep running (near-zero marginal cost, and the chains/IV consumers under other registrations — B1's term structure, the VRP research class — are unaffected), but the stock-signal escalation door closes permanently. No purchased history, no v2 of this hypothesis on this apparatus, and future proposals may not cite the accrued skew as "untested potential". No relitigation.

7. Power, printed (screen-grade, not SHIP-grade)

Let λ = mean(IC)/sd(IC) per week — the per-week signal-to-noise. Expected t at N weeks is λ√N. Checkpoint 1 has N ≈ 54 usable weeks (55 calendar weeks from inception minus expected misses); checkpoint 2 N ≈ 80.

λ (per-week IC signal/noise)E[t] @ ckpt 1P(clear 2.4)E[t] @ ckpt 2P(clear 2.4)
0.15 (plausible: large-cap, post-decay)1.10~10%1.34~15%
0.25 (optimistic: full published all-cap strength)1.84~29%2.24~44%

Even at the optimistic effect size the design clears the bar less than half the time by month 18. That asymmetry is deliberate: the bar guards the wallet (few false purchases), so a PASS is strong evidence of signal while a FAIL is weak evidence of absence — and the spending door closes on a FAIL anyway, because this shop budgets attention, not just truth. S2 is a ~20-vs-20-name portfolio difference dominated by idiosyncratic noise: reported for magnitude and bind rate, not expected to carry power. S3's power depends on how the effect splits across deciles; no claim is made.

8. Change discipline

Append-only after today, like the December memo: corrections and context arrive as dated appends below this line, never edits above it. The paired CAPTURES.md amendment (same date, panel B4) supersedes the unnamed-test clause and the "~June-30 / ~Aug" revisit points in the original registration; the original text stays in place, per the registry's append-only convention.

Panel-Item: B4 — merged derivatives-PM + new-alpha-strategist proposal, red-team revisions folded in (single binding primary; degenerate-flag replacement with the UNDECIDABLE clause; spending-not-truth framing; two pinned dates only).