时间序列学习笔记-3-A

  • 本学习笔记任课参考老师的课件所制作,在此特别感谢我的老师。
  • 本学习笔记参考北大李东风先生的《金融时间序列分析》授课备课资料,在此感谢。

Box-Cox变换,差分变换和时间序列平稳化

时间序列分析中的确定性因素分解法

  • 上一节我们学习了如何基于模型将时间序列分解为趋势项,季节项和无规则项
    X t = T t + S t + I t X_t=T_t+S_t+I_t Xt=Tt+St+It 或者 X t = T t × S t × I t X_t = T_t \times S_t \times I_t Xt=Tt×St×It
    在这种分解方式中,假设趋势项和季节项都是时间 t t t 的确定性函数,因此上述方法称为确定性因素分解法

  • 局限性:确定性分解法虽然直观,但在实际应用中存在一些局限性:

    • 确定性模型的全局参数化(即使用固定公式来表达趋势和季节性)通常难以准确描述复杂的趋势变化。
    • 非参数趋势拟合方法虽然能更好地拟合趋势,但在未来的预测中难以推广。
  • 无规则项的意义:确定性分解得到的无规则项 I t I_t It 虽然表面上看不再具有趋势性或季节性(我们称之为平稳时间序列),但这并不表示 I t I_t It 只是随机波动。很多时候, I t I_t It 里包含序列自相关性,可能蕴含对预测有帮助的信息。为了更好地利用这些信息,需要构建合适的模型来刻画这种自相关性。

随机化建模方法

  • 本节开始我们要学习时间序列建模与预测的随机化建模方法;这里趋势性和季节性不再是时间 t t t 的确定性表示,而是一个随机性的表示。例如,以下两个时间序列模型分别可以用于拟合不同的时间序列:
    在这里插入图片描述

    • 模型 X t = μ + X t − 1 + Z t X_t = \mu + X_{t-1} + Z_t Xt=μ+Xt1+Zt,其中 Z t ∼ N ( 0 , σ 2 ) Z_t \sim N(0, \sigma^2) ZtN(0,σ2),适合描述随机漫步模型 A R I M A ( 0 , 1 , 0 ) ARIMA(0,1,0) ARIMA(0,1,0)
    • 模型 X t = X t − 1 + X t − 12 + X t − 13 + θ 1 Z t − 1 + θ 2 Z t − 12 + θ 1 ⋅ θ 2 Z t − 13 + Z t X_t = X_{t-1} + X_{t-12} + X_{t-13} + \theta_1 Z_{t-1} + \theta_2 Z_{t-12} + \theta_1 \cdot \theta_2 Z_{t-13} + Z_t Xt=Xt1+Xt12+Xt13+θ1Zt1+θ2Zt12+θ1θ2Zt13+Zt,适合描述航空模型 A R I M A ( 0 , 1 , 1 ) × ( 0 , 1 , 1 ) 12 ARIMA(0,1,1) \times (0,1,1)_{12} ARIMA(0,1,1)×(0,1,1)12
  • 接下来,我们要介绍的建模方法是Box-Jenkins方法。该方法将时间序列划分为两类:平稳时间序列和非平稳时间序列,分别假定适当的 ARMA模型ARIMA模型。其中:

    • 对非平稳时间序列建立 A R I M A ARIMA ARIMA 模型,实际上是通过先用适当的差分变换将非平稳序列转化为平稳序列,然后再建立ARMA模型。
    • 因此,接下来的内容将介绍如何通过差分变换将非平稳序列转化为平稳时间序列,之后再对平稳时间序列进行 ARMA 建模。

平稳时间序列和非平稳时间序列

  • 我们实际上没有平稳时间序列的定义,只有后面将要介绍的平稳过程的定义;所谓平稳时间序列可以定义为:适合用一个平稳过程来表示其分布的序列。经验上来讲,这种序列没有明显的趋势性和季节性,在水平方向上波动,且波动的范围恒定。不满足这些特点的序列就可以归为非平稳时间序列

  • 非平稳序列是通过适当的变换转化为平稳序列来建模的。常见的变换有

    1. 趋势差分以消除趋势性;
    2. 季节差分以消除季节性;
    3. Box-Cox变换以使得波动稳定化;

我们分别用例子来说明。


趋势差分

  • 在时间序列分析中,一阶趋势差分运算是用来消除数据中的趋势性。其定义为:

y t = x t − x t − 1 = ∇ x t y_t = x_t - x_{t-1} = \nabla x_t yt=xtxt1=xt

  • 这个运算计算了相邻两个时间点之间的差值,从而去除了序列中的趋势成分。通过趋势差分,序列中的长期变化趋势可以被消除,使得数据更加平稳,便于后续的分析。
library(fpp3)
da <- read.table("C:/Users/LuoLi/Desktop/elecsales.txt")
T = dim(da)[1]
date <- year(make_date(year = 1989)) + 1:T -1
da <- tsibble(date = date, x = da$V1, index = date)
da <- mutate(da,x_1 = difference(x))
autoplot(da,vars(x,x_1))+ geom_point()

在这里插入图片描述

  • 再看一个例子,下面的第一张图,这种图在金融中很普遍,典型的股票价格序列,有明显的趋势性,但是这种趋势很难用前面讲的确定性函数去拟合,它是一种随机趋势,只能用这种差分去表示。
    在这里插入图片描述

  • 下面的例子可以看出为什么差分可以消除趋势性。假设 x t = β 0 + β 1 t + ϵ t x_t = \beta_0 + \beta_1 t + \epsilon_t xt=β0+β1t+ϵt,显然 x t x_t xt 有趋势性。容易计算:

