识别时间序列中的不同变异期

机器算法验证 时间序列 方差 马尔科夫过程 变化点
2022-03-27 17:38:23

我有一个时间序列,它可能会经历不同的波动阶段。一个例子可能是一些股票从上午 9 点到 11 点具有高方差,从上午 11 点到下午 2 点具有低方差,然后又出现高方差。有没有办法识别这些不同的变化时期?xt

我正在考虑采用长度为的滑动窗口,计算该窗口中的方差并在其上运行变化点检测,但我认为这需要我知道估计方差的分布。我的另一个想法是获取窗口的方差并尝试为其拟合马尔可夫链,但我事先不知道应该有多少个状态。 L

抱歉,激励的例子不仅仅在金融领域。我想有一种方法来模拟时间序列中的“风险”,这可能是与金融资产相关的风险。另一个例子是风能生产 - 风力涡轮机产生的能量非常不稳定且不可预测,但如果有一个学习算法可以识别一个月中的哪些日子风能生产的方差高,什么时候低,那就太好了

4个回答

有很多文献可以测试均值的变化。如果已知均值不变,并且需要检验方差,则可以将检验方差变化的问题转换为通过简单变换检验均值变化的问题。

假设您的初始数据是,然后定义,其中是平均值。那么的均值变化,将是的方差变化。XiYi=(Xiμ)2μYiEYi=E(Xiμ)2=Var(Xi)Xi

R中的changepoint包有一个cpt.var可以计算方差变化的函数。该函数中有两种测试,一种用于可以假定为正态分布的数据(默认选项dist="Normal"),另一种用于非参数测试(选项dist="CSS")。CSS方法是平方的累积和,在 Inclan & Tiao (1994) 论文中有详细说明 - 更多详细信息请参见?cpt.var.

虽然您可以对数据进行平方(正如 mpiktas 在答案中指出的那样),但这实际上可以抑制对变化较小的变化点的检测。想想看,如果你对一个大于 1 的值进行平方,它会变大,但如果它小于 1,它会变小。

http://www.unc.edu/~jbhill/tsay.pdf讨论了时间序列的方差变化此功能已添加到可从 http:..www.autobox.com 获得的软件中。我参与了这个非常重要的功能的开发/合并,这显然被 SAS、SPSS 和其他人忽略了。

您可以使用该mcp软件包执行此操作,前提是您提前知道分段数:

model = list(
    price ~ 1 + sigma(1),  # Intercept and variance
    ~ 0 + sigma(1),  # Change in variance, but not in mean
    ~ 0 + sigma(1)  # same
)

library(mcp)
fit = mcp(model, df, par_x = "time")

您也可以推断出这些变化发生在斜坡等顶部的时间。在 mcp 关于建模方差的文章中查看更多信息。