initial commit
This commit is contained in:
		
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
								
							@@ -1,2 +1,27 @@
 | 
			
		||||
# kelly-paper-experiment
 | 
			
		||||
 | 
			
		||||
If you start with $100 balance, and you make a bet with a 70% chance of winning.  If you win, you get $80.  If you lose, you lose $80.  
 | 
			
		||||
 | 
			
		||||
Do you take the bet?  Even more interesting, if you could keep repeating this bet over and over again, always betting 80% of your balance, should you do it?  
 | 
			
		||||
 | 
			
		||||
It makes sense, right, the odds are in your favor!  
 | 
			
		||||
 | 
			
		||||
### The actual answer - if you want to go broke, then yes
 | 
			
		||||
 | 
			
		||||
This blew my mind, how counter-intuitive the answer to this question actually is.  
 | 
			
		||||
 | 
			
		||||
This program runs 16 simulations where you start with a balance of 100 currencies.  You make consecutive bets, always betting 80% of your total balance with a 70% chance of winning each bet.  It then reports the results after ONLY 200 bets.  The result is the percentage of your returns (your end balance divided by your starting balance).
 | 
			
		||||
 | 
			
		||||
In other words, given enough time, we're all screwed.  
 | 
			
		||||
 | 
			
		||||
### Reference Video
 | 
			
		||||
 | 
			
		||||
[](https://www.youtube.com/watch?v=91IOwS0gf3g)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### How to build this program yourself
 | 
			
		||||
 | 
			
		||||
1. Install go - https://golang.org/dl/
 | 
			
		||||
2. Clone - git clone https://deadbeef.codes/steven/kelly-paper-experiment.git
 | 
			
		||||
3. Build - cd kelly-paper-experiment && go build .
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	rand.Seed(time.Now().UTC().UnixNano())
 | 
			
		||||
 | 
			
		||||
	var balance, investedPercentage, winningPercentage float64
 | 
			
		||||
	balance = 100
 | 
			
		||||
	investedPercentage = 0.80
 | 
			
		||||
	winningPercentage = 0.70
 | 
			
		||||
	discreteCompoundingPeriods := 200
 | 
			
		||||
	numSimulations := 16
 | 
			
		||||
	outputChannel := make(chan float64)
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < numSimulations; i++ {
 | 
			
		||||
		go simulation(balance, investedPercentage, winningPercentage, discreteCompoundingPeriods, outputChannel)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < numSimulations; i++ {
 | 
			
		||||
		fmt.Println(<-outputChannel)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func simulation(startingBalance, investedPercentage, winningPercentage float64, discreteCompoundingPeriods int, outputChannel chan float64) {
 | 
			
		||||
	balance := startingBalance
 | 
			
		||||
	for i := 0; i < discreteCompoundingPeriods; i++ {
 | 
			
		||||
		investedAmount := balance * investedPercentage
 | 
			
		||||
		if rand.Float64() <= winningPercentage {
 | 
			
		||||
			// you win
 | 
			
		||||
			balance += investedAmount
 | 
			
		||||
		} else {
 | 
			
		||||
			// you lose
 | 
			
		||||
			balance -= investedAmount
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	outputChannel <- (balance / startingBalance)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user