Tennis Analysis

As Sport Trader, one of the most common question that I receive from friends is ” What is the best strategy to win by betting? ” and the most popular is the one that betting always on the favorite player can guarantee a profit.

Let’s demonstrate with data if this strategy is profitable, so next time that I receive this question I can direct them to this page.

For those who are new to the world of betting let’s do a quick example:

We have a Tennis match, Federer vs Cecchinato.

Let’s say you bet 10€ on Federer with an odd of 1.1

  • If he wins, you have back your 10€, plus 1€ of profit
  • If he loses you’ll return will be 0€
  • If he wins, as you bet 10€ and won 11€, your ROI (return on investment) is 10%
  • If he loses, your ROI is -100%

If you place 10 bets of 10 each at an odd of 1.10, the total stake will be 100, the return 110(including the stake), so the profit will be 10.

If you just lose 1 of these 10 bets, you’ll return including the stake will be 99, a loss of 1. If you lose 2 bets, you’ll return including stake will be 88, a loss of 11.

So you need to win several bets in order to guarantee you a profit.

Is it really sustainable?

Dataset

Dataset source: http://tennis-data.co.uk/data.php

I used all ATP MATCHES from 2010 to 2021, in the dataset we have a lot of interesting data such as tournament names, players, odds, etc.

Our focus will be on analyzing the possible strategies to make a profit.

Data Cleaning

I combined all tables in a single one with the UNION ALL query, I checked for incorrect data, mispelling, duplicate, format date, etc.

The dataset, processes of data cleaning and analysis are available on GitHub: LINK

The entire process of data cleaning and analysis is available on GitHub View on GitHub

Analysis

OBJECTIVE: Answer the question ” Is it profitable bets always on the favorite player? “

In order to answer this question we have to decide on some strategies to apply:

STRATEGY 1: bets always on the favorite player with an odd <= 1.30

STRATEGY 2: bets always on the favorite player with an odd <= 1.10

STRATEGY 3: bets always on the favorite player (by odds) no matter what are the odds

STRATEGY 4: bets always on the top10 ranking players when they are playing versus a player who is in ranking in 20th position or more

Let’s Start !!

Before applying our strategies, let’s calculate the total number of matches and which bookmaker offer us the best profit.

Calculate the total number of matches:

SELECT COUNT(*) AS total_matches
FROM atp_matches;

In the dataset, we have the odds from 2 different bookmakers, BET365 and PINNACLE. We want to know which bookmaker offers us the best odds, so we can check who offers the best margin.

Calculate who offer the best margin:

SELECT
	ROUND(AVG((100 / B365W) + (100 / B365L)),2) AS bet365_margin,
    ROUND(AVG((100 / PSW) + (100 / PSL)),2) AS pinnacle_margin
FROM atp_matches;

More the margin is small, more are the profits, if we imagine that we know who is the winner of the match in advance and we bet always on the winner player, we can see the Pinnacle offers us the best ROI.

SELECT
	ROUND(SUM(10 * B365W),2) AS bet365_winnings,
    ROUND(SUM(10 * PSW),2) AS pinnacle_winnings
FROM atp_matches;

Pinnacle offers us the best return, so we’ll use it for our analysis.


STRATEGY 1: bets always on the favorite player with an odd <= 1.30

SELECT
	10 * COUNT(CASE WHEN PSW <= 1.30 OR PSL <= 1.30 THEN 1 ELSE NULL END) AS total_stake,
    ROUND(SUM(CASE WHEN PSW <= 1.30 THEN 10 * PSW ELSE NULL END),2) AS total_winnings,
    ROUND(SUM(CASE WHEN PSW <= 1.30 THEN 10 * PSW ELSE NULL END),2) - (10 * COUNT(CASE WHEN PSW <= 1.30 OR PSL <= 1.30 THEN 1 ELSE NULL END)) AS profit
FROM atp_matches;

Grouping by year

SELECT
    YEAR(match_date) AS yr,
    10 * COUNT(CASE WHEN PSW <= 1.30 OR PSL <= 1.30 THEN 1 ELSE NULL END) AS total_stake,
    ROUND(SUM(CASE WHEN PSW <= 1.30 THEN 10 * PSW ELSE NULL END),2) AS total_winnings,
    ROUND(SUM(CASE WHEN PSW <= 1.30 THEN 10 * PSW ELSE NULL END),2) - (10 * COUNT(CASE WHEN PSW <= 1.30 OR PSL <= 1.30 THEN 1 ELSE NULL END)) AS profit
FROM atp_matches
GROUP BY 1
ORDER BY 1 DESC;

STRATEGY 2: bets always on the favorite player with an odd <= 1.10, the query it’s the same as above, we have only to change all values of 1.30 with 1.10

SELECT
	10 * COUNT(CASE WHEN PSW <= 1.10 OR PSL <= 1.10 THEN 1 ELSE NULL END) AS total_stake,
    ROUND(SUM(CASE WHEN PSW <= 1.10 THEN 10 * PSW ELSE NULL END),2) AS total_winnings,
    ROUND(SUM(CASE WHEN PSW <= 1.10 THEN 10 * PSW ELSE NULL END) - (10 * COUNT(CASE WHEN PSW <= 1.10 OR PSL <= 1.10 THEN 1 ELSE NULL END)),2) AS profit
FROM atp_matches;

STRATEGY 3: bets always on the favorite player (by odds) no matter what are the odds

SELECT
	10 * COUNT(CASE WHEN PSW < PSL OR PSL < PSW THEN 1 ELSE NULL END) AS total_stake,
    ROUND(SUM(CASE WHEN PSW < PSL THEN 10 * PSW ELSE NULL END),2) AS winnings,
    ROUND(SUM(CASE WHEN PSW < PSL THEN 10 * PSW ELSE NULL END) - 10 * COUNT(CASE WHEN PSW < PSL OR PSL < PSW THEN 1 ELSE NULL END),2) AS profit
FROM atp_matches;

STRATEGY 4: bets always on the top10 ranking players when they are playing versus a player who is in ranking in 20th position or more

SELECT
	10 * COUNT(CASE WHEN (WRank <= 10 AND LRank >= 20) OR (WRank >= 20 AND LRank <= 10) THEN 1 ELSE NULL END) AS total_stake,
    ROUND(SUM(CASE WHEN WRank <= 10 AND LRank >= 20 THEN 10 * PSW ELSE NULL END),2) AS total_winnings,
    ROUND(SUM(CASE WHEN WRank <= 10 AND LRank >= 20 THEN 10 * PSW ELSE NULL END)
		- 10 * COUNT(CASE WHEN (WRank <= 10 AND LRank >= 20) OR (WRank >= 20 AND LRank <= 10) THEN 1 ELSE NULL END),2) AS profit
FROM atp_matches;

Unfortunately for some players, the strategy to bet always on the favorite player is not profitable.

Thanks for your time.

Giulio Pulino.