• 这篇文章主要讨论以下两个问题:
  1. 时间序列与回归的区别与联系
  2. 确定性时间序列的模型

1.时间序列与回归的区别与联系

1.1 联系
  • 都是通过学习过去的数据,预测未来数据,如房价预测。且同样都只能用于短期预测。
  • 都考虑到数据的随机性和噪声的影响
    如线性回归模型 时间序列线性回归模型python 时间序列回归方程求解_递推
    时间序列模型 (待补充)
1.2 区别
  • 最直观的一点,在回归中 时间序列线性回归模型python 时间序列回归方程求解_数学建模_02是由X预测的,通常有一个时间序列线性回归模型python 时间序列回归方程求解_数学建模_03
    而在时间序列中 时间序列线性回归模型python 时间序列回归方程求解_数学建模_02是由时间序列线性回归模型python 时间序列回归方程求解_matlab_05时间序列线性回归模型python 时间序列回归方程求解_时间序列_06等,即过去的时间序列线性回归模型python 时间序列回归方程求解_时间序列_07值预测的,通常是一个递推式
  • 独立性:(待补充)

2.确定性时间序列模型

2.1移动平均法(SMA,Simple Moving Average)

  • 适用条件:预测对象的基本趋势是在某一水平上下波动

1

2

3

4

5

6

51.3

60.5

52.6

56.2

54.2

56.0

7

8

9

10

11

12

51.0

59.2

54.9

52.2

60.3

57.6

2.1.1一次移动平均

递推式:时间序列线性回归模型python 时间序列回归方程求解_时间序列_08
这很直观,时间序列线性回归模型python 时间序列回归方程求解_数学建模_09时刻的时间序列线性回归模型python 时间序列回归方程求解_时间序列_10由之前
的N个数据决定,且每个数据的权重都是时间序列线性回归模型python 时间序列回归方程求解_matlab_11,即取算术平均值


代码:

%matlab
y=[51.3,60.5,52.6,56.2,54.2,56.0,51.0,59.2,54.9,52.2,60.3,57.6];
N=4;m=size(y,2);S=0;
S=sum(y(1:N));
y_predict=zeros(1,m);
error=0;
for i=N+1:m
    y_predict(i)=S/N;
    error=error+(y_predict(i)-y(i))^2;
    S=S+y(i)-y(i-N);
end
MSE=(error/(m-N))^0.5;

MSE=3.2520

可视化

时间序列线性回归模型python 时间序列回归方程求解_数学建模_12


2.1.2二次移动平均

(待补充)


2.2 指数平均(EMA,Exponational Moving Average)

2.2.1一次指数平均(对于SMA权值的改进)

适用条件:仍是预测对象的基本趋势是在某一水平上下波动,但是注意一次移动平均法历史数据的权值都是1/N,而一次指数平滑是年份越近的权值越大,这很符合我们直觉上的理解,即越近的年份影响越大


递推式时间序列线性回归模型python 时间序列回归方程求解_matlab_13
原理:首先定义一次指数平均为时间序列线性回归模型python 时间序列回归方程求解_数学建模_14则递推可得时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_15
再令时间序列线性回归模型python 时间序列回归方程求解_matlab_16
时间序列线性回归模型python 时间序列回归方程求解_matlab_17
“指数平均”由式(5)得名

注意一下两点:

  • 历史的数据权重越近的越大,根据式(5),即要预测t+1年,则t年的权值为时间序列线性回归模型python 时间序列回归方程求解_matlab_18,t-1年为时间序列线性回归模型python 时间序列回归方程求解_数学建模_19……,t-j年为时间序列线性回归模型python 时间序列回归方程求解_数学建模_20,权值递减且易证和为1
  • alpha 的选择:
  • 当数据比较平稳时,时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_21取小一点。因为t-j年为时间序列线性回归模型python 时间序列回归方程求解_数学建模_22,小的时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_21能让比较早的数据依然有较大的比重。
  • 当数据波动比较大时,近期的数据比较重要,所以时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_21取大一点,大的时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_21能让比较近的数据有较大的比重,远的数据比重很小。
  • 也可对多个时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_21测试,选择MSE最小的时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_21

代码

