Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分解商业周期时间序列:线性滤波器、HP滤波器、Baxter滤波器、Beveridge Nelson分解等去趋势法|附代码数据

分解商业周期时间序列:线性滤波器、HP滤波器、Baxter滤波器、Beveridge Nelson分解等去趋势法|附代码数据

原创
作者头像
拓端
发布于 2022-12-01 09:46:19
发布于 2022-12-01 09:46:19
69100
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:0
代码可运行

原文链接:http://tecdat.cn/?p=23000

最近我们被客户要求撰写关于商业周期分解的研究报告,包括一些图形和统计输出。本文包含各种过滤器,可用于分解南非GDP的方法。我们做的第一件事是清除当前环境中的所有变量。这可以通过以下命令进行

分解南非GDP数据

本文包含各种过滤器,可用于分解南非GDP的方法。我们做的第一件事是清除当前环境中的所有变量。这可以通过以下命令进行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm(list = ls())
graphics.off()

载入数据

如前所述,南非的GDP数据将其作为时间序列存储在gdp中,我们执行以下命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gdp <- ts(dat.tmp, start = c(1960, 2), frequency = 4)

为了确保这些计算和提取的结果是正确的,我们检查一下数据的图表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot(gdp)

线性滤波器_去除数据线性趋势_

为了估计一个线性趋势,我们可以利用一个包括时间趋势和常数的线性回归模型。为了估计这样一个模型,我们使用lm命令,如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lin.mod$fitted.values  # 拟合值与时间趋势有关
ts(lin.trend, start = c(1960, 1))  # 为趋势创建一个时间序列变量
gdp - linear  # 周期是数据和线性趋势之间的差异

回归的拟合值包含与线性趋势有关的信息。这些信息需要从模型对象lin.mod中提取,在上面的块中,我们将这些值分配给时间序列对象linear。然后从数据中剔除趋势,就得到了周期。

