时间序列预测基本方法:移动平均(SMA,EMA,WMA)

移动平均作为时间序列中最基本的预测方法,计算简单却很实用。不仅可以用来做预测,还有一些其他的重要作用,比如平滑序列波动,揭示时间序列的趋势特征。

移动平均简而言之即使用前n个时刻的观测值来预测下一个时刻的取值。移动平均可以分为简单移动平均、加权移动平均、指数移动平均等。注意:移动平均用于预测场景时,尤其是多步预测,需要要求序列相对平稳,没有趋势、季节性的情况。

问题公式化

给定一个时间序列{Xt},观测值序列为:x1,x2,…,xt
xt+1为可预测为前n项的平均值,即xt+1=E({xt-n+1,xt-n+2,…,xt}),n表示窗口大小需要往前推多少时刻。

移动平均能够去除时间序列的短期波动,使得数据变得平滑,从而可以方便的看出序列的趋势特征。原序列波动较大,经过移动平均后,随机波动会明显减少,窗大小n越大,平滑后波动越小,滞后越明显。

简单移动平均(Simple Moving Average,SMA)

SMAtSMA_tSMAt​(n)(n)(n) = 1n\frac{1}{n}n1​ ∑i=t−n+1t\textstyle\sum_{i=t-n+1}^t∑i=t−n+1t​ xnx_nxn​
nnn是窗口大小,SMAtSMA_tSMAt​表示ttt时刻的移动平均值

SMA案例代码

# 导包
import numpy as np
from pandas import read_csv
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
df = pd.read_csv('household_power_consumption_days.csv', sep=',', header=0,usecols=[0,1],parse_dates={'date':[0]},index_col=['date'])
# 真实数据列'Global_active_power'
real = df['Global_active_power']# 取前6个时刻的数据预测下一时刻的数据
rolling = df['Global_active_power'].rolling(window=6)
rolling_mean = rolling.mean()# 查看真实数据的维度和预测数据的维度
print("real Shape-- ",real.shape)#(1442,)
print("rolling_mean Shape-- ",rolling_mean.shape)#(1442,)

预测结果可视化

# 取最后258个时刻的数据绘图
plt.plot(real[-260:-2], color = 'red', label = 'Real')
plt.plot(rolling_mean[-260:-2], color = 'blue', label = 'Predicted')
plt.xlabel('Time')
plt.legend()
plt.show()

计算误差

real = real[-260:-2]
pred = rolling_mean[-260:-2]from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
# 计算误差
mae = mean_absolute_error(pred,real)
mse = mean_squared_error(pred,real)
print("MAE:",mae) # MAE: 218.50487338501293
print("MSE:",mse) # MSE: 90166.86320972697

加权移动平均(Weighted Moving Average,WMA)

与SMA类似,但是在计算平均数时不是等量齐观的,可以给最近的观测值相对历史观测值更大的权重。比容,最近的用电量对预测日最有影响力,历史用电量随着时间拉长影响力越小。
WMAtWMA_tWMAt​(n)(n)(n) = w1xt+w2xt−1+...+wn−1xt−n+2+xt−n+1w1+w2+...+wn\frac{ w_1x_t+w_2x_t-1+...+w_n-1x_t-n+2+x_t-n+1 }{w_1+w_2+...+w_n}w1​+w2​+...+wn​w1​xt​+w2​xt​−1+...+wn​−1xt​−n+2+xt​−n+1​
nnn是窗口大小,WMAtWMA_tWMAt​表示ttt时刻的移动平均值。
权重系数为n到0n到0n到0,即最近的一个数值权重为nnn,次近的为n−1n-1n−1,以此类推,直到000。
WMAtWMA_tWMAt​(n)(n)(n) = nxt+(n−1)xt−1+...+2xt−n+2+xt−n+1n+(n−1)+...+2+1\frac{nx_t+(n-1)x_t-1+...+2x_t-n+2+x_t-n+1 }{n+(n-1)+...+2+1}n+(n−1)+...+2+1nxt​+(n−1)xt​−1+...+2xt​−n+2+xt​−n+1​

WMA案例代码

