---
name: CLV/spread finding — edge is real but spread tax eats it
description: Closing-line value analysis showing the side-selection signal is genuine but execution at the ask bleeds it; motivates below-ask limit orders (Phase 4)
type: project
---

Analysis run 2026-05-30 on `live_data/*.csv` (395 signal games, entry snapshot = first PRE row where B365 OR Kalshi CLV in [0.05,0.12), close = last PRE snapshot).

**Findings:**
- Pure line movement entry→close (mid→mid): **+0.30¢ toward our side, t=+3.88** — stronger/less-noisy than the 2.48σ on W/L results because it uses all 395 bets, not just 84 wins. Strong evidence the side-selection has real information (not pure luck).
- But avg bid-ask spread at entry = **1.47¢ (~0.73¢ half-spread cost)**. We take the ask, so we pay ~0.73¢ to capture ~0.30¢ of line move → **net execution CLV is negative**. This is the Polymarket "spread tax."
- Raw entry-ask vs close-mid was −0.43¢ (t=−5.47) but that's biased by comparing ask to mid; the unbiased mid→mid is +0.30¢.

**Why it matters:** Resolves the user's "we just got lucky" doubt (2026-05-30). The edge is likely real but THIN, and current market-taking execution bleeds most of it — explaining why realized W/L feels so fragile. EPL (E0) remains the worst league (n=19, −65% ROI); excl-EPL the W/L edge is +2.80σ.

Caveats on the t=3.88: "close" = last pre-kickoff snapshot (was hourly cadence, now 15-min as of 2026-05-30), and bets aren't fully independent (same-day/league moves), so it's strong but not 5σ-clean.

**Below-ask limit orders DON'T work — tested & rejected 2026-05-30.** Backtested resting a BUY YES limit at ask−1/2/3¢ on the same 395 games (fill = a later pre-ko ask reaches our price). Result: at −1¢ fill rate 37% and P&L collapses +$213→+$19 (Z 1.73→0.24); −2¢/−3¢ go negative. **Cause: adverse selection** — a below-ask limit fills preferentially on bets where the line moves AGAINST us (losers); the winners (line moves up, toward us — the source of the +0.30¢ avg) walk away from the resting limit and never fill. The +0.30¢ avg line move is real but UNHARVESTABLE passively. So Phase 4 (limit-below-ask) is a dead end; **stay at-ask (current behavior, 100% fill, Z=1.73).** Implementation would've been trivial (~5 lines: offset config + price_cents adjust at daily_signals.py:1181 + GTD expiration_ts wiring in kalshi_trader.place_limit_order) — the plumbing isn't the problem, the strategy is.

**How to apply:** The edge is real but thin; don't chase execution tricks (below-ask limits backfire). Better levers are selection-side: cut structurally-losing leagues (EPL/E0 worst), and the user's "ride out variance" stance (see feedback_ride_out_variance.md) to gather more data at small $3 size.
