Sports Betting with an AI Agent
a bar conversation, a cron job, and $583 in profit.
i was at a bar with my friend Anthony Carli and we asked: "how could Ultron sports bet for us?"
we came up with an approach. aggregating expert consensus from the web, looking for contrarian signals, adding a fade test based on a previous experiment. we wrote the prompt, set up a cron job to make 3 picks per day, and had Ultron email the results.
march 2026. 75 picks. 43-32 record. 57.3% win rate. +$583.16 profit on paper. flat $100 per pick.
the first two high confidence picks hit. i got so excited that on the third one, march 7, i put $50 of real money on UConn to blow out Marquette. Marquette upset UConn. that was the last time i bet real money on a high confidence pick.
the system went 3-0 on march 12 and we went green for the first time. then crashed to -$425 on march 24. then ripped back to finish at +$583. and on march 31st, Ultron just woke up and decided not to make any picks.
the baird experiment
this whole thing started at a Baird internship the previous summer. there was a market watch competition with a $1M paper portfolio.
i prompted Perplexity and Claude to find penny stocks they thought would moon. then i faded every single pick. meaning i did the opposite: if the AI said buy, i shorted it.
i'd do all my research before market open, have my positions ready, and execute everything within the first 30 minutes of the trading day. the AI's picks would often tank right at open, which is exactly when you want to be short.
result: +72% return, 2nd place out of 19. the AI was a reliable contrarian indicator.
that fade test concept became a core part of the sports betting system. if Ultron liked a pick too much, maybe we shouldn't trust it.
the system
cron job runs every morning at 8am. Ultron wakes up, pulls upcoming games from multiple sports, searches the web for expert analysis and consensus picks, and runs them through a decision framework.
the prompt has three main components:
1. strategy: aggregate expert consensus from trusted sources and look for contrarian signals where public betting is heavily skewed. don't just follow the crowd. find spots where the line moved against public money.
2. decision framework: consensus plays get priority (when 70%+ of experts agree). contrarian plays come second (fade heavy public betting when sharp money is on the other side). situational edges are last (rest advantages, revenge games, playoff clinch scenarios).
3. pick selection rules: exactly 3 picks per day. diversify across sports when possible. provide confidence level (medium or high). include reasoning for each pick with supporting data.
4. fade test: before finalizing, check: would i take the opposite side of this bet? if the answer is yes, downgrade confidence or drop the pick. this was the Baird lesson baked into the system.
output format: date, sport, matchup, selection, odds, confidence, reasoning. gets emailed to both of us. simple.
what actually happened
march 2-30, 2026. 31 days. Ultron made picks on 25 of them. 6 days with no picks because the system was down.
the missing days: march 1, 8, 9, 18, 27, 31. on march 31st specifically, Ultron just woke up and decided not to make any picks. no explanation. just silence.
system reliability: 81%. not bad, not great.
here's what the P&L curve looked like:
started march 2 at -$109. got worse. march 7 hit -$312 in the hole. that was the low point of week one.
march 12 was the breakout. went 3-0, swept the board, gained $287 in one day, and went green for the first time. momentum shifted.
then march 17 happened. crashed back to -$305. another rough stretch through march 24 at -$425, the worst day of the entire month.
then the heater. march 28-30, went 9-1 over three days. closed out the month at +$583.16.
the swings were brutal. but the system clawed back every time.
by sport
NBA: 19-13 (59.4%), +$438.68. this was the profit engine. Ultron crushed basketball.
march madness (NCAAB): 4-2 (66.7%), +$163.64. small sample, elite performance. tournament chaos worked in our favor.
MLB: 2-1 (66.7%), +$99.91. baseball just started late march, limited data.
NCAAM: 6-5 (54.5%), +$45.46. basically break-even once you factor in juice.
NHL: 12-10 (54.5%), -$64.53. the only losing sport. hockey was the system's weakness.
by confidence
this is the most interesting part.
medium confidence: 39-28 (58.2%), +$670.58. this is where all the profit came from.
high confidence: 4-4 (50.0%), -$87.42. broke even on record, lost money because of the juice.
high confidence picks were worse than medium confidence picks. significantly worse.
the system could not calibrate its own certainty. when Ultron was "sure" about something, that was actually a red flag. the Baird fade test was right.
lessons
1. trust medium confidence more than high confidence. the AI doesn't know what it doesn't know. overconfidence is a bug, not a feature.
2. NBA > NHL. basketball is more predictable. hockey has too much randomness (goalie performances, bounces, overtime coin flips).
3. system reliability matters. 6 missed days out of 31 is 19% downtime. if this were real money, that's a problem. automation is only valuable if it's consistent.
4. the comeback is part of the system. down $425 on march 24, finished +$583 six days later. variance is real. you have to survive the drawdowns to see the heaters.
5. contrarian signals work. fading public betting and trusting line movement was more reliable than just following consensus. the Baird experiment validated in a different domain.
the P&L curve
what's changing for april
the prompt stays the same. the sport mix stays the same. NHL is 12-10, that's fine, not enough data to call it broken. we're not going NBA-heavy or dropping anything. the core system works.
the one thing we are changing: high confidence picks.
the problem is subtle. if you tell the picking agent "stop making high confidence picks," it just stops labeling things high confidence. the signal disappears. it games itself. you need the agent to be honest about its confidence without knowing what happens to that honesty.
so we're splitting it into two agents.
agent A runs the same prompt, same research, same process. it makes picks and assigns confidence naturally. it has no idea what happens next. as far as it knows, every pick goes straight to production.
agent B runs 10 minutes later. it reads agent A's picks, silently drops anything labeled high confidence, and publishes the rest. agent A never sees agent B's logic. the filtering is invisible.
this preserves the confidence signal as data (we can keep tracking whether high picks improve over time) while preventing it from costing us money. agent A stays honest because it doesn't know it's being filtered.
everything else stays the same. 3 picks per day, flat $100, same research prompt, same cron schedule. let's see what april looks like.
every single pick
here's the full record. 75 picks. every game, every outcome, every dollar.
| Date | Sport | Event | Selection | Odds | Conf. | Result | P&L |
|---|---|---|---|---|---|---|---|
| Mar 2 | NHL | Stars @ Canucks | Over 5.5 | -130 | Med | L | -$100 |
| Mar 2 | NCAAB | Duke vs NC State | NC State +9.5 | -102 | Med | L | -$100 |
| Mar 2 | NBA | Celtics @ Bucks | Celtics -7 | -110 | High | W | +$91 |
| Mar 3 | NHL | Panthers @ Devils | Under 6 | -140 | Med | L | -$100 |
| Mar 3 | NHL | Stars @ Flames | Stars ML | -128 | High | W | +$78 |
| Mar 3 | NHL | Avalanche @ Ducks | Under 6.5 | 105 | Med | W | +$105 |
| Mar 4 | NBA | Thunder @ Knicks | Thunder -4.5 | -110 | High | L | -$100 |
| Mar 4 | NHL | Hurricanes @ Canucks | Canucks +1.5 | -120 | Med | W | +$83 |
| Mar 4 | NHL | Hurricanes @ Canucks | Under 6.5 | -110 | Med | W | +$91 |
| Mar 5 | NBA | Raptors @ Timberwolves | Raptors +6 | -110 | Med | L | -$100 |
| Mar 5 | NBA | Warriors @ Rockets | Under 215.5 | -110 | Med | L | -$100 |
| Mar 5 | NBA | Pistons @ Spurs | Spurs -3.5 | -106 | Med | W | +$94 |
| Mar 6 | NBA | Heat @ Hornets | Hornets ML | -160 | Med | L | -$100 |
| Mar 6 | NHL | Avalanche @ Stars | Stars ML | -130 | Med | L | -$100 |
| Mar 6 | NBA | Trail Blazers @ Rockets | Under 224.5 | -110 | Med | W | +$91 |
| Mar 7 | NCAAB | #4 UConn @ Marquette | UConn -8.5 | -110 | High | L | -$100 |
| Mar 7 | NBA | Magic @ Timberwolves | Timberwolves ML | -289 | Med | L | -$100 |
| Mar 7 | NHL | Predators @ Sabres | Sabres ML | -185 | Med | W | +$54 |
| Mar 10 | NBA | Celtics @ Spurs | Under 222.5 | -110 | Med | L | -$100 |
| Mar 10 | NHL | Golden Knights @ Stars | Stars ML | -150 | Med | W | +$67 |
| Mar 10 | NHL | Penguins @ Hurricanes | Penguins +1.5 | -134 | Med | W | +$75 |
| Mar 11 | NHL | Capitals @ Flyers | Capitals ML | -115 | Med | L | -$100 |
| Mar 11 | NBA | Rockets @ Nuggets | Nuggets -5.5 | -110 | Med | W | +$91 |
| Mar 11 | NHL | Canadiens @ Senators | Canadiens +1.5 | -185 | Med | W | +$54 |
| Mar 12 | NBA | Celtics @ Thunder | Celtics +6.5 | -110 | Med | W | +$91 |
| Mar 12 | NHL | Oilers @ Stars | Stars ML | -135 | Med | W | +$74 |
| Mar 12 | NHL | Avalanche @ Kraken | Avalanche -1.5 | 122 | Med | W | +$122 |
| Mar 13 | NHL | Oilers @ Blues | Oilers ML | -143 | Med | L | -$100 |
| Mar 13 | NBA | Knicks @ Pacers | Pacers +13.5 | -110 | Med | W | +$91 |
| Mar 13 | NBA | Suns @ Raptors | Raptors -4.5 | -110 | Med | W | +$91 |
| Mar 14 | NHL | Sharks @ Canadiens | Canadiens ML | -178 | Med | L | -$100 |
| Mar 14 | NCAAB | Duke vs Virginia (ACC) | Duke -8.5 | -110 | Med | L | -$100 |
| Mar 14 | NBA | Nuggets @ Lakers | Lakers +2.5 | -110 | Med | W | +$91 |
| Mar 15 | NBA | Timberwolves @ Thunder | Timberwolves +8.5 | -110 | Med | L | -$100 |
| Mar 15 | NBA | Mavericks @ Cavaliers | Cavaliers -16.5 | -110 | Med | L | -$100 |
| Mar 15 | NHL | Blues @ Jets | Jets ML | -125 | Med | W | +$80 |
| Mar 16 | NHL | Penguins @ Avalanche | Avalanche -1.5 | 107 | Med | L | -$100 |
| Mar 16 | NBA | Lakers @ Rockets | Lakers +2.5 | -110 | Med | W | +$91 |
| Mar 16 | NBA | Magic @ Hawks | Hawks -2.5 | -110 | Med | W | +$91 |
| Mar 17 | NBA | Thunder @ Magic | Thunder -9.5 | -110 | Med | L | -$100 |
| Mar 17 | NBA | Cavaliers @ Bucks | Cavaliers -10 | -110 | Med | L | -$100 |
| Mar 17 | NHL | Wild @ Blackhawks | Wild -1.5 | 140 | Med | L | -$100 |
| Mar 19 | NCAAM | Georgia (8) vs Saint Louis (9) | Georgia ML | -115 | Med | L | -$100 |
| Mar 19 | NBA | Lakers @ Heat | Lakers +3.5 | -110 | High | W | +$91 |
| Mar 19 | NCAAM | South Florida (11) vs Louisville (6) | South Florida +5.5 | -110 | Med | W | +$91 |
| Mar 20 | NCAAM | Texas Tech (5) vs Akron (12) | Akron +7.5 | -110 | Med | L | -$100 |
| Mar 20 | NCAAM | UCLA (7) vs UCF (10) | UCLA -5.5 | -110 | Med | L | -$100 |
| Mar 20 | NCAAM | Clemson (8) vs Iowa (9) | Iowa -2.5 | -110 | Med | W | +$91 |
| Mar 21 | NCAAM | Michigan State (3) vs Louisville (6) | Michigan State -4.5 | -110 | Med | W | +$91 |
| Mar 21 | NCAAM | Houston (2) vs Texas A&M (10) | Houston -10.5 | -110 | Med | W | +$91 |
| Mar 21 | NCAAM | Gonzaga (3) vs Texas (11) | Texas +6.5 | -110 | Med | W | +$91 |
| Mar 22 | NCAAM | Kentucky (7) vs Iowa State (6) | Kentucky +4.5 | -102 | Med | L | -$100 |
| Mar 22 | NCAAM | Texas Tech (5) vs Alabama (4) | Texas Tech +1.5 | 110 | Med | L | -$100 |
| Mar 22 | NCAAM | UCLA (7) vs UConn (2) | UConn -4.5 | -110 | Med | W | +$91 |
| Mar 23 | NBA | Spurs @ Heat | Heat +5.5 | -110 | Med | L | -$100 |
| Mar 23 | NHL | Senators @ Rangers | Senators ML | -190 | High | W | +$53 |
| Mar 23 | NBA | Warriors @ Mavericks | Warriors -2.5 | -110 | Med | W | +$91 |
| Mar 24 | NBA | Lakers @ Pistons | Lakers -2.5 | -110 | High | L | -$100 |
| Mar 24 | NHL | Maple Leafs @ Bruins | Bruins ML | -186 | High | L | -$100 |
| Mar 24 | NHL | Wild @ Lightning | Wild ML | 140 | Med | L | -$100 |
| Mar 25 | NBA | Thunder @ Celtics | Celtics +2.5 | -110 | Med | W | +$91 |
| Mar 25 | NBA | Rockets @ Timberwolves | Timberwolves +1.5 | -110 | Med | W | +$91 |
| Mar 25 | NBA | Heat @ Cavaliers | Under 242.5 | -109 | Med | W | +$92 |
| Mar 26 | MLB | Guardians @ Mariners | Under 6.5 | 100 | Med | L | -$100 |
| Mar 26 | MLB | White Sox @ Brewers | Brewers -1.5 | 109 | Med | W | +$109 |
| Mar 26 | NBA | Knicks @ Hornets | Hornets -1.5 | -102 | Med | W | +$98 |
| Mar 28 | NCAAB | Illinois vs Iowa (Elite Eight) | Under 139.5 | -110 | Med | W | +$91 |
| Mar 28 | NBA | Spurs @ Bucks | Spurs -3.5 | -110 | Med | W | +$91 |
| Mar 28 | NCAAB | Arizona vs Purdue (Elite Eight) | Arizona -6 | -110 | Med | W | +$91 |
| Mar 29 | NBA | Clippers @ Bucks | Under 222.5 | -110 | Med | L | -$100 |
| Mar 29 | NCAAB | Michigan vs Tennessee (Elite Eight) | Michigan -7.5 | -110 | Med | W | +$91 |
| Mar 29 | NCAAB | Duke vs UConn (Elite Eight) | UConn +5.5 | -110 | Med | W | +$91 |
| Mar 30 | NBA | Celtics @ Hawks | Hawks -1.5 | -110 | Med | W | +$91 |
| Mar 30 | NBA | 76ers @ Heat | Heat +2 | -110 | Med | W | +$91 |
| Mar 30 | MLB | Diamondbacks vs Tigers | Diamondbacks ML | -110 | Med | W | +$91 |