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

1. 引子

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

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

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

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

2.程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding: utf-8 -*-

import random
import math
import matplotlib.pyplot as plt

TIMES = 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中取随机数r
val = money * p # 计算本次赌资val
if r > 3: # 有70%的可能性r>3
money += val # 赢val元
else:
money -= val # 亏val元
if money <= 0: # 如果输光,则提前出局
money = 0.000001
break
return money / BASE_MONEY # 此次操作的赢亏,>1为赢

for idx in range(0,9):
p = 0.1 * (idx + 1) # 投资比例占总资产的比例为0.1,0.2...0.9
plt.subplot(331+idx) # 设定做图位置
array = []
lose = 0
for i in range(1, 100): # 每个p值试验100次
v = test(p)
if v < 1: # 亏本的次数
lose += 1
array.append(math.log10(v)) # 因数值跨度太大,以10底取对数
print "percent ", p, ", lose ", lose
plt.ylim(-1, 10) # y轴坐标设定为-1到10做图
plt.plot(array)
plt.show()

3.执行结果

(1) 原程序,单次胜算为 70%

pp.png

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) 变化一个参数,将单次胜算设为 50%

p2.png

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) 再变化一个参数,将单次胜算设为 90%

p3.png

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同学,你怎么看?