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