# Kelly Capital Growth Investment Strategy (Example in R)

In the paper Response to Paul A Samuelson letters and papers onthe Kelly Capital Growth Investment Strategy pages 5 and 6 Dr William T Ziemba, gives a praticle example on Kelly Growth.

I’m trying to replicate the simulation explained there on R :

Step 1 : Create the Table as da Data.Frame

Win.Prob <- c(0.57,0.38,0.285,0.228,0.19)
Odds <- c("1-1","2-1","3-1","4-1","5-1")
Implied.Odds <-c(0.5,0.333,0.25,0.2,0.167)
Edge <- c(0.07,0.0467,0.035,0.028,0.0233)
Opt.Kelly <- c(0.14,0.07,0.0467,0.035,0.028)
Prob.Chose.Bet <- c(0.1,0.3,0.3,0.2,0.1)
Cum.Prob.Bet <- c(0.1,0.4,0.7,0.9,1)


Step 2 : Create the function that replicates the simulation

# Initiate the function that takes 3 variables (Initial Wealth, Decision Points, Number of Simulations)

kelly.simulation <- function(InitialWealth,SimulationNumber,SimulationSteps,KellyFraction) {

#Initiate a Matrix that generates SimulationSteps*SimulationNumber random numbers and Attribute to the Bet choice
simu_bets <- matrix(sample.int(5, size = SimulationSteps*SimulationNumber, replace = TRUE, prob = c(.1,.3,.3,.2,.1)),nrow=SimulationSteps,ncol=SimulationNumber)

#Take the chosen bet in simu_bets and create a new matrix of Optimal Kelly Bets based on the table in Kelly.Example
simu_kellybets <- ifelse(simu_bets == 1,Kelly.Example$Opt.Kelly, ifelse(simu_bets == 2,Kelly.Example$Opt.Kelly,
ifelse(simu_bets == 3,Kelly.Example$Opt.Kelly, ifelse(simu_bets == 4,Kelly.Example$Opt.Kelly,Kelly.Example$Opt.Kelly)))) #Take the chosen bet in simu_bets and create a new matrix of Winning Probability based on the table in Kelly.Example simu_prob <- ifelse(simu_bets == 1,Kelly.Example$Win.Prob,
ifelse(simu_bets == 2,Kelly.Example$Win.Prob, ifelse(simu_bets == 3,Kelly.Example$Win.Prob,
ifelse(simu_bets == 4,Kelly.Example$Win.Prob,Kelly.Example$Win.Prob))))

#Generate a new matrix of random number and compare to the prob of winning 1 means you won the bet 0 means you lost
simu_rnd <- matrix(runif(SimulationSteps*SimulationNumber,0,1),nrow=SimulationSteps,ncol=SimulationNumber)
simu_results <- ifelse(simu_prob>=simu_rnd,1,0)

#Generate a new matrix simu_results * simu_bets and creat the wealth simulation over each timestep
bet_combined <- simu_results * simu_bets
bet_combined[bet_combined==0] <- -1
multiplier <- 1 + simu_kellybets * bet_combined*KellyFraction
Wealth_Matrix <- apply(rbind(InitialWealth, multiplier), 2, cumprod)
row.names(Wealth_Matrix) <- NULL

#return the variation of wealth over each step for the defined number of simulations (Rows = Each Bet Decision Point / Column = Each simulation)
return(Wealth_Matrix)
}


Step 3 : Run the Simulation and Attribute the Resulting Matrix to a Variable called kelly.sim with 700 steps and 1000 simulations and Fraction = 1

 kelly.sim <- kelly.simulation(InitialWealth=1000,SimulationNumber=1000,SimulationSteps=700,KellyFraction=1)


Step 4 : Check the results of the last row of the simulations (in the example row number 701)

max(kelly.sim[701,])
 47800703
mean(kelly.sim[701,])
 270680.9
min(kelly.sim[701,])
 3.377048


In your oppinion these code replicates the simulation described in the paper ?

• Sorry, i forgot to update the data frame name, and column names. Now it should work, first create a data frame called Kelly.Example exact as it shows on the example (same column names) and run again the function. Just tested and everything worked for me. Jul 8, 2014 at 19:06
• The code is correct, just tested again. you have to call the function into a variable kelly.sim in order to create the wealth matrix kelly.sim <- kelly.simulation(InitialWealth=1000,SimulationNumber=1000,SimulationSteps=700) then you can use max, min and mean with kelly.sim Jul 8, 2014 at 19:16
• Added the code to generate the first data.frame Jul 8, 2014 at 19:34
• Now it runs - what is your exact question? Whether this replicates the algorithm described in the paper? Jul 11, 2014 at 15:05
• what are your numbers relative to the data he has published? Jul 11, 2014 at 15:14

As the paper suggests, the results that are shown in table 2 are taken from (if you read the caption) 