掘金社区

仓位管理(1): 鞅与反鞅策略,凯利公司及其局限Pinned highlighted

掘金小Q 【 论坛管理员 】 发表在策略研究 2018-07-16 11:05:26

策略研究
2567
1
0

鞅策略与反鞅策略

介绍

在我们去进行股票,期货投资的时候,经常听到有人说到金字塔加仓法,当亏损的时候,每次亏损都加大我们的仓位到原来的总仓位的两倍,这样,一方面可以摊薄我们的平仓持仓成本,另一方面,当行情反转的时候,

我们就更容易回本,甚至收回收益;而当盈利的时候,我们去增加仓位就需要小心,可以每次增加仓位为原来的 1/2,因为股价高的时候,它回落起来也更容易,因此,我们以比较小的仓位去进行加仓,可以避免我们的持仓成本太高。

乍一听,是这么一回事,而且不少我们投资者也会采用这样的办法去应对自己的投资策略。但是,这样做是否合理,能不能从数学,从数据模拟上针对我们这样的投资策略去进行一个合理的分析呢?

这里,笔者试图以掷硬币为例,来介绍鞅与反鞅策略。对于掷硬币,这里做一个假定,假如正面为赢,反面为输,赢的话,可以得到多一枚硬币,输的话,付出的硬币就此输去。

鞅策略

有一种投注方法,当我们每次输了的时候,那么我们下次就加倍投注,譬如,第一次如果投入一枚硬币,那么下一次我们就投入两枚硬币,赢了的话,我们不仅可以将输了的一枚硬币成本覆盖,还能多赚一枚;如果还是输的话,那么下次我们投注 4 枚硬币,赢了的话,不仅可以覆盖我们付出的 3 枚硬币,还能多赚一枚硬币;以这 样的策略一直往下,如果能赢,我们总是能多赢一枚硬币。

但是,这样的策略隐含了一个假设,那就是它默认我们的资金是无限的,当连续输的情况出现的时候,是否还坚持这样的策略,哪怕我们仍然想坚持,但是本金可能不足够了。譬如,假设我们有 100 枚初始硬币,经过这样的 掷硬币赌博,如果出现连续 7

次皆负的情况,我们的本金就全部输掉了。

也许你会认为,连续 7 次硬币都出现反面概率不大,但是,当我们参与这样的赌博次数足够多的时候,连续 7 次 或更多次硬币出现的概率会变得非常大,譬如,掷一百次硬币实验中,连续 7 次或更多次出现反面的概率是

0_1531708794664_01.jpg

当连续掷硬币次数变得足够多的时候,譬如 1000 次,这个概率就会变得非常大,简单起见,这里笔者直接利用计算机模拟,连续进行 100 次这样的掷 1000 次硬币实验,看连续出现 7 次或以上硬币为正面概率多大

  • 测试代码

    import numpy as np
    np.random.seed(1234)
    j = 0
    for i in range(1000):
        results = np.random.randint(0, 2, 1000)
        for i in range(1000-7):
            if np.all(results[i: i+7] == np.array([1, 1, 1, 1, 1, 1, 1])):
                # print(i)
                j = j+1
                break
    print(j)
    
  • 实际输出为 990,也就是说,测试 1000 次,出现连续 7 次正面或以上的次数有990次,也就说说破产概率有 0.99,这样的概率, 一般人估计都承受不了。

反鞅策略

有一种叫反鞅策略的投注方法,在赢的时候,适当加注,在输的时候,则适当减注,譬如,无论盈亏,每次下注都是目前总金额的 1%, 这样,当盈利的时候,我们加注总金额的 1%,相应的加注比初始加注要更多,而当亏损的时候,我们加注的金额也相比初始金额要小,那么,这样去投注效果会如何呢?下面的代码试着用 1% 的风险 度进行 1000 次掷硬币赌博,初始资金为 100元。

