{% extends "base.html" %}{% from "_macros.html" import empty, pnl_cls, bar, pct, venue_chips, chart, csrf, flash, edge_cell, source_note %} {% block title %}{{ info.title }}{% endblock %} {% block content %}
Markets › {{ info.sport }}{% if info.season %} › {{ info.season }}{% endif %}{% if info.event_id %} › event page{% endif %}
{{ info.name or "" }}{% if info.start_date %} · {{ info.start_date|fmt }}{% endif %}{% if countdown and not completed %} · {{ countdown }}{% endif %}
{{ flash(msg) }}| Outcome |
Our fair
{% if has_pm or kalshi %}
{% if kalshi %}{% endif %}
{% endif %}
| Fair | {% for v in exchanges %}{{ v.name }}{% if v.status == 'soon' %} (soon){% elif completed %} (as of){% endif %} | {% endfor %}Bets · staked | {% if completed %}Result | {% endif %}
|---|---|---|---|---|---|
| {% if r.athlete_id %}{{ r.subject }}{% else %}{{ r.subject }}{% endif %} {{ r.detail }} | {{ bar(r.fair, r.pm_mid, "wide", (r.venues.kalshi.mid if r.venues and r.venues.kalshi else none)) }} | {{ pct(r.fair, 1) }} | {% for v in exchanges %}{% set q = r.venues.get(v.code) if r.venues else none %}{% if q %}{% if q.bid is not none and q.ask is not none %}{{ "%.2f"|format(q.bid) }}–{{ "%.2f"|format(q.ask) }}{% elif q.mid is not none %}{{ "%.3f"|format(q.mid) }}{% else %}listed{% endif %}{% if q.call %} {{ q.call }} {{ "%+.1f"|format(q.best * 100) }}{% endif %}{% elif v.status == 'soon' %}n/a{% else %}–{% endif %} | {% endfor %}{% if r.private and r.private.bets %}{{ r.private.bets }} · {{ r.private.staked|money(false, false) }}{% endif %} | {% if completed %}{% if r.result == True %}YES{% elif r.result == False %}NO{% endif %} | {% endif %}
Not priced: our model has no fair value for this market type yet, so only the exchanges' prices are shown.
{% endif %} {% if placeholders and placeholders.get(kind) %}Not shown: {{ placeholders[kind] }} Polymarket placeholder{{ "s" if placeholders[kind] != 1 }} (unnamed slots like “Driver A”, or “any other”), which we don't price.
{% endif %}Bars: our fair probability; the yellow tick is the exchange price (click Polymarket/Kalshi to switch indicators). Gap = exchange − our fair, in points.{% if schema_exchanges %} A green YES / NO beside {% for v in schema_exchanges %}{{ v.name }}{% if not loop.last %}, {% endif %}{% endfor %} quotes is the side with an edge net of the taker fee{% if user.role == 'admin' %} (racinglines markets --exchange {{ schema_exchanges[0].code }} fair){% endif %}.{% endif %}
Replayed through the season on Polymarket's recorded hourly prices ({{ st.decisions|length }} decisions: pre-season, then 1 h after each race). At each decision: an as-of season forecast (only sessions that had ended), then rebalance every championship market to ${{ st.params.stake_per_edge|int }} × edge when |fair − price| ≥ {{ "%.0f"|format(st.params.min_edge * 100) }} pts (max ${{ st.params.max_stake|int }}/market, ${{ st.params.capital|int }} total). Trades fill at the price 1 h after the decision plus half the recorded spread and {{ "%.1f"|format(st.params.slippage * 100) }}¢ slippage; markets under {{ st.params.min_volume|money(false, false) }} traded are skipped; eliminated drivers settle when Polymarket closes their market; open positions are valued at what they'd sell for now. Run #{{ st.id }} · {{ st.created_at|fmt }}.
| Market | Outcome | Polymarket | Our fair | Edge | Holding | Target | Action |
|---|---|---|---|---|---|---|---|
| {{ kind_label.get(r.kind, r.kind) }} | {{ r.subject }} | {{ "%.3f"|format(r.price) }} | {{ pct(r.fair, 1) }} | {{ "%+.1f"|format(r.edge * 100) }} | {{ r.holding }} | {{ r.target }} | {% if r.action not in ('hold', 'no position') %}{{ r.action }}{% else %}{{ r.action }}{% endif %} |
| Market | Outcome | Side | Shares | Cost basis | Price now / result | Value | P&L |
|---|---|---|---|---|---|---|---|
| {{ kind_label.get(r.kind, r.kind) }} | {{ r.subject }} | {{ r.side }} | {{ "%.0f"|format(r.shares) if r.shares }} | {{ r.basis|money if r.basis }} | {{ "%.3f"|format(r.price) if r.price is not none }} | {{ r.value|money if r.value is not none }} | {{ r.pnl|money(true) if r.pnl is not none }} |
| {{ empty("No positions yet.") }} | |||||||
| Filled (UTC) | Decision | Outcome | Side | Shares | Price paid | Polymarket | Our fair |
|---|---|---|---|---|---|---|---|
| {{ t.t[:16] }} | {{ t.decision }} | {{ t.subject }} | {{ t.side }} | {{ "%+.0f"|format(t.shares) }} | {{ "%.3f"|format(t.price) }} | {{ "%.3f"|format(t.mid) }} | {{ pct(t.fair, 1) }} |
| Pos | Athlete | Status | Points | Our win price | Our podium price |
|---|---|---|---|---|---|
| {{ r.position|fmt if r.position is not none }} | {{ r.athlete }} | {{ r.status }} | {{ r.points|fmt }} | {{ pct(r.win, 1) }} | {{ pct(r.podium, 1) }} |
This race has run. {% if diag_runs %}Diagnostics: {% for d in diag_runs %}#{{ d.id }} as of {{ d.cutoff }}{{ " · " if not loop.last }}{% endfor %}.{% endif %} {% if diag_job and info.source_key %} Run a diagnostic at another cutoff →{% endif %}
{% elif season %}Season markets: mirror a Polymarket event from the Polymarket list{% if kalshi %} or a Kalshi event from the Kalshi list{% endif %}{% for v in schema_exchanges %} or {{ 'an' if v.name[0]|upper in 'AEIOU' else 'a' }} {{ v.name }} event from the {{ v.name }} list{% endfor %}, or manage my season markets.
{% else %}Creates (or reprices) YES/NO markets in my book at our fair ± spread/2. Takers see prices only.
{% for v in venue_sum %}{% if v.venue.code == 'polymarket' and v.slug %} open on Polymarket ↗{% elif kalshi and v.venue.code == 'kalshi' and v.slug %} open on Kalshi ↗{% elif v.venue.code in schema_exchanges|map(attribute='code') and v.slug %} {{ v.venue.name }} list ↗{% endif %}{% endfor %} {% endif %}