ICM Equity Calculator
From PokerAI
The problem with using only chip stacks and chips to determine the correct play in SNG is that the chips do not correlate to their actual value on a one-to-one basis. An ICM Calcuator computes the tournament equity that a certain chip stack has in relation to the other stacks at the table in order to determine the true value of the stacks. You can then use the ICM equity values to calculate pot odds and get a closer answer to the correct decision in tournaments.
ICM Equity is defined as:
Equity = P(1st)(Payout For First) + P(2nd)(Payout For Second) + … + P(nth)(Payout for nth) where P(i) denotes the probability of finishing on i-th place.
The problem usually is how to calculate P(i) efficiently and correctly. Usually, the following implementation assumptions and approach is taken:
- The probability of finishing first is assumed to be the ratio of your stack size vs total number of chips in play
- The probability of finishing second, etc is defined recursively, as the sum of probabilitites of player i = 1...n of finishing first, etc., and you finishing first (from the remaining players, and with adjusted stack sizes) afterwards.
Implementation
This is Java snippet returns ICM equity of selected player, by given payout structure and player stacks. The results from the following implementation are off slightly when the stack distributions are skewed. See also a C++ port of the below funtion
/**
* \param payouts Payout structure, e.g.: new double[]{0.5,0.3,0.2}
* \param stacks Player stacks
* \param player Index of selected player in the stack-array
* \returns ICM equity for selected player
*/
public static double getEquity ( double [] payouts, double [] stacks, int player )
{
double total = 0 ;
for ( int i = 0 ; i < stacks.length; i++ )
total += stacks [ i ] ;
return getEquity ( payouts, stacks.clone () , total, player, 0 ) ;
}
//Recursive method doing the actual calculation.
private static double getEquity ( double [] payouts, double [] stacks, double total, int player, int depth )
{
double eq = stacks [ player ] / total * payouts [ depth ] ;
if ( depth + 1 < payouts.length )
for ( int i = 0 ; i < stacks.length; i++ )
if ( i != player && stacks [ i ] > 0.0 ) {
double c = stacks [ i ] ;
stacks [ i ] = 0.0 ;
eq += getEquity ( payouts, stacks, total - c, player, depth + 1 ) * c / total;
stacks [ i ] = c;
}
return eq;
}
See also
Links
- ICM online calculator
- ICM online calculator - javascript
- ICM introduction
- ICM implementation home
- ICM implementation in python
- ICM Derivation and Sample Analysis
