<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yy5652-hash</title>
    <description>The latest articles on DEV Community by yy5652-hash (@yy5652hash).</description>
    <link>https://dev.to/yy5652hash</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4177701%2F756e7151-6824-4d3b-8b38-ad67bef0d547.png</url>
      <title>DEV Community: yy5652-hash</title>
      <link>https://dev.to/yy5652hash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yy5652hash"/>
    <language>en</language>
    <item>
      <title>I tried to Dutch-book 26 LLM forecasters. Asked one question at a time, every one of them paid out.</title>
      <dc:creator>yy5652-hash</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:20:16 +0000</pubDate>
      <link>https://dev.to/yy5652hash/i-tried-to-dutch-book-13-llm-forecasters-asked-one-question-at-a-time-every-one-of-them-paid-out-1flm</link>
      <guid>https://dev.to/yy5652hash/i-tried-to-dutch-book-13-llm-forecasters-asked-one-question-at-a-time-every-one-of-them-paid-out-1flm</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Benchmarked
&lt;/h2&gt;

&lt;p&gt;I run a bot in Metaculus' AI forecasting tournament. Like almost every forecasting bot, it sends each question to the model &lt;strong&gt;in a fresh chat&lt;/strong&gt;. That made me wonder: when the same event shows up from two angles, &lt;em&gt;"Will the US unemployment rate be 5% or higher in December 2027?"&lt;/em&gt; and &lt;em&gt;"Will it be below 5%?"&lt;/em&gt;, do the two answers even add up to 100%?&lt;/p&gt;

&lt;p&gt;If they don't, the forecaster is &lt;strong&gt;Dutch-bookable&lt;/strong&gt;. A bookie can buy and sell its contracts so that it profits &lt;strong&gt;whatever happens&lt;/strong&gt;. De Finetti showed in the 1930s that this is exactly what it means for a set of numbers to not be probabilities.&lt;/p&gt;

&lt;p&gt;The useful property of coherence: &lt;strong&gt;you don't need to know the future to measure it.&lt;/strong&gt; So the benchmark asks about 2027–2050 events that no model can have memorised, and still scores the answers today.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 37 question families
&lt;/h3&gt;

&lt;p&gt;Each family is a set of statements about the same small set of possible worlds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Family type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Coherence rule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;negation (6)&lt;/td&gt;
&lt;td&gt;"Apple's market cap &amp;gt; Microsoft's on 29 Dec 2028" / "Microsoft's ≥ Apple's"&lt;/td&gt;
&lt;td&gt;P(A) + P(not A) = 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;threshold (5)&lt;/td&gt;
&lt;td&gt;Bitcoin on 31 Dec 2028 above $50k / $100k / $150k / $250k&lt;/td&gt;
&lt;td&gt;must not increase with the threshold; this is how Metaculus builds numeric CDFs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deadline (4)&lt;/td&gt;
&lt;td&gt;A human on Mars by 2030 / 2035 / 2040 / 2050&lt;/td&gt;
&lt;td&gt;must not decrease over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;partition (5)&lt;/td&gt;
&lt;td&gt;Who wins the 2030 World Cup: Spain / France / Brazil / Argentina / England / anyone else&lt;/td&gt;
&lt;td&gt;sums to 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;conjunction (5)&lt;/td&gt;
&lt;td&gt;A, B, "A and B", "A or B"&lt;/td&gt;
&lt;td&gt;P(A∧B) ≤ min, P(A∨B) ≥ max, P(A) + P(B) = P(A∧B) + P(A∨B)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;story (3)&lt;/td&gt;
&lt;td&gt;"A Cat 4–5 hurricane hits the US in 2028" vs "…and causes &amp;gt;$50B damage"&lt;/td&gt;
&lt;td&gt;the detailed version can't be more likely (the Linda problem)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;28 families are about the real future. &lt;strong&gt;9 are controls&lt;/strong&gt; (dice, coins, cards) with exact answers. The controls separate "can't compute probabilities" from "is incoherent when genuinely uncertain".&lt;/p&gt;

&lt;p&gt;Every statement is asked &lt;strong&gt;in isolation&lt;/strong&gt;, in a fresh chat, the way bots do it. Every family is also asked &lt;strong&gt;jointly&lt;/strong&gt;, in one prompt. About 160 calls per model, temperature 0.&lt;/p&gt;

&lt;h3&gt;
  
  
  The metric: how much money can a bookie lock in?
