卡尔曼滤波器:用R语言中的KFAS建模时间序列

于时间序列预测,ARIMA等传统模型通常是一种流行的选择。虽然这些模型可以证明具有高度的准确性,但它们有一个主要缺点 - 它们通常不会解释“冲击”或时间序列的突然变化。让我们看看我们如何使用称为卡尔曼滤波器的模型来潜在地缓解这个问题。

时间序列 

我们以货币市场为例。货币对可能会有整体上升趋势,然后在抛售期间大幅下跌。传统的时间序列模型不一定能够立即解决这个问题,并且在考虑到趋势的突然变化之前可能需要几个时期。

因此,我们希望使用一个确实能够解释这种冲击的时间序列模型。让我们来看一个称为卡尔曼滤波器的便捷模型。

卡尔曼滤波器是一种状态空间模型,可以更快地调整冲击到时间序列。让我们看一下如何使用一个例子。

2015年1月,当瑞士国家银行决定从瑞士法郎取消瑞士法郎时,货币市场遭受了历史上最大的冲击之一。结果,瑞士法郎飙升,而其他主要货币则暴跌。

让我们看看卡尔曼滤波器如何调整这种冲击。

 卡尔曼滤波器:USD / CHF

首先,让我们下载2015年1月的USD / CHF数据:

 我们正在将货币数据转换为数据框,然后转换为日志格式以根据回报构建我们的时间序列。

现在,我们将尝试使用KFAS库使用卡尔曼滤波器对此时间序列进行建模。

 让我们来看看上面的内容。

SSModel表示“状态空间模型”,并观察我们正在对SSMtrend回归USD / CHF时间序列,这表示我们的平滑估计或状态预测比实际序列提前一步。

QH表示我们不受约束的时不变协方差估计。估计这些的步骤可能非常复杂,因此出于我们的目的,我将把它们设置为默认值0.01。

当我们绘制时间序列时,我们提出了以下内容:

?

我们可以看到我们的a,att和alpha系列瞬间适应震动。

  • a:对州的一步预测
  • att:对州的过滤估计
  • alphahat:平滑的状态估计

为了进行比较,我们还将计算10天移动平均值,以比较平滑性能与卡尔曼滤波器的平滑性能。

 现在让我们将上面的内容与我们的原始系列结合起来,看看我们提出了什么:

 这是生成的数据框:

?

在某些情况下,高频数据 - 或过滤从噪声信号中提取信息并预测未来状态,是卡尔曼滤波器最合适的用途。另一方面,平滑更依赖于过去的数据,因为在某些情况下,平均最近的测量可能比使用最近的测量更准确。

在这个特定的例子中,我们可以看到在时间段31(这是美元/瑞士法郎急剧下跌前一天),阿尔法(状态的平滑估计)的值从1.002显着下降到0.97,然后下降在实际震荡当天到0.915。

这在直觉上是有道理的,因为货币在一个月之前的交易价格为0.9658。在这方面,平滑估计器允许比使用滤波估计a更好地预测信号,滤波估计a直到时间段33才调整冲击。

此外,请注意,还使用了10天的SMA。尽管alpha被用作更平滑的,我们看到alpha仍然比简单的移动平均值更快地调整了震动 - 这意味着卡尔曼滤波器提供了比简单使用基本平滑技术更好的预测。

 例子:英镑/美元

因此,我们已经看到卡尔曼滤波器如何适应美元/瑞士法郎的突然变动。让我们再举一个货币冲击的例子。当英国在2016年6月投票支持“英国退欧”时,我们看到英镑/美元随后暴跌。

卡尔曼滤波器对此有何建模?我们来看看吧!

如在USD / CHF的例子中,我们从Quandl下载我们的GBP / USD数据并运行卡尔曼滤波器:

 

这是我们的数据图。同样,我们看到alpha在t = 22时的震荡前一天向下调整到1.438的水平:

?

以下是a,att和alpha统计信息:
?

同样,我们看到10天SMA需要将近10天才能完全调整震荡,再次表明平滑参数α在调整货币水平的巨大变化方面仍然证明是优越的。

结论

在本教程中,您了解到:

  • 调整时间序列冲击的重要性
  • 如何在R中使用KFAS实现卡尔曼滤波器
  • 如何解释卡尔曼滤波器的输出
  • 为什么卡尔曼滤波器是用于建模时间序列冲击的合适模型

非常感谢您阅读本文,有任何问题请联系我们!

大数据部落 -中国专业的第三方数据服务提供商,提供定制化的一站式数据挖掘和统计分析咨询服务