init_risk_list = [0.01]
risk_ratio = 1.0
init_cash = 100
gamble_counter = 1000
for init_risk in init_risk_list:
    final_risk = init_risk
    final_cash = init_cash
    for i in range(gamble_counter):
        # print(i, risk_ratio, final_cash)
        if final_cash <= 0:
            # 假如赌博后资金输光,退出循环
            print("风险度为 %f,第 %d 次赌博,输光所有" %(init_risk, i))
            break
        if np.random.randint(0, 2, 1) == 1:
            # 赌博赢了,资金变动
            final_cash = final_cash + final_cash * final_risk * 1.25
            # 如果掷硬币赢了,风险度为初始风险度
            final_risk = init_risk
        else:
            # 赌博输了,资金变动
            final_cash = final_cash - final_cash * final_risk
            # 如果掷硬币输了,风险度为之前的风险度乘以风险倍率
            final_risk = final_risk * risk_ratio
    if final_cash > 0:
        print("风险度为 %f, 最终资金为 %f"%(init_risk, final_cash))

实验结束后,笔者这里最后得到的资金是 702.9877 元, 感兴趣的读者可以自己去尝试一下。多次尝试的结果不同,但是一般而言,都是正收益。

不同风险度,鞅策略与反鞅策略的威力比较

为了更近一步说明鞅与反鞅策略的威力,这里做一个实验,假设有 11 个赌博者,他们对于风险偏好不同,第一个投资者比较谨慎,他能容忍的风险度为 1%, 第二个为 2%, 第三个为 3%, 第四个为 4%, 第五个为 5%, 第六个为 10%, 第七个为 15%, 第八个为 20%, 第九个为 30%, 第十个为 40%, 第十一个为 50%, 这样的赌博者参与掷硬币赌博, 如果说赢了,他们可以收获 1.25 元,如果输了,他们付出的硬币就此失去,那么,经过 100 次这样的赌博,利用两种不同的赌博策略,他们最终收益如何,对应的风险度如何变化,笔者这里利用代码进行了一些实验,代码与结果如下:

  • 针对鞅策略,不同风险度,经过 1000 次赌博,代码与结果:

    # 初始资金
    init_cash = 100.0
    # 赌博后资金
    final_cash = init_cash
    # 初始风险
    init_risk_list = [0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5]
    # 风险倍率
    risk_ratio = 2.0
    # 赌博次数
    gamble_counter = 1000
    for init_risk in init_risk_list:
        final_risk = init_risk
        final_cash = init_cash
        for i in range(gamble_counter):
            # print(i, risk_ratio, final_cash)
            if final_cash <= 0:
                # 假如赌博后资金输光,退出循环
                print("风险度为 %f,第 %d 次赌博,输光所有" %(init_risk, i))
                break
            if np.random.randint(0, 2, 1) == 1:
                # 赌博赢了,资金变动
                final_cash = final_cash + final_cash * final_risk * 1.25
                # 如果掷硬币赢了,风险度为初始风险度
                final_risk = init_risk
            else:
                # 赌博输了,资金变动
                final_cash = final_cash - final_cash * final_risk
                # 如果掷硬币输了,风险度为之前的风险度乘以风险倍率
                final_risk = final_risk * risk_ratio
        if final_cash > 0:
            print("风险度为 %f, 最终风险度为 %f, 最终资金为 %f"%(init_risk, final_risk, final_cash))
    

0_1531709473318_06.jpg

  • 反鞅策略,风险倍率设为 1.0,不同风险度对应的情况

    # 初始资金
    init_cash = 100.0
    # 赌博后资金
    final_cash = init_cash
    # 初始风险
    init_risk_list = [0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5]
    # 风险倍率
    risk_ratio = 1.0
    # 赌博次数
    gamble_counter = 1000
    for init_risk in init_risk_list:
        final_risk = init_risk
        final_cash = init_cash
        for i in range(gamble_counter):
            # print(i, risk_ratio, final_cash)
            if final_cash <= 0:
                # 假如赌博后资金输光,退出循环
                print("风险度为 %f,第 %d 次赌博,输光所有" %(init_risk, i))
                break
            if np.random.randint(0, 2, 1) == 1:
                # 赌博赢了,资金变动
                final_cash = final_cash + final_cash * final_risk * 1.25
                # 如果掷硬币赢了,风险度为初始风险度
                final_risk = init_risk
            else:
                # 赌博输了,资金变动
                final_cash = final_cash - final_cash * final_risk
                # 如果掷硬币输了,风险度为之前的风险度乘以风险倍率
                final_risk = final_risk * risk_ratio
        if final_cash > 0:
            print("风险度为 %f, 最终风险度为 %f, 最终资金为 %f"%(init_risk, final_risk, final_cash))
    

0_1531709559697_09.jpg

凯利公式

