10实现金融数据的时间序列分析及建模

ARIMA模型

自回归移动平均模型(ARIMA)包含一个确定(explicit)的统计模型用于处理时间序列的不规则部分,它允许不规则部分可以自相关。
数据准备

> library(zoo)
> library(xts)
> library(TTR)
> kings <- scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)
Read 42 items
> kingstimeseries <- ts(kings)
> plot.ts(kingstimeseries)

image.png

数据差分
如果从一个非平稳的时间序列开始, 那么首先就需要做时间序列差分直到得到一个平稳时间序列。如果必须对时间序列做 d 阶差分才能得到一个平稳序列,那么就使用 ARIMA(p,d,q) 模型,其中 d 是差分的阶数。

> kingstimeseriesdiff1 <- diff(kingstimeseries, differences=1)
> plot.ts(kingstimeseriesdiff1)

image.png

从一阶差分的图中可以看出,数据已经是平稳的。如果不平稳就需要继续差分。所以对于英国国王去世年龄时间序列选择 ARIMA(p,1,q) 的模型。
寻找 ARIMA 模型
通常我们需要检查平稳时间序列的自相关图和偏相关图,也就是寻找 ARIMA(p,d,q) 中合适的 p 值和 q 值。

> acf(kingstimeseriesdiff1, lag.max=20)
> acf(kingstimeseriesdiff1, lag.max=20, plot=F)

Autocorrelations of series ‘kingstimeseriesdiff1’, by lag

     0      1      2      3      4      5      6      7      8      9     10 
 1.000 -0.360 -0.162 -0.050  0.227 -0.042 -0.181  0.095  0.064 -0.116 -0.071 
    11     12     13     14     15     16     17     18     19     20 
 0.206 -0.017 -0.212  0.130  0.114 -0.009 -0.192  0.072  0.113 -0.093 
image.png

可以看出在滞后 1 阶的自相关值超出了置信边界,但是其他所有在滞后1-20 阶的自相关值都没有超出置信边界。

> pacf(kingstimeseriesdiff1, lag.max=20)
> pacf(kingstimeseriesdiff1, lag.max=20, plot=F)

Partial autocorrelations of series ‘kingstimeseriesdiff1’, by lag

     1      2      3      4      5      6      7      8      9     10     11 
-0.360 -0.335 -0.321  0.005  0.025 -0.144 -0.022 -0.007 -0.143 -0.167  0.065 
    12     13     14     15     16     17     18     19     20 
 0.034 -0.161  0.036  0.066  0.081 -0.005 -0.027 -0.006 -0.037 
image.png

显示在滞后 1,2 和 3 阶时的偏自相关系数超出了置信边界,为负值,且在等级上随着滞后阶数的增加而缓慢减少。

> library(forecast)
> kings.arima <- arima(kingstimeseries, order=c(1, 2, 3))
> summary(kings, arima)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  13.00   44.00   56.00   55.29   67.75   86.00 

模型预测

> kingsarimaforecast <- forecast(kings.arima, h=5)
> kingsarimaforecast
   Point Forecast    Lo 80    Hi 80    Lo 95     Hi 95
43       66.86843 47.05546 86.68139 36.56711  97.16974
44       69.46189 48.05746 90.86632 36.72664 102.19714
45       69.33508 47.11732 91.55285 35.35594 103.31423
46       69.79963 46.62460 92.97466 34.35648 105.24278
47       70.13562 46.03435 94.23689 33.27591 106.99533
> plot(kingsarimaforecast)

image.png

模型误差检验
在指数平滑模型下, 观察 ARIMA 模型的预测误差是否服从零均值、方差不变的正态分布,同时也可以观察连续预测误差是否(自)相关。 同时对国王去世年龄使用 ARIMA(1,1,3) 模型后所产生的预测误差做(自)相关图,和 Ljung-Box 检验

