How do the Bankers rules affect the game of Baccarat?

Let's have an indepth look at the bankers rules for the game of baccarat. Specifically, mini baccarat and EZ baccarat.
First we'll go over the drawing rules of the game, and then see how each rule affects the bankers chances of winning.
Baccarat is a game that requries very little player input. The player basically just makes a bet on one of the main wagers, and a side bet if desired. The rules tend to be a bit mysterious and complicated and are not usually explained at the table to player. On top of this, most casinos will use something like a 'safe shoe' which reads the cards, and then lets the dealer deal the cards according to the rules of the game, which means the dealer doesn't even need to know the rules whenever one of these are present.
What is the difference between mini baccarat and ez baccarat?
Mini baccarat is the version of the game where the dealer handles all the cards, it's a bit faster paced and will be the most commonly found version. If the banker wins, it pays out 0.95:1. If the player wins it pays 1:1.
EZ Baccarat is the exact same as mini baccarat, except that a bankers 3 card winning hand with a total of 7 results in a push for the banker. It's also more broadly referred to as no commission baccarat. This 3 card winning 7 is typically a side bet called the Dragon that pays 40:1.
This is done so the dealer can pay 1:1 on all winning banker hands, instead of having to calculate 95% of the original wager for a payout. All winning player hands are still paid at 1:1.
Ties for both pay 8:1 (sometimes 9:1, but I've never seen it).
Baccarat's rules
The objective of the game is to get as close to 9 as possible. Any values over 9 are only worth the second digit (called a modulus 10) So if the hand is worth 10, then it's actually worth 0 - 13 would be worth 3.
The banker's drawing rules depend on what the player draws, so banker always draws after the player has finished.
Player and Banker are both dealt 2 cards face up.
- If either player or banker has an 8 or 9, also called a natural, no one draws.
- If the player has 5 or less, they draw. If they have 6 - 9 they stand.
- If the player stands, the banker draws on 5 or less.
If the player draws, then the bankers drawing rules are as follows:
- If the banker's hand total is 2 or less, then the banker hand is dealt a third card
- If the banker's hand total is 3, then the banker hand is dealt a third card unless the player’s third card was an 8
- If the banker's hand total is 4, then the banker hand is dealt a third card unless the player’s third card was a 0, 1, 8, or 9
- If the banker's hand total is 5, then the banker hand is dealt a third card if the player’s third card was 4, 5, 6, or 7
- If the banker's hand total is 6, then the banker hand is dealt a third card if the players third card was a 6 or 7
This can be expressed in python code as such:
if banker_value in [8, 9] or player_value in [8, 9]:
# Check for natural win first
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
# Check for players 3rd card first
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if (banker_value <= 2) or \
(banker_value == 3 and player_third_card != 8) or \
(banker_value == 4 and 2 <= player_third_card <= 7) or \
(banker_value == 5 and 4 <= player_third_card <= 7) or \
(banker_value == 6 and 6 <= player_third_card <= 7):
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
elif banker_value <= 5:
# If no player 3rd card
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
The Experiment
What we're going to do is run the game at baseline first to see what the house edge (and some other statistics) will be for both versions of baccarat using the standard drawing rules. Then we'll remove all the rules for the banker and add them back one at a time and note the effects and results each time.
For a quick look at the results, I'm publishing the charts at the top of the article
Mini Baccarat
EZ Baccarat
Game Constants
Our constants for calculating the stats moving forward. Obviously for EZ Bac I'll just set that to True.
# Game Constants
EZ_BAC = False
NUM_DECKS = 8
NUM_SHOES = 10000000
CUT_CARD = 14
BANKER_PAYOUT = 0.95
if EZ_BAC:
BANKER_PAYOUT = 1
PLAYER_PAYOUT = 1
TIE_PAYOUT = 8
Standard baccarat rules are being used, 8 deck shoes with the cut card 14 cards from the end. Standard burn card procedure is used.
# Burn card procedure
# draw first card from deck and burn # additional cards of value of drawn card
# if a 10 value card in drawn, burn 10 ADDITIONAL cards
burn_card = deck[0]
if burn_card == 0:
indx = 11
else:
indx = burn_card + 1
10 million shoes will be run for each test. This should be adequate for our purposes.
Baseline Results
All results presented below are percentages. For example, the banker wins 45.85% of the time, and discounting ties, the banker wins 50.68% of the time. We'll mainly be looking at the effects on expected value (ev) / house edge (he)
# Mini Baccarat
{'banker_ev': -1.0600154438671239,
'banker_wins': 45.85976658739328,
'banker_wins_no_tie': 50.681301665993686,
'player_ev': -1.2329728855025424,
'player_wins': 44.62679370189074,
'player_wins_no_tie': 49.318698334006314,
'tie_ev': -14.37904260355618,
'tie_wins': 9.51343971071598}
Simulation time: 6.889375710487366
Banker EV -1.060%
Player EV -1.2329%
Tie EV -14.3790%
# EZ Baccarat / No Commission Baccarat
{'banker_ev': -1.0184217334931855,
'banker_wins': 43.60576754605404,
'banker_wins_no_tie': 48.19136773983194,
'dragon_he': -7.559526724002508,
'player_ev': -1.2362239561652888,
'player_wins': 44.624189279547224,
'player_wins_no_tie': 49.316887115707445,
'tie_ev': -14.361422637337606,
'tie_wins': 9.515397484740266}
Simulation time: 6.727535323301951
Banker EV -1.0180%
Player EV -1.2329%
Tie EV -14.3790%
Right off the top, the house edge of EZ Baccarat is about 0.042% lower than it is in mini baccarat.
First thing I am interested in finding out, is what happens to these stats when we remove the commission in regular baccarat, increasing the payout to 1:1.
{'EZ_BAC': False,
'banker_ev': 1.2361598718209743,
'banker_wins': 45.860573969094595,
'banker_wins_no_tie': 50.68307456200043,
'dragon_he': -100.0,
'player_ev': -1.2361598718209743,
'player_wins': 44.62441409727362,
'player_wins_no_tie': 49.31692543799957,
'tie_ev': -14.364892597314016,
'tie_wins': 9.515011933631776}
Simulation time: 7.270646619796753
Immediately what we see is that the banker has a built in edge over the house. Very interesting. This explains why the casino charges a 5% commission on all banker wins in baccarat. If they didn't we could expect to make 1.236% profit on EVERY banker bet placed.
$50 x .01236 = $0.618 profit per bet x 82 avg hands per shoe = $50.676 profit per shoe
Next let's remove all drawing rules for the banker and see what happens
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -20.373379794710566,
'banker_wins': 36.23494112349236,
'banker_wins_no_tie': 39.80483146881147,
'dragon_he': -100.0,
'player_ev': 18.56163273853595,
'player_wins': 54.79657386202831,
'player_wins_no_tie': 60.195168531188536,
'tie_ev': -19.283634869686004,
'tie_wins': 8.968485014479333}
Simulation time: 6.965019563833873
{'EZ_BAC': True,
'banker_ev': -18.55898891975202,
'banker_wins': 36.235909139638075,
'banker_wins_no_tie': 39.806204354985574,
'dragon_he': -100.0,
'player_ev': 18.55898891975202,
'player_wins': 54.79489805939009,
'player_wins_no_tie': 60.193795645014426,
'tie_ev': -19.277264791253558,
'tie_wins': 8.969192800971827}
Simulation time: 7.533976364135742
With no drawing rules, the bankers bet is at a massive disadvantage. Massively lower win rate resulting in a huge house edge. The banker is only playing off their initial 2 cards, while the player is allowed to draw a third card. Not accouting for ties, the player bet is winning 60% of the time with an 18% advantage.
Now we'll add in the 3rd card draw when the banker has a score of 5 or less.
If the player stands, the banker draws on 5 or less.
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
elif banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -15.05839975356808,
'banker_wins': 38.49731034783834,
'banker_wins_no_tie': 42.713966991720504,
'dragon_he': -100.0,
'player_ev': 13.133534236176164,
'player_wins': 51.630844584014504,
'player_wins_no_tie': 57.2860330082795,
'tie_ev': -11.153394386675576,
'tie_wins': 9.87184506814716}
Simulation time: 7.365928641955057
{'EZ_BAC': True,
'banker_ev': -13.588455736600846,
'banker_wins': 38.043614384612255,
'banker_wins_no_tie': 42.2106681669153,
'dragon_he': -81.45667915410843,
'player_ev': 13.136179618408372,
'player_wins': 51.632070121213104,
'player_wins_no_tie': 57.287516286542804,
'tie_ev': -11.151645616160554,
'tie_wins': 9.872039375982162}
Simulation time: 7.062964554627737
The EV for the banker bet in this situation is not affected as dramatically as you might expect. What's happening here is that the banker can only draw a card if the player has not drawn a card.
If the player stands, the banker draws on 5 or less.
This rule is what's giving the banker only a slight boost in EV. Essentially, the player has a first move advantage with +13% EV using the modified ruleset and we can see that represented in the EV scores for both versions of the game. Interestingly, the tie bet actually has less of a house edge than in the base game right now.
The banker draws on 5 or less, regardless of whether the player draws
This is not a rule of the game, but I wanted to see the results after running the above ruleset.
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -2.2640610793416336,
'banker_wins': 45.31197699246161,
'banker_wins_no_tie': 50.00084844917277,
'dragon_he': -100.0,
'player_ev': -0.0015377702814511895,
'player_wins': 45.31043922218016,
'player_wins_no_tie': 49.99915155082722,
'tie_ev': -15.601745931775945,
'tie_wins': 9.37758378535823}
Simulation time: 7.124127662181854
{'EZ_BAC': True,
'banker_ev': -2.736098673737458,
'banker_wins': 42.57428997088005,
'banker_wins_no_tie': 46.97957933342135,
'dragon_he': 12.26993676562611,
'player_ev': -0.002192466887568356,
'player_wins': 45.31038864461751,
'player_wins_no_tie': 49.99879033599679,
'tie_ev': -15.606727805103338,
'tie_wins': 9.377030243877407}
Simulation time: 7.084209243456523
You might expect this even ruleset to produce 50-50 results, but since we're charging a commission, or in the case of EZ Baccarat, a push on a 3 card 7 win for the banker, we're still seeing a negative expectation for the banker. The player bet has essentially no house edge and is indeed almost a true coin flip.
Let's see what happens if we remove the commission paid in mini baccarat.
BANKER_PAYOUT = 1
{'EZ_BAC': False,
'banker_ev': 0.002979479161463461,
'banker_wins': 45.31241530961168,
'banker_wins_no_tie': 50.00164390769113,
'dragon_he': -100.0,
'player_ev': -0.002979479161463461,
'player_wins': 45.30943583045022,
'player_wins_no_tie': 49.998356092308875,
'tie_ev': -15.596660260557083,
'tie_wins': 9.3781488599381}
Simulation time: 7.076362645626068
This is the closest we can get to a 50-50 result. The banker has a very slight advantage after the removal of the commission. The increased banker payout of course changes nothing for the player. This would not be considered the same as no commission baccarat, because the banker is still winning with a winning 3 card 7, it's not considered a push (that's only for EZ Baccarat / no commission baccarat).
Back to the actual rules of the game...
If the player draws, and if the dealer’s hand total is 2 or less, then the banker hand is dealt a third card
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if (banker_value <= 2):
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
elif banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -2.9579921305218693,
'banker_wins': 44.87170946171287,
'banker_wins_no_tie': 49.60511616720347,
'dragon_he': -100.0,
'player_ev': 0.7144066574362229,
'player_wins': 45.58611611914909,
'player_wins_no_tie': 50.39488383279653,
'tie_ev': -14.120430227757563,
'tie_wins': 9.542174419138048}
Simulation time: 7.376292951901754
{'EZ_BAC': True,
'banker_ev': -2.4099790523240907,
'banker_wins': 43.177136401306356,
'banker_wins_no_tie': 47.73240112470633,
'dragon_he': -30.6112139915923,
'player_ev': 0.7175696374848772,
'player_wins': 45.58711545363045,
'player_wins_no_tie': 50.39663725557193,
'tie_ev': -14.10995142798419,
'tie_wins': 9.543338730223978}
Simulation time: 6.934117937088013
We can see a major improvement in the house edge for the banker bet (which are now -2.95% and -2.40%) with the implementation of this 'dynamic' rule, and simultaneously the player bet EV is massively reduced. This rule is allowing the banker to be reactionary for the first time, giving them a large drawing advantage.
If the dealer’s hand total is 3, then the banker hand is dealt a third card unless the player’s third card was an 8
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if (banker_value <= 2) or \
(banker_value == 3 and player_third_card != 8):
banker_len = 3
indx += 1
elif banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -1.7341254600192368,
'banker_wins': 45.51770083376879,
'banker_wins_no_tie': 50.29933571529541,
'dragon_he': -100.0,
'player_ev': -0.5417595816692045,
'player_wins': 44.97594125209959,
'player_wins_no_tie': 49.70066428470459,
'tie_ev': -14.442778772815402,
'tie_wins': 9.506357914131621}
Simulation time: 7.015542685985565
{'EZ_BAC': True,
'banker_ev': -1.4811749490610815,
'banker_wins': 43.49709408601576,
'banker_wins_no_tie': 48.0654192340921,
'dragon_he': -17.169899198901728,
'player_ev': -0.5390714119413109,
'player_wins': 44.97826903507684,
'player_wins_no_tie': 49.70215604103536,
'tie_ev': -14.460485338854944,
'tie_wins': 9.504390517905007}
Simulation time: 6.7786217411359155
A slight improvement with the addition of this rule. The tie bet EV is coming closer to parity with the baseline, and now the player bet is a negative expectation bet.
If the dealer’s hand total is 4, then the banker hand is dealt a third card unless the player’s third card was a 0, 1, 8, or 9
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if (banker_value <= 2) or \
(banker_value == 3 and player_third_card != 8) or \
(banker_value == 4 and 2 <= player_third_card <= 7):
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
elif banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -1.2438866131091575,
'banker_wins': 45.75975719888951,
'banker_wins_no_tie': 50.57700827798012,
'dragon_he': -100.0,
'player_ev': -1.0441012468353217,
'player_wins': 44.71565595205419,
'player_wins_no_tie': 49.42299172201988,
'tie_ev': -14.278718358493292,
'tie_wins': 9.5245868490563}
Simulation time: 7.913999768098195
{'EZ_BAC': True,
'banker_ev': -1.1046056814933425,
'banker_wins': 43.61203381089578,
'banker_wins_no_tie': 48.2038963136832,
'dragon_he': -12.038147078939964,
'player_ev': -1.04080536536178,
'player_wins': 44.71663949238912,
'player_wins_no_tie': 49.42480469803165,
'tie_ev': -14.266759151260167,
'tie_wins': 9.52591564985998}
Simulation time: 8.608295651276906
We can see that the addition of these rules are slowly raising the bankers EV and decreasing the players EV.
If the dealer’s hand total is 5, then the banker hand is dealt a third card if the player’s third card was 4, 5, 6, or 7
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if (banker_value <= 2) or \
(banker_value == 3 and player_third_card != 8) or \
(banker_value == 4 and 2 <= player_third_card <= 7) or \
(banker_value == 5 and 4 <= player_third_card <= 7):
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
elif banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -1.08005887735394,
'banker_wins': 45.84230554568083,
'banker_wins_no_tie': 50.66984755988376,
'dragon_he': -100.0,
'player_ev': -1.212056399930106,
'player_wins': 44.630249145750724,
'player_wins_no_tie': 49.330152440116244,
'tie_ev': -14.252992222883965,
'tie_wins': 9.527445308568447}
Simulation time: 6.815460288524628
{'EZ_BAC': True,
'banker_ev': -1.0021966375254043,
'banker_wins': 43.62573824934762,
'banker_wins_no_tie': 48.21929602640567,
'dragon_he': -8.98255307115987,
'player_ev': -1.2177410924463061,
'player_wins': 44.62793488687303,
'player_wins_no_tie': 49.32701862963814,
'tie_ev': -14.262497795731266,
'tie_wins': 9.526389133807637}
Simulation time: 6.881539543469747
As should be expected by now, the more advantageous rules we add for the banker, the more their EV improves and the worse it gets for the player bet.
If the dealer’s hand total is 6, then the banker hand is dealt a third card if the players third card was a 6 or 7
if banker_value in [8, 9] or player_value in [8, 9]:
return indx, player_hand, banker_hand, player_len, banker_len
if player_value <= 5:
player_hand[2] = deck[indx]
player_third_card = player_hand[2]
player_len = 3
indx += 1
if (banker_value <= 2) or \
(banker_value == 3 and player_third_card != 8) or \
(banker_value == 4 and 2 <= player_third_card <= 7) or \
(banker_value == 5 and 4 <= player_third_card <= 7) or \
(banker_value == 6 and 6 <= player_third_card <= 7):
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
elif banker_value <= 5:
banker_hand[2] = deck[indx]
banker_len = 3
indx += 1
{'EZ_BAC': False,
'banker_ev': -1.0568551700983142,
'banker_wins': 45.86031507254691,
'banker_wins_no_tie': 50.68307886951139,
'dragon_he': -100.0,
'player_ev': -1.2361605835290335,
'player_wins': 44.624154489017876,
'player_wins_no_tie': 49.31692113048861,
'tie_ev': -14.360226054083046,
'tie_wins': 9.515530438435217}
Simulation time: 6.938762573401133
{'EZ_BAC': True,
'banker_ev': -1.0170724617376004,
'banker_wins': 43.60661201788616,
'banker_wins_no_tie': 48.19251238747557,
'dragon_he': -7.589724637220074,
'player_ev': -1.2368366934521535,
'player_wins': 44.623684479623755,
'player_wins_no_tie': 49.316545531603914,
'tie_ev': -14.35785087429695,
'tie_wins': 9.515794347300337}
Simulation time: 6.884163002173106
And finally the second last rule has been added back in. We are nearly to baseline, with the last rule being added in taking us to the baseline results at the top of the page.
We can see that the rules of this game have been carefully chosen to affect select hands in order to modulate the EV of banker, player and tie bets so that the casino comes out a winner no matter which bet is placed.
Note: I forgot to add in the dragon win rate % under the EZ Baccarat simulation data print out. My bad.