[关闭]
@fanxy 2020-04-19T14:49:28.000000Z 字数 6192 阅读 4600

第九讲 非平稳时间序列线性模型

樊潇彦 复旦大学经济学院 金融数据


Ch09_Data.rar412.8kB

  1. # 准备工作
  2. setwd("D:\\...\\Ch09")
  3. install.packages("fracdiff")
  4. library(tidyverse)
  5. library(readxl)
  6. library(ggplot2)
  7. library(tseries)
  8. library(zoo)
  9. library(forecast)

1. 随机游走

1.1 定义与数值模拟

  1. source("Ch09_myfun.R") # 调用函数
  2. set.seed(2) # 设定随机种子
  3. simu_random(mu=0, sigma=1, T=100, N=50) # 运行
  4. # mu: shift; sigma: sd(epsilon)
  5. # T:模拟T期; N: 模拟N次

1.2 标普500指数建模

  1. sp=read.table("d-sp5008.txt",header=T) # 读取SP500数据
  2. head(sp)
  3. lnp=ts(log(sp$close),start=c(1950,1,3)) # 取收盘价对数,转换为ts对象
  4. adf.test(lnp) # ADF检验,H0:有单位根
  5. regsp=auto.arima(lnp,stationary = F, seasonal = F, ic="aic")
  6. regsp
  7. par(mfcol=c(1,1))
  8. plot(regsp$x,lty = 1, main = "拟合S&P500指数", ylab = "", xlab = "")
  9. lines(fitted(regsp), lty = 2,lwd = 2, col = "red")
  10. head(data.frame(regsp$x,fitted(regsp))) # 比较真实数据和拟合结果

2. 季节模型

2.1 直接用auto.arima()命令建模分析

下面以可口可乐公司的财务数据为例,展示如何用auto.arima()命令进行建模分析。

  1. da=read.table("q-ko-earns8309.txt",header=T)$value # 读取数据
  2. koeps=ts(log(da),frequency=4,start=c(1983,1)) # 将对数值转换为ts对象
  3. par(mfcol=c(1,1))
  4. plot(koeps,type='l') # 作图
  5. points(koeps,pch=c("1","2","3","4"),cex=0.6) # 标记季度
  6. adf.test(koeps) # ADF检验,H0:有单位根
  7. regkoeps = auto.arima(koeps,stationary = F, seasonal = T, ic="aic")
  8. regkoeps
  9. tsdiag(regkoeps)
  10. par(mfcol=c(2,1))
  11. plot(regkoeps$x,lty = 1, main = "盈利拟合", ylab = "", xlab = "")
  12. lines(fitted(regkoeps), lty = 2,lwd = 2, col = "red")
  13. plot(forecast(regkoeps), main = "盈利预测")
  14. predict(regkoeps, n.ahead=4)

2.2 数据分解和季节调整后建模分析

有的数据用auto.arima()回归后残差仍存在自相关,或存在明显的季节性波动,回归结果不理想。以1992Q1-2016Q4的中国季度GDP数据为例:

  1. load("ydata.RData") # 读取数据
  2. head(ydata)
  3. reglny=auto.arima(ydata$lny, stationary = F, seasonal = T, ic="aic")
  4. reglny
  5. tsdiag(reglny) # 作图观察
  6. Box.test(reglny$residuals,lag=4,type='Ljung') # 序列自相关检验

对于这种情况,可以用基础stats包中的decompose()命令先对原始数据进行分解,生成经季节调整的数据后再建模。

  1. lny=ts(ydata$lny,frequency=4, start=c(1992,1)) # 转换为ts对象
  2. lny_dec=stats::decompose(lny) # 分解为趋势、季节和随机因素
  3. plot(lny_dec) # 分解结果作图
  4. lny_adj=seasadj(lny_dec) # 生成经季节调整的数据
  5. par(mfcol=c(1,1))
  6. plot(lny) # 比较季节调整前后的数据
  7. lines(lny_adj, col="red")
  8. reglny_adj=auto.arima(lny_adj, stationary =F, seasonal = F, ic="aic")
  9. reglny_adj
  10. tsdiag(reglny_adj)
  11. Box.test(reglny_adj$residuals,lag=4,type='Ljung')
  12. par(mfcol=c(2,1))
  13. plot(reglny_adj$x,lty = 1, main = "lny_adj拟合", ylab = "", xlab = "")
  14. lines(fitted(reglny_adj), lty = 2,lwd = 2, col = "red")
  15. predict(reglny_adj, n.ahead=4)
  16. plot(forecast(reglny_adj), main = "lny_adj预测")

课堂讨论:改用上一讲1992Q1-2019Q4的中国季度GDP数据(CME_Qqgdp.xls)重新分析,结果是否有变化?

3. 协整检验与误差修正模型

3.1 协整(cointegration)检验

  1. # 数据读入并作图
  2. oil <- read.zoo("JetFuelHedging.csv", sep = ",", FUN = as.yearmon, format = "%Y-%m", header = TRUE)
  3. par(mfcol=c(1,1))
  4. plot(oil$JetFuel, main = "Jet Fuel and Heating Oil Prices")
  5. lines(oil$HeatingOil, col = "red")
  6. legend("topleft", c("-- Jet Fuel","-- HeatingOil"),
  7. bty="n", text.col = c("black","red"))
  8. # OLS回归,残差平稳
  9. lmoil <- lm(oil$JetFuel ~ oil$HeatingOil)
  10. summary(lmoil)
  11. par(mfcol=c(2,1))
  12. plot(lmoil$residuals)
  13. acf(lmoil$residuals,lag=12)
  14. adf.test(lmoil$residuals)

