Python股票处理之八_大数定律

来源:互联网 发布:keepalive mysql 主 编辑:程序博客网 时间:2024/05/17 01:24

 1. 引子

       有一天,我看见一个预测日涨跌的程序,成功率在百分之七十几,于是分享给X同学。结果人家说“70%多,这准确率高么?瞎蒙的准确率也有50%”

       这准确率高么?只靠对技术形态的判断,好像也还行吧?如果有70%的正确率,到底怎么做赢的机会比较大?达到多少百分比,才能够满意?

       今天看《程序员的数学2:概率统计》中有一道类似的习题:设结果甲出现概率为0.7,结果乙出现概述为0.3,且不论甲还是乙,只要猜中,就能获得下注的金额,显然选择甲是明智的做法。假设你每天都会参与这场赌博,你会将占总资产比例p的金额投给甲,p在整个过程中保持不变,请问应该如何设定p值?(我把该题简化了,大概是这个意思)

       如果只考虑一天,显然把所有资产都投给甲p=1是最佳选择,然而不断重复赌局时,总会出现没有中奖而失去所有财产的情况。下面写一个程序模拟这一情况:

 

2. 程序

 

# -*- coding: utf-8 -*-import randomimport mathimport matplotlib.pyplot as pltTIMES = 50# 赌博总数50次BASE_MONEY=100# 本金100元def test(p):# p是赌资占资产的比例,在0-1之间money = BASE_MONEY# 当前资产for i in range(1,TIMES):r = random.randint(1,10)# 在1-10中取随机数rval = money * p# 计算本次赌资valif r > 3:# 有70%的可能性r>3money += val# 赢val元else:money -= val# 亏val元if money <= 0:# 如果输光,则提前出局money = 0.000001 breakreturn money / BASE_MONEY# 此次操作的赢亏,>1为赢for idx in range(0,9):p = 0.1 * (idx + 1)# 投资比例占总资产的比例为0.1,0.2...0.9plt.subplot(331+idx)# 设定做图位置array = []lose = 0for i in range(1, 100):# 每个p值试验100次v = test(p)if v < 1:# 亏本的次数lose += 1array.append(math.log10(v))# 因数值跨度太大,以10底取对数print "percent ", p, ", lose ", loseplt.ylim(-1, 10)# y轴坐标设定为-1到10做图plt.plot(array)plt.show()


 

3. 执行结果

 (1) 原程序,p=70%


percent 0.1 , lose  1

percent 0.2 , lose  1

percent 0.3 , lose  5

percent 0.4 , lose  6

percent 0.5 , lose  12

percent 0.6 , lose  30

percent 0.7 , lose  59

percent 0.8 , lose  64

percent 0.9 , lose  86

(每次运行结果稍有差别,但差别不大)

从结果可以看出,如果用少量的比例投资,亏的机会很小,但挣大钱的机会也小。同时投入资金比例超过0.7之后,亏本的可能性50%以上。尽管单次胜算是70%(独立同分布)。从图上看,合理的配置是资产的0.4-0.5左右。

 (2) 变化一个参数,p=50%


percent 0.1 , lose  66

percent 0.2 , lose  72

percent 0.3 , lose  89

percent 0.4 , lose  94

percent 0.5 , lose  97

percent 0.6 , lose  98

percent 0.7 , lose  98

percent 0.8 , lose  99

percent 0.9 , lose  99

可见,如果单次正确率为50%,即瞎蒙,即使只投入全部资产的0.1,也会亏本,如果配置到资产的0.4以上,从图上看,基本就是血本无归了。合理的选择是别参与。

 

(3) 再变化一个参数,p=90%


percent  0.1 , lose  0

percent 0.2 , lose  0

percent 0.3 , lose  0

percent 0.4 , lose  0

percent 0.5 , lose  0

percent 0.6 , lose  0

percent 0.7 , lose  0

percent 0.8 , lose  0

percent 0.9 , lose  0

把单次正确率设为90%时,几乎没有亏本的可能性,投入越多,挣得越多,但是从图中可见,投入0.9以上时也不是明智的选择。从图上看,合理的选择是0.7-0.8。

 

4. 分析

在这种利滚利的环境下,单次胜算越大,越应该果断投入;反之,保证不了正确率千万别碰。与事先想象不同的是:

(1) 如果胜算在50%左右,多次操作,结果并不是胜负各半,而是血本无归。

(2) 根据胜算比例,可计算出最适合的资产配置比例。

(3) 操作一次,结果是随机的,操作N多次,大量随机结果的平均值(以及分布)却相对恒定,这就是传说中的“大数定律”。因此,即使有较大胜算,也需要多次操作才能体现出来(即不怕一万,只怕万一)

 

5. 联想

比如买股票,我们可以选择某个胜算较高(胜算比例可从历史数据中算出)的技术形态,然后计算出合适的资产配置比例(见上例),按这个比例多次地买卖。在N次操作之后,收益范围基本是确定的。这个假设可以用历史的股票数据测试,我还没试过,就是随便一想,呵呵。

如果这个假设成立,在单次胜算90%的情况下,怎么买基本都是赚钱的,只是赚多赚少的问题,在单次胜算70%的情况下,也能找到一个利益和风险的最佳平衡点。X同学,你怎么看?