Skip to content

Latest commit

 

History

History
126 lines (80 loc) · 8.79 KB

File metadata and controls

126 lines (80 loc) · 8.79 KB

Do Prediction Markets Contain Tradeable Alpha?

A quantitative research project on the efficiency of Kalshi prediction markets — using causal-inference signals, cross-asset generalization tests, and a live-deployed paper-trading system.

Independent quantitative research by Chip Dullanty (2026). Solo end-to-end: research design, data engineering, statistical validation, and live cloud deployment.

Methods: Liang–Kleeman Information Flow (LKIF), microstructure arbitrage, options-implied mispricing. Data: ~0.5M trades / $94M volume of Kalshi S&P 500 contracts, plus BTC, ETH, MLB, NFL, NCAAF, and SPX 0DTE options.


TL;DR

I applied a directional causal-inference technique (Liang–Kleeman Information Flow) to prediction markets, then stress-tested every apparent edge with walk-forward validation, Monte-Carlo permutation tests, and out-of-sample replication across six asset classes. I built a live paper-trading system deployed on a cloud server to confirm the one edge that looked real.

The honest headline: Kalshi's liquid markets are efficient enough that no retail-accessible signal survived clean out-of-sample testing. Two candidate edges looked promising in-sample; both evaporated forward. That negative result — rigorously established rather than assumed — is the point.

This repo demonstrates: quantitative research design, statistical validation, intellectual honesty about false positives, and the engineering to test ideas live rather than just in a notebook.


What's in here

Area What I did Verdict
Core LKIF signal (src/core) Stitched 1 year of Kalshi S&P 500 contracts into a continuous series; built a multi-channel LKIF signal; walk-forward + Monte-Carlo tested it Signal exists, not profitable — carries faint information (p=0.007) but the market structure bleeds capital
Generalization (src/generalization) Re-ran the strategy on BTC, ETH, cross-asset SPY, and long-only variants Failed — the one in-sample winner (BTC contrarian) flipped sign out-of-sample on ETH
Sports microstructure (src/sports) Measured sum-to-one overround and arbitrage on 1M+ MLB/NFL/NCAAF quotes; tested a favorite-maker strategy Arb is real but untradeable — median depth ~17 contracts; MLB favorite-maker was the only edge that validated
Options-vs-Kalshi (src/options_edge) Compared Kalshi implied probabilities to SPX 0DTE options via Breeden–Litzenberger; recovered the probability-weighting function Favorite-longshot bias is real but inside the cost band — statistically robust, not tradeable
Live deployment (live) Built + deployed a paper trader and a live arbitrage scanner (real Kalshi order book, systemd on a cloud droplet) Killed the last candidate — the options-gap edge lost 9 of 11 clean out-of-sample trades

The research question

Most quant signals rely on correlation, which is symmetric and noisy. This project applies a less common technique — Liang–Kleeman Information Flow — that measures directional causation between time series:

$$T_{2 \to 1} = \frac{C_{11},C_{2,dx} - C_{12},C_{1,dx}}{C_{11},C_{22} - C_{12}^2}, \qquad \tau = \frac{T_{2\to1}}{|T_{2\to1}| + |T_{1\to2}|} \in [-1,+1]$$

Unlike correlation, τ is asymmetric — it distinguishes "volume drives price" from "price drives volume." The question: does that directional information exist in prediction-market microstructure, and can it be traded?

