# ZenHodl Live Trading Report + Platform Update (April 2026)

## The Numbers: 1,104 Trades Across 9 Sports

Over the past 5 weeks (March 9 to April 12, 2026), our 5 trading bots executed 1,104 trades across 9 sports on Polymarket. Every trade is logged, on-chain verified, and publicly visible. Here's the complete breakdown.

### Bot Performance (excluding legacy backfill)

**Moneyline WP Bot — The Workhorse**
195 trades. 130 wins, 64 losses. 67% win rate. +$57.37 net profit.

This is our main bot, trading NBA, MLB, NHL, NCAAMB, and NCAAWB moneyline markets. It uses sport-specific win probability models (XGBoost, logistic regression, split-phase) with Elo ratings, score state, time remaining, and sport-specific features like pace stats for basketball and shots on goal for hockey.

MLB has been the biggest winner lately — the bot is finding consistent edges in mid-game situations where the Polymarket price hasn't caught up to run-scoring or pitching changes. Recent MLB trades have been hitting 70-80% on resolution.

NHL has been strong since the playoff push started. The model catches value when teams take leads in the 2nd period — Polymarket prices often underestimate how hard it is to come back from a 1-0 deficit in hockey.

**Tennis WP Bot — Highest Per-Trade Profit**
39 trades. 24 wins, 12 losses. 67% win rate. +$38.94.

The tennis bot uses a hierarchical model: Elo ratings feed into point-level win probability, which builds up through games (including deuce), tiebreaks, sets, and full matches. Surface-adjusted (hard court, clay, grass) with separate serve rate tables for ATP vs WTA.

Recent highlight: Sinner at 37 cents when the model had him at 47 cents. The edge was there because the set score looked bad (down in games) but Sinner's Elo and surface advantage on clay made the comeback probability higher than the market was pricing. He won. +$2.04.

Tennis markets on Polymarket are less efficient than traditional sports because there are fewer market makers covering individual matches. The mispricing window often lasts 5-10 minutes, which is an eternity in liquid markets.

**LoL WP Bot — ML Pipeline Finally Active**
41 trades. 20 wins, 18 losses. 53% win rate. +$7.70.

The LoL bot had a rough start running on Elo-only predictions. After we activated the full ML pipeline (XGBoost on gold differential, kills, towers, dragons, barons), the Brier score improved 47.8% and accuracy jumped from 57.5% to 89%.

Recent action has been mixed. The G2 Esports trade was a big win ($2.30 at 31 cents entry), but the Cloud9 trade was a painful loss (-$1.02 at 35 cents). Esports markets are volatile — tier-1 teams have higher information efficiency, while tier-2 tournaments have wider edges but more surprises.

**Soccer WP Bot — Small Sample, Positive**
12 trades. 5 wins, 6 losses. 45% win rate. +$0.93.

The soccer bot uses a Poisson model with Elo-adjusted goal rates. It handles three-way markets (home, draw, away) which makes it fundamentally different from binary moneyline bots. The small sample makes it hard to draw conclusions, but the model is finding edges — just not converting them consistently yet.

The draw market is the hardest to trade because draws are inherently unpredictable. We're considering restricting to home/away only.

**CS2 WP Bot — Improved But Still Volatile**
90 trades. 35 wins, 47 losses. 43% win rate. -$10.06.

CS2 remains our most challenging bot. After the major overhaul (switching from HLTV to bo3.gg, adding the combined map+economy model, tightening filters), results improved but the bot is still slightly negative.

The core issue: CS2 markets have the widest edges but also the highest execution friction. Average slippage is 4-6 cents, which eats into edges. The 4-tier model architecture (bo3.gg combined → map ML → series ML → Elo-only) works well in theory, but the lower tiers (series ML, Elo-only) have significantly worse accuracy than the combined model.

We're currently testing a "Tier 1 only" mode that only trades when bo3.gg round+economy data is available. This should improve win rate at the cost of fewer trades.

