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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大数定律(Law of Large Numbers)是概率论中的一条重要定理,它指出在独立同分布的随机变量序列中,随着样本数量的增加,样本平均值的稳定性逐渐增强,趋于真实参数的期望值。 在Python中,我们可以通过模拟实验来验证大数定律。下面是一个简单的示例代码: ```python import random import matplotlib.pyplot as plt def law_of_large_numbers(num_samples): sample_means = [] cumulative_sum = 0 for i in range(num_samples): # 模拟抛硬币,1表示正面,0表示反面 coin_flip = random.randint(0, 1) cumulative_sum += coin_flip sample_mean = cumulative_sum / (i + 1) sample_means.append(sample_mean) # 绘制样本平均值随样本数量增加的变化图 plt.plot(range(1, num_samples + 1), sample_means) plt.axhline(y=0.5, color='r', linestyle='--', label='Expected value') plt.xlabel('Number of samples') plt.ylabel('Sample mean') plt.legend() plt.show() # 测试代码 law_of_large_numbers(1000) ``` 这段代码模拟了进行1000次抛硬币实验,并计算每次实验的样本平均值。最后绘制了样本平均值随着样本数量增加的变化图,同时绘制了期望值0.5的参考线。根据大数定律,随着抛硬币次数的增加,样本平均值会逐渐接近0.5。 当你运行这段代码时,你会看到样本平均值的变化趋势。注意,由于每次实验的结果是随机的,你可能会观察到不同的结果,但总体上样本平均值会逐渐接近0.5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值