{"componentChunkName":"component---src-templates-blog-post-js","path":"/polymarket-binary-options-intro/","result":{"data":{"site":{"siteMetadata":{"title":"/dev/yukarinoki"}},"markdownRemark":{"id":"377a3d9a-a468-5c22-8f46-6bb51be94f6d","excerpt":"日本語要約: Polymarketの予測市場におけるバイナリオプションの仕組みを開発者視点で解説する記事です。CLOB（中央指値注文帳）の構造、5分/15分BTCバイナリコントラクトのライフサイクル、APIやWebSocketを使ったデータ取得方法をPythonコード例とともに紹介します。 I’ve been…","html":"<blockquote>\n<p><strong>日本語要約</strong>: Polymarketの予測市場におけるバイナリオプションの仕組みを開発者視点で解説する記事です。CLOB（中央指値注文帳）の構造、5分/15分BTCバイナリコントラクトのライフサイクル、APIやWebSocketを使ったデータ取得方法をPythonコード例とともに紹介します。</p>\n</blockquote>\n<p>I’ve been digging into Polymarket’s binary options infrastructure for the past few weeks, specifically the short-duration BTC contracts. If you’re a developer looking to build trading tools, analytics dashboards, or just want to understand how these contracts actually work under the hood, this post covers what I’ve learned.</p>\n<h2 id=\"what-is-polymarket-and-why-binary-options\" style=\"position:relative;\"><a href=\"#what-is-polymarket-and-why-binary-options\" aria-label=\"what is polymarket and why binary options permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Is Polymarket and Why Binary Options?</h2>\n<p>Polymarket is a prediction market platform built on Polygon. Users trade shares in the outcome of events - political elections, sports, crypto prices, whatever. Each market resolves to either YES or NO, and shares pay out $1 if correct, $0 if wrong.</p>\n<p>Binary options on Polymarket take this concept and apply it to price movements. Instead of “Will candidate X win the election?”, you get markets like “Will BTC be above $67,500 at 14:05 UTC?” - a simple up/down bet on where price will be at a specific time.</p>\n<p>The key insight: these are NOT traditional options with Greeks and continuous payoffs. They’re binary - you either get $1 or $0. The pricing reflects the market’s implied probability of the event occurring. A YES share trading at $0.62 means the market thinks there’s roughly a 62% chance BTC will be above the strike at expiry.</p>\n<h2 id=\"the-clob-how-orders-get-matched\" style=\"position:relative;\"><a href=\"#the-clob-how-orders-get-matched\" aria-label=\"the clob how orders get matched permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The CLOB: How Orders Get Matched</h2>\n<p>Polymarket runs a Central Limit Order Book (CLOB) - not an AMM. This is important because it means you get real bid/ask spreads, limit orders, and proper price discovery.</p>\n<p>The CLOB is operated by Polymarket’s exchange operator but settlement happens on-chain via their CTF (Conditional Token Framework) contracts. Here’s the flow:</p>\n<ol>\n<li><strong>Order placement</strong>: You sign an order off-chain (EIP-712 typed data) specifying the token ID, side, price, and size</li>\n<li><strong>Matching</strong>: The exchange operator matches compatible orders</li>\n<li><strong>Settlement</strong>: Matched trades are settled on-chain - CTF tokens move between wallets</li>\n</ol>\n<p>The order book for each binary option market has two sides: YES tokens and NO tokens. Since YES + NO = $1 always, buying YES at $0.60 is equivalent to selling NO at $0.40. The exchange handles this complementarity automatically.</p>\n<p>What makes this interesting from a market microstructure perspective: the spreads on short-duration BTC binaries are often 2-5 cents wide. Market makers are actively quoting, and you can see the book update in real-time via WebSocket.</p>\n<h2 id=\"5-minute-and-15-minute-btc-binary-contracts\" style=\"position:relative;\"><a href=\"#5-minute-and-15-minute-btc-binary-contracts\" aria-label=\"5 minute and 15 minute btc binary contracts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-Minute and 15-Minute BTC Binary Contracts</h2>\n<p>The short-duration BTC markets are where things get fun. Polymarket runs rolling binary option contracts on BTC/USDT price with 5-minute and 15-minute durations.</p>\n<p>Here’s how a typical 5-minute contract works:</p>\n<ul>\n<li><strong>Strike</strong>: Set at the current BTC mid-price at market creation (e.g., $67,482.50)</li>\n<li><strong>Duration</strong>: 5 minutes from creation to resolution</li>\n<li><strong>Resolution source</strong>: BTC/USDT price from a specified oracle feed</li>\n<li><strong>Outcome</strong>: YES if BTC >= strike at expiry, NO otherwise</li>\n</ul>\n<p>The 15-minute contracts work identically but with a longer window, which generally means tighter spreads and more liquidity since there’s more time for price discovery.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1e52f7e0cdffea324a8d4945424e87b2/2ad15/bo_price_sim_bs.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 66.21621621621621%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACN0lEQVQ4y21Ty47UMBCcr+cGX4TggDhwRgKBBLvzyDpx4jjxI867qHZ2WEBEU+pJ0umurmqfqrLEsiz499r3HSGEv+C9h3Muwz9HQYwRKSUMw4BT0zSwXQeJt9sNPROMMZimKRdo2xZ1rVFVFbSuYa3lM5ufd/xOovcBaRwxJBaUjyVZXvR9l7tIt3meMTKpbQ0efp5RsJnvDeaR76YXjCkiBofO1mTrD4bGtJnRn9e2bZmNsIthhK4C4UUM/rYjEvu+ou88DFmHEHFyZHW8zMIdkEQWlJFKarxtKxmvUMrzPqAoHCWKbJgYB1yvZNhFTseClemhjYWLI2Y2XlhP4rhsHDnlriLBNI0ZRWFYpMPl0rBBi/O5pmQ2651NKRuLm9JQ2sC6iMb2MBwhpon6HM4JU4HorXXJ2LBonWNK0nBAeHb6VKqnvAJjNmLKWJY5r5KYIp211tSyRk29xbxpmrPmAikicL3lhtAUVWl0/DMySZyVJGElBWX3pMD+nx29IzFXtkRWL5ti1Bmu4RjqgsfHh7yPRVHkYuJyw7F80+KpbBGmBfOy/nZYsHCiyFxhKQt+evOxx6u3Cq8/tLhQy+J6xYW4nwxhOKcRSfMAXBU03fxWWHxXHVya4ccFK00c7gXffW3w/luLzw2wsukyH6Ov63poQ30n3m+839lgJeuhNlBPNR7OFX5cND59udHQkMc/7VPkngwZh2svp+Q+RvAH2653KJVCXZWoaWarKwTXU6bn48f8X46w5JkDfhKOAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"BO Pricing Dashboard\"\n        title=\"BO Pricing Dashboard\"\n        src=\"/static/1e52f7e0cdffea324a8d4945424e87b2/fcda8/bo_price_sim_bs.png\"\n        srcset=\"/static/1e52f7e0cdffea324a8d4945424e87b2/12f09/bo_price_sim_bs.png 148w,\n/static/1e52f7e0cdffea324a8d4945424e87b2/e4a3f/bo_price_sim_bs.png 295w,\n/static/1e52f7e0cdffea324a8d4945424e87b2/fcda8/bo_price_sim_bs.png 590w,\n/static/1e52f7e0cdffea324a8d4945424e87b2/2ad15/bo_price_sim_bs.png 801w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>The dashboard above shows the relationship between the underlying BTC/USDT mid price and the binary option price curves. You can see how the BO price responds non-linearly to moves in the underlying - this is basically the CDF of the implied distribution compressed into a 5-minute window.</p>\n<p>One thing that tripped me up initially: the contract creation is staggered. New 5m contracts launch every 5 minutes, so at any given time you might have an active contract with 3 minutes remaining and a new one that just opened. The overlap creates interesting arbitrage dynamics.</p>\n<h2 id=\"contract-lifecycle\" style=\"position:relative;\"><a href=\"#contract-lifecycle\" aria-label=\"contract lifecycle permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Contract Lifecycle</h2>\n<p>Every binary option contract goes through distinct phases:</p>\n<h3 id=\"1-creation\" style=\"position:relative;\"><a href=\"#1-creation\" aria-label=\"1 creation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Creation</h3>\n<p>The market is created with a condition ID, strike price, and expiry timestamp. The CTF contract mints the initial token positions. At this point, YES and NO tokens exist but no one has traded yet.</p>\n<h3 id=\"2-trading-period\" style=\"position:relative;\"><a href=\"#2-trading-period\" aria-label=\"2 trading period permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Trading Period</h3>\n<p>Orders flow in. Market makers post bids and asks on both sides. As BTC moves relative to the strike, the BO price adjusts. The closer to expiry, the more sensitive the price becomes to small moves in the underlying (gamma increases, if you want to think in options terms).</p>\n<h3 id=\"3-settlement\" style=\"position:relative;\"><a href=\"#3-settlement\" aria-label=\"3 settlement permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Settlement</h3>\n<p>At expiry, the oracle reports the BTC price. The contract resolves: if BTC >= strike, YES tokens are redeemable for $1 each. NO tokens become worthless. Redemption happens on-chain through the CTF contract.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/ed68d52201bccabe687c23c66cb76af7/79e48/market_fill_chart_poly.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 27.7027027027027%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA/UlEQVQY011Q7U7EMAzba6xJv9Ldpt0mxkkcCMH7v5ZxOg4EPyy7jpukHfbbHcf9HfvtBcfrB57fPrGsV0zTBZfL/IPpoekv84zrumCe5z8Zx1CqIROpVJTaqBtSSoiq0BiRiKgRRi+lCKkZT1vDsRtKTlDWYjzR2oShqaBogERBJqsEsnsCDaGzRcUk0n21hH2tGMexIzBz8gizhiFWblMjKi9lhnPmVoUTCR+iZPdHPydFYW7bDMJG4R96Q2UgiBtCFk7jtvrwuDGbjNTCQUo/01uW0of1ume/G/Yn18q/ywXO1f+xuLbOhWdz7XVqz2RqmxqqnRmz36w3/AKmD6SQjNhVkwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Polymarket Fills Chart\"\n        title=\"Polymarket Fills Chart\"\n        src=\"/static/ed68d52201bccabe687c23c66cb76af7/fcda8/market_fill_chart_poly.png\"\n        srcset=\"/static/ed68d52201bccabe687c23c66cb76af7/12f09/market_fill_chart_poly.png 148w,\n/static/ed68d52201bccabe687c23c66cb76af7/e4a3f/market_fill_chart_poly.png 295w,\n/static/ed68d52201bccabe687c23c66cb76af7/fcda8/market_fill_chart_poly.png 590w,\n/static/ed68d52201bccabe687c23c66cb76af7/79e48/market_fill_chart_poly.png 865w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>The fills chart above shows actual trades on a 5m binary market. Notice how trade frequency and size increase as we approach expiry - that’s participants reacting to last-second price moves in BTC.</p>\n<h2 id=\"accessing-polymarket-data-programmatically\" style=\"position:relative;\"><a href=\"#accessing-polymarket-data-programmatically\" aria-label=\"accessing polymarket data programmatically permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Accessing Polymarket Data Programmatically</h2>\n<p>Polymarket exposes two main interfaces for developers:</p>\n<h3 id=\"rest-api-clob-api\" style=\"position:relative;\"><a href=\"#rest-api-clob-api\" aria-label=\"rest api clob api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>REST API (CLOB API)</h3>\n<p>The CLOB API gives you access to markets, order books, and trade history. Base URL is <code class=\"language-text\">https://clob.polymarket.com</code>.</p>\n<p>Key endpoints:</p>\n<ul>\n<li><code class=\"language-text\">GET /markets</code> - list available markets (filterable by tag, status)</li>\n<li><code class=\"language-text\">GET /book?token_id={id}</code> - current order book snapshot</li>\n<li><code class=\"language-text\">GET /trades?market={id}</code> - recent trade history</li>\n<li><code class=\"language-text\">GET /prices?token_id={id}</code> - price history with OHLC data</li>\n</ul>\n<h3 id=\"websocket\" style=\"position:relative;\"><a href=\"#websocket\" aria-label=\"websocket permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>WebSocket</h3>\n<p>For real-time data, you connect to the WebSocket feed at <code class=\"language-text\">wss://ws-subscriptions-clob.polymarket.com/ws/market</code>. You subscribe to channels per market and get:</p>\n<ul>\n<li>Order book updates (bids/asks added/removed)</li>\n<li>Trade notifications</li>\n<li>Market status changes</li>\n</ul>\n<p>Here’s a basic Python script to fetch market data and inspect a BTC binary option:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-python line-numbers\"><code class=\"language-python\"><span class=\"token keyword\">import</span> requests\n<span class=\"token keyword\">import</span> json\n<span class=\"token keyword\">from</span> datetime <span class=\"token keyword\">import</span> datetime\n\nCLOB_BASE <span class=\"token operator\">=</span> <span class=\"token string\">\"https://clob.polymarket.com\"</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">get_btc_binary_markets</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Fetch active BTC binary option markets.\"\"\"</span>\n    resp <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>\n        <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>CLOB_BASE<span class=\"token punctuation\">}</span></span><span class=\"token string\">/markets\"</span></span><span class=\"token punctuation\">,</span>\n        params<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">\"tag\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"btc-binary\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"active\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"true\"</span><span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span>\n    resp<span class=\"token punctuation\">.</span>raise_for_status<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    markets <span class=\"token operator\">=</span> resp<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> markets\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">get_order_book</span><span class=\"token punctuation\">(</span>token_id<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Get current order book for a binary option token.\"\"\"</span>\n    resp <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>\n        <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>CLOB_BASE<span class=\"token punctuation\">}</span></span><span class=\"token string\">/book\"</span></span><span class=\"token punctuation\">,</span>\n        params<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">\"token_id\"</span><span class=\"token punctuation\">:</span> token_id<span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span>\n    resp<span class=\"token punctuation\">.</span>raise_for_status<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> resp<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">get_recent_trades</span><span class=\"token punctuation\">(</span>condition_id<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Fetch recent trades for a market.\"\"\"</span>\n    resp <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>\n        <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>CLOB_BASE<span class=\"token punctuation\">}</span></span><span class=\"token string\">/trades\"</span></span><span class=\"token punctuation\">,</span>\n        params<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">\"market\"</span><span class=\"token punctuation\">:</span> condition_id<span class=\"token punctuation\">,</span> <span class=\"token string\">\"limit\"</span><span class=\"token punctuation\">:</span> limit<span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span>\n    resp<span class=\"token punctuation\">.</span>raise_for_status<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> resp<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># Fetch active BTC binary markets</span>\nmarkets <span class=\"token operator\">=</span> get_btc_binary_markets<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">for</span> market <span class=\"token keyword\">in</span> markets<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Market: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>market<span class=\"token punctuation\">[</span><span class=\"token string\">'question'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  Condition ID: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>market<span class=\"token punctuation\">[</span><span class=\"token string\">'condition_id'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  End Date: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>market<span class=\"token punctuation\">[</span><span class=\"token string\">'end_date_iso'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  Tokens: YES=</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>market<span class=\"token punctuation\">[</span><span class=\"token string\">'tokens'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'token_id'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">12]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">...\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"          NO=</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>market<span class=\"token punctuation\">[</span><span class=\"token string\">'tokens'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'token_id'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">12]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">...\"</span></span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Get the order book for YES token</span>\n    yes_token_id <span class=\"token operator\">=</span> market<span class=\"token punctuation\">[</span><span class=\"token string\">'tokens'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'token_id'</span><span class=\"token punctuation\">]</span>\n    book <span class=\"token operator\">=</span> get_order_book<span class=\"token punctuation\">(</span>yes_token_id<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> book<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'bids'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">and</span> book<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'asks'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        best_bid <span class=\"token operator\">=</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>book<span class=\"token punctuation\">[</span><span class=\"token string\">'bids'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'price'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        best_ask <span class=\"token operator\">=</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>book<span class=\"token punctuation\">[</span><span class=\"token string\">'asks'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'price'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  Best Bid: $</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>best_bid<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.3f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  Best Ask: $</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>best_ask<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.3f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  Spread: $</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>best_ask <span class=\"token operator\">-</span> best_bid<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.3f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"parsing-trade-data\" style=\"position:relative;\"><a href=\"#parsing-trade-data\" aria-label=\"parsing trade data permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Parsing Trade Data</h2>\n<p>Once you have trade data, you usually want to reconstruct what happened - who was aggressive, what the fill rate looked like, how price evolved. Here’s how I parse trade data from the API:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-python line-numbers\"><code class=\"language-python\"><span class=\"token keyword\">import</span> pandas <span class=\"token keyword\">as</span> pd\n<span class=\"token keyword\">from</span> datetime <span class=\"token keyword\">import</span> datetime<span class=\"token punctuation\">,</span> timezone\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">parse_trades_to_df</span><span class=\"token punctuation\">(</span>trades<span class=\"token punctuation\">:</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"Parse raw trade data into a DataFrame with derived fields.\"\"\"</span>\n    records <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> trade <span class=\"token keyword\">in</span> trades<span class=\"token punctuation\">:</span>\n        ts <span class=\"token operator\">=</span> datetime<span class=\"token punctuation\">.</span>fromisoformat<span class=\"token punctuation\">(</span>\n            trade<span class=\"token punctuation\">[</span><span class=\"token string\">'timestamp'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>replace<span class=\"token punctuation\">(</span><span class=\"token string\">'Z'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'+00:00'</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span>\n        records<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">'timestamp'</span><span class=\"token punctuation\">:</span> ts<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">'price'</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>trade<span class=\"token punctuation\">[</span><span class=\"token string\">'price'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">'size'</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>trade<span class=\"token punctuation\">[</span><span class=\"token string\">'size'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">'side'</span><span class=\"token punctuation\">:</span> trade<span class=\"token punctuation\">[</span><span class=\"token string\">'side'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\"># 'BUY' or 'SELL'</span>\n            <span class=\"token string\">'fee_rate'</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>trade<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'fee_rate_bps'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">10000</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">'notional'</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>trade<span class=\"token punctuation\">[</span><span class=\"token string\">'price'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>trade<span class=\"token punctuation\">[</span><span class=\"token string\">'size'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    df <span class=\"token operator\">=</span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">(</span>records<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> df<span class=\"token punctuation\">.</span>empty<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> df\n\n    df <span class=\"token operator\">=</span> df<span class=\"token punctuation\">.</span>sort_values<span class=\"token punctuation\">(</span><span class=\"token string\">'timestamp'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>reset_index<span class=\"token punctuation\">(</span>drop<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># Compute running VWAP</span>\n    df<span class=\"token punctuation\">[</span><span class=\"token string\">'cum_notional'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> df<span class=\"token punctuation\">[</span><span class=\"token string\">'notional'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>cumsum<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    df<span class=\"token punctuation\">[</span><span class=\"token string\">'cum_size'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> df<span class=\"token punctuation\">[</span><span class=\"token string\">'size'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>cumsum<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    df<span class=\"token punctuation\">[</span><span class=\"token string\">'vwap'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> df<span class=\"token punctuation\">[</span><span class=\"token string\">'cum_notional'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">/</span> df<span class=\"token punctuation\">[</span><span class=\"token string\">'cum_size'</span><span class=\"token punctuation\">]</span>\n\n    <span class=\"token comment\"># Tag aggressive side (taker)</span>\n    df<span class=\"token punctuation\">[</span><span class=\"token string\">'is_buyer_taker'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> df<span class=\"token punctuation\">[</span><span class=\"token string\">'side'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'BUY'</span>\n\n    <span class=\"token comment\"># Time until expiry (assuming market_end is known)</span>\n    <span class=\"token keyword\">return</span> df\n\n<span class=\"token comment\"># Example usage</span>\ntrades <span class=\"token operator\">=</span> get_recent_trades<span class=\"token punctuation\">(</span>markets<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'condition_id'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> limit<span class=\"token operator\">=</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\ndf <span class=\"token operator\">=</span> parse_trades_to_df<span class=\"token punctuation\">(</span>trades<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Total trades: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>df<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Total volume: $</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>df<span class=\"token punctuation\">[</span><span class=\"token string\">'notional'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"VWAP: $</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>df<span class=\"token punctuation\">[</span><span class=\"token string\">'vwap'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>iloc<span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.4f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Buyer-taker ratio: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>df<span class=\"token punctuation\">[</span><span class=\"token string\">'is_buyer_taker'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.1%</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"\\nLast 5 trades:\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>df<span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token string\">'timestamp'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'price'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'size'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'side'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>tail<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>A few things I noticed when working with this data:</p>\n<ul>\n<li>Trades come back in batches - the API doesn’t guarantee strict ordering within the same block timestamp</li>\n<li>Fee rates vary by maker/taker status and can be 0 for makers on certain markets</li>\n<li>The <code class=\"language-text\">size</code> field is in shares (not USD) - multiply by price to get notional</li>\n<li>During high-volatility moments, you’ll see clusters of fills at the same timestamp as the book gets swept</li>\n</ul>\n<h2 id=\"practical-challenges\" style=\"position:relative;\"><a href=\"#practical-challenges\" aria-label=\"practical challenges permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Practical Challenges</h2>\n<p>A few gotchas if you’re building on this:</p>\n<p><strong>Rate limits</strong>: The CLOB API has rate limits that aren’t always clearly documented. I found ~100 requests/minute to be safe for the REST endpoints. Use WebSocket for anything real-time.</p>\n<p><strong>Token ID vs Condition ID</strong>: Markets have a <code class=\"language-text\">condition_id</code> (the overall market) and individual <code class=\"language-text\">token_id</code>s for YES and NO positions. Some endpoints want one, some want the other. The order book endpoint takes <code class=\"language-text\">token_id</code>, while trades takes the market’s <code class=\"language-text\">condition_id</code>.</p>\n<p><strong>Timing</strong>: For 5-minute binaries, even 500ms of latency matters. If you’re building a trading bot, you need to account for the time between your price observation and order arrival at the exchange.</p>\n<p><strong>Resolution edge cases</strong>: What happens if the oracle price is exactly at the strike? In Polymarket’s implementation, >= resolves to YES. But double-check the specific market’s resolution rules - they’re in the market description.</p>\n<h2 id=\"wrapping-up\" style=\"position:relative;\"><a href=\"#wrapping-up\" aria-label=\"wrapping up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Wrapping Up</h2>\n<p>Polymarket’s binary options are a surprisingly clean environment for building trading tools. The CLOB gives you proper market microstructure to analyze, the contracts are simple enough to model (binary payoff + time decay), and the API access is decent for a crypto platform.</p>\n<p>If you’re coming from TradFi options or DeFi AMMs, the mental model shift is: think of these as extremely short-dated digital options with discrete settlement. The pricing behavior near expiry is where all the action happens - and where the data gets interesting.</p>\n<p>I’m working on a follow-up post covering how to model the implied probability surface across multiple strikes and durations. If you’re building something similar, feel free to reach out.</p>","tableOfContents":"<ul>\n<li><a href=\"/polymarket-binary-options-intro/#what-is-polymarket-and-why-binary-options\">What Is Polymarket and Why Binary Options?</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#the-clob-how-orders-get-matched\">The CLOB: How Orders Get Matched</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#5-minute-and-15-minute-btc-binary-contracts\">5-Minute and 15-Minute BTC Binary Contracts</a></li>\n<li>\n<p><a href=\"/polymarket-binary-options-intro/#contract-lifecycle\">Contract Lifecycle</a></p>\n<ul>\n<li><a href=\"/polymarket-binary-options-intro/#1-creation\">1. Creation</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#2-trading-period\">2. Trading Period</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#3-settlement\">3. Settlement</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/polymarket-binary-options-intro/#accessing-polymarket-data-programmatically\">Accessing Polymarket Data Programmatically</a></p>\n<ul>\n<li><a href=\"/polymarket-binary-options-intro/#rest-api-clob-api\">REST API (CLOB API)</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#websocket\">WebSocket</a></li>\n</ul>\n</li>\n<li><a href=\"/polymarket-binary-options-intro/#parsing-trade-data\">Parsing Trade Data</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#practical-challenges\">Practical Challenges</a></li>\n<li><a href=\"/polymarket-binary-options-intro/#wrapping-up\">Wrapping Up</a></li>\n</ul>","frontmatter":{"title":"How Binary Options Work on Prediction Markets: A Developer's Introduction to Polymarket Contracts","date":"August 12, 2025","description":"A technical introduction to how binary option contracts work on Polymarket, covering CLOB structure, contract mechanics, and data access patterns for developers."}}},"pageContext":{"slug":"/polymarket-binary-options-intro/","previous":{"fields":{"slug":"/swagger-codegen-1/"},"frontmatter":{"title":"swager-codegenのまともな使い方"}},"next":{"fields":{"slug":"/bs-merton-polymarket/"},"frontmatter":{"title":"Comparing Black-Scholes and Merton Jump-Diffusion Models Against Real Polymarket Binary Option Prices"}}}}}