&lt;/h3&gt;

&lt;p&gt;For each family I compute the &lt;strong&gt;guaranteed profit&lt;/strong&gt; of a bookie who can trade at most $1 of each contract at the model's quoted prices. By LP duality this equals the L1 distance from the model's answers to the nearest coherent set of probabilities; a small exact solver computes it for any family shape. A coherent forecaster gives the bookie $0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leaderboard score = arbitrage-free rate&lt;/strong&gt;: the % of families (asked in isolation) on which the bookie can lock in &lt;strong&gt;at most 5¢&lt;/strong&gt;. A model that fails to answer 10% or more of the families (API errors, no parseable number) is not scored at all, so a dropped call never counts as incoherence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;26 models from six providers (Google, Anthropic, OpenAI, xAI, Alibaba, plus open-weight releases), everything I could fit into Kaggle's $10/day model quota over three days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google:&lt;/strong&gt; &lt;code&gt;gemini-3.8-flash&lt;/code&gt;, &lt;code&gt;gemini-3.7-flash&lt;/code&gt; (the task's default model), &lt;code&gt;gemini-3.6-flash&lt;/code&gt;, &lt;code&gt;gemini-3.5-flash&lt;/code&gt;, &lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt;, &lt;code&gt;gemini-3.1-flash-lite-preview&lt;/code&gt;, &lt;code&gt;gemini-3-flash-preview&lt;/code&gt;, &lt;code&gt;gemini-3.1-pro-preview&lt;/code&gt;, &lt;code&gt;gemma-4-31b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic:&lt;/strong&gt; &lt;code&gt;claude-haiku-4-5&lt;/code&gt;, &lt;code&gt;claude-haiku-5-5&lt;/code&gt;, &lt;code&gt;claude-sonnet-5&lt;/code&gt;, &lt;code&gt;claude-sonnet-5-5&lt;/code&gt;, &lt;code&gt;claude-opus-4-5&lt;/code&gt;, &lt;code&gt;claude-opus-4-6&lt;/code&gt;, &lt;code&gt;claude-opus-4-7&lt;/code&gt;, &lt;code&gt;claude-opus-4-8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI:&lt;/strong&gt; &lt;code&gt;gpt-5.4-nano&lt;/code&gt;, &lt;code&gt;gpt-5.4-mini&lt;/code&gt;, &lt;code&gt;gpt-5.5&lt;/code&gt;, &lt;code&gt;gpt-5.6-luna&lt;/code&gt;, &lt;code&gt;gpt-oss-20b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xAI / Alibaba:&lt;/strong&gt; &lt;code&gt;grok-4.20&lt;/code&gt; (non-reasoning), &lt;code&gt;qwen3-235b&lt;/code&gt;, &lt;code&gt;qwen3-next-80b&lt;/code&gt;, &lt;code&gt;qwen3-coder-480b&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three things worth knowing if you build on Kaggle's proxy. First, it reserves each call's worst-case cost from your quota up front, so with no &lt;code&gt;max_tokens&lt;/code&gt; the biggest models refuse every concurrent call; my first run silently turned those refusals into "incoherent" scores. The benchmark now caps &lt;code&gt;max_tokens&lt;/code&gt;, retries, records API errors, and refuses to score a model with low coverage. Second, thinking tokens are what make a 160-call suite expensive, so everything after day 1 ran with &lt;code&gt;reasoning="low"&lt;/code&gt; where the model accepts it; the seven day-1 models ran at their defaults. Third, check your parser against the controls: several models answer dice questions as fractions ("Probability: 11/36"), and my parser read that as 0.11. I found it on the last day, fixed it, and re-scored the affected runs from their saved raw replies. It moved two models by one family each.&lt;/p&gt;