I chose recurring markets (Kalshi's hourly S&P 500 contracts) rather than one-off events, so a strategy can be validated across many serial folds instead of a single lucky event.


Data

Kalshi S&P 500 (KXINXU) 270 trading days, 1,455 events, 435,308 contracts, 511,097 trades, $94M volume
Cross-asset Kalshi BTC (KXBTCD), ETH (KXETHD), weather; BTC-USD & SPY spot
Sports 1M+ MLB / NFL / NCAAF two-outcome quotes
Options SPX 0DTE call chains (Databento OPRA), for implied-probability benchmarks
Live Real-time Kalshi public API order book (paper trading, Apr–Jun 2026)

Source: Prediction Market Analysis dataset (Becker, 2025), plus live Kalshi API pulls.


Key results

1. LKIF carries information — but it's not a money machine

Walk-forward across 25 out-of-sample folds: +0.24 mean log-alpha per fold, alpha-positive in 56%. Monte-Carlo permutation test: the real signal beats 99.3% of n=300 noise replacements (p = 0.007). The top LKIF decile shows a ~62% up-rate vs a 53% base rate — a real but nonlinear edge that linear models miss.

The catch: the underlying always-long position loses ~99.99997% of capital over the year, so "beating the baseline by losing less" is a signal-detection result, not a profitable system.

LKIF walk-forward Monte Carlo permutation test

2. It does not generalize

The one strategy that looked good in-sample (a BTC contrarian variant) reversed sign out-of-sample when tested on ETH — the textbook signature of overfitting, not signal.

Cross-asset test

3. Real inefficiencies exist, but live inside the no-arbitrage cost band

  • Sports overround rises as liquidity falls (thin markets are less efficient) — but the arbitrage that clears execution cost sits in markets with median depth ~17 contracts: real, but too thin to harvest.
  • Favorite-longshot bias replicates out-of-sample (longshots overpriced, favorites underpriced), and I recovered the implied probability-weighting function (Prelec α ≈ 0.97). But the edge is smaller than costs, with strongly negative skew — a tail-selling payoff, not free money.

Market efficiency vs liquidity

4. The last candidate — killed live

An options-vs-Kalshi gap-fade looked like the one survivor (+4.7¢/trade gross out-of-sample in backtest). I deployed it as a live paper trader. Once isolated to its best direction and tested forward on clean data, it lost 9 of its 11 out-of-sample trades (−$293). The failure mode was diagnostic: when Kalshi disagreed with a 15-minute-delayed options feed, Kalshi was right — the market is better-calibrated than the signal.

See results/live_paper_trades.csv for the full live trade log.


Repository structure

src/core/            LKIF engine + continuous-series construction + SPX analysis
src/generalization/  BTC / ETH / cross-asset / long-only replication tests
src/sports/          Overround, sum-to-one arbitrage, MLB favorite-maker
src/options_edge/    Kalshi vs SPX-options mispricing, favorite-longshot, weighting fn
live/                Deployed paper trader + live order-book arbitrage scanner
reports/             Full written report, research paper, sports strategy memo
figures/             Result plots
results/             Machine-readable results (JSON) + live paper-trade log (CSV)

Start with reports/FINAL_REPORT.md for the full write-up.


Methods & tooling

  • Validation: walk-forward (rolling out-of-sample folds), Monte-Carlo permutation tests, strict train/test splits, out-of-sample replication on freshly pulled data.
  • Signal: multi-channel LKIF (momentum / volume / order-imbalance) across three rolling windows, used as a filter on a trend signal — never alone.
  • Options: Breeden–Litzenberger digital-option pricing via centered call spreads (centered to remove a ~2¢ discretization bias).
  • Stack: Python (NumPy, pandas, numba, matplotlib, pyarrow), Databento API, Kalshi public API, systemd + SSH cloud deployment.
pip install -r requirements.txt
# Scripts read Parquet trade/market data (not committed — see note below) and write to output/.

Data note: raw trade data (tens of GB of Parquet) is not committed. Scripts point to a local data/ directory; the dataset is public at the link above. Figures and result JSON are included so the findings are inspectable without re-running the pipeline.


Why the honest "no" matters

Any research that claims to have found free money in a real market is almost always overfit. This project tests many plausible edges, finds that most fail out-of-sample, and says so — then goes further and confirms it with live paper trading. The valuable, defensible conclusion is:

Kalshi's liquid S&P 500 markets are efficient enough that retail-accessible signals don't beat them — and the apparent edges that do appear are artifacts of overfitting or stale benchmarks.

That's the finding a real research desk would want: correct, validated, and not wishful.