python_移动窗口函数

38 篇文章 2 订阅

python_移动窗口函数

Moving Window Functions
# 11.7 移动窗⼝函数
# 在移动窗⼝(可以带有指数衰减权数)上计算的各种统计函数也
# 是⼀类常⻅于时间序列的数组变换。这样可以圆滑噪⾳数据或断
# 裂数据。我将它们称为移动窗⼝函数(moving window
# function),其中还包括那些窗⼝不定⻓的函数(如指数加权移
# 动平均)。跟其他统计函数⼀样,移动窗⼝函数也会⾃动排除缺
# 失值。
# 开始之前,我们加载⼀些时间序列数据,将其重采样为⼯作⽇频
# 率:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
close_px_all = pd.read_csv('examples/stock_px_2.csv',
                           parse_dates=True, index_col=0)
close_px = close_px_all[['AAPL', 'MSFT', 'XOM']]
close_px = close_px.resample('B').ffill()
# 现在引⼊rolling运算符,它与resample和groupby很像。可以在
# TimeSeries或DataFrame以及⼀个window(表示期数,⻅图11-
# 4)上调⽤它:
close_px.AAPL.plot()
close_px.AAPL.rolling(250).mean().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1557c8bcef0>

plt
plt.figure()
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
# 表达式rolling(250)与groupby很像,但不是对其进⾏分组、创建
# ⼀个按照250天分组的滑动窗⼝对象。然后,我们就得到了苹果
# 公司股价的250天的移动窗⼝。
# 默认情况下,诸如rolling_mean这样的函数需要指定数量的⾮NA
# 观测值。可以修改该⾏为以解决缺失数据的问题。其实,在时间
# 序列开始处尚不⾜窗⼝期的那些数据就是个特例(⻅图11-5):
appl_std250 = close_px.AAPL.rolling(250, min_periods=10).std()
appl_std250[5:12]
appl_std250.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1557c9ae0f0>

# 要计算扩展窗⼝平均(expanding window mean),可以使⽤
# expanding⽽不是rolling。“扩展”意味着,从时间序列的起始处开
# 始窗⼝,增加窗⼝直到它超过所有的序列。apple_std250时间序
# 列的扩展窗⼝平均如下所示:
expanding_mean = appl_std250.expanding().mean()
plt.figure()
# 对DataFrame调⽤rolling_mean(以及与之类似的函数)会将转
# 换应⽤到所有的列上(⻅图11-6):
close_px.rolling(60).mean().plot(logy=True)
<matplotlib.axes._subplots.AxesSubplot at 0x16dee0be7f0>

close_px.rolling('20D').mean()
Exponentially Weighted Functions
plt.figure()
指数加权函数
# 另⼀种使⽤固定⼤⼩窗⼝及相等权数观测值的办法是,定义⼀个
# 衰减因⼦(decay factor)常量,以便使近期的观测值拥有更⼤
# 的权数。衰减因⼦的定义⽅式有很多,⽐较流⾏的是使⽤时间间
# 隔(span),它可以使结果兼容于窗⼝⼤⼩等于时间间隔的简单
# 移动窗⼝(simple moving window)函数。
# 由于指数加权统计会赋予近期的观测值更⼤的权数,因此相对于
# 等权统计,它能“适应”更快的变化。
# 除了rolling和expanding,pandas还有ewm运算符。下⾯这个例
# ⼦对⽐了苹果公司股价的60⽇移动平均和span=60的指数加权移
# 动平均(如图11-7所示):
# 指数加权函数
# 另⼀种使⽤固定⼤⼩窗⼝及相等权数观测值的办法是,定义⼀个
# 衰减因⼦(decay factor)常量,以便使近期的观测值拥有更⼤
# 的权数。衰减因⼦的定义⽅式有很多,⽐较流⾏的是使⽤时间间
# 隔(span),它可以使结果兼容于窗⼝⼤⼩等于时间间隔的简单
# 移动窗⼝(simple moving window)函数。
# 由于指数加权统计会赋予近期的观测值更⼤的权数,因此相对于
# 等权统计,它能“适应”更快的变化。
# 除了rolling和expanding,pandas还有ewm运算符。下⾯这个例
# ⼦对⽐了苹果公司股价的60⽇移动平均和span=60的指数加权移
# 动平均(如图11-7所示):
aapl_px = close_px.AAPL['2006':'2007']
ma60 = aapl_px.rolling(30, min_periods=20).mean()
ewma60 = aapl_px.ewm(span=30).mean()
ma60.plot(style='k--', label='Simple MA')
ewma60.plot(style='k-', label='EW MA')
plt.legend()
<matplotlib.legend.Legend at 0x1557da34ba8>