然后我们可以借助下面的命令来绘制这个结果,其中趋势和周期被绘制在不同的数字上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot.ts(gdp, ylab = "")  
lines(linear, col = "red")  
legend("topleft", legend = c("data", "trend")

霍德里克 - 普雷斯科特 (Hodrick-Prescott,HP) _滤波器_对数据进行去趋势处理

要用流行的HP滤波法分解这个数据。在这种情况下,我们将lambda的值设置为1600,这也是对季度数据的建议。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hp(gdp, freq = 1600)
plot.ts(gdp, ylab = "")  # 绘制时间序列
plot.ts(hp.decom$cycle, ylab = "")  # 绘制周期图

这似乎更准确地反映了我们对南非经济表现的理解。


点击标题查阅往期内容

R语言从经济时间序列中用HP滤波器,小波滤波和经验模态分解等提取周期性成分分析

左右滑动查看更多

01

02

03

04

用Baxter-King滤波器去趋势数据

为了利用Baxter-King 滤波器。在这种情况下,我们需要指定周期的频带,其上限被设定为32,下限被设定为6。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bk(gdp, pl = 6, pu = 32)
plot.ts(gdp, ylab = "")
plot.ts(cycle, ylab = "")

这似乎再次为南非经济活动的周期性提供了一个相当准确的表述。还要注意的是,周期的表示比以前提供的要平滑得多,因为噪音不包括在周期中。

Christiano-Fitzgerald滤波器去趋势数据

这个滤波器的性质与上面提供的非常相似。此外,产生与Baxter-King滤波器高度相似的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot.ts(gdp, ylab = "")

plot.ts(cfcycle, ylab = "")

用Beveridge-Nelson分解法 "去趋势 "数据 

为了将数据分解为随机趋势和平稳周期,我们可以采用Beveridge-Nelson分解法。当采用这种技术时,我们需要指定与平稳部分有关的滞后期的数量。在我下面的例子中,我假设有八个滞后期。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot.ts(gdp, ylab = "")
lines(bn.trend, col = "red")
plot.ts(bn.cycle, ylab = "")

比较周期的不同衡量标准

然后,我们可以将所有这些结果结合在一张图上,考虑各自的相似性和差异。在这个例子中,我创建了一个时间序列ts.union,但是我也可以先绘制一个单一的序列,然后再使用lines命令在上面绘制连续的图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ts.union(lin.cycle, hp.decom, bp.decom, 
    cf.decom, bn.cycle)

plot.ts(comb, ylab = "")

谱分解

在我们考虑使用谱技术之前,最好先清除当前环境中的所有变量,并关闭所有的图。下一步是确保你可以通过使用library命令来访问这些包中的程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(tsm)
library(TSA)
library(mFilter)

使用谱技术进行分解。我们可以为三个时间序列变量生成数值,然后将它们组合成一个单一的变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2 * cos(2 * pi * t * w[1]) + 3 * sin(2 * pi * t * 
    w[1])  # no.obs点上的6个周期的频率
4 * cos(2 * pi * t * w[2]) + 5 * sin(2 * pi * t * 
    w[2])  #频率为10个周期的观察点
6 * cos(2 * pi * t * w[3]) + 7 * sin(2 * pi * t * 
    w[3])  # 在没有观测点的情况下,频率为40个周期
y <- x1 + x2 + x3

为了观察这些变量,我们可以把它们绘制在一个单独的轴上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
par(mfrow = c(2, 2), mar = c(2.2, 2.2, 2, 1), cex = 0.8)
plot(x1, type = "l", main = "x1")
plot(x2, type = "l", main = "x2")
plot(x3, type = "l", main = "x3")
plot(y, type = "l", main = "y")

此后,我们可以使用周期图来考虑这些时间序列变量的每一个属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gram(y, main = "y", col = "red")

当然,我们可以利用一个过滤器,从总体时间序列变量中去除一些不需要的成分。为此,我们可以应用上下限相对较窄的Christiano-Fitzgerald滤波器。此后,我们使用应用于与周期有关的信息的周期图,来调查它是否成功地剔除了一些频率成分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cf(y0)
gram(cycle)

这个结果将表明,滤波器已经排除了大部分的高频率成分。为了看看这个周期与之前的数据有什么关系,我们把通过滤波器的周期性信息绘制在分量上。此外,我们还将这个结果绘制在综合周期的变量上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot(x1, type = "l", lty = 1)
lines(cycle, lty = 3, lwd = 3)
plot(y, type = "l", lty = 1)
lines(cycle, lty = 3, lwd = 3)

在这两种情况下,它似乎都对过程中的趋势做了合理的描述。

南非商业周期的谱分解法

为了考虑如何在实践中使用这些频谱分解,我们现在可以考虑将这些技术应用于南非商业周期的各种特征中。

下一步将是运行所有的过滤器,这些过滤器被应用于识别南非商业周期的不同方法。

现在,让我们对商业周期的每一个标准应用一个周期图。

线性滤波器提供了一个很差的结果,因为趋势明显占主导地位(这不是周期应该有的)。这与Hodrick-Prescott滤波器的特征形成对比,后者的趋势信息已经被去除。Baxter & King和Christiano & Fitzgerald的带通滤波器也是这种情况。在这两种情况下,噪声也已经被去除。最后的结果与Beveridge-Nelson分解有关,我们注意到周期包括大量的趋势和大量的噪声。

小波分解

为了提供一个小波分解的例子,我们将把该方法应用于南非通货膨胀的数据。这将允许使用在这个过程中推导出对趋势的另一种衡量方法,这可以被认为是代表核心通货膨胀。请注意,这种技术可以应用于任何阶数的单整数据,所以我们不需要首先考虑变量的单整阶数。

然后,我们将利用消费者价格指数的月度数据,该数据包含在SARB的季度公告中。数据可以追溯到2002年。为了计算通货膨胀的同比指标,我们使用diff和lag命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
diff/cpi[-1 * (length - 11):length]

为了确保所有这些变量的转换都已正确进行,我们对数据进行绘图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot(inf.yoy)

由于我们在这种情况下主要对识别平滑的趋势感兴趣,我们将使用贝希斯函数。这样的函数是Daubechies 4小波,它应用修正的离散小波变换方法。此外,我们还将使用三个母小波来处理各自的高频成分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wt(yoy, "d4")

然后我们可以为每个独立的频率成分绘制结果,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot.ts(yoy)
for (i in 1:4) plot.ts(d4[[i]]

如果我们现在想在数据上绘制趋势(父小波)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot.ts(inf, ylab = "inf")
lines(ren)

请注意,由于各自的频段是相加的,我们可以将其中一个母频段加入到趋势中,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inf.tmp <- inf.tren + inf.d4$w3
inf.tren2 <- ts(inf.tmp, start = c(2003, 1), frequency = 12)

plot.ts(inf.yoy, ylab = "inf")
lines(inf.tren2, col = "red")

相关经济变量的周期性成分之间的相关性

为了确定周期的特征是否合适,我们可以考虑宏观经济总量的一些不同周期性方法之间的相关性。例如,我们可以考虑产出和生产(或就业)的周期性在不同的滞后期应该是相关的。如果它们不相关,那么该方法可能无法准确描述各自变量的周期性成分。

在本文使用的例子中,代码可能有点难以理解,但我们鼓励你自己去研究,以提高你对这个编码环境的总体理解。 

下一步是读入数据并为数据的各种周期性成分创建一些矩阵。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yd <- dat[5:n.obs, ] - dat[1:(n.obs - 4), ]  # 存储输出

yc_li <- matrix(rep(0, n.obs * n.var), ncol = n.var)
yc_hp <- matrix(rep(0, n.obs * n.var), ncol = n.var)
yc_bp <- matrix(rep(0, n.obs * n.var), ncol = n.var)
yc_bn <- matrix(rep(0, n.obs * n.var), ncol = n.var)

使用上面包含的方法对数据进行过滤。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (i in 1:n) {
    
    # 用线性滤波器对数据进行去趋势处理
    lin.mod <- lm(dat[, i] ~ time(dat[, i]))
    
    # 用HP滤波器去趋势数据
    yc_hp[, i] <- hp.cycle
    
    #用带通滤波器去趋势数据
    yc_bp[, i] <- bp.cycle
    
    #  Beveridge-Nelson分解
    yc_bn[, i] <- bn.[, 2]
}

计算不同提前期和滞后期的相关关系。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (i in 1:n) {
    for (j in 1:n.var) {
        c_li <- leadlag(yc_li[, i], yc_li[, j], maxLeadLag)
        c_hp <- leadlag(yc_hp[, i], yc_hp[, j], maxLeadLag)
        c_bp 
        c_bn
        c_yd 

        
        for (k in 1:5) {

            ynamesLong[(cnt + k), 1] <- paste(ynames.tmp)
        }
        cnt <- cnt + 5

绘制结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 线性趋势

barplot(corrStylizedFact)
box()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# hp滤波器

op <- par(mfrow = c(1, 3))
barplot(corrStyli, ylim = c(-1, 1))
box()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# beveridge nelson 分解
barplot(coracts, ylim = c(-1, 1), col = "red")
box()

本文摘选 R语言分解商业周期时间序列:线性滤波器、HP滤波器、Baxter滤波器、Beveridge Nelson分解等去趋势法 ,点击“阅读原文”获取全文完整资料。


点击标题查阅往期内容

R语言时间序列分解和异常检测方法应用案例R语言矩阵特征值分解(谱分解)和奇异值分解(SVD)特征向量分析有价证券数据R语言从经济时间序列中用HP滤波器,小波滤波和经验模态分解等提取周期性成分分析 R语言状态空间模型和卡尔曼滤波预测酒精死亡人数时间序列matlab实现扩展卡尔曼滤波(EKF)进行故障检测 卡尔曼滤波器:用R语言中的KFAS建模时间序列 状态空间模型:卡尔曼滤波器KFAS建模时间序列 R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测 使用R语言随机波动模型SV处理时间序列中的随机波动率 PYTHON用时变马尔可夫区制转换(MRS)自回归模型分析经济时间序列 R语言有限混合模型(FMM,finite mixture model)EM算法聚类分析间歇泉喷发时间 长短期记忆网络LSTM在时间序列预测和文本分类中的应用 Python随机波动率(SV)模型对标普500指数时间序列波动性预测 R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据 R语言使用ARIMAX预测失业率经济时间序列数据 R语言用ARIMA模型,ARIMAX模型预测冰淇淋消费时间序列数据 R语言经济学:动态模型平均(DMA)、动态模型选择(DMS)预测原油时间序列价格

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python中的chdir函数:更改工作目录利器
在Python中,`chdir`是一个内置函数,用于更改当前工作目录。今天就给大家简单介绍一下该函数的用法和一些注意事项,一起来学习一下吧。
华科云商小彭
2023/10/07
6380
Python中的chdir函数:更改工作目录利器
python进入文件目录 命令_python创建目录
Python可以使用os.chdir()方法转到指定目录。os.chdir() 方法用于改变当前工作目录到指定的路径。
全栈程序员站长
2022/09/27
4K0
python-获取当前工作路径
sys.argv[0] import sys print sys.argv[0]#获得的是当前执行脚本的位置(若在命令行执行的该命令,则为空) 运行结果(在python脚本中执行的结果): F:/SEG/myResearch/myProject_2/test.py os模块 import os print os.getcwd()#获得当前工作目录 print os.path.abspath('.')#获得当前工作目录 print os.path.abspath('..')#获得当前工作目录的父
py3study
2020/01/10
3.3K0
【Python让生活更美好01】os与shutil模块的常用方法总结
Python作为一种解释型的高级语言,脚本语言,又被称作“胶水语言”,就是因为其灵活的语法和其依靠浩如烟海的第三方包实现的丰富多彩的功能,而os和shutil就是这样一种功能强大的模块,可以非常快捷地帮助使用者解决日常计算机文件相关操作的一些问题,下面就对os和shutil包中一些常见的命令进行说明: import os,shutil os.getcwd()#获取当前工作目录 os.chdir('newdir')#改变当前工作目录 os.mkdir('test')#在当前工作目录下生成单级文件夹 o
Feffery
2018/04/17
7692
python 获取当前目录和文件
import os print os.getcwd() #获取当前工作目录路径 print os.path.abspath('.') #获取当前工作目录路径 print os.path.abspath('test.txt') #获取当前目录文件下的工作目录路径 print os.path.abspath('..') #获取当前工作的父目录 !注意是父目录路径 print os.path.abspath(os.curdir) #获取当前工作目录路径
用户5760343
2019/07/05
3.8K0
python os模块 --- 操作系统接口模块
1.OS模块下的常见函数 # os模块 # os.sep:取代操作系统特定的路径分隔符 # os.getcwd:得到当前工作目录,即当前python脚本工作的目录路径。 # os.getenv()和os.putenv:分别用来读取和设置环境变量 # os.listdir():返回指定目录下的所有文件和目录名 # os.remove(file):删除一个文件 # os.stat(file):获得文件属性 # os.mkdir(name):创建目录 # os.rmdir(name):删除目录 # os.exit
诡途
2020/10/16
6260
python之OS模块(对文件or目录操
  os,语义为操作系统,包含普遍的操作系统功能,与具体的平台无关。python编程时,处理文件和目录这些操作,就比如说:显示当前目录下所有文件/删除某个文件/获取文件大小……
py3study
2020/01/09
6770
Python基础教程(十四):OS 文件/目录方法
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝💝💝如有需要请大家订阅我的专栏【Python系列】哟!我会定期更新相关系列的文章 💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!
用户11147438
2024/06/14
1680
Python基础语法-内置函数和模块-os模块
os 模块提供了一些函数来与操作系统进行交互,比如获取当前工作目录、创建目录、删除目录、重命名文件等等。在本文中,我们将详细介绍 os 模块的常用函数。
玖叁叁
2023/04/18
3190
python模块—os
    OS模块也是我们平时工作中很常用到的一个模块,通过os模块调用系统命令,获得路劲,获取操作系统的类型等都是使用该模块。
py3study
2020/01/13
1.1K0
python之获取文件os模块
  Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。下面我们来介绍一下python的文件os模块相关知识。
jiankang666
2022/12/05
4490
python之获取文件os模块
Python绝对路径和相对路径详解
每个运行在计算机上的程序,都有一个“当前工作目录”(或 cwd)。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。
用户8442333
2021/11/30
3.5K0
Python修改文件后缀名[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
6.2K0
python 如何查看与更换工作目录
# -*- coding: utf-8 -*- #导入OS包 import os #os.getcwd()查看当前目录 print('\n当前目录位置:') print(os.getcwd()) #os.chdir修改目录 os.chdir("E:\python_py\python1_learn") print('\n修改后目录位置:') print(os.getcwd())
学到老
2019/02/14
9200
python学习_24(目录)
os.curdir 返回当前目录 >>> os.curdir '.' os.pardir 返回当前目录的父目录 >>> os.pardir '..' #切换到上级目录 >>> os.chdir(os.pardir) >>> os.getcwd() 'E:\\' os.getcwd() 获取当前工作目录 >>> os.getcwd() 'E:\\' >>> os.chdir("个人") >>> os.getcwd() 'E:\\个人' os.chdir(path) 切换到指定工作目录 >>> os.c
py3study
2020/01/14
6230
(三十九) 初遇python之Context Managers上下文管理器
各位读者大大们大家好,今天学习python的Context Managers上下文管理器,并记录学习过程欢迎大家一起交流分享。
XXXX-user
2019/07/23
5710
(三十九) 初遇python之Context Managers上下文管理器
小朋友学Python(18):目录
Python的os模块有许多方法能帮你创建,删除和更改目录。 一、创建目录 mkdir()方法 可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。 语法: os.mkdir("dirname") 例1:在当前目录下创建一个新目录testdir import os os.mkdir("testdir") 二、获取当前目录 getcwd()方法 getcwd()方法显示当前的工作目录。 语法: os.getcwd() 注意,这里cwd是current w
海天一树
2018/04/17
6670
Python-os-01-获取当前文件所在文件夹路径
系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2
zishendianxia
2019/10/23
1.5K0
python3基础:目录操作
os模块提供了统一的操作系统接口函数,python中对文件和文件夹的操作都要涉及到os和shutil模块,在使用前需要使用import引入,例如;
py3study
2020/01/09
1.3K0
Python3目录操作
输出: 'D:\python\jupyter' 'D:\python' ['.ipynb_checkpoints', 'bak', 'jupyter', 'project', 'test.txt', 'testdir', 'Untitled.ipynb', ]
py3study
2020/01/03
7960
相关推荐
Python中的chdir函数:更改工作目录利器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验