Appearance
前置基础-从概率角度谈市场中的博弈
前置基础:从概率角度谈市场中的博弈
前言
在这个世界上我们看到的现象大体分为必然现象和随机事件两类。必然现象是指在相同条件下发生时完全可以事先预言其结果的,比如太阳每天必然从东边升起,西边落下。随机事件则是指在个别试验中呈现不确定的结果,但在相同的条件下大量重复试验中又会呈现一定的规律性,比如抛掷一次硬币,可能是正面,也可能是反面,但是不管什么人抛掷,当抛掷的次数逐渐增多时,出现正面或者反面的频率会逐渐接近 50%。
虽然我们不能确定随机事件的结果,但我们可以用一个介于 0 与 1 之间的数值来表示随机事件发生的可能性,这个数值就是概率。股票的涨跌属于随机事件,因此股票交易策略与概率密切相关,比如“动量策略”中当某只股票连续上涨几天后执行买入,在连续下跌几天后执行卖出,策略背后的支撑就是在历史走势统计下,这种“惯性”现象具有概率上的优势。
那么概率在股票量化交易中究竟有多重要?我们又该如何使用概率来进行股票量化交易?本小节首先介绍下在概率中占有非常重要地位的伯努利分布,接着将股市简化成一个博弈的模型,从伯努利分布的视角谈谈如何才能在这场博弈中占据优势。
伯努利分布的特性
伯努利分布也称为二项分布,是统计概率中非常重要的一种离散随机变量分布,也是金融领域中十分常用的随机变量分布。以抛掷硬币为例,抛掷一次硬币就是一次独立的伯努利试验,它只有两种可能的结果,即正面朝上或反面朝上,并且这两种可能的结果是否发生是互相对立的,我们将正面朝上用1表示,概率设为p=50%,反面朝上用0表示,概率设为q=1-50%,因此独立的伯努利分布即为结果为0或1的概率分布。
抛掷n次硬币就是n次独立的伯努利试验,由于每一次抛掷硬币正面朝上或反面朝上发生的概率是保持不变的,与其它各次抛掷硬币的结果无关,所以n次伯努利试验是相互独立的重复试验。我们把在n次伯努利试验中某事件发生的次数X定义为一个随机变量,如果每次试验中某事件发生的概率为p,就称X服从参数为n、p的伯努利分布或者二项分布,记作X~B(n,p)。如果要求得在n次伯努利试验中某事件恰好发生k次的概率,对应的公式为:
解释下这个公式,作为独立发生的事件,假定前k次发生而其余的n-k次不发生的概率为。由于只考虑事件在n次试验中发生k次而无论是在哪k次发生,所以由组合知识可知应有
种不同的方式。 我们仍然以抛掷硬币为例,具体介绍下以上的计算公式。将抛掷硬币正面朝上用1表示、背面朝上用0表示,抛5次硬币可能出现的组合情况有32种,如下所示:
我们计算下抛5次硬币中连续出现5次正面朝上事件的概率:
相信很多人如果在赌场中看到连续开出五次正面之后会决定去押反面,理由可能是因为连续开出五次正面的概率已经很小了,更别说连续开出六次正面。抛5次硬币连续出现正面的概率是2的5次方分之一,也就是1/32(0.03125),确实已经很小了。那上面的这张表格其他组合出现的概率是多少呢?事实上,上面的这张表格抛5次硬币所能出现的32种组合,无论你所抛的结果是哪一个,他们的概率同样都是1/32,也就是说10011出现的概率跟11111是一模一样的。
我们刚才讲到伯努利试验是相互独立的,也就是说每次抛硬币是相互独立的,既然这样前5次抛硬币对于第6次抛硬币的结果是没有任何影响的。当抛硬币次数的增加到一定样品的时候会发现正面和反面出现的概率会无限的接近于50%,这个没错,前提是并不考虑正面和反面在第几次试验中发生,而现在我们是需要考虑正反面出现的顺序的,要知道1100和0011这两种情况正面出现的概率都是50%,但是赌局的结果是完全不一样的。所以说在抛硬币的游戏中,你并不需要知道前几次抛硬币的结果,因为下一次硬币出现正面的概率还是50%,但是随着次数的积累,每次都能顺利猜中的概率会变得越来越低,这也是赌场从来不怕你赢钱,就怕你赢了钱不来的原因。
我们把5次抛硬币试验映射为5次股票交易,将股票上涨定义为1,股票下跌定义为0,由于A股市场中上涨才能获利,那么11100表示在这5次交易中,有3次成功2次失败,有人会吹嘘道:“我的交易策略胜率达到了60%!” 其实不然,实际上策略的胜率只有50%而已,因为随着交易次数的增加,失败的概率会越来越高,最终会趋于50%,这也是为什么很多短期看似高胜率的策略到最后会失败的原因所在。
概率在市场中的应用
通常我们在下单买卖股票的时候需要设定价格和数量,选择买的原因是认为股票会涨,相反选择卖的原因是认为股票会跌,我们作出买卖方向以及买卖数量的决策其实是基于一个预期涨跌的概率,当你认为这个股票一定会涨的时候肯定会加大仓位多买点,相反如果认为这个股票会跌就会选择空仓。当然在这个市场上也存在很多以投硬币方式盲目买卖股票的人。那么我们为了说明概率与盈亏、仓位以及策略彼此之间的联系,我们将复杂的股市简化成一个博弈的案例模型,从概率的角度谈谈伯努利分布在金融市场博弈中所起的作用。
需要说明下的是,建议感兴趣的同学在学习完基础内容后再调试此部分例程的代码,本小节仅是通过例程说明概率的作用,代码详解部分可参考《基于凯利公式的仓位管理》或后续的基础专栏。
假设我们投资的市场并不是一个处于牛市或熊市大趋势下的市场,而是一个具有涨跌随机波动特征的短线交易市场,可以不分昼夜的不停交易,而且还不需要交手续费。我们的初始资金是1000元,每次用1%的仓位随机买9个股票,如果有一半以上的股票涨了的话,我们暂定赚一倍仓位投入的钱,否则一半以上的股票跌了,仓位投入的钱就全部亏损,也就是赔率1赔1。市场模型代码如下所示:
#创建简易的市场模型
def simpmarket(win_rate, play_cnt=1000, stock_num=9, position=0.01, commission=0.01, lever=False):
my_money = np.zeros(play_cnt)
my_money[0] = 1000 #初始资金
once_chip = my_money[0]*position #初始仓位
lose_count = 1
binomial = np.random.binomial(stock_num, win_rate, play_cnt) #伯努利分布
for i in range(1, play_cnt):
if binomial[i] > stock_num//2:
my_money[i] = my_money[i-1] + once_chip if lever == False else my_money[i-1] + once_chip*lose_count
lose_count = 1
else:
my_money[i] = my_money[i-1] - once_chip if lever == False else my_money[i-1] - once_chip*lose_count
lose_count += 1
my_money[i] -= commission
if my_money[i] <= 0:
break
return my_money
由于股价涨跌被认为是无法预测,那么赢钱的概率为50%。我们邀请50人(trader
)参与1000局看下资金变化曲线及最终亏盈资金直方图,如下所示:
#概率50% 无手续费 参加1000次
_ = [plt.plot(np.arange(1000), simpmarket(0.5, play_cnt=1000, stock_num=9, commission = 0),alpha=0.6) \
for _ in np.arange(0,trader)]
_ = plt.hist([simpmarket(0.5, play_cnt=1000, stock_num=9, commission = 0)[-1] \
for _ in np.arange(0, trader)], bins=30)
注:资金变化曲线的横坐标为参与的局数,总共为1000局。纵坐标为资金的变化情况,初始资金为1000元,最高的获利资金达到了1800元,最少的亏损资金则少于400元。
注:最终亏盈资金直方图的横坐标为剩余资金的分布情况,纵坐标为分布的剩余资金所对应的人数。
从图形上看亏钱的人和赚钱的人基本一半一半,符合零和游戏中有人赚钱就有人亏钱的特征。不过市场要经营是需要有收入的,券商要收一定比例的佣金、国家会收印花税作为税收收入、上海交易所会收过户费,这也是为什么他们总希望大家频繁交易的原因。也许有同学会说与交易资金相比手续费才几个钱,几乎可以忽略不计的,但是这些同学没考虑到随着交易次数的不断增加手续费的影响就会体现出来了。为了更直观的比较出手续费对交易的影响,我们假定每次交易的手续费为0.01元,这次我们邀请50个人参与500000局看下资金变化曲线及最终亏盈资金直方图,如下所示:
#概率50% 手续费0.01 参加500000次
_ = [plt.plot(np.arange(500000), simpmarket(0.5, play_cnt=500000, stock_num=9, commission = 0.01),alpha=0.6) \
for _ in np.arange(0,trader)]
_ = plt.hist([simpmarket(0.5, play_cnt=500000, stock_num=9, commission = 0.01)[-1]
for _ in np.arange(0, trader)], bins=30)
从图形上可知,零和游戏很不幸变成了负和游戏,大多数人最后是血本无归的,只有零星几个人目前还是赚钱,但是随着交易次数的进一步增大最后的结局一定是血本无归。市场是一定会有手续费的,那我们就这么心甘情愿的当韭菜吗?韭菜需要制定交易策略来逆袭一下才行! 我们利用前面讲的统计概率学知识来制定一个逆袭策略,我们知道伯努利分布中单次买一只股票涨和跌的概率是独立的,无论买了多少次股票,下一次股票涨的概率还是50%,那么只要人生不是太背总会碰到涨的时候。所以出现一半股票跌就继续买,越跌越买,同时加大每一次下注的仓位,加大的倍数一定要超过赔率,否则最后能挣到钱是不足以弥补之前亏损的。比如:
第一次下注100元,一半股票跌,亏损100。
第二次,下注300元,一半股票跌,亏损300。
第三次,下注900元,一半股票跌,亏损900。
第四次,下注2700元,一半股票跌,亏损2700。
第五次,下注8100元,一半股票涨,盈利8100,扣除之前亏损的一共4000元,还挣了4100。
我们假定每亏损一次,下一次就加注一倍筹码,我们邀请50个人参与1000局看下资金变化曲线及最终亏盈资金直方图,如下所示:
#概率50% 无手续费 参加1000次 始能加注
_ = [plt.plot(np.arange(1000), simpmarket(0.5, play_cnt=1000, stock_num=9, commission=0, lever=True),alpha=0.6) \
for _ in np.arange(0,trader)]
_ = plt.hist([simpmarket(0.5, play_cnt=1000, stock_num=9, commission = 0, lever=True)[-1] \
for _ in np.arange(0, trader)], bins=30)
虽然理论上采用这个名叫“一条路走到黑”的策略,做个坚定的死多头的同时通过不断加码下注是可行的,算是利用概率取胜的一个很好的办法,但是从模拟的情况来看仍然有很大一部分交易者血本无归,原因很简单你得保证有足够用的本金才行,当市场出现黑天鹅事件的时候连续10几次都出现一半以下股票跌也不是没有可能。对于大多数散户来说,并没有足够多的可以随意使用的本金,另外在短线交易中,资金量到达一定程度之后,短线就已经没有办法做了。
看来如果我们想盈利的话就只能期待在每局上涨的概率大于50%时才参与,当上涨的概率小于50%就选择不参与,那样就不会亏钱了。但是我们立足这个市场的目的并不是为了不亏钱,而是为了在风险最小的前提下将利润最大化,于是我们加入仓位管理因子来制定另一个逆袭的策略。虽然仓位管理本身无法提高概率,但是可以帮助我们平滑收益曲线和稳定性,否则每次全仓买入,即使概率再高碰到一次下跌也会血本无归。市场模型代码如下所示:
#创建简易的市场模型应用仓位管理
def positmanage(play_cnt=1000, stock_num=9, commission=0.01):
my_money = np.zeros(play_cnt)
my_money[0] = 1000
for i in range(1, play_cnt):
win_rate = np.random.random(size=1)#生成[0,1)之间的浮点数
binomial = np.random.binomial(stock_num, win_rate, 1)
once_chip = my_money[0] * win_rate * 0.1
if binomial > stock_num//2:
my_money[i] = my_money[i-1] + once_chip
else:
my_money[i] = my_money[i-1] - once_chip
my_money[i] -= commission
if my_money[i] <= 0:
break
return my_money
我们改变概率这个因子,并且将每局仓位比例与概率相关联,上涨概率大时投入的仓位也大,反之上涨概率小时投入的仓位也小,这样就能保证每局赢的钱要比亏的钱多,我们邀请50个人参与1000局看下资金变化曲线及最终亏盈资金直方图,如下所示:
#仓位管理 手续费0.01 参加1000次
_ = [plt.plot(np.arange(1000), positmanage(play_cnt=1000, stock_num=9, commission=0.01),alpha=0.6) \
for _ in np.arange(0,trader)]
_ = plt.hist([positmanage(play_cnt=1000, stock_num=9, commission = 0)[-1] \
for _ in np.arange(0, trader)], bins=30)
从图形上可知,结果是每个人都能盈利,这个策略让我们逆袭成功!其实这些个例程映射到量化交易之中就是一次策略的回测,在上涨概率大时增加仓位下注,在上涨概率小时减少仓位下注或者干脆不玩了,赢钱的时候多赢点,亏钱的时候少亏点,这样就可以在市场中风险可控的前提下获得最大的收益,这也就是量化交易管理概率带来的优势。
总结
本小节笔者将复杂的股市简化成一个具有博弈特性的市场模型,介绍了为什么在没有概率优势的前提下参与交易会亏钱,也从概率的角度介绍了如何利用伯努利分布在金融市场博弈中占据优势。其实股票交易和玩一个游戏、做一个项目理念上是相通的,需要章法、需要制定策略,否则就和抛硬币赌博一样的,用量化交易可以帮助我们管理好概率,更理性的去下单!
最后,给大家留一道思考题:
在实际股票交易中我们可以通过回测、度量等方法去评估股票上涨的概率,那么中长线交易与短线、超短线交易相比,在获利概率上哪种更高呢?大家是怎么看待这两类交易的?
欢迎大家在留言区留言,和我一起讨论。