I've been all over the forums but I can't quite seem to locate Part III of this series. Does it exist?
Posters' Poll: Top Sportsbooks

Best Sportsbooks List
SBR TopRated Sportsbooks


#1 5Dimes (SBR rating A+)  675 Pts  #1 Bookmaker  SBR rating A+  Review  
#2 Heritage Sports (SBR rating A+)  665 Pts  #2 5Dimes  SBR rating A+  Review  
#3 Bookmaker (SBR rating A+)  380 Pts  #3 Heritage  SBR rating A+  Review  
#4 Pinnacle (SBR rating A+)  310 Pts  #4 BetOnline  SBR rating A+  Review  
#5 BetOnline (SBR rating A+)  165 Pts  #5 Intertops  SBR rating A  Review 
Over 7500 views...for this?
BTP
Week 12401 1017 pts
Civilized Return (on investment).
SBR Founder Join Date: 12/14/2005
I'm unaware of the existence of a closed form solution to the mutually exclusive outcome Kelly problem except in the very special case of bookmaker overround less than unity across all possible outcomes (for Full Kelly). Now I'm not saying it doesn't exist, just that I've never seen it (nor spent much time trying to suss it out for myself)
Specifically, given an unconstrained pure arbitrage optimal strategy would would be to wager a percentage of bankroll on each outcome equal to the probability of that outcome occurring.
What's most interesting about this is that in the face of a pure arbitrage, an unconstrained player would optimally wager without regard for individual odds.
For example, a fair coin prop offering +110 on heads and +100 would call for a 50% full Kelly wager on each outcome, while a fair offered at +20000 heads and 500 tails would call for the same pair of half bankroll bets.
Anyway, here's a plainEnglish description of the algorithm I used in the SBR Kelly calculator to calculate full Kelly stakes on mutually exclusive events.
 Sort all bets by edge, from highest to lowest.
 Calculate the fair implied probability for each bet. This is just the reciprocal of the decimal odds.
 Starting with the highest edge bet, calculate a running total of the the implied probability and the actual probability. The running total for each bet includes the sum of the implied and actual probabilities for that bet and every bet with a higher edge.
 If the sum of all the implied probabilities is less than 1 (i.e., a true arb exists), then for each bet the stake will be the actual probability. If this is the case, we can stop here.
 If the sum of all the implied probabilities is greater than 1, then for each bet calculate the quotient (1 – the sum of actual probabilities) / (1 sum of implied probabilities).
 Find the smallest value of this quotient that’s greater than zero. If no quotient is greater than zero then no bets will be made.
 Then for each bet the stake will be the actual probability minus the minimum quotient from 6) above multiplied by the fair implied probability.
If it helps, following is the old skool JS I used in the Kelly Calculator for mutually exclusive outcomes with Kelly multiplier = 1.
Kind of embarrassing when I look at my old code now ...
Code:function calcMutExKelly(a_dEdge, a_dOdds, dKellyMult) { var lSingles,a_sParlayNames,a_dRealKellyStakes; if (dKellyMult == undefined  dKellyMult <= 0  isNaN(dKellyMult)) dKellyMult = 1; dKellyMult = parseFloat(dKellyMult); if (!isArray(a_dEdge)  !isArray(a_dOdds) ) { var err = "calcMutExKelly: Odds and Edge arguments must both be arrays"; alert(err); return err; } lSingles = a_dOdds.length; if(lSingles != a_dEdge.length) { var err = "calcMutExKelly: Edge (size=" + a_dEdge.length + ") and odds (size=" + lSingles + ") arrays are different sizes"; alert(err); return err; } a_dRealKellyStakes = new Array(Math.pow(2,lSingles)1); a_sParlayNames = new Array(Math.pow(2,lSingles)1); var oSortedByEdge = new Array(lSingles1); var dTotProb = 0; for (var i=0; i<=lSingles1;i++) { var mydProb = edge2prob(a_dEdge[i], a_dOdds[i]); dTotProb += mydProb ; oSortedByEdge[i] = { n: i, dEdge: a_dEdge[i], dOdds: a_dOdds[i], dProb: mydProb}; } if(dTotProb > 1 + 1e6) { var err = "calcMutExKelly: Sum of probabilities of mutually exclusive outcomes (" + dTotProb + ") may not be > 1"; alert(err); return err; } var fnSortByEdge = function(a,b) { return(b.dEdge  a.dEdge); } ; oSortedByEdge.sort(fnSortByEdge); var dMinResult = 1, dOverround = 0, dSumProb = 0, dSumOddsRecip = 0; for (var i = 0; i<=lSingles1; i++) { dSumProb += oSortedByEdge[i].dProb; if ( dSumProb > 1 ) dSumProb = 1; // due to rounding error probability may erroneously be slightly > 1 dOverround += 1 / oSortedByEdge[i].dOdds; var dProposedMinResult = (1dSumProb) / (1dOverround ); if (dProposedMinResult > 0 && dProposedMinResult < dMinResult) { dMinResult = dProposedMinResult ; } } for (var i = 0; i<=lSingles1; i++) { if (dOverround < 1 && dSumProb >= 1  1e7 ) { a_dRealKellyStakes[Math.pow(2,oSortedByEdge[i].n)] = oSortedByEdge[i].dProb; } else { a_dRealKellyStakes[Math.pow(2,oSortedByEdge[i].n)] = Math.max(0, oSortedByEdge[i].dProb  dMinResult / oSortedByEdge[i].dOdds); } a_sParlayNames[Math.pow(2,oSortedByEdge[i].n)] = ''+(1+oSortedByEdge[i].n); } g_arrStakes = a_dRealKellyStakes; return {arrNames: a_sParlayNames, arrStakes: a_dRealKellyStakes}; }
the_fredrik gave Ganchrow 10 SBR Point(s) for this post. 
SBR Founder Join Date: 8/28/2005
I wonder what he does now.
BTP
Week 14320 384 pts
BTP
Week 12410 781 pts
BTP
Week 11410 324 pts
BTP
Week 11410 686 pts
$20
Angelman
donation
02/15/2018
Props to Ganch. At least the guy was trying.
Thoughtprovoking stuff. One example I'll present:
* Betting a 200 Fav w/ 70% Win Probability. Compare to +200 Dog w/ 35% Win Probability.
Which is a better risk?
Well, each bet is a +5% ROI. So, we're even on Expectation. The 200 Fav is a MUCH better risk.
One vantage point is to view how your Bankroll will oscillate over 100 similar plays. You can chart this on a Binomial Distribution. On the string of 200 Favs, I'm very unlikely to show a Net Loss on 100 plays.
On 100 +200 Dogs, I could easily show a Net Loss, just based on bad variance.
BTP
Week 11410 686 pts
$20
Angelman
donation
02/15/2018
BTP
Week 11410 324 pts