应用于股市的凯利公式讲解、推导与Python实现

1. 凯利公式是什么?

在我们进行投资或任意性质的赌Bo时,假设我们可以预估出胜率赢时的利润率输时的亏损率,那我们应该拿出多少本金进行投资呢?这就是凯利公式要回答的问题。

注意上面的话,凯利公式有个前提,就是胜率赢时的利润率输时的亏损率 要已知,你可以通过其他技术手段或者经验来进行预估。

用数学公式表示则为:

f ( p , W , L ) = p ∗ W − ( 1 − p ) ∗ L W ∗ L f(p,W, L) = \frac{p*W - (1-p)*L }{W*L} f(p,W,L)=WLpW(1p)L

其中:

  • p :获胜的概率,取值范围为 [ 0 , 1 ] [0,1] [0,1]
  • W:获胜时的利润率。取值范围为 [ 0 , + ∞ ] [0,+∞] [0,+]。① 假设我们投注1块钱,赢得话1块变2块,此时我们的利润率是100%,而不是200%。② 若在股市中,假设我们投资100块,预计涨幅30%(或者说在涨30%时止盈),赢后100变130,那么利润率就是30%,即0.3。
  • L:失败时的亏损率。取值范围为 [ 0 , 1 ] [0, 1] [0,1]。① 假设我们投注1块,输的话变为0。则亏损率就是100%。② 股市中,假设我们投资100块,预计下跌10%(或下跌10%时止损),之后100变90,那亏损率就是10%
  • f(p, W, L):该函数的值则为投注的比例。范围是 [ 0 , + ∞ ] [0, +∞] [0,+]。这里之所以不是 [ 0 , 1 ] [0,1] [0,1],是因为当 W W W很大,而 L L L很小时,凯利公式会让你上杠杆。

这里每次投注的比例,是以现在的钱为基准。假设第一次手里有100,投注比例是20%,赢了之后变120了。那么下次的20%就是 120 * 20% = 24元

2. 凯利公式举例

我们举几个实际例子来感受一下:

  • 场景一:掷骰子,胜率50%(p=0.5),赢翻倍(W=1),输清0(L=1),则投注比例应为: f = 0 f = 0 f=0。即不应该投注,这游戏没有任何意义。
  • 场景二:投不均匀的骰子,胜率60%(p=0.6),赢翻倍(W=1),输清0(L=1),则投注比例应为: f = 0.2 f = 0.2 f=0.2 。这次就有的玩了,一次投注20%的钱,假设我有100,就投注20元。
  • 场景三:投不均匀的骰子,胜率40%(p=0.4),赢翻倍(W=1),输清0(L=1),则投注比例应为: f = − 0.2 f = -0.2 f=0.2 。即不应该投注。
  • 场景四:假设你根据历史经验判断一只股票后续上涨概率很大,你决定买入后在上涨30%时止盈(W=0.3),若亏损大于10%(L=0.1)你就会选择止损。结合你的止盈点、止损点和该股票历史表现等因素,你判断这次操作的胜率为70%(p=0.7),则投注比例应为: f = 6 f=6 f=6。即加5倍杠杆,假设你有1万元,那么再借5万,凑够6万买入。就算你输了,也只输 6 ∗ 0.1 = 0.6 6*0.1=0.6 60.1=0.6 万,还了5万还能剩4千呢。注意:这只是公式给出的结果,可别真去借钱上杠杆。毕竟你自己的估算的概率不准,再加上要是跌停了,你想止损也卖不出去。
  • 场景五:同场景四,上涨30%止盈(W=0.3),亏损20%止损(L=0.2),胜率为40%(p=0.4),则 f = 0 f = 0 f=0,不应该入场。
  • 场景六:同场景四,上涨30%止盈(W=0.3),亏损10%止损(L=0.1),胜率为40%(p=0.4),则 f = 2 f = 2 f=2,2倍杠杆入场。注意:这里看似场景五和六只是调整了一下止损点,但实则不是。因为若五和六是完全相同的场景,那么你降低了你的止损点,那么你的胜率也应该相应降低。
  • 场景六:同场景四,上涨30%止盈(W=0.3),亏损10%止损(L=0.1),胜率为30%(p=0.3),则 f = 0.66 f = 0.66 f=0.66,即投注本金的66%。