### Sport Breakdown (All Bots Combined, Excluding Backfill)

| Sport | Trades | Record | Win Rate | P&L |
|-------|--------|--------|----------|-----|
| MLB | 174 | 104W-68L | 60% | Strong positive |
| NHL | 107 | 50W-28L resolved | 64% | Near breakeven |
| NBA | 109 | 48W-61L | 44% | Negative |
| NCAAMB | 242 | 124W-111L | 53% | Negative |
| ATP/Tennis | 33 | 18W-12L | 60% | +$16.98 |
| LoL | 52 | 21W-28L | 43% | Negative |
| CS2 | 276 | 118W-150L | 44% | Negative |
| Soccer | 14 | 7W-6L | 54% | +$2.71 |

**Key insight:** The bot-level view is much more informative than the sport-level view because the legacy backfill data (727 trades from pre-bot wallet imports) pollutes the sport breakdown. The Moneyline WP bot at +$57.37 and Tennis at +$38.94 are clearly profitable. CS2 is the problem child that needs more work.

### Recent Trade Highlights (Last 48 Hours)

**Best trades:**
- Canucks at 47 cents, model said 64%. Won. +$3.72 (great value on a team leading 1-2 that came back)
- Flyers at 52 cents, model said 58-59%. Won. +$2.94 each (two fills)
- Blue Jackets at 61 cents, model said 74%. Won. +$2.05 each
- Sinner at 37 cents, model said 47%. Won. +$2.04 (ATP match comeback)

**Worst trades:**
- Flames at 55 cents, model said 64%. Lost. -$3.30 (NHL game turned)
- Red Wings at 69 cents, model said 81%. Lost. -$2.88 each (two fills — double hit)
- Blue Jackets at 68 cents, model said 83%. Lost. -$2.84 (NHL upset)
- Brewers at 73 cents, model said 80%. Lost. -$1.52

**Pattern in losses:** Most losses come from NHL and MLB games where the bot enters in the 1st or 2nd period/inning with a lead-based edge, and the opposing team comes back. The model correctly identifies the leading team as favored but overestimates the probability in early game states where there's still a lot of game left.

## Platform Updates (v7 through v10)

### v10: Billing, Crypto, Model Accuracy (April 8-10)

The biggest release yet. Three major themes:

**Model accuracy leap.** NHL Brier score improved 23.6% (0.205 → 0.157) — the biggest single-model improvement in our history. Root cause: team stats (offensive/defensive rating, pace, power play, save percentage) were being trained on but never fed real data at inference time. The cache was NCAAMB-only. Fixed across NBA and NHL.

Added a live recalibration system that runs rolling isotonic regression on the last 500 resolved predictions per sport. It automatically refits every 25 new samples and catches calibration drift without needing a full model retrain. Also added MLB bullpen quality overlay (bullpen ERA impacts innings 5-9 predictions) and expanded the NBA star impact table from 37 to 58 players.

**Crypto payments.** Integrated NowPayments for Bitcoin, Ethereum, USDC, and 350+ other coins. 10% crypto discount on all products. Every pricing card now has a "Pay with crypto" option.

**Google Ads attribution fix.** Discovered that conversion events were reporting $0 value because Stripe trial subscriptions charge $0. Now passes the plan's sticker price ($49) as expected lifetime value. Added Enhanced Conversions (email hashing for cross-device attribution) and a begin_checkout GA4 event on every interstitial page load, giving us 150 top-of-funnel signals per day.

**Security overhaul.** Converted 5 BaseHTTPMiddleware classes to pure ASGI, eliminating 200 crashes per day from a LocalProtocolError. Rotated from standard Stripe key to restricted key (smaller blast radius). Scrubbed old keys from 4 backup locations.

### v9: All 5 Bots Improved (April 6)

**NBA calibration improved 44%.** The Elo bug fix (0 teams loaded → 42 teams) dropped ECE from 0.103 to 0.057. Added dynamic edge thresholds: early game requires higher edges (model uncertainty 18.7c), late game accepts smaller edges (4c).

