移动平均
移动平均法是用一组最近的实际数据来预测未来一期或几期内目标值的常用方法。移动平均法适用于即期预测,当时间序列不会快速变化,且不存在季节性因素的时候,移动平均法能有效地消除预测中的随机波动,对序列具有修匀或平滑作用。
简单移动平均
是下一期的预测值,代表移动窗口大小,代表的是前n期实际值
公式浅显易懂
缺点也显而易见,历史所有时间点对现在的影响权重都一样
加权移动平均
代表第t期的权重
权重的选择是个分析活,需要根据数据的特点进行选择,考虑数据的时间粒度,是否具有周期性等等。一般来说,近期数据对未来更有预测意义,但是如果近期数据存在异常数据,则预测的时候会出现问题,但是期数变多的话,虽然会使得序列更平滑,但是也使得预测值对数据的实际波动不敏感。
如果序列具有季节性,移动平均的项数N与季节波动长度一致才可以消除季节波动,当序列具有周期性的时候同样道理。
移正平均
移动平均项数k为奇数,其移动平均值为移动平均项数中间一期的数值。如果是偶数,则再需要对相邻两个平均值的移动平均,就能使得平均值对正某一时期了。(对于简单移动平均来说)
很简单的,序列13579,移动平均值就是5
移动平均线
移动平均最常见的使用就是在股市中了,将一定时期内的证券价格(指数)「加以平均」,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标
很有趣的是,可以从股市规律来学习移动平均的数学规律。
「滞后性」
因为移动平均是根据历史数据来计算的,存在一定滞后性,所以有可能错过一些股价变动的信号
「趋势性」
移动平均线最大的特点是能够消除一些季节或周期波动,直观地显示趋势,所以可以从大趋势去进行鞠策
指数加权移动平均
指数加权移动平均(ewma)是以指数级递减加权的移动平均,各数值的权重随时间呈指数式递减,时间越靠近当前时刻的数据加权影响力越大。
ewma与MA的区别是,MA通常是以某个大小的时间窗口去计算,而ewma是计算所有样本的,但是会强调当前样本的重要性,逐渐淡化历史样本的重要程度。
「公式:」
python代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#生成均匀分布数据
data = pd.DataFrame()
data['sample'] = np.random.normal(size=100)
#简单移动平均
data['MA5'] = data['sample'].rolling(window=5).mean()
data['MA10'] = data['sample'].rolling(window=10).mean()
#指数加权移动平均
data['EWMA5'] = data['sample'].ewm(span=5).mean()
data['EWMA10'] = data['sample'].ewm(span=10).mean()
data[['sample','MA5','MA10','EWMA5','EWMA10']].plot(subplots=False, figsize=(12,6), grid=True)
指数平滑
一次指数平滑
当时间序列无明显的趋势变化,可用一次指数平滑预测。
代表t期平滑值
代表平滑常数
代表t-1期实际值
二次指数平滑
一次指数平滑直接利用平滑值作为预测值,二次指数平滑法则利用平滑值对趋势进行修正得到一个线性平滑模型,适用于具有线性趋势的时间序列
,是线性平滑模型参数
是第t期二次指数平滑值
是第t+m期的预测值
m为预测超前期数
三次指数平滑
三次指数平滑是在二次的基础上再平滑
最后这里的则是三次指数平滑法的t+m期预测值
「趋势调整」
一段时间内收集到的数据如果呈现出上升或下降趋势将导致指数预测滞后于实际需求,通过趋势调整,添加趋势修正项,可以在一定程度上改进指数预测效果。
进行趋势调整的指数平滑预测有三个步骤:
1、 利用前面介绍的方法计算第t期的简单指数平滑预测;
2、 计算趋势。其公式为:
其中,
=第t期经过平滑的趋势;
=第t期上期经过平滑的趋势;
b=选择的趋势平滑系数;
=对第t期简单指数平滑预测;
=对第t期上期简单指数平滑预测。
3、计算趋势调整后的指数平滑预测值.计算公式为:
「的确定」
α值是根据时间序列的变化特性来选取的。若时间序列的波动不大,比较平稳,则α应取小一些,如0.1 ~ 0.3 ;若时间序列具有迅速且明显的变动倾向, 则α应取大一些,如0.6 ~ 0.9。实质上,α是一个经验数据,通过多个值进行试算比较而定,哪个α值引起的预测误差小,就采用哪个。
ps:发现网络上都是把三次指数平滑法和holt-winters当同一个东西,但是有的三次指数平滑公式又不一样0-0,稍微查了一下资料,上面的三次指数平滑法是布朗指数平滑。下面的又是另一种。
Holt-Winters
Holt-Winters季节性方法包括预测方程和三个平滑方程-一个水平(level)的,一个趋势方程,一个用于季节性成分 ,具有相应的平滑参数 ,,。我们用表示季节性的频率,即一年中的季节数。例如,对于季度数据L=4,对于每年的中的月则是
「加法模型」
「乘法模型」
其中是数据平滑因子,0 <<1,β是趋势平滑因子,0 是季节变化平滑因子,0 <<1-a(这里是数据平滑因子alpha)。
以加法模型来解释一下几条平滑公式,乘法在意义上是一样的。
首先是,代表的是经过季节修正的观测值()和无季节项预测值()之间的加权平均
趋势方程是基于的估计趋势与上一期估计趋势的加权平均
季节方程是当前季节和上一个季节同期值的加权平均值,我个人对季节项的前半部分理解是独立出季节分量
预测方程的部分下标意思是确保用于预测的季节性指数的估算值来自样本的最后一组观测数据。
初始趋势估计的一般公式为:
为i = 1,2,...,L设置季节性指数的初始估计会涉及更多。如果N是数据中存在的完整循环数(the number of complete cycles),则:
其中为
一个是平均值在个数据的周期。
「衰减模型」
增加阻尼系数作用与趋势,随着预测时间长度的增加而减弱趋势。这通常会提高预测的准确性。
python代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#导入库
from statsmodels.tsa.holtwinters import ExponentialSmoothing
#生成sin数据
data = pd.DataFrame()
a = np.linspace(-10, 10, 100)
b = np.sin(a)
data['sin']=b
train,test = data.iloc[:80,0],data.iloc[79:,0]
model = ExponentialSmoothing(train,seasonal='add',seasonal_periods=31).fit()
pred = model.predict(start=test.index[0],end=test.index[-1])
fig=plt.figure(figsize=(12,6))
plt.plot(train.index,train,label='train')
plt.plot(test.index,test,label='test')
plt.plot(pred.index,pred,label='Holt-Winters')
plt.legend(loc='best')
plt.show()
「seasonal_periods」参数的作用就是季节波动,这里设置的是31,几乎完美拟合曲线
指数平滑法的组合分类
指数平滑法可以通过组合季节或趋势变换成不同的方法
Reference
- https://wiki.mbalib.com/wiki/%E6%8C%87%E6%95%B0%E5%B9%B3%E6%BB%91%E6%B3%95#.EF.BC.88.E4.B8.89.EF.BC.89_.E4.B8.89.E6.AC.A1.E6.8C.87.E6.95.B0.E5.B9.B3.E6.BB.91.E9.A2.84.E6.B5.8B
- https://en.wikipedia.org/wiki/Exponential_smoothing#Triple_exponential_smoothing_(Holt_Winters)
- https://otexts.com/fpp2/taxonomy.html