{% extends "base.html" %}{% from "_macros.html" import pnl_cls, bar, pct, venue_chips, new_badge, page_head, status_badge, source_note %} {% block title %}Markets{% endblock %} {% block content %} {% call page_head("Markets", "Every sport we price: what's next, what's live on each venue, and how we did lately.") %}All Polymarket markets →{% if kalshi %} All Kalshi markets →{% endif %}{% for v in schema_exchanges %} All {{ v.name }} markets →{% endfor %}{% if tapes %} Recorded tapes →{% endif %}{% endcall %}
racinglines markets record{% else %}not yet{% endif %}Loading…
Polymarket vs Kalshi on every outcome listed on both, at the log's latest tick{% if user.role == 'admin' %} (racinglines markets disagree){% endif %}. Gap = Kalshi mid − Polymarket mid; net = |gap| − both taker fees; edge = the better taker trade vs our fair, net of fees. Greyed rows: a venue's tape shows nothing traded in the prior 24 h, so the gap is on paper.
| Outcome | Polymarket | Kalshi | Fair | Net |
|---|---|---|---|---|
| {{ r.kind_label }} · {{ r.subject }} | {{ pct(r.pm_mid, 1) }}{% if r.pm_bid is not none and r.pm_ask is not none %} {{ pct(r.pm_bid, 1) }}–{{ pct(r.pm_ask, 1) }}{% endif %} | {{ pct(r.kalshi_mid, 1) }}{% if r.kalshi_bid is not none and r.kalshi_ask is not none %} {{ pct(r.kalshi_bid, 1) }}–{{ pct(r.kalshi_ask, 1) }}{% endif %} | {{ pct(r.fair, 1) }} | {{ "%+.1f"|format(r.gap_net * 100) }} |
Every race weekend (modeled sports) and every recorded exchange event (tape-only sports). A tape-only sport has no single cross-venue event, so each exchange's own listing is its own day.
Browse all Polymarket markets ·{% if kalshi %} all Kalshi markets ·{% endif %}{% for v in schema_exchanges %} all {{ v.name }} markets ·{% endfor %}{% if tapes %} recorded tapes{% endif %}. Bars: our fair probability; the orange tick is the exchange price.
{% if sport_status %}{% include "_sport_status.html" %}{% endif %} {% endblock %}