#平滑法框架
#滑动平均法函数
#霍尔特指数平滑法spa
#霍尔特-温特指数平滑法code
#平滑法应用场景数学
#简单移动平滑(Single Moving Average)io
#指数平滑(Exponential Moving Average)ast
附件是数据
滑动平均法
处于恒定水平和没有季节性变更的时间序列
霍尔特指数平滑法
有趋势性但没有季节性因素的时间序列
霍尔特-温特指数平滑法
有趋势性且有季节性变更趋势的时间序列
理论上能够针对数据产生的机理构建动态模型,其实是根据数据扰动项之间相关性结构构建预测模型
优势:该方法在一个统一的框架下适用与全部的时间序列
缺点:模型造成须要基于知识和经验断定
滑动平均法
霍尔特指数平滑法
霍尔特-温特指数平滑法
简单移动平滑(Single Moving Average)
简单移动平均认为最近 N 期的数据对当前数据有预测做用,并且认为这 N 期数据的影响大小是相等的
数学表达式
n表示移动平均的期数,n越长,拟合曲线越平滑;n越短,对近期变化越敏感
指数平滑(Exponential Moving Average)
指数平滑认为最近各期的影响权重会随着时间间隔的变大而呈现指数衰减
数学表达式
平滑系数α设定较大时,近期数据的权重变大,适合预测对近期敏感的时间序列数据,而α设定较小时则适合变化缓慢的时间序列数据, α的经验值为0.05到0.3之间
简单的移动平滑和指数平滑法案例
#简单的移动平滑和指数平滑法 #股票预测案例 > library(TTR) > data(ttrc)#股票数据 #SMA() 表示简单的移动平滑 > SMA(1:5,n=3) # n=3 表示平均移动的期数3 [1] NA NA 2 3 4 #EMA() 表示指数平滑 > EMA(1:5,n=3,ratio = 0.2) # ratio表示系数α,例如最后一个预测数据根据公式等于2.92 = 5.0*0.2+2.40*2.92 [1] NA NA 2.00 2.40 2.92 > sma.20 <-SMA(ttrc[,"Close"], 20) #去前面的20期作平滑统计 > tail(sma.20) #获取向量、矩阵、表、数据框架或函数或最后一个部分,head()开头部分 [1] 51.6855 51.6930 51.7640 51.8470 51.8945 51.9440 > plot.ts(sma.20) #以下图
当 不考虑周期性时,而且当数据有 向上或向下的线性趋势时,可使用 霍尔特指数平滑法(Holt Exponential Moving Average)进行预测
这种方法是指数平滑方法中的一种,其认为序列是存在一个较固定的趋势γ,那么第 t 期的估计值应该为第 t-1 期的观测值加上固定趋势的影响
每一期的固定趋势会受到随机因素的影响不恒等于r,因此r自己是一个随机序列:
加入平滑系数 𝛼 获得第 t 期的平滑值为:
因为r自己是一个随机序列,天然也能够被平滑:
𝑟_𝑡称为趋势序列,因此霍尔特指数平滑法是含有两个参数α和β的平滑方法
当时间序列 除了趋势性以外,还表现出 明显的周期性或季节性时,可使用 霍尔特温特指数平滑法(HoltWinters)进行预
HoltWinters来源于Holt指数平滑法,在其基础上增长了季节项,而季节效应可分为累加与累积两种
累加公式以下
累积公式以下
二者比较
霍尔特温特指数平滑法案例
#方式一 > par(mfrow = c(2,1)) > tsHW <- HoltWinters(tsdata)#霍尔特温特指数平滑法默认是累加的 > plot(tsHW) #下图中上部分 > tsHW <- HoltWinters(tsdata,seasonal = 'multi') #默认是累加的,这里用累乘的方法 > plot(tsHW) #下图中下部分,红色线是预测值,蓝色是置信区间 > tsHW.Pred<-predict(tsHW,12, prediction.interval = TRUE) #模型进行预测 predict()等于调用predict.HolWinters()进行预测 #prediction.interval = TRUE 给出预测区 #12表示预测 12个月 > tsHW.Pred fit upr lwr Jan 1961 447.0559 466.8057 427.3061 Feb 1961 419.7123 440.2920 399.1326 Mar 1961 464.8671 486.7712 442.9630 Apr 1961 496.0839 519.3350 472.8329 May 1961 507.5326 531.9278 483.1375 Jun 1961 575.4509 602.1935 548.7083 Jul 1961 666.5923 696.5558 636.6288 Aug 1961 657.9137 688.6454 627.1821 Sep 1961 550.3088 578.9777 521.6398 Oct 1961 492.9853 520.9553 465.0153 Nov 1961 420.2073 446.9458 393.4688 Dec 1961 465.6345 487.9686 443.3004 > plot(tsHW,tsHW.Pred)
#方式二:使用 forecast包中的 hw方法() > library(forecast) > par(mfrow = c(2,1)) > plot(hw(tsdata,h = 12)) #以下图上部分 > plot(hw(tsdata,seasonal='multi',h = 12)) #以下图下部分