acf(kingsarimaforecast$residuals, lag.max=20)
image.png
> Box.test(kingsarimaforecast$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  kingsarimaforecast$residuals
X-squared = 10.141, df = 20, p-value = 0.9655

ARIMA 模型自动预测

> kings.arima1 <- auto.arima(kingstimeseries)
> summary(kings.arima1)
Series: kingstimeseries 
ARIMA(0,1,1) 

Coefficients:
          ma1
      -0.7218
s.e.   0.1208

sigma^2 estimated as 236.2:  log likelihood=-170.06
AIC=344.13   AICc=344.44   BIC=347.56

Training set error measures:
                    ME     RMSE      MAE       MPE    MAPE      MASE       ACF1
Training set 0.9712931 14.99836 11.92162 -10.40664 29.5176 0.7496724 0.05350284
> kings.arima_new <- arima(kingstimeseries, order=c(0, 1, 1))
> summary(kings.arima_new)

Call:
arima(x = kingstimeseries, order = c(0, 1, 1))

Coefficients:
          ma1
      -0.7218
s.e.   0.1208

sigma^2 estimated as 230.4:  log likelihood = -170.06,  aic = 344.13

Training set error measures:
                    ME     RMSE      MAE       MPE    MAPE      MASE       ACF1
Training set 0.9712931 14.99836 11.92162 -10.40664 29.5176 0.7496724 0.05350284
> kingsarimaforecast <- forecast(kings.arima_new, h=5)
> kingsarimaforecast
   Point Forecast    Lo 80    Hi 80    Lo 95     Hi 95
43       67.75063 48.29647 87.20479 37.99806  97.50319
44       67.75063 47.55748 87.94377 36.86788  98.63338
45       67.75063 46.84460 88.65665 35.77762  99.72363
46       67.75063 46.15524 89.34601 34.72333 100.77792
47       67.75063 45.48722 90.01404 33.70168 101.79958
> plot(kingsarimaforecast)
image.png
> acf(kingsarimaforecast$residuals, lag.max=20)
image.png
> Box.test(kingsarimaforecast$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  kingsarimaforecast$residuals
X-squared = 13.584, df = 20, p-value = 0.8509

指数平滑模型

它对时间序列上面连续的值之间相关性没有要求,指数平滑法可以用于时间序列数据的短期预测。
简单指数平滑法
适用于没有季节性变化且处于恒定水平以及没有明显趋势的时间序列的预测。
获取数据(数据来源为伦敦每年降雨量),通过 ts 函数转换为时间序列.。

> rain <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1)
Read 100 items
> rainseries <- ts(rain, start=c(1813))
> plot.ts(rainseries)
image.png
> rainseriesHW <- HoltWinters(rainseries, beta=F, gamma=F)
> plot(rainseriesHW)
image.png

预测未来 5 年的降水量

> library(forecast)
> rainseriesforecasts <- forecast(rainseriesHW, h=5)
> plot(rainseriesforecasts)
image.png

蓝线是预测 1913-1920 间的降雨量,深灰色阴影区域为 80% 的预测区间,浅灰色阴影区域为 95% 的预测区间。 forecast 提供了预测误差的统计指标(residuals),来评估预测是否有改进的可能性:如果预测误差是相关的,则很可能是简单指数平滑预测可以被另外一种预测技术优化。

> acf(rainseriesforecasts$residuals[!is.na(rainseriesforecasts$residuals)], lag.max=20, plot=T)
image.png

可以发现自相关系数在第 3 期的时候达到了置信界限。为了验证在滞后 1-20 阶时非 0 自相关属性是否显著,可以借助 Box.test() 的 Ljung-Box检验。

> Box.test(rainseriesforecasts$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  rainseriesforecasts$residuals
X-squared = 17.401, df = 20, p-value = 0.6268

统计量为 17.4,并且 P 值是 0.626 这样的值不足以拒绝预测误差在 1-20 阶是非零自相关。
霍尔特指数平滑法
霍尔特指数平滑法可以用于非恒定水平,没有季节性可相加模型的时间序列预测。 霍尔特指数平滑法是估计当前时间的水平和斜率。其平滑水平是由两个参数控制,alpha:估计当前点水平,beta:估计当前点趋势部分斜率。两个参数都介于 0-1 之间,当参数越接近 0,大部分近期的观测值的权值将较小。 数据来源是 1866 年到 1911 年每年女士裙子直径,将数据通过 ts 函数转换为时间序列,并画出时序图。

> skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
Read 46 items
> skirtsseries <- ts(skirts, start=c(1866))
> plot.ts(skirtsseries)
image.png
> skirtsseriesHW <- HoltWinters(skirtsseries, gamma=F)
> skirtsseriesHW
Holt-Winters exponential smoothing with trend and without seasonal component.

Call:
HoltWinters(x = skirtsseries, gamma = F)

Smoothing parameters:
 alpha: 0.8383481
 beta : 1
 gamma: FALSE

Coefficients:
        [,1]
a 529.308585
b   5.690464
> plot(skirtsseriesHW)
image.png

相关预测值中 alpha 值为 0.8383,beta预测值为 1.0,这些都是非常高的值,充分显示了无论是水平上还是趋势的斜率上,当前值对时间序列上的最近的观测值的依赖关系比较重,这样的结果也符合我们的预期,因为时间序列的水平和斜率在整个时间段内发生了巨大的变化。 总体来看,预测的效果也还不错(红色为预测值)。
预测未来 5 年的数据值,并画出预测结果。

> skirtsseriesforecasts <- forecast(skirtsseriesHW, h=5)
> plot(skirtsseriesforecasts)
image.png

为了检验预测效果,我们同样检验延迟 1-20 阶中的预测误差是否非零自相关,继续采用 Ljung-Box 检验。

> acf(skirtsseriesforecasts$residuals[!is.na(skirtsseriesforecasts$residuals)], lag.max=20, plot=T)
image.png

相关图呈现样本内预测误差在滞后 5 阶时超过置信边界,其他都没有超过,我们认为存在一定的偶尔因素。

> Box.test(skirtsseriesforecasts$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  skirtsseriesforecasts$residuals
X-squared = 19.731, df = 20, p-value = 0.4749

p =0.4749,意味着置信度只有 53% 这样的值不足以拒绝预测误差在 1-20 阶是非零自相关,则我们接受预测误差在 1-20 阶是非零自相关的。
Holt-Winters 指数平滑法
有增长或者降低趋势并且存在季节性波动的时间序列的预测方法。 Holt-Winters 算法中提供了 alpha、beta 和 gamma 来分别对应当前点的水平、趋势部分和季节部分,参数的去执法范围都是 0-1 之间,并且参数接近 0 时,近期的观测值的影响权重就越小。 数据来源是澳大利亚昆士兰州海滨纪念商品的月度销售日子做为分析对象,将数据通过 ts 函数转换为时间序列,并画出时序图。

> souvenir <- scan("http://robjhyndman.com/tsdldata/data/fancy.dat")
Read 84 items
> souvenirtimeseries <- ts(souvenir, frequency=12, start=c(1987, 1))
> plot.ts(souvenirtimeseries)
image.png

可以通过取对数来减少极值带来的影响,消除方差不齐。

> logsouvenirtimeseries <- log(souvenirtimeseries)
> plot.ts(logsouvenirtimeseries)
image.png
> souvenirtimeseriesHW <- HoltWinters(logsouvenirtimeseries)
> plot(souvenirtimeseriesHW)
image.png

通过 forecast 包来预测未来 12 个月的销售数据,并画出预测结果

> souvenirtimeseriesforecasts <- forecast(souvenirtimeseriesHW, h=12)
> plot(souvenirtimeseriesforecasts)
image.png

模型非常成功得预测了季节峰值,峰值大约发生在每年的 12 月份。 还可以通过画相关图和进行 Ljung-Box 检验来检查样本内预测误差在延迟 1-20 阶时否是非零自相关的,并以此确定预测模型是否可以再被优化。

> acf(souvenirtimeseriesforecasts$residuals[!is.na(souvenirtimeseriesforecasts$residuals)], lag.max=20, plot=T)
image.png

相关图显示出在滞后 1-20 阶中样本自相关值都没有超出显著(置信)边界。

> Box.test(souvenirtimeseriesforecasts$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  souvenirtimeseriesforecasts$residuals
X-squared = 17.53, df = 20, p-value = 0.6183

Ljung-Box 检验的 p 值为 0.6183,所以我们推断在滞后 1-20 阶中没有明显证据说明预测误差是非零自相关的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 时间序列分析研究的是按时间顺序收集的数据。相邻的观测数据通常相互依赖。因此,时间序列分析的技术需要处理这种相依性。...
    Jachin111阅读 983评论 0 0
  • 来源:yv.l1.pnn - kesci.com原文链接:时间序列分析入门,看这一篇就够了 点击以上链接👆 不用配...
    91160e77b9d6阅读 1,782评论 0 2
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,523评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,810评论 4 1
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,564评论 0 11