在用 python 模拟股价随机游走的时候使用过两种随机方法,在测试的时候都能生成[-10%,10%]之间的数,但是在绘图时就发现 uniform 方法有很大问题,直接看代码。
方法 1-uniform
def random_stock(N=4,size=1000):
arr = []
for j in range(N):
np.random.seed()
init = np.random.randint(5,100)#初始化价格
l = [init]
for i in range(size):
np.random.seed()
l.append(l[-1]*(1+np.random.uniform(-0.1,0.1)))#核心代码
arr.extend(l)
return np.array(arr).reshape(N,-1).T
df = random_stock(4,1000)
data = pd.DataFrame(df,index=pd.date_range(start='2012-1-1',periods=df.shape[0],freq='B'),columns=[s for s in 'ABCDEFGHIJ'[:df.shape[1]]])
方法 2-randn
def random_stock(N=4,size=1000):
arr = []
for j in range(N):
np.random.seed()
init = np.random.randint(5,100)#初始化价格
l = [init]
for i in range(size):
np.random.seed()
l.append(l[-1]*(1+np.random.randn()*0.027))#核心代码
arr.extend(l)
return np.array(arr).reshape(N,-1).T
第二种方法绘图出来是没问题的,但是第一种方法绘图出来见贴图,这个图比较极端,四张图都出现这种情况,但是每次运行 100%会有一张图出现暴涨或暴跌后一蹶不振的情况(暴涨的话会从几十块一路涨到 800 块啊!), 60%概率出现 2 张图出现这种状况,亲吻出现这种状况是什么原因?
1
princelai OP |
2
skydiver 2016-06-03 16:36:14 +08:00
第二种方法绘图出来是什么样子的?
|
4
skydiver 2016-06-03 16:39:10 +08:00
本来均匀分布和正态分布结果就不一样。也可以理解吧。
而且看文档里 Samples are uniformly distributed over the half-open interval [low, high) (includes low, but excludes high) 所以均匀分布的时候实际上是不平衡的,所以更倾向于下跌 |
5
princelai OP @skydiver
``` tmp = np.random.uniform(-0.1,0.1,1000) In [80]: tmp.max() Out[80]: 0.099213124782427387 In [81]: tmp.min() Out[81]: -0.099187629003319552 In [84]: tmp.std() Out[84]: 0.057371789966341694 In [85]: tmp.var() Out[85]: 0.0032915222839420251 In [87]: tmp.sort() In [88]: tmp[499] Out[88]: -0.001321330606845611 ``` 平均分布相比正态分布应该更多的涨停跌停,但事实上,只有跌停没有涨停啊 |
6
Mutoo 2016-06-03 16:53:42 +08:00
把 random.seed() 放在 for 里面本来就不是很好的作法。
|
8
princelai OP @Mutoo 删除 seed 还是一样,运行了 3 次,一共 12 张图,还有 5 张出现一样情况,另一次出现暴涨,从不到 100 块涨到 1200 块了。。。。。
|
10
princelai OP @skydiver 好吧也不纠结了,没想到一个开一个闭影响这么大,还是用正态分布了,也符合股市的分布
|
11
Mutoo 2016-06-03 17:38:28 +08:00
随机的范围是 1+(-0.1, 0.1) => 0.9 ~ 1.1
若考虑只有 0.9 和 1.1 这两个离散的情况,且等概率出现,实验 2n 次,则必然有 1 * (0.9^n) * (1.1^n) < 1 也就是你亏掉 10%,下一次想要回本,必须要赚 11.1%,而不是 10%,因为你本金已经没那么多了。 |
12
Mutoo 2016-06-03 17:48:30 +08:00
这里随机的分布是正常的,问题在于你用的是乘法而不是加法。
|