kalshi-yes-to-american-odds draft
Converting a Kalshi Yes (or No) cent price to the American-odds equivalent for the right outcome — the conversion that bridges Kalshi binary markets to sportsbook quotes
- Tags
- kalshi conversion american-odds probability fundamentals
- Vocabulary
- cents_to_probability
- The first step of the conversion: a Kalshi cent price X maps directly to implied probability X/100. A Yes at 65¢ implies P(Yes) = 0.65; a No at 36¢ implies P(No) = 0.36.
- american_branch_split
- American odds use two formulas depending on whether the implied probability is below or above 0.5. Below: positive odds, +(1-p)/p × 100. At/above: negative odds, -p/(1-p) × 100. Same split as american-decimal-conversion.
- fee_adjusted_american
- The American-equivalent that includes Kalshi's per-trade fee in the risk and profit numerators. Kairos exposes this via kalshi_half_maker(cents); the unadjusted (raw) American conversion ignores fees. The two differ by ~0.3-1.5% depending on price and bucket.
- outcome_matters
- Direction-of-question gotcha. Converting a Yes price gives American odds for the Yes outcome; converting the matching No price gives American odds for the No outcome. These are NOT the same number on opposite sides of the same game — they price different events with the spread loaded onto opposite sides.
This is the conversion the operator reaches for whenever Kalshi quotes a binary market and the operator wants to compare it to a sportsbook's American-odds quote on the same event. It is conceptually simple — cents are an implied probability, and American odds are a different way of writing the same probability — but it is the source of confusion the user has flagged most often, because the conversion has two directions that price different events, and the failure mode is converting the wrong side and treating it as comparable to the sportsbook's quote on the question you actually care about.
The two-step conversion: cents → implied probability → American odds. The implied probability is just the cents price divided by 100. The American odds depend on whether the probability is below or above 0.5: below 0.5 means underdog (positive American), at or above 0.5 means favorite (negative American). The formula split is identical to american-implied-probability — only the input source has changed.
The Kalshi-specific complication is fees. Kalshi charges a per-trade fee that depends on price (and bucket — game vs. spread/total — see below). The fee adjusts the risk and profit numerators of the American formula, so a fee-adjusted American conversion produces a slightly different number than the raw conversion. Kairos's kalshi_half_maker(cents) helper in kairos/core/odds.py returns the fee-adjusted American value (with the firm's 50% rebate baked in via KALSHI_FEE_RATE_NET). The raw conversion below ignores fees; the worked example shows both the raw answer and notes where the fee-adjusted answer would shift it.
For exact field semantics, fee schedule details, and the underlying Kalshi-side conventions (whole-cent vs fixed-point, SDK renames, market-bucket fee differences), defer to kalshi-mcp via lookup_field(yes_price), lookup_field(no_price), and search_gotchas(fee). Mimir owns the conceptual mapping; kalshi-mcp owns the field-level details.
Worked example
A Patriots-vs-Jets binary market on Kalshi. The market is structured as "Will the Patriots win?" — Yes = Patriots win, No = Patriots do NOT win.
Kalshi quotes: - Yes: 47¢ - No: 55¢
Question 1: What is the American-equivalent for "Patriots win"?
This is what the Yes price represents. Convert it.
- cents → probability: 47 / 100 = 0.47.
- 0.47 < 0.50 → positive (underdog) branch.
- American = (1 / 0.47 − 1) × 100 = (2.1277 − 1) × 100 = +112.77 → round to +113.
So Yes at 47¢ on "Patriots win" is the same implied probability as a sportsbook quoting Patriots at +113. Fee-adjusted (via kalshi_half_maker(47)), this number shifts very slightly because Kalshi's fee narrows the profit and widens the risk for an at-entry trade. The shift is small at this price (well under 1% of the American number); for tight arb decisions per two-way-arbitrage you must use the fee-adjusted figure. Consult kalshi-mcp__search_gotchas(fee) for the exact fee model and formula in use today.
Question 2: What is the American-equivalent for "Patriots do NOT win"?
This is what the No price represents — the No side resolves whenever the Yes side doesn't. Convert it.
- cents → probability: 55 / 100 = 0.55.
- 0.55 ≥ 0.50 → negative (favorite) branch.
- American = −(0.55 / (1 − 0.55)) × 100 = −(0.55 / 0.45) × 100 = −122.22 → round to −122.
So No at 55¢ on "Patriots win" is the same implied probability as a sportsbook quoting "Patriots do NOT win" at −122.
A subtlety worth flagging: "Patriots do NOT win" and "Jets win" are NOT always the same event. In a sport with possible ties (NFL, soccer), a tie is also a "Patriots do NOT win" outcome, so the No price covers Jets-win-OR-tie. In a sport without ties (NBA regular season, MLB, tennis), they're identical and you can call −122 the "Jets win" line freely. For the NFL example here, ties are rare but legal — consult the market's resolution rule on kalshi-mcp__describe_endpoint(events.get_event) to confirm whether ties resolve No or void the contract before treating −122 as a Jets-win line specifically.
Crucial: the +113 (Yes-on-Patriots) and the −122 (No-on-Patriots) are NOT a matched pair on the same outcome. They price two different events:
- +113 = "Patriots win" priced at the Yes-side cost (cross the Yes ask).
- −122 = "Patriots do NOT win" priced at the No-side cost (cross the No ask). In a no-tie sport this equals "Jets win"; in a tie-possible sport it equals "Jets win OR tie."
If you want the American-equivalent for "Jets win" paid through the Yes side instead (which would be selling Yes at the bid, not buying No at the ask), you'd use the Yes-bid price (e.g. 46¢) and run the conversion on its complement, 54¢ (since selling Yes at 46¢ ≈ buying No at 54¢). Different price (54¢ vs 55¢), different American number — the difference is the spread. This is the muddy spot. The fix is to always be explicit about which question you're answering and which side of the book you are crossing.
Question 3: How does this compare to a sportsbook quoting Patriots +120 and Jets −150?
Now we have two American quotes for each outcome:
| Outcome | Kalshi (raw) | Sportsbook |
|---|---|---|
| Patriots win | +113 | +120 |
| Jets win | −122 | −150 |
For "Patriots win": sportsbook +120 pays more than Kalshi +113. If you believe the Patriots will win, the sportsbook is the better venue (modulo fees and limits).
For "Jets win": Kalshi −122 requires risking less per dollar of profit than sportsbook −150 (less negative is better for a favorite bet). If you believe the Jets will win, Kalshi is the better venue.
A two-way-arbitrage check (per two-way-arbitrage): Patriots at +120 (sportsbook) and Jets at −122 (Kalshi No) — taking each on the venue that prices them best. Convert each to implied probability:
- Patriots +120: 100 / (120 + 100) ≈ 0.4545
- Jets −122: 122 / (122 + 100) ≈ 0.5495
Sum: 1.004. Not under 1.0, so no arb here — the spread plus Kalshi's implicit fee gap eats the would-be edge. Whether the gap shrinks under the fee-adjusted American figures (which lower the Kalshi side's effective probability slightly) depends on the exact fee impact at these cent prices. Use kalshi_half_maker(55) and kalshi_half_maker(53) (the Yes-bid complement) to compute fee-adjusted American numbers when the rough check is on the boundary. See kalshi-mcp__search_gotchas(fee) for the fee schedule.
Gotchas
- Direction matters: Yes-on-Patriots and No-on-Jets answer different questions. Yes at 47¢ converts to American odds for the Patriots winning. No at 55¢ converts to American odds for the Jets winning. They are two different bets. The reflexive "convert the Yes price and you've got the answer for both sides" is wrong and is the user's flagged source of confusion. Always identify the outcome before converting, and convert the price on the side that bets on that outcome.
- The Yes price and the matching No price don't produce inverse American numbers. Yes at 47¢ → +113 and No at 53¢ (the complement, not the No ask) → −113 would be inverse. But the No ask is usually 54-55¢ at the same time — the spread shifts the No-side price away from the Yes-side complement. Converting the Yes ask and the No ask gives you American numbers on different sides of a non-zero spread, not inverses.
- Fee adjustment is cents-side specific. The raw cents → American conversion ignores fees. Kairos's
kalshi_half_maker(cents)(inkairos/core/odds.py) bakes the per-trade fee into the risk and profit numerators directly:risk = P·(1 + r·(1 − P))andprofit = (1 − P)·(1 − r·P)withr = KALSHI_FEE_RATE_NET = 0.00875(after the 50% maker rebate). For a 47¢ Yes the fee adjustment shifts the American number by less than a point; for tight prices near 50¢ the relative impact is largest. Use raw conversions for sanity-check comparisons; use fee-adjusted for arb decisions. Consultkalshi-mcp__search_gotchas(fee)for the canonical fee schedule. - Spread and total markets are fee-exempt today; game (moneyline) markets are not. Kairos's
is_fee_exempt_bucketreturns True for"spread"and"total"and False for"game". The bucket-aware helperamerican_from_kalshi_cents(cents, bucket)selects raw conversion for fee-exempt buckets and fee-adjusted for game. Don't apply the fee adjustment to a spread/total bucket — you'll mis-price by the fee. Don't omit it on a game bucket. - Round-trip drift: cents → American → cents may not reproduce the input. Both conversions involve rounding (cents are integer, American is rounded to integer or one decimal in Kairos). For 47¢ → +113 → cents, the back-conversion via
100 / (113 + 100) × 100 = 46.95rounds back to 47¢, but at edge prices (especially near 50¢ or near the boundary) you can land one cent off. Usekalshi_half_maker_cents_from_americanfor the fee-aware inverse and don't expect bit-exact round-tripping. - The −100 boundary at p = 0.5 follows the canonical Mimir rule. Yes at exactly 50¢ → American −100 (per the codebase's
−100canonical choice for the boundary, documented inamerican-decimal-conversion). Don't quote +100 here. - Selling Yes is not the same execution as buying No, even though it's the same economic position. The cents price you pay differs (Yes-bid vs. No-ask), and the fee model (maker vs. taker) may differ depending on whether your order rests on the book or crosses the spread. The American-equivalents you compute will therefore differ between the two paths to the same outcome — pick the one that matches the order you actually placed. See
kalshi-yes-no-semanticsfor the equivalence relation andkalshi-mcp__search_gotchas(fee)for the maker/taker schedule.
Open questions
- The entry currently references
kalshi_half_maker's formula by name and explains where fees enter the risk/profit numerators, but does not reproduce the full helper. If a downstream consumer reports they wanted the formula inline rather than as a reference, expand the "Fee adjustment is cents-side specific" gotcha into its own subsection with the worked formula. Otherwise leave as-is. - Kalshi's fee schedule may change. The entry references
KALSHI_FEE_RATE_NET = 0.00875as the current value but does not encode it as a fact; consumers should fetch the current rate fromkalshi-mcprather than relying on the number quoted here. Whether Mimir should periodically re-validate the fee number againstkalshi-mcpis a corpus-maintenance question, but the per-entry safer behaviour is to not pin the value. - For sub-cent fractional markets (where
yes_price_dollarscarries digits past two decimal places), the conversion is identical in principle but the integer-cent rounding gotcha disappears; rounding moves to the chosen tick precision instead. The entry's framing assumes whole-cent ticks. If a consumer hits a fractional market they should still apply the cents → probability → American flow, just with the higher-resolution input. Whether Mimir should add a fractional-market sub-section is a future-entry question.
Cross-references
- mimir: kalshi-yes-no-semantics
- mimir: american-implied-probability
- mimir: american-decimal-conversion
- mimir: two-way-arbitrage
- mimir: book-vig-overround
- kalshi-mcp: lookup_field(yes_price)
- kalshi-mcp: lookup_field(no_price)
- kalshi-mcp: lookup_field(yes_price_dollars)
- kalshi-mcp: search_gotchas(price)
- kalshi-mcp: search_gotchas(fee)