**NBA injury integration.** Real-time ESPN injury API with a 58-player star impact table. Jokic out = -16% WP, LeBron = -12%, applied after model prediction but before edge calculation.

**CS2 combined model.** Map-specific CT win rates across 9 maps, 4-tier economy system, conditional dampening based on data quality. Min_edge optimized to 8c (5-10c bucket has 71.4% WR), max_edge capped at 25c (20c+ edges have 36% WR — model overconfident).

**LoL ML activated.** XGBoost on gold diff (39% importance), kills, towers, dragons, barons. Brier improved 47.8%, AUC from 0.575 to 0.890.

**Tennis WTA calibration.** Split serve rates for ATP vs WTA (WTA hard: 58% vs ATP 64%). Set dominance momentum features added.

### v8: Major Platform Overhaul (April 4)

**Unified trading bot.** All 5 sport bots consolidated into a single process with shared WebSocket connection, global circuit breaker, and portfolio-level risk management.

**Circuit breakers on all bots.** $20 daily loss limit, 5-loss streak cooldown, 30% rolling win rate gate. Prevents catastrophic sessions.

**Feed quality system.** New scoring for every signal (price freshness, match confidence, spread). Warm start blocks trading until 30% of tokens have fresh prices. Execution queue prevents duplicate trades on restart.

**Security audit.** 6 critical fixes: authenticated unsubscribe, SSRF webhook validation, XSS escaping, CSP updates, session cookie hardening, logout CSRF.

**Research paper published.** Full white paper at /research with statistical significance tests, baseline comparisons, threats to validity.

**5 monitoring agents.** Reconciliation, strategy allocation, claim integrity, entitlement QA, deployment drift — all running daily via cron with Discord alerts.

### v7: CS2 Audit + Domain Migration (April 4)

**CS2 bot overhaul.** Deep analysis of 33 live trades revealed 45% WR vs 78% backtest. Tightened filters turned -67c into +40c retroactively. Min_edge 4c→10c, max_entry 80c→70c, added 8c slippage gate.

**Domain migration.** api.zenhodl.net → zenhodl.net as primary domain. All URLs, sitemap, emails, CSP updated.

**PageSpeed optimization.** Score improved from 55 to 79. GZip compression (54KB→11KB), 1-year cache headers, deferred Google Tag, dashboard mockup converted from 90 HTML nodes to 17KB WebP image.

**Dashboard course tab rebuilt.** Backend-saved progress, resume/next-step CTA, expandable module workspaces with checklists, common failures, success criteria.

## The Honest Assessment

**What's working:**
- Moneyline WP bot is clearly profitable (+$57 on 195 trades, 67% WR)
- Tennis bot has the best per-trade economics (+$38 on 39 trades)
- MLB model is hitting well in mid-game situations
- NHL playoff trading is finding real edges
- Infrastructure is solid — 99.5% uptime, no missed settlement windows

**What's not working:**
- CS2 is still slightly negative despite 3 major overhauls
- NBA has been negative this stretch (-$520 in sport-level view, though much of this is pre-improvement backfill)
- LoL is inconsistent — the ML model is better than Elo-only but still loses on tier-2 tournaments
- Soccer sample size is too small to draw conclusions

**What we're changing:**
- CS2: testing Tier 1 only mode (bo3.gg round data required)
- NBA: new dynamic edge thresholds reducing early-game overconfidence
- LoL: considering tournament-tier filtering (skip tier-2 events)
- Overall: live recalibration system should catch drift faster than manual retraining

The platform itself has matured significantly. Crypto payments, abandoned cart recovery, real MRR tracking, monitoring agents, security hardening — the infrastructure is no longer the bottleneck. The bottleneck is model accuracy on specific sports and execution quality on thin esports markets.

---

*All trades verified on-chain. Live results at zenhodl.net/results. Full changelog at zenhodl.net/changelog. Course teaching the methodology at zenhodl.net/course.*