从上面关于鞅与反鞅策略的比较我们可以发现,控制好风险,对应每次投入仓位的控制,对于我们最终的收益影响非常巨大,但是,我们也发现,风险小的话,对应的收益却往往不如风险比较大的投资策略。那么,有没有一种在风险和收益之间平衡的投资策略呢?

其实是有的,一个比较著名的理论上最佳投注比例公式,叫做凯利公式,可以作为我们投资下注的一个参考方式,笔者这里再次赘言,对凯利公式进行简要介绍。

假设有一个赌局,每投入 1,有 p 的概率获得额外正收益W ,有 q=1-p的概率获得额外负收益-L, 每次投入比例为 x, 收益为 f(x),

目标是期望收益最大化。

0_1531709947653_67.jpg

因此,当我们知道了赔率,胜率,完全可以利用凯利公式对我们的投资进行指导,去获得更多的收益。譬如,读者可能已经发现了,在我们采用反鞅策略去进行赌博的时候,一开始风险加大的时候,收益变多;但是超过某个阈值的时候,很容易就破产,这里,我们采用凯利公式计算一下,在我们之前举例的情况下,投注最佳比例是多少?

在示例中,掷硬币,每猜对一次的概率都是 0.5, 猜对了赢得 1.25 元,输了就投入全部没有,因此,我们有 $b=\frac{W}{L} = \frac{1.25}{1} = 1.25$, $p, q$ 均为 0.5, $L=1$, 因此 $x=(1.25*0.5 - 0.5)/1.25/1=0.1$,

从我们实验的结果可以看到,确实,当风险度为 0.1 的时候,收入最多,与我们之前实验结果相符。

讨论

知道了凯利公式,也许会有读者会想到,通过凯利公式,完全可以指导我们去做投资,譬如,股票市场,和赌博差异也不算很大,甚至有人说,股票市场就是一个大赌场。但是,当读者真的想套用凯利公式的时候,会发现有很大的困难,困难来自于投资的胜率和赔率的不确定性。

当我们去投资某支股票的时候,是赚是亏,赚多少,亏多少,并没有一个确定的值,一个耗时耗力的做法是去做仿真交易或者小资金去投资,根据一段时间后统计投资成功率的结果来决定之后投资比例。但是,一方面这样的做法相当耗时,另一方面,不同时期,股票市场风格差异,按照彼时投资结果去作为此时投资结果的参考,彼时投资结果是否能正确反应当前市场的风格,可能我们心里要打一个问号了。那这时候可能读者就会问,那我们去了解凯利公式有什么用呢?此时,程序化交易的优势也就体现出来了。

当我们的投资理念确定好之后,用代码将其建模并回测,完全可以在历史的不同时间段内进行回测,得到不同市场风格下,策略的胜率和赔率情况,之后,当确定回测结果没有其他问题的时候,我们就可以按照最佳的投资比例去控制我们利用该策略去投资股票市场的仓位,以期得到最佳的回报。

即便如此,直接套用凯利公式,可能依然是不合适的,在任何时候,我们都需要将风险的意识放在最前面,风险占据的权重可能在我们投资决策中,占据的比例比收益更大,以比较小的风险作为投资决策,可能会更合适。凯利公式考虑的是理论上的胜率赔率,实际情况可能会更差,当考虑到手续费,滑点,回测与实盘其他差异后,实际情况后比回测差基本上是百分百的,因此,我们是不是应该用相比凯利公司更小的风险度作为我们投资的比例呢?如何去确定这样的风险度,篇幅限制,如果读者感兴趣,请积极留言,笔者会在之后的公众号中加入其他仓位管理方法的介绍。

最后,强烈推荐在参考书目中提到的书籍,如果读者有时间,有兴趣,强烈推荐大家去仔细研读参考书籍,对于风险控制,仓位管理,作者给了很好的介绍。另外,海龟交易法的仓位管理,读者如果阅读了本文再去看它的仓位管理方式,也许会有更大的收获。

参考

《资金管理方法及其应用》 -- 安德烈 昂格尔

作者: 胡琛 (南京师范大学理论物理博士)

相关阅读:
《仓位管理(2): 凯利公式指导投资与多种资金管理方式》

评论: 1

Looks like your connection to 掘金量化社区 - 量化交易者的策略交流学习社区 was lost, please wait while we try to reconnect.