Same-same
Same-same
Tl;dr
Cross-venue NBA game markets on Polymarket and Kalshi and generate GO signals when a paired YES/NO position locks a positive edge after fees and execution constraints. Success requires reliable schedule coverage, accurate team/market mappings, timely price polling with escalation, and a simulation path to validate fees and slippage before live execution.
Success criteria checklist (template)
✅ Market exists: Found market: <EVENT_OR_MARKET_ID>
✅ Market is active: Status: <status>
✅ Market not closed: Closes: <ISO_8601>
✅ Valid side: Side: <yes|no>
✅ Order size >= 1 contract(s): Size: <n> contract(s)
✅ Order notional >= $1.00: Order value: <$n.nn> (min: $1.00)
✅ Price in valid range (0-100¢): Price: <n>¢
✅ Market has reasonable spread (<50¢): Spread: <n>¢ (Bid: <n>¢, Ask: <n>¢)
❌ Market has real liquidity (not placeholder prices): Bid: <n>¢, Ask: <n>¢ - appears to be placeholder prices
❌ Price is fillable (>= bid: <n>¢): Your price: <n>¢
✅ Sufficient account balance: Balance: <$n.nn>, Cost: <$n.nn>
Opportunity definition
- Instruments: NBA game winner markets on Polymarket (binary) and Kalshi (binary). We pair a YES on one venue with a NO on the other.
- Edge: total cost of paired legs + fees below $1.00 (100 cents), with fillability and liquidity checks.
- Output: GO/NO-GO signal per game + venue pair with justification and expected edge.
Inputs and data sources
- NBA schedule:
nba-2025-PacificStandardTime.csv(current baseline). - Polymarket: market metadata and CLOB top-of-book prices (source to be confirmed).
- Kalshi: market list and quotes (source to be confirmed).
Schedule ingest
- Lookahead window: default 48 hours (configurable).
- Flow: read all games within the window, then derive candidate market identifiers/URLs for each venue.
- Uncertain timing: game time alignment rules are still open; must account for venue-specific market close times.
Mapping table (teams)
Store a mapping table to align team identifiers across venues and internal references.
Fields:
internal_slug(example:nba-la-lakers)common_name(example:L.A. Lakers)polymarket_team_idpolymarket_team_namekalshi_team_idkalshi_team_namesource_name(where the mapping was obtained)source_key(identifier from the source)last_verified_at
Market matching (game level)
- Build a canonical game id from schedule:
date,home_team,away_team. - Generate candidate venue markets using team mapping and venue naming patterns.
- Keep a one-to-many view until we can confirm the true venue market id for the game.
Pricing and polling
- Baseline polling: every 60 seconds for all candidate games.
- Escalation: switch to 10-second polling after volume threshold is met (configurable).
- Persist every snapshot to the DB with venue, market id, bid/ask, size, and timestamp.
GO signal logic (draft)
- Pair legs: example
Poly YES (Team A)+Kalshi NO (Team A). - Compute
edge_cents = 100 - (poly_leg_cost + kalshi_leg_cost + fees_cents). - Require:
- market exists and active
- market not closed
- valid side
- size and notional minimums
- price in valid range
- spread below threshold
- real liquidity (not placeholder prices)
- price is fillable
- account balance sufficient
- If all pass and
edge_cents >= min_edge_cents, emit GO.
Simulator
- Run the same signal logic with configurable inputs:
- fees by venue
- min order size and notional
- slippage model
- rate limits and polling cadence
- fill probability threshold
Open questions
- How to normalize market close times relative to scheduled tipoff.
- The canonical source for schedule (CSV is placeholder vs. future API feed).
- Polymarket and Kalshi naming conventions for NBA markets (slug/ticker patterns).
- Venue fee models and minimums for NBA markets.
Implementation references
app/agents/(existing opportunity work; review for compatible patterns)docs/opportunities/time-alignment-approx.md(format reference)