&lt;p&gt;Not scored: &lt;code&gt;glm-5&lt;/code&gt; (empty replies on half the questions), &lt;code&gt;deepseek-r1&lt;/code&gt; and &lt;code&gt;gemma-4-26b&lt;/code&gt; (ran out of output tokens before giving a number on 40–50% of families), &lt;code&gt;gpt-oss-120b&lt;/code&gt; (the runner errored), and &lt;code&gt;grok-4.5&lt;/code&gt; / &lt;code&gt;grok-4.6&lt;/code&gt; (listed, but the proxy answers 404).&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5fgc63yxvyn9jdu79yz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5fgc63yxvyn9jdu79yz2.png" alt="Isolated vs joint coherence per model, and where the bookie's profit comes from" width="800" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Every model knows the rules of probability. It just doesn't apply them across separate calls.&lt;/strong&gt;&lt;br&gt;
On the 9 dice-and-card controls, 23 of the 26 models are essentially perfectly coherent (≤ 1¢ per family). Asked a whole family in one prompt, every model is 95–100% arbitrage-free, and 21 of 26 score a clean 100%. Asked one statement per chat, they drop to &lt;strong&gt;49–89%&lt;/strong&gt;, 70% on average. The problem is not ignorance; it is isolation, which is exactly how forecasting bots call these models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The money is in conjunctions, partitions and negations. Monotone families are nearly free.&lt;/strong&gt;&lt;br&gt;
Across all models and families asked in isolation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;family type&lt;/th&gt;
&lt;th&gt;arbitrage-free rate (isolated)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;conjunction&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;partition&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;negation&lt;/td&gt;
&lt;td&gt;57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deadline&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;threshold&lt;/td&gt;
&lt;td&gt;94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;story&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Deadlines ("by 2030 / 2035 / 2040") and thresholds ("above $50k / $100k / …") are mostly fine: models handle &lt;em&gt;monotone&lt;/em&gt; structure even across calls. The three family types with a &lt;em&gt;conservation law&lt;/em&gt; (things must add up) are where the bookie eats. The worst single family was the earthquake conjunction (26¢ per model on average), the best was anything with a date ladder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The most expensive single answers.&lt;/strong&gt; A bookie earns these with zero information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;qwen3-235b&lt;/code&gt;, earthquake conjunction: P(M7+ in California by 2035) = &lt;strong&gt;0.18&lt;/strong&gt;, P(M7+ in Kanto) = &lt;strong&gt;0.35&lt;/strong&gt;, P(both) = &lt;strong&gt;0.75&lt;/strong&gt;, P(at least one) = &lt;strong&gt;0.98&lt;/strong&gt;. "Both" is more likely than either part. Worth &lt;strong&gt;$1.20&lt;/strong&gt; per $1 of contracts, the maximum this benchmark can award.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-oss-20b&lt;/code&gt;, same family: P(California) = &lt;strong&gt;0.995&lt;/strong&gt;, P(Kanto) = &lt;strong&gt;0.015&lt;/strong&gt;, P(both) = &lt;strong&gt;0.9996&lt;/strong&gt;. &lt;strong&gt;$1.08&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;qwen3-next-80b&lt;/code&gt;, two IPOs: P(OpenAI lists) = &lt;strong&gt;0.40&lt;/strong&gt;, P(SpaceX lists) = &lt;strong&gt;0.85&lt;/strong&gt;, P(both) = &lt;strong&gt;0.10&lt;/strong&gt;, P(at least one) = &lt;strong&gt;0.15&lt;/strong&gt;. "At least one" is less likely than either. &lt;strong&gt;$1.00&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grok-4.20&lt;/code&gt; (non-reasoning), on a &lt;em&gt;control&lt;/em&gt;: asked for P(at least two of five dealt cards share a rank), it reasoned that there are "13 ranks and only 4 suits, so by the pigeonhole principle" five distinct ranks are impossible, and answered &lt;strong&gt;1&lt;/strong&gt;. In the next chat it computed P(all five ranks differ) = &lt;strong&gt;0.507&lt;/strong&gt;, correctly. &lt;strong&gt;51¢&lt;/strong&gt;, on a question with a textbook answer.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-5.4-mini&lt;/code&gt;, the Moon: P(someone walks on the Moon before 2029) = &lt;strong&gt;0.74&lt;/strong&gt; and P(nobody does) = &lt;strong&gt;0.74&lt;/strong&gt;. They sum to &lt;strong&gt;1.48&lt;/strong&gt;. &lt;code&gt;gpt-5.4-nano&lt;/code&gt; did the same (1.43), and &lt;code&gt;qwen3-next-80b&lt;/code&gt; went to 1.80 (0.95 and 0.85). The model agrees with whichever framing it is shown.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude-opus-4-7&lt;/code&gt;, climate conjunction: P(A) = 0.35, P(B) = 0.38, P(both) = 0.28, P(at least one) = &lt;strong&gt;0.90&lt;/strong&gt;. &lt;strong&gt;45¢&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;"Which of 2027–2030 will be the warmest year", four mutually exclusive answers: &lt;code&gt;qwen3-235b&lt;/code&gt; 1.37, &lt;code&gt;haiku-4-5&lt;/code&gt; 1.32, &lt;code&gt;gpt-5.4-mini&lt;/code&gt; 1.31. The 2030 World Cup partition goes the other way for &lt;code&gt;gpt-oss-20b&lt;/code&gt;: six exhaustive outcomes that sum to &lt;strong&gt;0.36&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Newer beats bigger. Price barely predicts coherence.&lt;/strong&gt; The top three are &lt;code&gt;gemini-3.8-flash&lt;/code&gt; (89%), &lt;code&gt;gpt-5.5&lt;/code&gt; and &lt;code&gt;gemini-3.7-flash&lt;/code&gt; (both 84%). &lt;code&gt;gemini-3.1-pro-preview&lt;/code&gt; (68%) sits below six Flash and Flash-Lite models from its own family, and every Claude Opus (68–76%) is at or below &lt;code&gt;claude-haiku-5-5&lt;/code&gt; (78%). What does track coherence is the release generation inside a family: Gemini Flash goes 68 → 78 → 76 → 84 → 89 from 3.0 to 3.8, Haiku 65 → 78 and Sonnet 68 → 76 from one release to the next, GPT 59 (5.4-mini) → 84 (5.5). At the bottom, four of the eight lowest scores are open-weight models (&lt;code&gt;gpt-oss-20b&lt;/code&gt;, &lt;code&gt;qwen3-coder-480b&lt;/code&gt;, &lt;code&gt;qwen3-next-80b&lt;/code&gt;, &lt;code&gt;qwen3-235b&lt;/code&gt;), almost entirely because of conjunctions (20–41¢ per family).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Temperature 0 is not deterministic on this proxy.&lt;/strong&gt; The default model scored 67.6%, 75.7%, 81.1% and 83.8% on four identical runs. A single-run leaderboard number carries roughly ±8 points of noise, so I report family-level cents alongside the headline percentage and treat differences under ~10 points as a tie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. The Linda problem is mostly solved.&lt;/strong&gt; Adding a plausible detail ("…aboard a SpaceX Starship") almost never raised the probability (story families 95% arbitrage-free).&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'd measure next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Paraphrase robustness: the negation failures look like an &lt;em&gt;acquiescence&lt;/em&gt; effect, so ask the same family as "Will X happen?" vs "Is it false that X happens?".&lt;/li&gt;
&lt;li&gt;Whether sampling 5 answers and averaging recovers coherence (it should reduce the run-to-run noise in finding 5, but not the systematic conjunction errors).&lt;/li&gt;
&lt;li&gt;Resolved questions, in a year: does coherence predict accuracy?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If you build forecasting bots
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For multiple-choice and numeric questions, ask for &lt;strong&gt;all options / the whole CDF in one call&lt;/strong&gt; and renormalise.&lt;/li&gt;
&lt;li&gt;For anything else, &lt;strong&gt;project your answers onto the coherent set&lt;/strong&gt; after the fact. Because the true outcome is a vertex of that convex set, the projection can never make the Brier score worse, whatever happens. The LP in the notebook does it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kaggle benchmark (leaderboard): &lt;a href="https://www.kaggle.com/benchmarks/yy5652/dutch-book-bench" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/yy5652/dutch-book-bench&lt;/a&gt; — the leaderboard column is a batch run of the task per model through Kaggle's own task runner. For the 13 models I added on the last day it is the same run as in the chart; for the earlier ones it is a re-run, so the numbers differ by the ±8-point noise described in finding 5&lt;/li&gt;
&lt;li&gt;Kaggle task page (code, per-model outputs, the model's own reaction to its worst Dutch book): &lt;a href="https://www.kaggle.com/benchmarks/tasks/yy5652/dutch-book-bench" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/yy5652/dutch-book-bench&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source, offline test and results: &lt;a href="https://github.com/yy5652-hash/minibench-bot/tree/claude/gifted-cori-docto2/kaggle_benchmark" rel="noopener noreferrer"&gt;https://github.com/yy5652-hash/minibench-bot/tree/claude/gifted-cori-docto2/kaggle_benchmark&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prior work: &lt;em&gt;Consistency Checks for Language Model Forecasters&lt;/em&gt; (Paleka et al.) also uses arbitrage to score consistency. What's different here: exact-answer controls next to open questions, a direct isolated-vs-joint comparison, one generic LP that turns any family of events into a guaranteed-profit number, and Kaggle's model roster.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