3. 凯利公式的Python实现

python公式很简单,就是按照上面公式写一下即可

def kelly_buy_ratio_strategy(
        p: float,  # 获胜概率
        W: float,  # 获胜时的盈利,或止盈点。例如:当上涨时预计盈利为20%,则rW=0.2
        L: float,  # 失败时的亏损,或止损点。例如:当下跌10%时止损,则rL=0.1
):
    """
    根据“凯利公式”决定买入的仓位比例
    """

    buy_ratio = (p * W - (1 - p) * L) / (W * L)

    if buy_ratio < 0:
        buy_ratio = 0

    return buy_ratio

4. 凯利公式数学推导

该节讲解凯利公式的推导,不感兴趣可以不看。

假设有一种赌Bo游戏,胜率固定为 p p p,盈利率固定为 W W W,亏损率固定为 L L L。(注意这里 p , W , L p, W, L p,W,L 都是常量)

假设我们进行 N N N 次游戏,那么将会有 N ⋅ p N \cdot p Np 次获胜, N ⋅ ( 1 − p ) N \cdot (1-p) N(1p) 次失败。

我们用 A n A_n An 来表示第 n n n次的本金,假设我们每次投注的比例为 x x x,则第 A n + 1 A_{n+1} An+1 次的金额则为:

A n + 1 = { A n ( 1 + x W ) if win A n ( 1 − x L ) if lose A_{n+1} = \begin{cases} A_n(1+x W) &\text{if win} \\ A_n(1-x L) &\text{if lose} \end{cases} An+1={An(1+xW)An(1xL)if winif lose

我们的初始本金为 A 0 A_0 A0,进行 N N N 次游戏,我们的本金变化可能如下:

A 1 = A 0 ( 1 + x W )       w i n A 2 = A 1 ( 1 − x L )       l o s e A 3 = A 2 ( 1 + x W )       w i n ⋯ A n − 1 = A n − 2 ( 1 − x L )       l o s e A n = A n − 1 ( 1 + x W )       w i n \begin{aligned} A_1 &= A_0 (1+xW) ~~~~~ win \\ A_2 &= A_1 (1-xL) ~~~~~ lose \\ A_3 &= A_2 (1+xW) ~~~~~ win \\ \cdots \\ A_{n-1} & = A_{n-2} (1-xL) ~~~~~ lose \\ A_{n} & = A_{n-1} (1+xW) ~~~~~ win \\ \end{aligned} A1A2A3An1An=A0(1+xW)     win=A1(1xL)     lose=A2(1+xW)     win=An2(1xL)     lose=An1(1+xW)     win

上述式子中,每次win和lose都是随机的,但一共有 N ⋅ p N \cdot p Np 次胜 和 N ⋅ ( 1 − p ) N \cdot (1-p) N(1p) 次败。

我们现在消除 A 1 , A 2 , … , A n − 1 A_1, A_2, \dots, A_{n-1} A1,A2,,An1,则式子变为:

A n = A 0 ( 1 + x W ) ( 1 − x L ) ( 1 + x W ) ⋯ ( 1 − x L ) ( 1 + x W ) = A 0 ( 1 + x W ) N p ( 1 − x L ) N ( 1 − p ) \begin{aligned} A_n & = A_0 (1+xW)(1-xL) (1+xW)\cdots (1-xL)(1+xW) \\\\ &= A_0 (1+xW)^{Np}(1-xL)^{N(1-p)} \end{aligned} An=A0(1+xW)(1xL)(1+xW)(1xL)(1+xW)=A0(1+xW)Np(1xL)N(1p)

上述式子中, A 0 , W , L , N , p A_0,W,L,N,p A0,W,L,N,p都是常量,只有投注比例 x x x 是变量,因此当自变量 x x x 变化时,最终的金额 A n A_n An 也会变。所以我们的目的就是求一个 x x x,使得 A n A_n An 最大。

因此,我们重新表示一下这个式子:

A n ( x ) = A 0 ( 1 + x W ) N p ( 1 − x L ) N ( 1 − p ) A_n (x) = A_0 (1+xW)^{Np}(1-xL)^{N(1-p)} An(x)=A0(1+xW)Np(1xL)N(1p)

接下来让 A 0 A_0 A0除过去,式子变为:

A ′ ( x ) = A n A 0 = ( 1 + x W ) N p ( 1 − x L ) N ( 1 − p ) A'(x) = \frac{A_n}{A_0} = (1+xW)^{Np}(1-xL)^{N(1-p)} A(x)=A0An=(1+xW)Np(1xL)N(1p)

此时我们发现,求 A n ( x ) A_n(x) An(x) 最大 和 求 A ′ ( x ) A'(x) A(x) 最大是等价的。因此,我们就可以消除 A 0 A_0 A0了。之后我们再对两边开 N N N次方根,式子变为:

A ′ ′ ( x ) = A ′ ( x ) 1 n = [ ( 1 + x W ) N p ( 1 − x L ) N ( 1 − p ) ] 1 n = ( 1 + x W ) p ( 1 − x L ) ( 1 − p ) A''(x) = A'(x)^{\frac{1}{n}} = [(1+xW)^{Np}(1-xL)^{N(1-p)}]^{\frac{1}{n}} = (1+xW)^{p}(1-xL)^{(1-p)} A′′(x)=A(x)n1=[(1+xW)Np(1xL)N(1p)]n1=(1+xW)p(1xL)(1p)

我们同样发现,求 A ′ ( x ) A'(x) A(x) 最大 和 求 A ′ ′ ( x ) A''(x) A′′(x) 最大也是等价的。因此,这次我们就消除了 N N N 。为了让式子更简单,我们两边再取对数,式子变为:

A ′ ′ ′ ( x ) = ln ⁡ A ′ ′ ( x ) = p ln ⁡ ( 1 + x W ) + ( 1 − p ) ln ⁡ ( 1 − x L ) A'''(x) = \ln A''(x) = p \ln (1+xW) + (1-p) \ln (1-xL) A′′′(x)=lnA′′(x)=pln(1+xW)+(1p)ln(1xL)

同样,求 A ′ ′ ( x ) A''(x) A′′(x) 最大 和 求 A ′ ′ ′ ( x ) A'''(x) A′′′(x) 最大也是等价的。最终,我们将一开始的式子就化简为了对下式求最大值:

A ′ ′ ′ ( x ) = p ln ⁡ ( 1 + x W ) + ( 1 − p ) ln ⁡ ( 1 − x L ) A'''(x) = p \ln (1+xW) + (1-p) \ln (1-xL) A′′′(x)=pln(1+xW)+(1p)ln(1xL)

求最大值嘛,让导数等于0即可。即:

d A ′ ′ ′ ( x ) d x = p W 1 + x W + ( 1 − p ) − L 1 − x L = 0 \frac{d A'''(x)}{dx} = p \frac{W}{1+xW} + (1-p) \frac{-L}{1-xL} = 0 dxdA′′′(x)=p1+xWW+(1p)1xLL=0

到这里就简单多了,我们将 x x x解出来,最终得:

x = p ∗ W − ( 1 − p ) ∗ L W ∗ L x = \frac{p*W - (1-p)*L }{W*L} x=WLpW(1p)L

即,当胜率为 p p p,胜利时收益率为 W W W,失败时亏损率为 L L L时,最佳的投注比例 x = p ∗ W − ( 1 − p ) ∗ L W ∗ L x = \frac{p*W - (1-p)*L }{W*L} x=WLpW(1p)L




参考资料

凯利公式,以及一个横扫股圈的男人 : https://www.bilibili.com/video/BV1sz4y1w7Hj/

凯利公式是啥?(李永乐): https://www.bilibili.com/video/BV1Qt41197GY/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值