oddsx · read-only research status
Generated 2026-09-14T10:00:49Z · HEAD 9612e75

fundamental_arb_exec dossier — does the short-horizon Black-Scholes edge survive executable entry prices, OOS, net?

Status: FALSIFIED under the pre-registered rule (results 2026-09-14, commit 7542179). Executable fills remove the fundamental_arb_short edge; not promoted. Pre-registered 2026-09-14 as a separate hypothesis, after the fundamental_arb_short post-hoc diagnostics pointed to a stale-price artifact and before any fundamental_arb_exec result was computed.

Pre-registration

Frozen with the G4c checks in tests/g4c/. Nothing below may change after a result exists; a change means a new, separately registered hypothesis.

Hypothesis. For Polymarket markets that ask whether an asset's price will be above, below, or touch a strike by a date, a Black-Scholes fair probability (archived fundamental_arb pricer, realized volatility) identifies mispriced YES prices. Taking the model's side when the gap is large earns a positive net return out of sample and beats a no-skill benchmark under the same costs.

This is a limited test. Volatility is realized volatility for every asset. The archived bot preferred ATM implied volatility for equities; that variant is not tested here.

Universe.

Decision time. One decision per market.

YES price at decision. Price of trades in [t_dec − 10 min, t_dec), weighted by token_amount.

Entry (fill) price. The signal still uses the YES price above; the bet is filled at an executable price.

Model inputs.

Signal. edge = p_model − yes_price.

Returns. Hold to resolution, $1 notional per bet, at p = fill_price.

Costs. oddsx.research.validation cost model on fill_price, spread 0.02.

Split. Calendar split on t_dec: TRAIN before 2026-07-01T00:00:00Z, TEST on or after it. TRAIN is reported, never used to choose anything.

Benchmark. The favorite null on the filled decisions, same costs, at fill_price. Buy YES when yes_price ≥ 0.5, otherwise sell YES. edge_vs_naive = strategy TEST mean net − benchmark TEST mean net.

Verdict rule (TEST, pooled).

Also reported (no effect on the verdict).

Promotion. A VALIDATED verdict does not move anything into strategies/. Promotion is a separate operator decision.

Results

Computed by research/hypotheses/fundamental_arb_exec/run.py --results on runs/g4c/decisions.parquet (commit 7542179). Numbers are copied from registry/results/fundamental-arb-exec.json and runs/g4c/universe.json.

Universe accounting. 106,318 markets parsed in the window; 29,623 kept (one decision each), the same universe as fundamental_arb_short. Exclusions:

reasonmarkets
end − t_dec under 30 minutes33,872
no trades26,595
no YES trade in the 10 minutes before t_dec8,061
not cleanly resolved5,042
between side3,125

Fill accounting. 4,421 of the 29,623 decisions have a fill trade in [t_dec, t_dec + 10 min). Fill delay after t_dec: median 198 s, p10 17 s, p90 492 s. Signals: TRAIN 1,546 (627 filled, 919 unfilled), TEST 1,228 (516 filled, 712 unfilled). These signal counts equal fundamental_arb_short's bet counts, as they should: the signal is unchanged.

TRAIN vs TEST (pooled, $1 per bet at fill_price, net of costs unless stated).

metricTRAINTEST
n_decisions13,07416,549
n_bets (signalled and filled)627516
n_unfilled_signals919712
mean_gross+0.2214−0.0988
mean_net+0.1125−0.2449
median_net+0.0386+0.0088
Sharpe (bet-level)+0.0261−0.1457
favorite-null mean_net+0.1043−0.0504
edge_vs_naive+0.0082−0.1945
cluster-bootstrap 95% lower bound of mean_net−0.1474−0.3901
top-1% |net PnL| share0.27290.1434

TEST cohorts (reported, no vote). crypto|above: 515 bets, mean net −0.2456. crypto|touch_above: 0 bets. stock|above: 1 bet, mean net +0.1202.

Tails. In TEST the median is slightly positive (+0.009) while the mean is −0.245: many small wins are outweighed by full −1 losses. The largest 1% of bets carry about 14% of absolute PnL, so the loss is not a few outliers. In TRAIN the mean is about three times the median (+0.113 vs +0.039) and the largest 1% carry about 27% of absolute PnL; even TRAIN barely beats the favorite null (+0.008) and its lower bound is negative.

Caveats.

Post-hoc diagnostics (not part of the verdict)

Computed by the controller on 2026-09-14, after the verdict. None of this was pre-registered and none of it changes the verdict below. It bears on why the fundamental_arb_short edge disappears.

  1. No selection bias from unfilled signals. TEST signals valued at the stale signal price (fundamental_arb_short economics): filled n = 516, mean net +0.179; unfilled n = 712, mean net +0.120. The unfilled signals were not the better ones, so dropping them does not explain the loss.
  2. The price moves against the signal. Fill price minus signal price, in the bet's direction: median +0.044, mean +0.089. 67.4% of fills are worse than the signal price.
  3. Same bets, two prices. The 516 filled TEST bets earn +0.179 net at the stale signal price and −0.245 net at the executable fill.
  4. Fill speed does not save it. Mean net at signal price → at fill, by fill delay:
fill delaynat signal priceat fill
0–60 s104+0.295−0.129
60–300 s237+0.249−0.286
300–600 s175+0.014−0.258
  1. Conclusion for fundamental_arb_short (G4b). Its frozen-rule result (TEST mean net +0.145) is explained by stale YES prices. With executable entry the edge disappears.

Verdict

FALSIFIED

Under the pre-registered rule, TEST has 516 bets (above the 200 floor), and all three conditions fail: mean net −0.2449 ≤ 0, edge_vs_naive −0.1945 ≤ 0, and the cluster-bootstrap 95% lower bound −0.3901 ≤ 0. The protocol verdict is recorded as computed.

Plain conclusion: the short-horizon Black-Scholes signal has no executable edge on these markets. fundamental_arb_short's result was a stale-price artifact: the market price catches up to the model before a bet can be filled. Do not paper-trade or promote any fundamental_arb variant; nothing moves into strategies/.