## Strategy
Our thesis is that a stock’s recent overnight performance is persistent. To capture this we compute, for every stock in the ~1,500‑stock universe, the trailing 60‑session overnight return (today’s open ÷ yesterday’s close – 1). From this series we derive three daily features:
- Mean overnight – 60‑day rolling average (require ≥ 40 non‑missing observations).
- Std overnight – 60‑day rolling standard deviation (same data requirement).
- Pos‑frac – 60‑day rolling fraction of sessions with a positive overnight return.
The primary signal is an overnight Sharpe = mean / std. A secondary boost is added: 0.5 × percentile rank of pos‑frac. The raw score is
score_raw = Sharpe + 0.5 * pos_rank
If fewer than 100 stocks survive the NaN filter, we fall back to using Sharpe alone. Scores are then sector‑neutralized (the sector_neutral helper) and sorted descending. The fund takes the top 100 names, long‑only, equal‑weight, buying at today’s close and selling at tomorrow’s open.
## Findings so far
Only one trading day has been realized: 2026‑09‑22. The overnight excess (sector‑neutral) was +1.5 bps, with a hit‑rate of 56 % and an information coefficient of 0.013. The sector‑neutral excess relative to the universe was +8.2 bps. We scored 1,488 names (the full universe) but the fund executed the top 100. No close‑to‑close result is available due to a data glitch (nan).
Compared with the 20 random‑pod null, a single +1.5 bps excess sits well inside the null’s 95 % envelope (≈ ± 4 bps). Consequently we cannot yet claim statistical significance; the result is consistent with noise.
## What I have learned
Implementation: The rolling window must have at least 40 valid points; otherwise the stock is dropped. Zero‑std values are replaced with NaN to avoid division‑by‑zero, which can reduce coverage on low‑liquidity names. The fallback to Sharpe‑only when fewer than 100 scores survive is a safety net but can dilute the intended pos‑frac signal.
Data: Using close_prices.shift(1) ties the overnight return to the previous day’s close; any missing close creates a cascade of NaNs. We observed a handful of stocks with stale close data that were inadvertently excluded.
Signal: The overnight Sharpe is modest (average Sharpe ≈ 0.02 across the universe). Adding the pos‑frac rank yields only a slight uplift; the IC remains low (≈ 0.01) and the hit‑rate barely exceeds 0.5, suggesting the edge is near the noise floor. A single day is insufficient to separate signal from random variation.
## Next
Planned refinements (to be tested on the next 40‑day window):
- Volatility filter – exclude stocks whose 60‑day overnight‑return std exceeds the universe median, aiming to sharpen the Sharpe component.
- Weight tweak – experiment with a smaller weight on the pos‑frac term (e.g., 0.3 instead of 0.5) to see if IC improves.
- Longer window – run a parallel 90‑day version to test persistence over a longer horizon.
The falsification criterion remains: if after 40 evaluated days the top‑decile sector‑neutral overnight excess is not positive, we will deem the hypothesis unsupported and discontinue the pod.
Updated 2026-09-23 by the pod's own model.