Polymarket's $644M February Jobs Bet: How the Worst Payrolls Print in Years Was Priced
February payrolls came in at -92,000. Polymarket had $644M wagered across seven range markets and still priced the correct outcome at 22 cents the morning it happened. Here's the full price path.
The February 2026 nonfarm payrolls print was -92,000 — the worst single-month result since the early COVID lockdowns. Polymarket traders had collectively wagered $644 million across seven outcome-range markets covering every possible scenario from "less than 25K" to "more than 175K." At 8 AM UTC on March 6, the morning the number dropped, the correct bucket was trading at 22 cents. Two hours later it settled at 99.95 cents.
This isn't a post about how the market was "wrong." Markets can't price what they can't know. It's about what the order book actually showed in the two weeks leading up to the number — including one clear signal that most commentators missed entirely.
The Baseline Picture: Seven Markets, $644M, One Winner
Polymarket structured the February jobs report as a set of seven binary markets, each asking whether payrolls would land in a specific 25K-wide range. Every trader who thought they knew the print picked their bucket and went long the Yes side. Here's how the money distributed:
| Outcome Range | Total Volume | Pre-Report Morning Price |
|---|---|---|
| Less than 25K | $146.5M | 22¢ |
| 50K–75K | $126.6M | 26¢ |
| 25K–50K | $117.3M | ~22¢ |
| 75K–100K | $88.4M | ~16¢ |
| 100K–125K | $63.1M | ~12¢ |
| 150K–175K | $51.9M | ~9¢ |
| 125K–150K | $50.4M | ~9¢ |
The consensus was 50–75K, at 26¢. The most money in absolute terms ($146.5M) was on "less than 25K" — the eventual winner — but it was still trading at less than a quarter. Meanwhile $126.6M in capital on the 50–75K range was about to go to zero.
By any read, the market was pricing an above-zero jobs print as the base case. February had to print below 25K for the leading volume bucket to pay out. It printed -92K.
The Iran Signal (That Didn't Hold)
Here's the part that makes this more than a hindsight story.
On February 25, news of diplomatic talks between Iran and the US via Oman broke. The market immediately interpreted this as "de-escalation → oil stays lower → economy holds up → consensus payrolls." The "less than 25K" Yes contract dropped from 22¢ to 15¢ in a single session. The 50–75K range moved the other direction, peaking near 28¢ — traders were more confident in the consensus positive print.
Then the strikes happened. At 18:00 UTC on February 27, confirmation of US and Israeli air campaigns against Iranian targets circulated. Oil spiked past $110/barrel. The "less than 25K" market reversed hard: from 15.5¢ back to 25¢ within 24 hours — a 10 percentage-point move attributable directly to the oil shock repricing labor market tail risk.
| Timestamp (UTC) | "Less Than 25K" Price | Event |
|---|---|---|
| Feb 24 00:00 | 22¢ | Baseline |
| Feb 25 07:00 | 17¢ | Iran–Oman diplomacy signals |
| Feb 25 15:00 | 15¢ | Oman talks confirmed |
| Feb 27 18:00 | 20¢ | Iran strikes confirmed |
| Feb 28 08:00 | 28.5¢ | Post-strike peak |
| Mar 6 06:00 | 22¢ | Final morning pre-report |
| Mar 6 13:00 | 49¢ | Report hits (first trades) |
| Mar 6 14:00 | 99.95¢ | Settled |
That 10pp move — from 15¢ to 25¢ — is a clean macro transmission signal. Oil shock → energy costs spike → consumer spending pressure → higher probability of negative payrolls. The order book was picking this up faster than most Wall Street desks revised their consensus estimates.
But then the market gave it back. By March 6 morning, "less than 25K" had drifted back to 22¢ — almost exactly where it started on February 24. Consensus anchoring pulled the market back toward the positive-print prior, even as the fundamental picture had materially changed.
Volume: The Slow Ramp That Didn't Fully Resolve the Price
The volume story is equally telling. Daily volume on the "less than 25K" market tells you when informed money started moving:
| Date | Daily Volume | Multiple vs. Baseline |
|---|---|---|
| Feb 24–26 | ~$5.4M/day | 1.0× |
| Feb 27–28 | $5.7M / $6.5M | 1.1–1.2× |
| Mar 1 | $7.4M | 1.4× |
| Mar 2 | $11.1M | 2.1× |
| Mar 3 | $12.4M | 2.3× |
| Mar 4 | $12.8M | 2.4× |
| Mar 5 | $13.4M | 2.5× |
| Mar 6 | $15.5M | 2.9× |
Volume started climbing on March 1 and had more than doubled by March 2. On March 2, the "less than 25K" price briefly ran to 39.5¢ — traders were piling in. But the price pulled back from that peak and settled in the 22–24¢ range for the final three days.
The interpretation: volume escalation indicated accumulation of tail-risk bets, but it wasn't directional enough to move the final price. Every time "less than 25K" ran toward 30–40¢, sellers came in and faded it. The market kept re-anchoring to the view that -92K was too extreme to price at 30+ cents.
Bid-ask spread on the market peaked at 53¢ on March 6 — market makers were nearly checking out. By comparison, spreads had been 2–4¢ in late February. The uncertainty was known; the final price just didn't fully reflect it.
Replicating the Analysis
You can pull this exact price and volume path from the polymarketdata.co API:
from polymarketdata import PolymarketDataClient, Resolution
import pandas as pd
# Slugs for the February jobs markets
MARKET_SUB25K = "will-the-us-add-less-than-25k-jobs-in-february"
MARKET_50_75K = "will-the-us-add-between-50k-and-75k-jobs-in-february"
with PolymarketDataClient(api_key="YOUR_API_KEY") as client:
# Price trajectory for the "less than 25K" winner
prices_sub25k = client.history.get_market_prices(
MARKET_SUB25K,
start_ts="2026-02-24T00:00:00Z",
end_ts="2026-03-07T00:00:00Z",
resolution=Resolution.ONE_HOUR,
)
# Volume/spread for the same market
metrics_sub25k = client.history.get_market_metrics(
MARKET_SUB25K,
start_ts="2026-02-24T00:00:00Z",
end_ts="2026-03-07T00:00:00Z",
resolution=Resolution.ONE_HOUR,
)
df_prices = prices_sub25k.to_dataframe_prices()
df_metrics = metrics_sub25k.to_dataframe_metrics()
# Filter to Yes token only
df_yes = df_prices[df_prices["token_label"] == "Yes"].copy()
df_yes["t"] = pd.to_datetime(df_yes["t"], utc=True)
df_yes = df_yes.sort_values("t")
# Key reference timestamps
iran_strikes_confirmed = pd.Timestamp("2026-02-27 18:00:00", tz="UTC")
report_release = pd.Timestamp("2026-03-06 13:00:00", tz="UTC")
# Price just before Iran strikes
pre_strike = df_yes[df_yes["t"] < iran_strikes_confirmed]["price"].iloc[-1]
# Price peak after strikes, pre-report
post_strike_peak = df_yes[
(df_yes["t"] >= iran_strikes_confirmed) &
(df_yes["t"] < report_release)
]["price"].max()
# Price morning of report (08:00 UTC)
morning_price = df_yes[
df_yes["t"] == pd.Timestamp("2026-03-06 08:00:00", tz="UTC")
]["price"].values[0]
# Price at settlement
settlement_price = df_yes[df_yes["t"] >= report_release]["price"].iloc[2]
print(f"Pre-strike price: {pre_strike:.3f}")
print(f"Post-strike peak: {post_strike_peak:.3f}")
print(f"Morning of report: {morning_price:.3f}")
print(f"Settlement price: {settlement_price:.3f}")
print(f"Iran repricing: +{post_strike_peak - pre_strike:.2f}pp")
# Daily volume ramp
df_metrics["t"] = pd.to_datetime(df_metrics["t"], utc=True)
df_metrics["date"] = df_metrics["t"].dt.date
daily_vol = df_metrics.groupby("date")["volume"].sum()
baseline = daily_vol[:"2026-02-26"].mean()
print(f"\nBaseline daily volume: ${baseline:,.0f}")
print(f"Resolution day volume: ${daily_vol['2026-03-06']:,.0f}")
print(f"Volume multiple: {daily_vol['2026-03-06'] / baseline:.1f}x")
# Peak spread
print(f"\nPeak bid-ask spread: {df_metrics['spread'].max():.3f}")
What This Means for Trading These Markets
Two patterns worth internalizing:
Geopolitical shocks reprice macro tail risk faster than consensus. The Iran strikes moved February jobs tail probability by 10pp in under 24 hours. Oil at $110 is an automatic drag on consumer spending and business margins — the order book priced that transmission before most economists revised their forecasts. When you see a geopolitical event that materially changes energy prices, check economic data markets immediately. The first-mover window is typically 12–48 hours before the consensus catches up.
Volume acceleration without price convergence is a warning sign. Volume on the "less than 25K" market tripled in the final week, but the price didn't move to match — it kept getting faded back to 22¢. That's the market telling you there's genuine disagreement between buyers and sellers, not consensus. In these situations, the final pre-report price is less reliable than usual as a probability estimate. The 53¢ peak spread on resolution day was the market maker version of saying "we genuinely don't know" — by the time the spread is that wide, the liquidity signal had already told you the uncertainty was real.
The February print was the tail. 22 cents for a tail event that eventually happened isn't necessarily "wrong" — but the combination of an oil shock, three declining months in five, and a volume ramp that doubled in four days before report day was a reasonably complete picture. The market had the pieces. It just anchored to the consensus anyway.
All data from the polymarketdata.co API. Full endpoint reference at polymarketdata.co/docs.