统计分析和数据挖掘咨询服务:y0.cn/teradat(咨询服务请联系官网客服

?QQ:3025393450

?

【服务场景】  

科研项目; 公司项目外包;线上线下一对一培训;数据采集;学术研究;报告撰写;市场调查。

【大数据部落】提供定制化的一站式数据挖掘和统计分析咨询服务

?

原文地址:https://www.cnblogs.com/tecdat/p/10919458.html

时间: 2024-08-28 18:41:50

卡尔曼滤波器:用R语言中的KFAS建模时间序列的相关文章

R语言中 fitted()和predict()的区别

fitted是拟合值,predict是预测值.模型是基于给定样本的值建立的,在这些给定样本上做预测就是拟合.在新样本上做预测就是预测. 你可以找一组数据试试,结果如何.fit<-lm(weight~height,data=women)fitted(fit) predict(fit,newdata=data.frame(height=90))##将90代入看结果如何这是R in action中的例子 R语言中 fitted()和predict()的区别,布布扣,bubuko.com R语言中 fi

R语言中apply函数

前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言本身来实现的,而向量操作是基于底层的C语言函数实现的,从性能上来看,就会有比较明显的差距了.那么如何使用C的函数来实现向量计算呢,就是要用到apply的家族函数,包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等. 目录

数据的标准化与中心化以及R语言中的scale详解(转)

1.数据的中心化 所谓数据的中心化是指数据集中的各项数据减去数据集的均值.例如有数据集1, 2, 3, 6, 3,其均值为3,那么中心化之后的数据集为1-3,2-3,3-3,6-3,3-3,即:-2,-1,0,3,0 2.数据的标准化所谓数据的标准化是指中心化之后的数据在除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差.例如有数据集1, 2, 3, 6, 3,其均值为3,其标准差为1.87,那么标准化之后的数据集为(1-3)/1.87,(2-3)/1.87,(3-3)

R语言中的read.table()

参考资料:http://www.cnblogs.com/xianghang123/archive/2012/06/06/2538274.html read.table(file, header = FALSE, sep = "", quote = "\"'", dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"

R 语言中 data table 的相关,内存高效的 增量式 data frame

面对的是这样一个问题,不断读入一行一行数据,append到data frame上,如果用dataframe,  rbind() ,可以发现数据大的时候效率明显变低. 原因是 每次bind 都是一次重新整个数据集的重新拷贝 这个链接有人测试了各种方案,似乎给出了最优方案 http://stackoverflow.com/questions/11486369/growing-a-data-frame-in-a-memory-efficient-manner library(data.table) d

rugarch包与R语言中的garch族模型

来源:http://www.dataguru.cn/article-794-1.html rugarch包是R中用来拟合和检验garch模型的一个包.该包最早在http://rgarch.r-forge.r-project.org上发布,现已发布到CRAN上.简单而言,该包主要包括四个功能: 拟合garch族模型 garch族模型诊断 garch族模型预测 模拟garch序列 拟合序列分布 下面分别说一下. 一.拟合garch族模型 拟合garch族模型分三个步骤:(1)通过ugarchspec

R语言中aggregate函数

前言 这个函数的功能比较强大,它首先将数据进行分组(按行),然后对每一组数据进行函数统计,最后把结果组合成一个比较nice的表格返回.根据数据对象不同它有三种用法,分别应用于数据框(data.frame).公式(formula)和时间序列(ts): aggregate(x, by, FUN, ..., simplify = TRUE) aggregate(formula, data, FUN, ..., subset, na.action = na.omit) aggregate(x, nfre

R语言中的Theil-Sen回归分析

原文链接:http://tecdat.cn/?p=10080  Theil-Sen估计器是一种在社会科学中不常用 的简单线性回归估计器  .三个步骤: 在数据中所有点之间绘制一条线 计算每条线的斜率 中位数斜率是 回归斜率 用这种方法计算斜率非常可靠.当误差呈正态分布且没有异常值时,斜率与OLS非常相似. 有几种获取截距的方法.如果 关心回归中的截距,那么知道 软件在做什么是很合理的. 当我对异常值和异方差性有担忧时,请在上方针对Theil-Sen进行简单线性回归的评论 . 我进行了一次 模拟,

R语言中else if 常见错误

if (0.1>RATE=>0){wthistory=0} else if(0.3>RATE=>0.1){wthistory=5} else if(0.5>RATE=>0.3){wthistory=10} else if(0.7>RATE=>0.5){wthistory=15} else if(0.9>RATE=>0.7){wthistory=15} else{wthistory=30} R语言中支持 else if 的判断,但是上面的写法是错误