##------BELOW ARE PARAMETERS WE CAN PLAY WITH ------# minBetSize = 2 minBankSizeAtEndOfSim = 100 startingBalance = 100 edge = 0.1 confidenceInterval95 = c(0,0.05,0.1,0.15,0.2,0.25,0.3,0.45,0.7) numberOfSimulations = 700 numberOfBets = 1000 KellyFraction = 0.4 ##--------------SIMULTATION CODE STARTS HERE------ #LOOP THROUGH THE ARRAY OF POSSIBLE CONFIDENCE INTERVALS PROVIDED goneBustArray = NULL; for (confidenceCounter in 1:length(confidenceInterval95)){ # WE WILL FIND THE PROB OF BUST FOR EACH CONFIDENCE INTERVAL GoneBust = rep(0, length = numberOfSimulations) FinalBalance = matrix(0, nrow = numberOfSimulations, ncol = numberOfBets) for (i in 1:numberOfSimulations){ #LOOP THROUGH EACH SIMULATION currentBalance = startingBalance for (j in 2:numberOfBets){ #FOR THIS SIMULATION LOOP THROUGH THE NUMBER OF BETS TO MAKE believedProbability = runif(1) #GET A PORBABILTY RANDOMLY FROM A UNIFORM DISTRIBUTION odds = (1+edge)/believedProbability #FIND THE ODDS YOU WOULD USE FOR YOUR "PERCIEVED" EDGE stakeSize = ((believedProbability*odds - (1-believedProbability))/odds)*KellyFraction*currentBalance[j-1] #GET YOUR STAKE SIZE OUT actualEdge = rnorm(1, mean = edge, sd = confidenceInterval95[confidenceCounter]/2) #FIND MY ACTUAL EDGE drawn from a norml dist. actualWinProbability = (actualEdge + 1)/odds #DETERMINE MY ACTUAL PROB OF WINNING if (stakeSize < minBetSize){ # IF MY STAKE SIZE IS SMALLER THAN MY MIN THEN BET NOTHING stakeSize = 0 } winProb = runif(1) if (winProb <= actualWinProbability){ #THEN WE HAVE ONE AND ADJUST BALANCE ACCORDINGLY currentBalance[j] = currentBalance[j-1] + (odds-1)*stakeSize }else{ #THEN WE HAVE LOST AND ADJUST BALANCE ACCORDINGLY currentBalance[j] = currentBalance[j-1] - stakeSize } if (currentBalance[j-1] < minBetSize){ # YOUR BALANCE IS TO SMALL SO BUST GoneBust[i] = 1 break } if (currentBalance[j] > 10000000){ # YOUR BALANCE IS MASSIVE STOP BETTING YOU WIN break } } if (currentBalance[j-1] < minBankSizeAtEndOfSim){ #IF BALANCE IS LESS THAN YOU STARTED WITH THEN YOU BUST GoneBust[i] = 1 } currentBalance[j:numberOfBets] = currentBalance[j-1] #FILLING IN SOME BLANKS IF WE LEFT THIS SIMULATION EARLY, IE. WENT BUST OR MADE LOTS FinalBalance[i,] = currentBalance #RECORD THIS SIMULATIONS PERFORMANCE SO WE CAN PLOT THE AVERAGE LATER } goneBustArray[confidenceCounter] = sum(GoneBust)/length(GoneBust) plot(colSums(FinalBalance)) #PLOTTING THE AVERAGE OF ALL SIMS PERFORMANCE } plot(confidenceInterval95, goneBustArray, type = "o", xlab = "Confidence Interval", ylab = "Probability of Bust") ####------------END OF ONE SIMULATION TYPE ------------- ########## SIMULATION TO PLOT A 3D SURFACE OF BUST PROB AS KELLY FRACTION AND CONFIDENCE INTERVAL VARY ##### #### THIS MAY TAKE HOURS TO RUN ############## ##------BELOW ARE PARAMETERS WE CAN PLAY WITH THIS CODE TAKES VERY LONG TIME TO RUN------# minBetSize = 2 minBankSizeAtEndOfSim = 100 startingBalance = 100 edge = 0.1 confidenceInterval95 = c(0,0.05,0.1,0.15,0.2,0.25,0.3,0.45,0.7) numberOfSimulations = 1000 numberOfBets = 1000 KellyFraction = seq(from = 0.1, to = 1, by = 0.1) ##--------------SIMULTATION CODE STARTS HERE------ #LOOP THROUGH THE ARRAY OF POSSIBLE CONFIDENCE INTERVALS PROVIDED goneBustMatrix = matrix(0, nrow = length(KellyFraction), ncol = length(confidenceInterval95)) for (kellyCounter in 1:length(KellyFraction)){ goneBustArray = NULL; for (confidenceCounter in 1:length(confidenceInterval95)){ # WE WILL FIND THE PROB OF BUST FOR EACH CONFIDENCE INTERVAL GoneBust = rep(0, length = numberOfSimulations) FinalBalance = matrix(0, nrow = numberOfSimulations, ncol = numberOfBets) for (i in 1:numberOfSimulations){ #LOOP THROUGH EACH SIMULATION currentBalance = startingBalance for (j in 2:numberOfBets){ #FOR THIS SIMULATION LOOP THROUGH THE NUMBER OF BETS TO MAKE believedProbability = runif(1) #GET A PORBABILTY RANDOMLY FROM A UNIFORM DISTRIBUTION odds = (1+edge)/believedProbability #FIND THE ODDS YOU WOULD USE FOR YOUR "PERCIEVED" EDGE stakeSize = ((believedProbability*odds - (1-believedProbability))/odds)*KellyFraction[kellyCounter]*currentBalance[j-1] #GET YOUR STAKE SIZE OUT actualEdge = rnorm(1, mean = edge, sd = confidenceInterval95[confidenceCounter]/2) #FIND MY ACTUAL EDGE drawn from a norml dist. actualWinProbability = (actualEdge + 1)/odds #DETERMINE MY ACTUAL PROB OF WINNING if (stakeSize < minBetSize){ # IF MY STAKE SIZE IS SMALLER THAN MY MIN THEN BET NOTHING stakeSize = 0 } winProb = runif(1) if (winProb <= actualWinProbability){ #THEN WE HAVE ONE AND ADJUST BALANCE ACCORDINGLY currentBalance[j] = currentBalance[j-1] + (odds-1)*stakeSize }else{ #THEN WE HAVE LOST AND ADJUST BALANCE ACCORDINGLY currentBalance[j] = currentBalance[j-1] - stakeSize } if (currentBalance[j-1] < minBetSize){ # YOUR BALANCE IS TO SMALL SO BUST GoneBust[i] = 1 break } if (currentBalance[j] > 10000000){ # YOUR BALANCE IS MASSIVE STOP BETTING YOU WIN break } } if (currentBalance[j-1] < minBankSizeAtEndOfSim){ #IF BALANCE IS LESS THAN YOU STARTED WITH THEN YOU BUST GoneBust[i] = 1 } currentBalance[j:numberOfBets] = currentBalance[j-1] #FILLING IN SOME BLANKS IF WE LEFT THIS SIMULATION EARLY, IE. WENT BUST OR MADE LOTS FinalBalance[i,] = currentBalance #RECORD THIS SIMULATIONS PERFORMANCE SO WE CAN PLOT THE AVERAGE LATER } goneBustArray[confidenceCounter] = sum(GoneBust)/length(GoneBust) plot(colSums(FinalBalance)) } plot(confidenceInterval95, goneBustArray, type = "o", xlab = "Confidence Interval", ylab = "Probability of Bust") goneBustMatrix[kellyCounter,] = goneBustArray } persp(x = KellyFraction, y = confidenceInterval95, z = goneBustMatrix,theta = -30, phi = 10, expand = 0.5, col = "lightblue",ltheta = 60, shade = 0.75, ticktype = "detailed", xlab = "Kelly Fraction", ylab = "95% confidence", zlab = "Probability of ruin")