Kalshi Dutch Agent

Teach me
WS: -- --
🔒 Read-only mode — you cannot modify settings or profiles
Dashboard
Report
Arbitrage
Positions
Profiles
Help

Daily P&L History

DateP&L ?Net profit or loss for that day across all settled trades.Trades ?Total number of trades executed that day.Cost ?Total dollar amount spent buying contracts that day.Fees ?Total exchange fees paid on that day's trades.
Page 1

24-Hour P&L

WS: -- Last scan: -- Events: -- | Qualified: -- Duration: --
Near Misses
Decisions
Bot Health
Top 100 events per profile closest to qualifying
#ProfileScan ?When this near-miss was recorded.Event ?The Kalshi event ticker and title. Click to open on Kalshi.Markets ?Number of open markets (options) in this event. Best K ?Smallest number of top options whose implied probabilities sum to ≥ coverage threshold.Coverage Prob ?Probability that one of the top-K options wins.Cost ?Total cost to buy YES on the best K options. Must be < $1.00 for a profitable dutch. Gap ?How far coverage probability is from the threshold.Liquidity ?Estimated dollar value of open interest across all markets.Filters Failed ?Which qualifying filters this event didn't pass.
Price Updates: WebSocket | Ticks/s: -- | Re-evals: --
Filter Dictionary — What each status means
All passedEvent meets all qualifying filters — it's a live dutching candidate.
Only N markets (need M)The event has fewer open options than the Min Options in Market setting requires.
Low liquidity $X (threshold $Y)Total liquidity is below the threshold. The event still qualifies but the position size will be capped to available order-book depth.
Coverage X% < Y% (top K)The top K options' implied probabilities don't cover enough of the outcome space.
Cost $X >= $1.00Buying YES on the top K options costs $1.00 or more — guaranteed loss.
Zero implied probabilityNone of the markets have meaningful price data.
Tail probability X% > Y%Too much probability sits in the uncovered long-tail options.
TimeProfileEventOptions OutcomeEdgeCoverageScan→DecisionReason

Database Tables

Table Rows Purge Strategy

Recent Errors & Warnings

Loading...
Matching
Help

Cross-Exchange Matches

Status Kalshi Market Polymarket Market Category Similarity Confidence Confirmed At
Loading...

📖 Cross-Exchange Arbitrage

Arbitrage exploits price disagreements for the same event across two exchanges. On any binary prediction market, a YES contract and a NO contract are two sides of the same coin — exactly one of them will pay out $1.00. When Kalshi and Polymarket misprice opposite sides, a guaranteed profit window opens.

The Core Idea

Every binary market has two contracts: YES and NO. Exactly one resolves to $1.00; the other resolves to $0.00.

The arbitrage trade is:

  1. Buy YES on one exchange
  2. Buy NO on the other exchange (for the same event)

No matter what happens, exactly one of your two contracts pays $1.00. If the total cost of both was less than $1.00, the difference is your guaranteed profit.

How It Works — Step by Step

  1. Scan — The bot continuously pulls markets from both Kalshi and Polymarket.
  2. Match — Using AI embeddings & Gemini verification, it finds markets on both exchanges that resolve on the same real-world outcome.
  3. Compare Prices — For each matched pair, it looks at the YES price on one exchange and the NO price on the other.
  4. Detect the Gap — If YES on Exchange A + NO on Exchange B < $1.00, that's an arbitrage opportunity.
  5. Execute — Buy YES on one exchange and NO on the other. One contract is guaranteed to pay $1.00.

Worked Example

Suppose both exchanges list:
"Will the Fed cut rates in June 2026?"

Kalshi thinks rate cuts are unlikely (YES is cheap). Polymarket thinks they're more likely (YES is expensive, so NO is cheap). The two exchanges disagree — that's the opportunity.

Exchange Contract Price
Kalshi YES — Fed cuts rates $0.38
Polymarket NO — Fed does not cut rates $0.55

💰 Total cost (YES on Kalshi + NO on Polymarket):

$0.38 + $0.55 = $0.93

🏆 Payout — no matter what happens:

IF FED CUTS (YES wins)

Kalshi YES pays $1.00
Poly NO pays $0.00

Payout = $1.00

IF FED DOESN'T CUT (NO wins)

Kalshi YES pays $0.00
Poly NO pays $1.00

Payout = $1.00

📈 Guaranteed profit per contract (before fees):

$1.00 − $0.93 = $0.07 (7.5% return)

⚠️ Why Speed Matters

Arbitrage windows are fleeting. Other traders and bots are watching the same prices. The gap might last only seconds. The bot needs to:
  1. Detect the pricing mismatch
  2. Place orders on both exchanges simultaneously
  3. Get both fills before the prices converge

If only one side fills, you're left with a naked directional bet — not arbitrage. That's why the matching pipeline runs continuously, and execution must be fast.

🔑 Key Takeaway

The formula: YES price (Exchange A) + NO price (Exchange B) < $1.00.

Buy YES on one side, NO on the other. Exactly one always pays $1.00 — the other pays $0.00. If your combined cost was less than $1.00, the difference is pure profit regardless of the outcome.

The smaller the sum, the larger the edge. The bot's job is to find confirmed market pairs, watch for these pricing gaps, and execute before they close.

Positions
Triage Recommendations
Triage Audit
All Sims SIM

Triage Actions

Recommendation Audit

Track how well triage recommendations performed. Shows whether each sell recommendation was validated by the eventual market outcome and the P&L impact of acting on or ignoring the advice.

Overview
Categories
Rules
Triage

Category Controls

Control which market categories each profile scans. Toggle categories enabled/disabled and set per-category mode (Sim or Live). Child categories inherit from parents unless explicitly overridden.

Select a profile to view category settings

Trade Validation Rules

Rules validate trade decisions before execution. When a rule flags a trade, it goes to the Waiting queue in the Decisions tab for manual approval. Toggle rules on/off below.

Loading rules...

Waiting Queue

Trades flagged by rules waiting for your approval. Approve to execute, reject to discard. Unanswered trades auto-expire after 48 hours.

Position Triage Agent

The triage agent checks the NWS hourly forecast every hour for each event where you hold open weather positions. If any hourly forecast temp falls outside your covered brackets, it recommends selling. If the forecasted extreme exactly equals a boundary, it escalates to checking every 5 minutes. One scan per event covers all profiles. Toggle triage rules on/off below.

Loading triage rules...

Profiles

How Live vs Dry-Run Mode Works
Standard profile runs in whichever mode the bot was started with.
python main.py --dry-run → Simulated trades, no real money
python main.py → Live orders on Kalshi with real money
Named profiles always run in simulation mode alongside the main bot. They mirror the same market scan but apply their own strategy settings and track results independently.
Create simulation profiles with different settings for A/B testing
ActiveNameModeBankrollOpen Won / LostP&LKey SettingsActions

Service Connections

API keys and credentials used by the bot to connect to external services. Changes apply globally across all profiles.

Tools

📊

Market Simulator

Build a hypothetical market with custom odds and see dutching P&L for each K scenario. Includes Kalshi fee model.

🩺

System Health

Live resource monitoring, hang detection status, and troubleshooting guide for diagnosing bot stalls and memory issues.

🔎

Market Explorer

Browse all tracked Kalshi and Polymarket events. Click any market to inspect raw API responses from all available endpoints.

Tutorials

🔍

How We Analyze Data

Learn how the system discovers markets, keeps prices fresh via WebSocket, and continuously evaluates dutching opportunities to enter positions at the right time.

🛡️

Risk Management

How profile-level limits, position sizing, capital allocation, and the triage agent work together to protect your portfolio.