JohnZhuang24

R语言与数据分析练习:选择适当模型拟合某股票连续若干天的收盘价序列的发展

R语言与数据分析练习:选择适当模型拟合某股票连续若干天的收盘价序列的发展

ARIMA模型

ARIMA模型(英语:Autoregressive Integrated Moving Average model),差分整合移动平均自回归模型,又称整合移动平均自回归模型(移动也可称作滑动),是时间序列预测分析方法之一。ARIMA(p,d,q)中,AR是“自回归”,p为自回归项数;MA为“滑动平均”,q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。“差分”一词虽未出现在ARIMA的英文名称中,却是关键步骤。

题目:

某股票连续若干天的收盘价如表5-13所示,选择适当模型拟合该序列的发展。

数据如下:

表5-13 某股票收盘价
————————————————————————————————————
304 303 307 299 296 293 301 293 301 295 284 286 286 287 284 282 278 281
278 277 279 278 270 268 272 273 279 279 280 275 271 277 278 279 283 284
282 283 279 280 280 279 278 283 278 270 275 273 273 272 275 273 273 272
273 272 273 271 272 271 273 277 274 274 272 280 282 292 295 295 294 290
291 288 288 290 293 288 289 291 293 293 290 288 287 289 292 288 288 285
282 286 286 287 284 283 286 282 287 286 287 282 282 294 291 288 289
————————————————————————————————————

实现代码:

# 设置工作目录并读取数据
setwd("D:/bigdata/R语言与数据分析/R语言数据分析实战/第5章/02-习题程序")
data1 <- read.csv("./data/data.csv")
data <- data1[1:100, ]

# 平稳性检验
# 结论: 1.序列并未全部在一个常数内稳定地来回波动 属于非平稳随机序列
#       2.发现数据为非平稳序列 需要做处理
data <- ts(data)
plot(data)  # 绘制时序图 
acf(data, lag.max = 30)  # 数据自相关检验 



# 差分运算:使得数据在一个常数附件随机波动
data_t1 <- diff(data)
plot(data_t1)  # 绘制时序图
acf(data_t1, lag.max = 30)  # 数据自相关检验

# 单位根检验:若p值小于0.05 则该序列为非纯随机序列
library(tseries)
adf.test(data_t1)


# 模型定阶
library(TSA)
res <- armasubsets(y = data_t1, nar = 5, nma = 5)  # 差分序列BIC定阶
plot(res)


# 模型残差检验
library(forecast)
for(p in c(0, 3, 5)){
  for(q in c(0, 3, 4)){
    arima.model <- Arima(data, order = c(p, 1, q))
    box.test.result <- Box.test(arima.model$residuals, lag = 1, type = "Ljung-Box")  
    print(paste(\'p =\', p, \'; q =\', q , \'; 残差P值:\', 
                round(box.test.result$p.value, 4), collapse = ""))
  }
}


# 模型评估
for(p in c(0, 3, 5)){
  for(q in c(0, 3, 4)){
    arima.model <- Arima(data, order = c(p, 1, q))
    forecast.data <- forecast(arima.model, h = 7)
    pred <- forecast.data$mean
    error <- abs(data1[101:107, 1] - pred) / data1[101:107, 1]
    print(paste(\'p =\', p, \'; q =\', q , \';误差:\', round(mean(error), 6)))
  }
}

# 因此最优模型是ARIMA(3,1,3)

运行截图:

在这里插入图片描述

分类:

技术点:

相关文章: