{"id":379,"date":"2021-07-30T07:00:45","date_gmt":"2021-07-30T12:00:45","guid":{"rendered":"https:\/\/wollen.org\/blog\/?p=379"},"modified":"2025-04-05T11:16:14","modified_gmt":"2025-04-05T16:16:14","slug":"sports-betting-at-the-monte-carlo","status":"publish","type":"post","link":"https:\/\/wollen.org\/blog\/2021\/07\/sports-betting-at-the-monte-carlo\/","title":{"rendered":"Sports betting at the Monte Carlo"},"content":{"rendered":"<p>Many Americans have picked up a new hobby in recent years: sports betting. The industry has exploded since the US Supreme Court <a href=\"https:\/\/www.actionnetwork.com\/news\/legal-sports-betting-united-states-projections\" target=\"_blank\" rel=\"noopener\">threw out a federal ban<\/a> in 2018.<\/p>\n<div style=\"height: 1px;\"><\/div>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/sports_betting_revenue-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2495 size-full\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/sports_betting_revenue-1.png\" alt=\"\" width=\"500\" height=\"400\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/sports_betting_revenue-1.png 500w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/sports_betting_revenue-1-300x240.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<div style=\"height: 2px;\"><\/div>\n<p>While the stereotype is still a smoke-filled room in a dark corner of a casino, these days the <a href=\"https:\/\/www.sportsbettingdime.com\/guides\/research\/sports-betting-record-year\/\" target=\"_blank\" rel=\"noopener\">majority<\/a> of sports betting happens online. And analysts say the COVID-19 pandemic helped grow the industry&#8217;s online footprint. It gave people something to do from home\u2014at least when sports were on TV. Sports fans have been managing their fantasy teams for years so it felt natural to start betting on games. And with some states now experiencing budget shortfalls they may look to expand the industry further.<\/p>\n<hr \/>\n<p>So placing a bet is easier than ever. What does the math look like? How often do you need to win to make a profit? The sportsbooks have to be making money somehow.<\/p>\n<p>Sportsbooks do it through vigorish\u2014often called juice. This is the extra percent that a book charges to take your bet. The industry standard is <em>-110<\/em>, which means you&#8217;ll lay $110 for a chance to win $100. But if you lose, the book will keep the whole $110. Juice varies depending on the book, type of bet, and normal market forces like which side has received more action. But in general <em>-110<\/em> is considered standard.<\/p>\n<p>At that rate the math works out like this:<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/5238_equation-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1498 size-large\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/5238_equation-1-1024x347.png\" alt=\"\" width=\"640\" height=\"217\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/5238_equation-1-1024x347.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/5238_equation-1-300x102.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/5238_equation-1-768x260.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/5238_equation-1.png 1071w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Solving for <em>p<\/em>, win rate, you&#8217;ll find that <code>p = 11\/21<\/code> or about 52.4%. This is the win rate you&#8217;d need to break even.<\/p>\n<p>That doesn&#8217;t sound like an extraordinarily difficult task. To turn a profit you only have to be slightly better than some guy flipping a coin.<\/p>\n<p>Just for fun, say you have a 55% win rate and you make one-hundred $100 bets. Assuming variance didn&#8217;t exist, you&#8217;d expect to win 55 times and lose the other 45. Such a run would produce a profit of $550 on $11,000 wagered, or an ROI of 5%. Not bad, right? <a href=\"https:\/\/www.businessinsider.com\/personal-finance\/average-stock-market-return\" target=\"_blank\" rel=\"noopener\">On average<\/a> it takes a whole year to see a 9% return in the stock market.<\/p>\n<p>But <a href=\"https:\/\/nypost.com\/2019\/09\/05\/the-betting-math-sports-wagerers-must-come-to-accept\/\" target=\"_blank\" rel=\"noopener\">in the real world<\/a> very few people can pick 55% over the long run.<\/p>\n<p>And just as important for casual bettors: variance <em>does<\/em> exist. You&#8217;ll experience runs of 65% or better\u2014or lose just as often\u2014over a sample of hundreds of bets. The idea of 55% (or 54 or 53) is easy enough to wrap your head around in abstract terms, but keeping perspective during a hot or cold streak is much more difficult. When the probability of success differs only slightly from a coinflip, bettors will often find themselves in the middle of seemingly impossible streaks\u2014both good and bad.<\/p>\n<hr \/>\n<p>We can build a simulation (similar to the <a href=\"https:\/\/www.investopedia.com\/terms\/m\/montecarlosimulation.asp\" target=\"_blank\" rel=\"noopener\">Monte Carlo method)<\/a> to visualize sports betting results.<\/p>\n<p>If we know expected win rate it&#8217;s very simple. Pick a random number between 0 and 1 and check whether it&#8217;s larger or smaller than the win rate. For example, in pseudocode:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">function bet():\r\n    r = random_number()\r\n    if r &lt;= win_rate:\r\n        # win 1.0 unit\r\n    else:\r\n        # lose 1.1 units<\/pre>\n<p>Each iteration of this function represents a single bet. We can then repeat the process thousands of times and keep a ledger of profit\/loss.<\/p>\n<p>A quick simulation of 1,000 bets using a 55% win rate looked like this:<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/bet_simu4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2496 size-full\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/bet_simu4.png\" alt=\"\" width=\"1200\" height=\"600\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/bet_simu4.png 1200w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/bet_simu4-300x150.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/bet_simu4-1024x512.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2021\/07\/bet_simu4-768x384.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p><em>Units<\/em> are a way of normalizing bet sizes. You can bet $1 or $1,000 and the probability of winning will be the same.<\/p>\n<p>The bettor in this particular simulation was fortunate to see a nice 45-unit profit over 1,000 bets. But it&#8217;s important to remember that 1,000 bets will span a lifetime for most casual bettors. This person was actually in the red after 500 bets. And that&#8217;s with an intentionally inflated assumption of a 55% expected win rate! Simulations running at 53% will be even more volatile. Any rate below 52.38% will trend downward in the long run.<\/p>\n<p>Of course when I run this script again the plot will look completely different. The unpredictability is the point. You can be a great handicapper and it&#8217;s still very difficult to profit consistently. There&#8217;s a reason hedge funds organize around beating stock markets rather than betting markets. Trading fees leave more meat on the bone.<\/p>\n<p>That said, I probably sound more cynical than I&#8217;d like. Sports betting can be a great hobby, especially for data-minded people who have access to nearly unlimited information. Simulations for table games like craps or roulette would be even more dismal because, unlike sports betting, there&#8217;s no way to beat those games in the long run.<\/p>\n<p>So what am I doing here? Just adding a little context. I&#8217;ve been worn down by the deluge of sports book ads and I know they&#8217;re selling an experience that doesn&#8217;t exist. Keep expectations in check, remember you aren&#8217;t the next Billy Walters, and (most importantly) don&#8217;t let me tell you what to do with your money.<\/p>\n<hr \/>\n<p><strong>Full code:<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from random import random\r\nimport matplotlib.pyplot as plt\r\nfrom matplotlib import style\r\nimport matplotlib.ticker as ticker\r\n\r\n\r\ndef one_bet(win_rate, unit_size):\r\n    if random() &lt;= win_rate:\r\n        return unit_size\r\n    else:\r\n        return unit_size * -11 \/ 10\r\n\r\n\r\ndef simulate(win_rate, unit_size, number_sims):\r\n    profit = 0\r\n    x_hist, y_hist = [], []\r\n    for bet in range(number_sims):\r\n        x_hist.append(bet + 1)\r\n        profit += one_bet(win_rate, unit_size)\r\n        y_hist.append(profit)\r\n    return x_hist, y_hist\r\n\r\n\r\ndef generate_plot(x_data, y_data, win_rate_label, sims_label, output_filename):\r\n    style.use(\"ggplot\")\r\n    fig, ax = plt.subplots(figsize=(12, 6))\r\n    fig.subplots_adjust(left=0.05, right=0.987, top=0.95, bottom=0.084)\r\n\r\n    ax.plot(x_data, y_data)\r\n\r\n    x_format = ticker.StrMethodFormatter(\"{x:,.0f}\")\r\n    ax.xaxis.set_major_formatter(x_format)\r\n    y_format = ticker.StrMethodFormatter(\"{x:+.0f}\")\r\n    ax.yaxis.set_major_formatter(y_format)\r\n\r\n    font = \"Ubuntu Condensed\"\r\n    plt.xticks(font=font, fontsize=12)\r\n    plt.yticks(font=font, fontsize=12)\r\n    ax.set_xlabel(\"Number of Bets\", font=font, size=15, labelpad=3)\r\n    ax.set_ylabel(\"Profit  (Units)\", font=font, size=15, labelpad=3)\r\n    ax.set_title(f\"Sports Betting Profit Simulation  |  {win_rate_label * 100:.0f}% win rate \u2013 {sims_label:,} bets\",\r\n                 font=font, size=12)\r\n\r\n    plt.savefig(output_filename, facecolor=fig.get_facecolor())\r\n    return\r\n\r\n\r\nWIN_RATE = 0.55\r\nUNIT_SIZE = 1.0\r\nNUMBER_SIMS = 1000\r\n\r\nx_ledger, y_ledger = simulate(win_rate=WIN_RATE,\r\n                              unit_size=UNIT_SIZE,\r\n                              number_sims=NUMBER_SIMS)\r\n\r\ngenerate_plot(x_ledger, y_ledger,\r\n              win_rate_label=WIN_RATE,\r\n              sims_label=NUMBER_SIMS,\r\n              output_filename=\"bet_simu.png\")\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Many Americans have picked up a new hobby in recent years: sports betting. The industry has exploded since the US Supreme Court threw out a federal ban in 2018. While the stereotype is still a smoke-filled room in a dark<\/p>\n","protected":false},"author":1,"featured_media":424,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[215,41,59],"tags":[47,24,64,25,42,65,60,61,62,63],"class_list":["post-379","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-betting","category-probability","category-sports","tag-math","tag-matplotlib","tag-monte-carlo","tag-python","tag-random","tag-simulation","tag-sports","tag-sports-betting","tag-sportsbook","tag-statistics"],"_links":{"self":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/comments?post=379"}],"version-history":[{"count":38,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/379\/revisions"}],"predecessor-version":[{"id":2497,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/379\/revisions\/2497"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media\/424"}],"wp:attachment":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media?parent=379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/categories?post=379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/tags?post=379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}