关于numpy库的随机漫步*

随机漫步好有诗意的感觉。
什么是随机漫步?
随机游走(random walk)也称随机漫步,随机行走等是指基于过去的表现,无法预测将来的发展步骤和方向。核心概念是指任何无规则行走者所带的守恒量都各自对应着一个扩散运输定律 ,接近于布朗运动,是布朗运动理想的数学状态,现阶段主要应用于互联网链接分析及金融股票市场中。

我们通过模拟随机漫步来说明如何运用数组运算。先来看一个简单的随机漫步的例子:从0开始,步长1和-1出现的概率相等。

下面是一个通过内置的random模块以纯Python的方式实现1000步的随机漫步:

In [247]: import random
   .....: position = 0
   .....: walk = [position]
   .....: steps = 1000
   .....: for i in range(steps):
   .....:     step = 1 if random.randint(0, 1) else -1
   .....:     position += step
   .....:     walk.append(position)
   .....:
In [249]: plt.plot(walk[:100])

下图是根据前100个随机漫步值生成的折线图:


随机漫步折线图

可以看出,这就是100次中各步的累计和,可以用一个数组运算来实现。因此,我们可以用np.random模块一次性随机产生1000个抛硬币的结果(即两个数中任选一个),将其分别设置为1或-1,然后计算累计和:

In [251]: nsteps = 1000
In [252]: draws = np.random.randint(0, 2, size=nsteps)
In [253]: steps = np.where(draws > 0, 1, -1)
In [254]: walk = steps.cumsum()

有了这些数据之后,我们可以沿着漫步路径做一些统计工作了,比如求取最大值和最小值:

In [255]: walk.min()
Out[255]: -3
In [256]: walk.max()
Out[256]: 31

现在来看一个复杂一点的统计任务——首次穿越时间,即随机漫步过程中第一次到达某个特定值的时间。假设我们想要知道随机漫步需要多久才能距离初始0点至少10步远(任一方向均可)。
np.abs(walk)>=10可以得到一个布尔型数组,它表述的是距离是否达到或者超过10,而我们想要知道的是第一个10或-10的索引。可以用argmax来解决这个问题,它返回的是该布尔型数组第一个最大值的索引(因为True是1,False是0,所以True就是最大值):

In [257]: (np.abs(walk) >= 10).argmax()
Out[257]: 37

值得注意的是,这里使用argmax并不是很高效,因为它无论如何都会对数组进行完全扫描。在本例中,只要发现了一个True,那我们就知道它是个最大值了。
??
所以应该如何优化?
遍历循环获得循环次数么?

文章代码引用自:《利用Python进行数据分析·第2版》第4章 NumPy基础:数组和矢量计算
作者:SeanCheney
感谢SeanCheney同意引用。

https://www.jianshu.com/p/3b68d9a360fc

Python量化投资网携手4326手游为资深游戏玩家推荐:《天天象棋下载

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论