# 导包
import numpy as np
from pandas import read_csv
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
df = pd.read_csv('household_power_consumption_days.csv', sep=',', header=0,usecols=[0,1],parse_dates={'date':[0]},index_col=['date'])
# 真实数据列'Global_active_power'
real = df['Global_active_power']# 权重函数
def WMA(close, n):weights = np.array(range(1, n+1))sum_weights = np.sum(weights)res = close.rolling(window=n).apply(lambda x: np.sum(weights*x) / sum_weights, raw=False)return res# 取前6个时刻的数据加权预测下一时刻的数据
df['WMA'] = WMA(df['Global_active_power'],6)
rolling_mean = df['WMA']# 查看真实数据的维度和预测数据的维度
print("real Shape-- ",real.shape)#(1442,)
print("rolling_mean Shape-- ",rolling_mean.shape)#(1442,)

预测结果可视化

# 取最后258个时刻的数据绘图
plt.plot(real[-260:-2], color = 'red', label = 'Real')
plt.plot(rolling_mean[-260:-2], color = 'blue', label = 'Predicted')
plt.xlabel('Time')
plt.legend()
plt.show()

计算误差

real = real[-260:-2]
pred = rolling_mean[-260:-2]from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
# 计算误差
mae = mean_absolute_error(pred,real)
mse = mean_squared_error(pred,real)
print("MAE:",mae) # MAE: 181.05885714285714
print("MSE:",mse) # MSE: 66044.51492577454

指数移动平均(Exponential Moving Average,EMA)

可以看成一种特殊的加权移动平均,也称为指数加权移动平均(EWMA)。与WMA类似,它为以前的数值分配了一系列固定的指数递减权重,即权重系数随着时间呈指数下降。EMA提供了一个更明显的指标,能更快地反映最近的趋势。

EMAtEMA_tEMAt​ = xt+(1−α)xt−1+(1−α)2xt−2...+(1−α)tx01+(1−α)+(1−α)2+...+(1−α)t\frac{x_t+(1-\alpha)x_t-1+(1-\alpha)^2x_t-2...+(1-\alpha)^tx_0}{1+(1-\alpha)+(1-\alpha)^2+...+(1-\alpha)^t}1+(1−α)+(1−α)2+...+(1−α)txt​+(1−α)xt​−1+(1−α)2xt​−2...+(1−α)tx0​​
ttt是窗口大小,0<α<=10<\alpha<=10<α<=1为平滑因子,(1-\alpha)^i为呈指数增加的权重,期数离预测时刻越近权重越大。

EMA案例代码

# 导包
import numpy as np
from pandas import read_csv
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
df = pd.read_csv('household_power_consumption_days.csv', sep=',', header=0,usecols=[0,1],parse_dates={'date':[0]},index_col=['date'])
# 真实数据列'Global_active_power'
real = df['Global_active_power']# 指数函数,取前6个时刻的数据加权预测下一时刻的数据
df['EMA'] = df['Global_active_power'].ewm(span=6,min_periods=6).mean()
rolling_mean = df['EMA']# 查看真实数据的维度和预测数据的维度
print("real Shape-- ",real.shape)#(1442,)
print("rolling_mean Shape-- ",rolling_mean.shape)#(1442,)

预测结果可视化

# 取最后258个时刻的数据绘图
plt.plot(real[-260:-2], color = 'red', label = 'Real')
plt.plot(rolling_mean[-260:-2], color = 'blue', label = 'Predicted')
plt.xlabel('Time')
plt.legend()
plt.show()

计算误差

real = real[-260:-2]
pred = rolling_mean[-260:-2]from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
# 计算误差
mae = mean_absolute_error(pred,real)
mse = mean_squared_error(pred,real)
print("MAE:",mae) # MAE: 178.27270483176076
print("MSE:",mse) # MSE: 62814.68751826136

SMA:权重系数一致;

WMA:权重系数随时间间隔线性递减;

EMA:权重系数随时间间隔指数递减。

参考文献:

https://zhuanlan.zhihu.com/p/430537478

【时间序列】时间序列预测基本方法:移动平均(SMA,EMA,WMA)相关推荐

  1. 简单易用 炒股必看的时序预测基本方法--移动平均(SMA、EMA、WMA)

    来源:TimeSeries 移动平均作为时间序列中最基本的预测方法,计算虽简单但却很实用.不仅可以用于预测,还有一些其他的重要作用,比如平滑序列波动,揭示时间序列的趋势特征. 时间序列预测 移动平均就 ...

  2. 时间序列分析 - 移动平均SMA, EMA(EWMA) 之python

    pandas: pandas.DataFrame.rolling pandas.DataFrame.ewm pandas.DataFrame.mean 其中rolling可以指定窗口类型win_typ ...

  3. 股票指标SMA EMA WMA...

    原理转载于:http://www.cnblogs.com/xiaobajiu/p/7066490.html 一.函数简介 MA(x,n)-移动平均,是最简单的n日内的平均值 SMA(x,n,m)-简单 ...

  4. 【数据分析】基于时间序列的预测方法(2021-01-08)时间序列预测

    时间序列预测 目录 时间序列预测 1.时间序列介绍 2.原始数据集 3.导入数据 4.检测时间序列的平稳性 5.如何使时间序列平稳 5.1 估计和消除趋势 5.1.1 对数转换 5.1.2 移动平均 ...

  5. 【数据分析】基于时间序列的预测方法

    时间序列预测 目录 时间序列预测 1.时间序列介绍 2.原始数据集 3.导入数据 4.检测时间序列的平稳性 5.如何使时间序列平稳 5.1 估计和消除趋势 5.1.1 对数转换 5.1.2 移动平均 ...

  6. 【统计学】【2018.05】【含源码】时间序列:以密度预测评价方法为中心的预测与评价方法

    本文为挪威卑尔根大学(作者:Therese Grindheim)的硕士论文,共113页. 本文的研究重点是密度预测和相应的评价方法.密度预测是对预测值概率密度的估计.密度预测及相关的评价方法与点.区间 ...

  7. java三次指数平滑_时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)

    所有移动平均法都存在很多问题. 它们都太难计算了.每个点的计算都让你绞尽脑汁.而且也不能通过之前的计算结果推算出加权移动平均值. 移动平均值永远不可能应用于现有的数据集边缘的数据,因为它们的窗口宽度是 ...

  8. 深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战 神经网络(neual networks)是人工智能研究领域的一部分,当前最流行的神经网络 ...

  9. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息...

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

  10. keras时间序列数据预测_使用Keras的时间序列数据中的异常检测

    keras时间序列数据预测 Anomaly Detection in time series data provides e-commerce companies, finances the insi ...

最新文章

  1. 生产环境 JVM 内存溢出案例分析
  2. 图像生成之扩散模型:靠加入类别条件,效果直达SOTA
  3. Matlab-创建文字云
  4. 【边缘检测】RCF: Richer Convolutional Features for Edge Detection
  5. 新款ATM恶意软件Alice 可对抗动态分析 但目前需要物理接触主机
  6. 关于猿如何找对象,心里没点那啥数吗?
  7. jmeter安装包_分布式执行jmeter脚本步骤(非GUI)
  8. 设计模式学习笔记0——概念
  9. 十大笔记本品牌型号命名规则【联想】
  10. mustache.js html模板,js模板引擎Mustache将h5模板页面转化为小程序页面
  11. 基金买入两天可以卖出吗?
  12. 电商常用字体_字体商用有风险,侵权罚款上千万!告诉你怎么正确使用
  13. PCD Lesson2:PCD文件的write
  14. php 请求 响应,发送http响应后继续处理php
  15. 51单片机原理以及接口技术(一)-单片机发展概述
  16. MineCraft建模工具
  17. 计算机组成原理课程笔记
  18. Windows环境下配置Ceres(带suitesparse-metis)
  19. vue之猫眼json数据的获取直接用于自己的vue项目中,swiper轮播插件的坑
  20. ffmpeg学习日记17-获取MP4视频流的帧率

热门文章

  1. 2020最新微信小程序学习资源汇总,包括文档、视频、系列教程、开源项目、框架!
  2. laravel8+ 微信小程序生成二维码
  3. 如何通过 SSH 连接到 Docker 容器
  4. 端口错误 给Arduino下载程序提示
  5. [量化学院]机器学习有哪些常用算法
  6. 转dmg 到iso。。。
  7. openlayer4 加载arcgis rest 服务
  8. 最新四端同步苹果cms影视影视源码
  9. 偏向锁理论太抽象,实战了解下偏向锁如何发生以及如何升级【实战篇】
  10. 反编译PyInstaller打包后的exe为py源码