w=10
for timestep in range(length):
subSer=Ser[timestep:timestep+w]
mean_i=np.mean(subSer)
vol_i=(np.sum((subSer-mean_i)**2)/len(subSer))**0.5
volList.append(w_i)
def rolling_meansqdiff_loopy(Ser, w):
length = Ser.shape[0]- w + 1
volList= []
for timestep in range(length):
subSer=Ser[timestep:timestep+w]
mean_i=np.mean(subSer)
vol_i=(np.sum((subSer-mean_i)**2)/len(subSer))**0.5
volList.append(vol_i)
return volList
时间安排-
In [223]: Ser = pd.Series(np.random.randint(0,9,(10000)))
In [224]: %timeit rolling_meansqdiff_loopy(Ser, w=10)
1 loops, best of 3: 2.63 s per loop
# @Mad Physicist's vectorized soln
In [225]: %timeit Ser.rolling(10).std(ddof=0)
1000 loops, best of 3: 380 µs per loop
In [226]: %timeit rolling_meansqdiff_numpy(Ser.values, w=10)
1000 loops, best of 3: 393 µs per loop
通常,[金融类]人们会以年化价格变动百分比来表示波动性。
假设你在一个数据框中有每日价格,并且一年中有252个交易日,你可能会想要如下内容:
df.pct_change().rolling(window_size).std()*(252**0.5)
这里有一个新的方法-
样本运行-
运行时测试
迂回的方法-
时间安排-
两种矢量化方法比循环方法快得多!
看起来你在找^{} 。您可以将^{} 计算应用于结果对象:
如果不打算再次使用滚动窗口对象,可以编写一行:
请记住,在这种情况下
ddof=0
是必要的,因为标准差的标准化是通过len(Ser)-ddof
实现的,而ddof
在熊猫中默认为1
。相关问题 更多 >
编程相关推荐