Binary Moving Window Functions
⼆元移动窗⼝函数
# 有些统计运算(如相关系数和协⽅差)需要在两个时间序列上执
# ⾏。例如,⾦融分析师常常对某只股票对某个参考指数(如标准
# 普尔500指数)的相关系数感兴趣。要进⾏说明,我们先计算我
# 们感兴趣的时间序列的百分数变化:
# ⼆元移动窗⼝函数
# 有些统计运算(如相关系数和协⽅差)需要在两个时间序列上执
# ⾏。例如,⾦融分析师常常对某只股票对某个参考指数(如标准
# 普尔500指数)的相关系数感兴趣。要进⾏说明,我们先计算我
# 们感兴趣的时间序列的百分数变化:
plt.figure()
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
spx_px = close_px_all['SPX']
spx_rets = spx_px.pct_change()
returns = close_px.pct_change()
# 调⽤rolling之后,corr聚合函数开始计算与spx_rets滚动相关系数
corr = returns.AAPL.rolling(125, min_periods=100).corr(spx_rets)
corr.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1557dbac550>

plt.figure()
假设你想要⼀次性计算多只股票与标准普尔500指数的相关系
# 数。虽然编写⼀个循环并新建⼀个DataFrame不是什么难事,但
# ⽐较啰嗦。其实,只需传⼊⼀个TimeSeries和⼀个DataFrame,
# rolling_corr就会⾃动计算TimeSeries(本例中就是spx_rets)与
# DataFrame各列的相关系数。结果如图11-9所示:
# 假设你想要⼀次性计算多只股票与标准普尔500指数的相关系
# 数。虽然编写⼀个循环并新建⼀个DataFrame不是什么难事,但
# ⽐较啰嗦。其实,只需传⼊⼀个TimeSeries和⼀个DataFrame,
# rolling_corr就会⾃动计算TimeSeries(本例中就是spx_rets)与
# DataFrame各列的相关系数。结果如图11-9所示:
corr = returns.rolling(125, min_periods=100).corr(spx_rets)
corr.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1557dc7e898>

User-Defined Moving Window Functions
plt.figure()
⽤户定义的移动窗⼝函数
# rolling_apply函数使你能够在移动窗⼝上应⽤⾃⼰设计的数组函
# 数。唯⼀要求的就是:该函数要能从数组的各个⽚段中产⽣单个
# 值(即约简)。⽐如说,当我们⽤rolling(...).quantile(q)计算样本
# 分位数时,可能对样本中特定值的百分等级感兴趣。
# scipy.stats.percentileofscore函数就能达到这个⽬的(结果⻅图
# ⽤户定义的移动窗⼝函数
# rolling_apply函数使你能够在移动窗⼝上应⽤⾃⼰设计的数组函
# 数。唯⼀要求的就是:该函数要能从数组的各个⽚段中产⽣单个
# 值(即约简)。⽐如说,当我们⽤rolling(...).quantile(q)计算样本
# 分位数时,可能对样本中特定值的百分等级感兴趣。
# scipy.stats.percentileofscore函数就能达到这个⽬的(结果⻅图
from scipy.stats import percentileofscore
score_at_2percent = lambda x: percentileofscore(x, 0.02)
result = returns.AAPL.rolling(250).apply(score_at_2percent)
result.plot()
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:9: FutureWarning: Currently, 'apply' passes the values as ndarrays to the applied function. In the future, this will change to passing it as Series objects. You need to specify 'raw=True' to keep the current behaviour, and you can pass 'raw=False' to silence this warning
  if __name__ == '__main__':
<matplotlib.axes._subplots.AxesSubplot at 0x1557e7b4ac8>

pd.options.display.max_rows = PREVIOUS_MAX_ROWS
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-20-1d8d9b03b286> in <module>()
----> 1 pd.options.display.max_rows = PREVIOUS_MAX_ROWS

NameError: name 'PREVIOUS_MAX_ROWS' is not defined
Conclusion
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值