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.
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.
| 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 |
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:
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.
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.
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.
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.
- 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.
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.
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.
- 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.
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.



