Shipping Signals: How to Make Money on Prediction Markets with AIS Data
Veblyn Research - April 2, 2026

Polymarket hosts hundreds of shipping and geopolitics markets. Most traders watch Twitter for breaking news and trade on vibes. That is slow, noisy, and unreliable.
We asked: what happens when you align structured real-world signal data - AIS vessel transit counts, maritime advisories, congestion indices - directly to these markets? The answer: you see price moves before they happen.
This post walks through exactly how the pipeline works, how you can replicate it yourself, and what the data actually looks like when a chokepoint starts deteriorating. This is not theory. This is a walkthrough for making money.
The data pipeline
We built a system connecting PortWatch AIS chokepoint data to Polymarket shipping event contracts. 198 shipping events. 6 major chokepoints (Suez, Panama, Hormuz, Malacca, Bosporus, Bab el-Mandeb). 5 signal types per chokepoint. Signals update continuously from satellite AIS feeds and are aligned to every relevant market in real time.
198
shipping events analyzed
91.5%
signal coverage
0.351
Brier score (model) vs 0.342 (market)
5
transport signals per chokepoint
What the signals are
Each chokepoint has five transport signals. Together they give you a complete picture of what is happening at the passage - from normal flow to full closure. Here is what each one measures.
throughput_count
Daily vessel count through the chokepoint. The most direct measure of traffic flow.
closure_indicator
Binary flag for complete closure. When this flips to 1, markets move fast.
congestion_index
Ratio of baseline-to-actual throughput using a 14-day rolling median. Captures gradual deterioration.
reroute_share
Fraction of traffic detouring via alternative routes. Rises before official advisories.
security_risk_index
Composite of congestion and closure risk. Aggregates multiple threat dimensions.
What we found
Transit count drops correlate with market attention - when vessels stop flowing, markets reprice. The signal data is genuinely informative: 91.5% of events have fresh transport signals within the analysis window.
A gradient boosting model trained on these signals achieved a Brier score of 0.351 versus the market baseline of 0.342. The model does not beat the market on aggregate, but the raw signal data is the value.
Most prediction market traders do not monitor AIS data at all. When a signal changes - transit count drops 15% - informed participants can act before the crowd. That is where the money is.
Signal-to-price relationship
Here is what the edge looks like in practice. When Suez transit counts drop below the rolling average, the market is slow to reprice. Eight hours later, it catches up.
| Date | Suez Transit | 7-day Avg | Market Price | Price 8h Later |
|---|---|---|---|---|
| Mar 28 | 44 | 51 | 35% | 42% |
| Mar 25 | 48 | 52 | 28% | 35% |
| Mar 22 | 39 | 50 | 30% | 38% |
Every row shows the same pattern: transit count drops below average, market has not repriced yet, and within 8 hours the price moves 7-8 points. That 7-8 point move is profit if you are positioned before it happens.
How to replicate this yourself
This is a step-by-step walkthrough. By the end you will have shipping metrics and market history flowing into your own code. No special access required - just an API key.
Step 1: Get a Veblyn API key
Create a free account at veblyn.com/auth. Your API key starts with vb_ and lives in the dashboard under Settings.
Step 2: Pull shipping markets
One call returns every active shipping market with its current price, volume, and metadata. Filter by category to get only shipping.
import httpx
client = httpx.Client(headers={"Authorization": "Bearer vb_YOUR_KEY"})
# Get all shipping markets
resp = client.get("https://api.veblyn.com/api/v1/market",
params={"category": "shipping", "status": "active"})
markets = resp.json()["market"]
for m in markets:
print(f"{m['title']}: {m['price']:.1%}")Step 3: Pull the shipping metric you care about
Shipping metrics live under the PortWatch stream. List the available metrics, then fetch history for the one you want to study.
# List PortWatch metrics and inspect Suez throughput history
metrics = client.get(
"https://api.veblyn.com/api/v1/stream/portwatch/metric"
).json()
suez_throughput = next(
m for m in metrics
if m["entity_id"] == "suez" and m["metric_name"] == "throughput_count"
)
history = client.get(
f"https://api.veblyn.com/api/v1/metric/{suez_throughput['id']}/history",
params={"limit": 30},
).json()
for point in history[-5:]:
print(point["ts"], point["value"])Step 4: Compare metric trend to market price
Pull market quote history separately, then compare it against the metric series. When throughput drops but price has not moved, you are looking at a mispricing.
market_id = markets[0]["id"]
quote_history = client.get(
f"https://api.veblyn.com/api/v1/market/{market_id}/history",
params={"limit": 30},
).json()
# Compare quote_history to the metric history above.
# If throughput_count is dropping while price hasn't moved,
# the market may be underpricing the disruption.You do not need a model to act on this. A daily check of metric direction vs. market price is enough to catch most mispricings. The model helps you scale it - but the raw data is the real product.
The model we built
We trained a HistGradientBoostingClassifier from scikit-learn on historical shipping events to see how far signal data alone can go.
Feature set (32 features)
- Market microstructure - probability, best bid, best ask, spread, depth
- Event structure - outcome count, outcome entropy
- Transport signals - 5 real-time signals (throughput_count, closure_indicator, congestion_index, reroute_share, security_risk_index)
- Signal delta - 2 features tracking 24-hour changes in throughput and congestion
73
training events
32
validation events
67
test events
64K+
total rows
| Split | Events | Rows | Period |
|---|---|---|---|
| Training | 73 | 9,628 | 2021-2024 |
| Validation | 32 | 4,256 | 2024-2025 |
| Test | 67 | 50,175 | 2025-2026 |
Calibration uses temperature scaling (Platt scaling) with temp=3.0. This smooths the model's raw probabilities so they better represent true likelihoods rather than overconfident point estimates.
Understanding the Brier score
The Brier score measures calibration - how well predicted probabilities match actual outcomes. Lower is better. A perfect forecaster scores 0.0. A coin flip scores 0.25.
0.351
Our model
0.342
Market baseline
The market is slightly better calibrated overall. That is expected - prediction markets aggregate thousands of participants, each bringing different information. Beating that aggregate on raw calibration is extremely hard.
But that is not the point.The model scoring 0.351 against the market's 0.342 means our signal data is nearly as informative as the crowd's collective wisdom. Five transport signals from AIS data carry almost as much predictive power as the entire market's order flow.
The real value is not beating the market's Brier score. It is having the signals before the market reprices. When throughput drops, you see it in the API. The market sees it when enough traders notice. That gap - hours to sometimes a full day - is where the money is.
The 6 chokepoints
Global shipping funnels through a handful of narrow passages. When any one of these gets disrupted, prediction markets react - but usually late. Here is what each one controls.
| Chokepoint | Location | Why it matters |
|---|---|---|
| Suez Canal | Egypt | Connects Mediterranean to Red Sea, ~12% of global trade |
| Panama Canal | Panama | Links Atlantic to Pacific, ~5% of global trade |
| Strait of Hormuz | Iran/Oman | ~20% of the world's oil passes through here |
| Bab el-Mandeb | Yemen/Djibouti | Entry to Red Sea, Houthi attacks disrupted shipping |
| Strait of Malacca | Malaysia/Indonesia | Busiest shipping lane, ~25% of global trade |
| Bosporus | Turkey | Connects Black Sea to Mediterranean |
Veblyn tracks all six. Each chokepoint gets its own set of five transport signals, updated continuously from AIS data and maritime advisories.
What to watch for
You do not need to build a model to make money on shipping markets. Here are the practical rules we use internally.
Throughput drops >10% below 14-day average
This is your early warning. When vessel counts fall meaningfully below the rolling baseline, something is happening at the chokepoint. Pull up the relevant markets and check if the price has moved yet. If it has not - that is your window.
Reroute share is rising
When ships start detouring around a chokepoint, the reroute_share signal climbs before any official advisory gets issued. Markets tend to follow within hours of the reroute becoming visible in the data.
Closure indicator flips to 1
This is the strongest signal in the dataset. When a chokepoint closes completely, markets reprice fast. If you see this in the API before it hits the news, act immediately. These moves are large and rapid.
Security risk index above 0.5
Elevated risk does not always mean a closure is coming, but it means the market should be pricing in higher uncertainty. Compare the security_risk_index to the current market probability - if the market is too calm relative to the risk level, there is an opportunity.
Check daily
You can monitor these signals on the Veblyn dashboard or pull them via the API. Shipping disruptions do not happen every day, but when they do, the traders who see the data first capture the repricing. Set up a daily check and wait.
Why this matters for you
Having real-time AIS data aligned to prediction markets gives you an informational edge that most traders simply do not have. You see the disruption in the data before it is priced in.
That is what Veblyn provides through a clean API - normalized shipping signals connected to every relevant market. No scraping. No manual lookups. No waiting for news to break on Twitter. The data is already there, structured and ready to act on.
Access shipping signals and 4 other data streams on Veblyn.
Free API key. Start pulling signals in 5 minutes.
Create Free Account