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

1. 引子

有一天,我看见一个预测日涨跌的程序,成功率在百分之七十几,于是分享给X同学。结果人家说“70%多,这准确率高么?瞎蒙的准确率也有50%”
这准确率高么?只靠对技术形态的判断,好像也还行吧?如果有70%的正确率,到底怎么做赢的机会比较大?达到多少百分比,才能够满意?
看《程序员的数学2:概率统计》中有一道类似的习题:设结果甲出现概率为0.7,结果乙出现概述为0.3,且不论甲还是乙,只要猜中,就能获得下注同等的金额,猜不中则输掉赌资。显然选择甲是明智的做法。假设你每天都会参与这场赌博,你会将占总资产比例p的金额投给甲,p在整个过程中保持不变,请问应该如何设定p值?(我把该题简化了,大概是这个意思)
如果只考虑一天,显然把所有资产都投给甲p=1是最佳选择,然而不断重复赌局时,总会出现没有中奖而失去所有财产的情况。下面写一个程序模拟这个赌局:

2.程序

# -*- 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%

Python股票处理之八_大数定律_第1张图片
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%

Python股票处理之八_大数定律_第2张图片
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%

Python股票处理之八_大数定律_第3张图片
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同学,你怎么看?

你可能感兴趣的:(Python股票处理之八_大数定律)