initial commit
This commit is contained in:
parent
d62d732f9a
commit
0c9a3b086d
25
README.md
25
README.md
@ -1,2 +1,27 @@
|
|||||||
# kelly-paper-experiment
|
# 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
|
||||||
|
|
||||||
|
[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/91IOwS0gf3g/0.jpg)](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)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user