3.2 误差修正模型(Error correction model,ECM)

Engle and Granger(1987) 指出如果非平稳变量 是协整的,则存在下述误差修正模型:

以美国1年期和3年期两种国债的收益率为例,直接回归下述方程得到的残差 是非平稳的:

  1. # 数据读入并作图
  2. r1=read.table("w-gs1yr.txt",header=T)
  3. r3=read.table("w-gs3yr.txt",header=T)
  4. time=paste(r1$year,r1$mon,r1$day,sep="-")
  5. r=data.frame(time=as.Date(time,format="%Y-%m-%d"),
  6. r1=r1[,4],r3=r3[,4])
  7. head(r)
  8. r$yymm=as.yearmon(r$time)
  9. matplot(x=r$yymm,r[,2:3],type="l",xlab="",ylab="",main="1年期和3年期美国国债利率(%)")
  10. legend(x=1990, y=15, horiz = F, legend=c("1年期","3年期"), lty=1:2, bty="n",
  11. box.lty=0, col=c("black","red"))
  12. # P85, (2-46)式OLS回归,残差非平稳
  13. m1=lm(r3~r1,data=r)
  14. summary(m1)
  15. acf(m1$residuals,lag=12)

根据Tsay(2015),回归下述EMC模型得到平稳残差,表明两种利率之间存在协整关系:

  1. # P88, (2-49)式回归
  2. c1=diff(r$r1)
  3. c3=diff(r$r3)
  4. m3=arima(c3,order=c(0,0,1),xreg=c1,include.mean=F)
  5. m3
  6. tsdiag(m3)
  7. # 与下面的命令结果一致
  8. auto.arima(r$r3,stationary=F, seasonal=F, xreg=r$r1, ic="bic")

3.3 应用:配对交易策略

如果两支股票的对数价格存在以下协整关系:

则通过构造一个线性资产组合 就可以获得平稳收益

一个简单的交易策略为:
1. 假定 ,说明 的价格相对于 被高估,可以在远期市场卖出1单位 的同时买入 单位 ,资产组合的潜在价值为
2. 假定 ,即 相对于 出现价格回落,此时从市场上买入1单位 、同时卖出 单位 ,完成远期合约交割后得到收益

只要 大于交易费用和风险因素等构成的交易成本,就可以通过上述策略获得稳定收益。

课堂讨论:澳大利亚的BHP和巴西的VALE是两家自然资源行业的公司,请以其2002年7月1日到2006年3月31日的数据为例,构造交易策略。

  1. # 读入数据并作图
  2. da=read.table("d-bhp0206.txt",header=T)
  3. da1=read.table("d-vale0206.txt",header=T)
  4. bhp=log(da$adjclose)
  5. vale=log(da1$adjclose)
  6. matplot(data.frame(bhp,vale),type='l')
  7. # OLS估计
  8. regols=lm(bhp~vale)
  9. summary(regols)
  10. acf(regols$residuals) # 残差自相关
  11. # EMC模型
  12. regemc=auto.arima(bhp,stationary=F, seasonal=F, xreg=vale, ic="aic")
  13. regemc
  14. tsdiag(regemc) # 回归结果理想,存在协整关系

4. 其他常用模型

4.1 指数平滑

假设时间序列的序列相关性以指数衰减,其中是贴现因子:


这种预测方法叫做指数平滑法(exponential smoothing method),是ARIMA(0,1,1)模型的特殊情形(详见Tsay(2015)第2.8节)。

  1. # P73-74:
  2. da=read.table("d-vix0810.txt",header=T)
  3. vix=log(da$Close)
  4. m1=arima(vix,order=c(0,1,1))
  5. m1
  6. # stats包中命令回归,结果一样:
  7. vix_holt=HoltWinters(vix, beta=F, gamma=F)
  8. vix_holt$alpha-1

4.2 长记忆(AFRIMA)模型

如果一个时间序列的样本ACF在数值上不大,但衰减得很慢,则该序列可能有长记忆。考虑估计以下模型:

  1. library(fracdiff)
  2. da=read.table("d-ibm3dx7008.txt",header=T)
  3. ew=abs(da$vwretd)
  4. fdGPH(ew)$d # Geweke-Port-Hudak方法估计d
  5. summary(fracdiff(ew,nar=1,nma=1)) # 估计AFRIMA(1,d,1)模型

4.3 模型选择

auto.arima()等命令中,可以选择常用的模型选择标准ic=c("aicc", "aic", "bic")。此外还可以通过forecast::accuracy()命令报告的指标,比较不同模型的回归精度,如:
- ME: Mean Error
- RMSE: Root Mean Squared Error
- MAE: Mean Absolute Error
- MPE: Mean Percentage Error
- MAPE: Mean Absolute Percentage Error
- MASE: Mean Absolute Scaled Error
- ACF1: Autocorrelation of errors at lag 1.

  1. accuracy(reglny)

参考文献

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注