∇ x t = β 1 + ϵ t − ϵ t − 1 \nabla x_t = \beta_1 + \epsilon_t - \epsilon_{t-1} xt=β1+ϵtϵt1

  • 关于时间 t t t 的趋势项被消掉了。因此,有确定性趋势的序列也可以用差分来消除趋势性。

季节差分

  • 在时间序列分析中,可以使用季节差分运算来消除数据中的季节性。定义如下:

y t = x t − x t − s = ∇ s x t y_t = x_t - x_{t-s} = \nabla_s x_t yt=xtxts=sxt

  • 其中 s s s 表示季节周期长度。因为 x t x_t xt x t − s x_{t-s} xts 处于同一季节,相减可以消除季节性影响。

  • 在 R 语言中,可以使用 difference() 函数来计算季节差分,通过设置 lag = s 实现季节性调整。

difference(x,lag = s)
  • 看下面的例子,季节差分可以消除趋季节周期性
da2 <- as_tsibble(forecast::wineind)
colnames(da2) <- c("Month","x")
da2 <- mutate(da2,x_12=difference(x,lag = 12))
autoplot(da2,vars(x,x_12))

在这里插入图片描述

  • 这个数据实际上同时有趋势性和周期性,这从经典分解结果可以看得很清楚。
cd <- model(da2,classical_decomposition(x))
components(cd) |> autoplot()

在这里插入图片描述

  • 因此这个数据,我们可以通过先做一个趋势差分消除趋势再做一个季节差分消除季节性,即
    y t = ∇ x t , z t = ∇ 12 y t = ∇ 12 ∇ x t y_t = \nabla x_t, \quad z_t = \nabla_{12} y_t = \nabla_{12} \nabla x_t yt=xt,zt=12yt=12xt
da2 <- mutate(da2,x_1 = difference(x),
              x_1_12 = difference(x_1,lag=12))
autoplot(da2,vars(x,x_1,x_1_12))

在这里插入图片描述


方差稳定性变换

  • 有一些序列,其波动幅度随着时间有系统性的变化,例如波动性越来越大。对于这类序列,我们需要先做适当的 Box-Cox 变换,使得其波动稳定化,然后再进行差分运算消除趋势性和季节性。例如,经典的 AirPassengers 序列,如果直接进行趋势差分,差分之后的序列波动性可能会越来越大,导致方差不稳定。因此,合适的做法是首先应用 Box-Cox 变换,使得序列的波动性变得稳定,再进行差分操作来消除趋势性和季节性。
    w t = ∇ 12 ∇ ln ⁡ x t w_t = \nabla_{12} \nabla \ln x_t wt=12lnxt
da3 = as_tsibble(AirPassengers)
colnames(da3) <- c("month","x")
da3 <- mutate(da3,x_1 = difference(x),
              lnx = log(x),
              lnx_1=difference(lnx),
              lnx_1_12=difference(lnx_1,lag=12))
autoplot(da3,vars(x,x_1))

在这里插入图片描述

autoplot(da3,vars(x,lnx,lnx_1,lnx_1_12))

在这里插入图片描述


补充:

make_date函数

make_date 是 R 语言中的一个函数,主要用于创建 Date 类型的日期对象。该函数通常用于生成特定格式的日期,尤其在数据分析和时间序列处理中。

语法
make_date(year, month = 1, day = 1)
  • year:指定年份。
  • month:指定月份,默认为 1
  • day:指定日期,默认为 1

difference() 函数

在 R 的 fpp3 包中,difference() 函数用于计算时间序列的差分。这种差分操作特别适用于时间序列分析,帮助平稳化数据,以便更好地进行建模。fpp3 包中的 difference() 函数与基础 R 中的 diff() 功能类似,但经过优化,更适合直接应用于 fpp3 包的时间序列对象(如 tsibble 数据结构)。

语法
difference(x, lag = 1, differences = 1)
  • x:时间序列数据,通常为 tsibble 数据格式。
  • lag:差分的滞后期,默认为 1,表示相邻时点之间的差分。例如,对月度数据使用 lag = 12 可以计算年度季节性差分。
  • differences:差分次数,默认为 1,用于计算高阶差分。
示例
季节性差分

使用 lag = 12 计算年度差分,适用于按月的数据。

library(fpp3)

# 使用 fpp3 包内置数据
data <- as_tsibble(USAccDeaths)
# 计算年度季节性差分
seasonal_diff <- data %>%
  mutate(seasonal_difference = difference(value, lag = 12))
print(seasonal_diff)
高阶差分

计算高阶差分以去除更复杂的趋势。

# 二阶差分
high_order_diff <- data %>%
  mutate(high_order_difference = difference(value, differences = 2))
print(high_order_diff)
应用场景
  • 平稳化序列:差分可以去除趋势或季节性,使时间序列变为平稳序列,适合于平稳模型(如 ARIMA)。
  • 季节性调整:通过选择合适的 lagdifference() 可用于去除季节性成分,例如年度或季度季节性。
注意事项

difference() 函数在使用高阶差分时,可能会导致缺失值,因此可能需要在后续步骤处理这些缺失值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值