有什么好的模型可以做高精度的时间序列预测呢？
 最近工作涉及风速预测和风电功率预测，看了一些论文，稍作总结。 风电场以10min为间隔采集的风力数据（不同高度的风速，风向），为了提高风电并网效率，需要提前预测风速和风电功率。这显然是一个时间序列预测问题，但直接用ARIMA模型时效果不佳。 以前做过预测商店营业额和预测打车订单，细细想来和预测风速有很大不同。下面先简要阐述这两类时间序列问题的差异。从形成机制上讲，商店营业额和打车订单是由人的行为驱动的，风是由自然因素驱动的，后者的稳定性更差。 预测人群的行为相对来说更简单，理由有三： 因而，营业额和打车订单可以看成大量的独立随机变量之和，波动性不大，呈现出明显的周期。此外，商业数据一般有一个趋势，与公司处于发展期，稳定期或者衰减期相对应。以发展期为例，对数函数、线性函数或指数函数往往能较好拟合趋势。节假日效应在预期之中，比如情人节鲜花销量会明显增加，其变化幅度可以参考历史信息。 再回到风速预测，其难点主要有： 以上主要讨论了两种序列的特点，一种由人为因素驱动（内在机理比较清楚），一是自然因素驱动（内在机理难以刻画）。搞清楚数据产生机制很重要，不仅对于理解数据背后的意义，还可以指导我们选取合适的模型。 下面主要介绍时间序列建模的常见方法。 ARMA 模型是时间序列分析中描述平稳时间序列自相关性的典型方法。ARIMA(p, d, q)模型是对 ARMA(p, q)模型的扩展。它通过 d 阶差分将非平稳时间序列转化为平稳时间序列，然后再建立ARMA(p, q)模型: \\y(t)=\sum_{i=1}^p\phi_iy(t-i)+\sum_{j=1}^q\theta_je(t-j)+e(t) 当残差序列通过白噪声检验，就表示建立了一个合理的ARMA模型。如果不仅要预测值，还要给出置信区间，则需要对残差的平方进行白噪声检验。如果残差的平方未通过白噪声检验，说明存在异方差，一般通过GARCH模型进一步提取残差信息： e(t)=\epsilon(t)\sqrt{h(t)}\\ h(t)=\sum_{i=1}^n\alpha_i e^2(t-i)+\sum_{j=1}^m\beta_j h(t-j)+C 最终通过 \hat{y}(t) 和 \hat{h}(t) 给出置信区间。 如果存在异方差，更合理的做法应该是联合ARIMA-GARCH模型，一起估计参数，但这样参数估计难度较大。 预测 t 时刻的值，可以利用 t 时刻之前的数据构造特征，然后用SVM，LSTM，Gaussian Process等模型训练。 模型性能取决于输入的特征。关于构造特征，可以参考我的另一个问答：特征工程到底是什么？ 将时间序列分解为周期项（Season），趋势项（Trend），节假日项（holiday）等。 \\y(t) = g(t)+s(t)+h(t)+\epsilon_t 其中， g(t) 是非周期的趋势项， s(t) 是周期项， h(t)  是节假日效应。Facebook开源的prophet就是通过这样的分解来训练模型。 需要特别指出，STH分解不是将数据分解为几部分再分别拟合，而是将模型写成三部分之和（根据数据的内在机理），再去拟合实际数据求解模型参数。模型怎么写，涉及到哪些参数，这是由对问题和数据的理解决定的。比如，趋势项和周期项之间可能是乘法关系：值越大，周期内的振幅越大，此时可以先求对数再用加法模型拟合。 prophet论文地址：Forecasting at Scale 利用信号处理的方法，将时间序列分解为高频和低频信号。这和上面的方法有本质上的不同，STH分解的是模型而不是数据。对于分离后的信号，再用ARIMA等模型拟合。最后，将各个部分的预测值叠加或重构，就得到预测值。整个过程分为三步：分解、训练模型并预测，重构。 常见的分解的方法有下面四种： 以小波分解和为例，其算法架构为： FT在整个时域上分解信号，但风速所包含的频率往往随着时间变化（与每一次风的成因有关系），因此实际使用中多用对时域自适应的小波分解。在实际应用中EMD可能存在模态混叠现象，分离后的信号包含多个频率，影响精度。近几年，VMD方法（这个还没看懂）也引起了不小的关注。 想法：将时间序列数据分为线性项（L）和非线性项（N），再拟合。 \\y(t) = L(t)+N(t) L(t) 表示线性项，可以通过滑动平均（moving average）提取。 \\ L(t) = \frac{1}{m} \sum_{t-m+1}^{t}y(i) 通过调节 m 使线性部分 L(t) 满足正态性，然后用ARIMA模型拟合。 对于非线性部分 N(t)=y(t)-L(t) ，可以用非线性核方法或者神经网络训练等非线性方法拟合。 最后，将两部分模型的预测值相加。更好的办法是利用线性部分的预测值 \hat{L}(t) 、非线性部分的历史值 (N(t-p),\cdots,N(t-1)) 和原始数据 (y(t-q),\cdots,y(t-1)) 作为特征，训练一个非线性模型来拟合 y(t) : \\y(t) = f(N(t-p),\cdots,N(t-1),\hat{L}(t),y(t-q),\cdots,y(t-1)) 一种算法架构： 论文地址：Improving forecasting accuracy of time series data using a new ARIMA-ANN hybrid method and empirical mode decomposition  时间序列预测是一个复杂的问题，没有Silver Bullet，一招管用。