Setup
You may be familiar with the compound interest formula: \[a_n = a_0 (1+r)^n,\] where \(r\) is the constant annual (say) rate of return. Setting \(R = (1+r)\), we have \(a_n = a_0 R^n\).
If the returns per year are not constant (think stocks instead of bonds), then we have to modify the formula to, \[a_n = a_0 \prod_{i=1}^n R_i.\] Suppose the \(R_i\) come from a known (and "stable over time") random process. We know how to deal with sums and products of independent and identically distributed (iid) random variables.
As I demonstrated in the previous post, we don't want to maximize the arithmetic average \(\langle a_n \rangle\) because it is skewed by positive outcomes; instead, we use a geometric average.
We can do this using the property of logarithms.
\[\begin{align}
\log a_n & = \log a_0 + \sum_{i=1}^{n} \log R_i\\
\langle \log \frac{a_n}{a_0} \rangle & = n \langle \log R \rangle,\\
\end{align}\] where I have used the result that expected value of the sum of iid random variables, \(y = \sum_{i=1}^{n} x_i,\) is given by \(\langle y \rangle = n \langle x \rangle.\)
We wan to maximize \(\langle \log \frac{a_n}{a_0} \rangle\) by maximizing \(\langle \log R \rangle\).
Let us denote the average return \(S = \exp(\langle \log R \rangle)\), so that we can crudely write \(a_n \sim a_0 S^{n}\) (compare this with the formula \(a_n = a_0 R^n\) for constant rate of returns).
Note that \(S\) is a function of \(f\). We want to choose \(f\) to maximize this growth rate.
Optimization
Back to our wager. Let us generalize it a little bit.
Suppose there are \(m\) possible outcomes (instead of just two), each with probability \(q_i\), and payoff \(b_i\). Note that the \(q_i\)s have to add to one. How much do we wager?
We want to maximize \(S\) (or \(\log S\), since it is a monotonic function). \[\begin{align}
\log S & = \langle \log R \rangle \\
& = q_1 \log(1 + b_1 f) + ... + q_m \log(1 + b_m f) \\
& = \sum_{i=1}^{m} q_i \log(1 + b_i f)
\end{align}\] Setting up:
\[\dfrac{d \log S}{df} = \sum_{i=1}^{m} \frac{q_i b_i}{1 + b_i f} = 0\] Solving the last equation for \(f\) gives the optimal value. This value corresponds to an average growth rate of \[S = \exp \left( \sum q_i (1 + b_i f^*) \right)\]
Special Case
When we have just two outcomes, \[\frac{q_1 b_1}{1 + b_1 f} + \frac{q_2 b_2}{1 + b_2 f} = 0\] Following the example in the last post, by Setting \(b_2 = -1\) and \(q_1 = q\), we get \[\frac{q b}{1 + b f} = \frac{1 - q}{1 - f},\] which simplifies to the familiar rule, presented there.
Python Code
Lets encode the equation to solve:
def funcKelly(f, q, b):
"""equation to solve for f"""
s = 0.
for qi, bi in zip(q,b):
s += (qi * bi) / (1. + bi * f)
return s
def optimalKelly(q, b):
"""given probabilities q and payouts b,
solve the equation to get optimal Kelly
by solving the function funcKelly"""
from scipy.optimize import brentq
fstar = brentq(funcKelly, 0.0, 1.0, args=(q, b))
return fstar
Geometric Average Growth Rate
Finally, let me plot the average growth rate S versus fraction f, by taking the average of 1000 independent simulation (of a series of 100 bets) with q = (0.5, 0.5), b = (2, -1).
The "star" on the plot shows the optimality of \(f^*\).
No comments:
Post a Comment