y=[51.3,60.5,52.6,56.2,54.2,56.0,51.0,59.2,54.9,52.2,60.3,57.6];
MSE_min=inf; m=size(y,2);
y_predict=zeros(1,m);
y_predict(1)=(y(1)+y(2))/2;% 取初值
for alpha=[0.1,0.3,0.5,0.7]
    error=0;
    for i=2:m
        y_predict(i)=alpha*y(i-1)+(1-alpha)*y_predict(i-1);
        error=error+(y_predict(i)-y(i))^2;
    end
    MSE=(error/(m-N))^0.5;
    if MSE<MSE_min
        MSE_min=MSE;
        alpha_opt=alpha;
    end
end

MSE=3.8220

可视化

时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_28

  • 可以看到时间序列线性回归模型python 时间序列回归方程求解_matlab_29时间序列线性回归模型python 时间序列回归方程求解_时间序列_07滞后了一个时间单位,其实从公式(1)可以就看出时间序列线性回归模型python 时间序列回归方程求解_数学建模_02时间序列线性回归模型python 时间序列回归方程求解_matlab_05是更相关的,而不是时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_33
2.2.2 二次指数平均(对一次指数的改进)

适用条件:目的是修正一次指数的滞后偏差,且适用于线性趋势模型。
递推公式时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_34
原理:在式(2)一次指数平均的基础上,定义二次指数平均时间序列线性回归模型python 时间序列回归方程求解_matlab_35
递推得:时间序列线性回归模型python 时间序列回归方程求解_时间序列线性回归模型python_36
时间序列线性回归模型python 时间序列回归方程求解_时间序列_37的系数如下表

时间序列线性回归模型python 时间序列回归方程求解_matlab_35

时间序列线性回归模型python 时间序列回归方程求解_matlab_35

时间序列线性回归模型python 时间序列回归方程求解_matlab_35

……

时间序列线性回归模型python 时间序列回归方程求解_matlab_35

时间序列线性回归模型python 时间序列回归方程求解_时间序列_42

时间序列线性回归模型python 时间序列回归方程求解_时间序列_42

……

时间序列线性回归模型python 时间序列回归方程求解_时间序列_42

时间序列线性回归模型python 时间序列回归方程求解_时间序列_42

……

时间序列线性回归模型python 时间序列回归方程求解_时间序列_42

……

……

时间序列线性回归模型python 时间序列回归方程求解_时间序列_42
可证权值之和仍然为1

时间序列线性回归模型python 时间序列回归方程求解_递推_48
其中时间序列线性回归模型python 时间序列回归方程求解_递推_49
时间序列线性回归模型python 时间序列回归方程求解_时间序列_50
(读者可以代入(3)和(9)看下时间序列线性回归模型python 时间序列回归方程求解_数学建模_51时间序列线性回归模型python 时间序列回归方程求解_时间序列_52长什么样😄)

再取m=1,即得到递推式(6)

代码:

y=[51.3,60.5,70.6,86.2,94.2,106.0,111.0,129.2,134.9,144.2,150.3,160.6];
MSE_min=inf; m=size(y,2);
y_predict=zeros(1,m);
S1=zeros(1,m);
S2=zeros(1,m);
S1(1)=(y(1)+y(2))/2;
S2(1)=(y(1)+y(2))/2;
y_predict(1)=(y(1)+y(2))/2;
for alpha=[0.1,0.3,0.5,0.7]
    error=0;
    for i=2:m
        y_predict(i)=(2-alpha)/(1-alpha)*S1(i-1)-(1/(1-alpha))*S2(i-1);
        S1(i)=(alpha)*y(i)+(1-alpha)*S1(i-1);
        S2(i)=(alpha)*S1(i)+(1-alpha)*S2(i-1);
        error=error+(y_predict(i)-y(i))^2;
    end
    MSE=(error/(m-N))^0.5;
    if MSE<MSE_min
        MSE_min=MSE;
        alpha_opt=alpha;
    end
end

MSE=6.8805


可视化

时间序列线性回归模型python 时间序列回归方程求解_时间序列_53


2.2.3 三次指数平均

适用条件:时间序列变化趋势为二次曲线趋势
公式参见司守奎《数学建模算法与应用》