Arbitrage Buckets
This page covers the bucket block of an arbitrage strategy (platform: arbitrage). It applies to one setup only: a Kalshi series_ticker on leg A with a rolling daily Polymarket US leg B, set up as shown in Polymarket US leg B. Every bucket key is also listed in All arbitrage parameters.
Daily markets such as a city's high temperature are listed as several bucket markets per day: 74 °F or below, 75 to 76 °F, and so on. With a rolling daily Polymarket US leg and a Kalshi series_ticker, the Bot pairs buckets that settle on exactly the same range and trades one pair at a time. The bucket block chooses which pair.
bucket is allowed only when venues.b.platform is polymarket_us with a recurring selector. Anywhere else, even bucket: {} is rejected. A bare bucket: line with no value counts as leaving it out. Leaving it out is the same as select: all.
How matching works:
- The Bot finds the current Polymarket US event (see Polymarket US leg B) and the Kalshi series' markets that close within 120 seconds of it.
- It reads each market's settlement range as whole numbers, both ends included. Polymarket US
…-gte77lt78fand Kalshi "between 77 and 78" both cover 77 to 78. Polymarket US…-lt75fand Kalshi "less than 75" cover 74 and below. Polymarket US…-gte83fand Kalshi "greater than 82" cover 83 and above. - Buckets with exactly the same range on both venues become pairs. A bucket without an exact match is dropped.
bucket.selectpicks the pair to trade. That pair still has to pass every lock check, includingmin_net_edge_bpsafter fees.
Matching daily temperature buckets across venues
- Picked by select: all
- Picked by nearest_even_odds
- Wanted by pinned_bounds
…-lt75f0.02 / 0.04…-gte75lt76f0.11 / 0.14…-gte77lt78f0.27 / 0.30allbest screen edge: Kalshi NO 0.65 + Polymarket US YES 0.30 = 0.95…-gte79lt80f0.37 / 0.40nearest_even_oddsKalshi midpoint 38¢ is closest to 50¢pinned_boundsgte 81, lte 82: no pair today, every loop skips…-gte83f0.01 / 0.03KXHIGHNY and Polymarket US temp-nychigh, with a_yes_equals: b_yes. Only Kalshi markets that close within 120 seconds of the Polymarket US event are considered. The screen edge is $1 minus the cheaper lock pair’s two asks, from listed quotes and before fees. max_volume (not shown) picks the pair with the most combined volume. Whichever pair is picked must still pass min_net_edge_bps after fees. The 81 to 82 bucket is left off the Polymarket US side, and pinned_bounds is shown with gte: 81, lte: 82, to illustrate a bucket with no pair.bucket.select
| Value | Picks | When it picks again |
|---|---|---|
all (default) | The pair with the best gross edge, before fees, from each market's listed best bid and ask, in the better direction. If no pair has those quotes yet, the pair whose Kalshi midpoint is closest to 50¢ | Every loop, so it can switch buckets |
nearest_even_odds | The pair whose Kalshi midpoint is closest to 50¢ | Once per daily event |
max_volume | The pair with the most Kalshi plus Polymarket US volume | Once per daily event |
pinned_bounds | Only the pair whose range equals bucket.bounds | Once per daily event. If that bucket has no pair, every loop skips |
Case doesn't matter. Other values are rejected with "unknown bucket selector".
all ranks pairs by gross edge from listed quotes, not by net edge after fees. The chosen pair is then checked against min_net_edge_bps using the live order books.
bucket.bounds
With select: pinned_bounds, set gte, lte or both, as whole numbers that match the bucket's range exactly, both ends included:
| Bucket | bounds |
|---|---|
77 to 78 °F (…-gte77lt78f) | gte: 77, lte: 78 |
83 °F or above (…-gte83f) | gte: 83 |
74 °F or below (…-lt75f) | lte: 74, not 75 |
bounds with any other select is rejected ("bounds is only used with select: pinned_bounds"), and so is pinned_bounds without either bound. A decimal such as 77.5, or a gte above lte, saves but never matches a bucket, so every loop skips.
A bucket block with a fixed leg B is rejected:
# Rejected: bucket needs a rolling daily Polymarket US leg B, and this leg B is a fixed slug
# error: bucket requires a recurring Polymarket US leg B
version: 1
platform: arbitrage
strategy: complementary
venues:
a:
platform: kalshi
market:
series_ticker: KXHIGHNY
b:
platform: polymarket_us
market:
slug: tc-temp-nychigh-2026-09-27-gte77lt78f
mapping:
a_yes_equals: b_yes
bucket:
select: nearest_even_odds
risk:
max_position_usdc: 25
loop:
interval: 30