精华内容
下载资源
问答
  • Matlab时间序列分析

    万次阅读 多人点赞 2018-11-13 18:53:46
    在引入时间序列前,先介绍几个matlab函数 matlab中的gallery函数简析 Matlab 中的 gallery 函数是一个测试矩阵生成函数。当我们需要对某些算法进行测试的时候,可以利用gallery函数来生成各种性质的测试矩阵。其用法...

    时间序列分析需要解决的问题

    假设我们有这么一段数据(采样自移动公司某段时间的开户客户数目)
    下载地址,包含本实验用到的数据/资料以及全部代码,实验报告,引用请告知,关注并留言获取提取码,或者到我的csdn下载进行下载
    在这里插入图片描述
    我们可以发现,在数据中似乎有种明显的趋势规律,或许还存在一定的周期性。但是,我们却不好描述这种趋势或者说是周期,因为数据中存在一定的随机因素模糊了我们的判断。在进行时间序列数据分析时,我们大部分的目的都是想从中找出可以表达的规律以便于我们对未来做预测。
    在这里,我们把时间序列数据分解为以下三项:

    真实数据=趋势项+周期项+随机项
    趋势性:例如随时间变化的一次函数/多次函数/幂函数趋势等
    周期项:周期规律
    随机项:在这里可以理解为噪声,但是这些噪声也是存在规律的。
    

    不难发现,趋势性和周期项都不难描述,难以刻画的是随机项变化。而如果我们真正能预测随机项的变化,那么我们就基本上可以预测整个数据下一步的走势了。

    时间序列分析的步骤

    • 观测数据(均值,周期等)
    • 数据预处理
    • 平稳化–去趋势与去周期,剩余随机项
    • 用类似于回归/滑动平均的思想来 拟合随机项
      1.判断去趋势去周期后的数据是否平稳
      2.计算数据的自相关函数和偏相关函数
      3.根据自相关/偏相关函数性质决定选用什么模型来拟合随机项

    在这里插入图片描述
    4.模型定阶和拟合参数的求解
    5.模型检验

    • 模型最终实现功能:将周期项/趋势性/随机项结合,是一个关于时间变化的函数,这个函数可以在一定程度上对未来数据进行预测。

    如何实现每个步骤

    去趋势/去周期

    运用差分算子可以去趋势和周期,其中N阶差分用于具有N阶多项式趋势的数据去趋势,N步差分用于具有N步周期的数据去周期。

    偏相关/自相关函数的计算

    可以运用matlab自带函数,也可以自己编写。

    模型定阶

    可以参考AIC/BIC等定阶方法

    模型检验

    通过计算LB统计量和卡方统计量,判断拟合的误差项是否为白噪声序列,如果是,则检验通过。

    一个具体的案例 --移动开户数分析

    我们有一份移动公司两年间共计700余天的每日开户树,我们想探寻其中的随机因素。

    数据观察

    变化趋势

    在这里插入图片描述

       图一.原开户数据趋势变化的观察
    

    可以发现,开户数在局部区间的极值变化具有一定的周期性。但是数据太多且有点杂乱。
    为了更好的观察数据的规律,拟将数据进行滑动平均处理,在一定程度上更能看出规律性。并且,依据两年的月数天数变化,设置标记每月天数变化的向量,计算每月,每个季度,每年的平均开户数进行观察。计算并绘制得到下图:
    在这里插入图片描述

    图二.开户数据趋势变化周期的观察
    

    上图红色标记为2012年,蓝色标记为2013年。总的看来均有上升的趋势。图二左上角绘制的是2012和2013的开户数滑动平均观察(使用matlab smooth函数,滑动窗口设置为30),容易发现在年这个层面上趋势具有较大的相关性,一年显然可以是一个大周期的刻画。但是这个周期太大了,如果选取这个周期做去季节性,显然会损失大量数据。因此,我们想找到一个更小的周期来刻画,其实我们还可以发现图一中有明显的小起伏,经验证起伏平均间隔为30即一个月,那么一个月是否为一个周期呢?右上图是按月进行平均的统计值绘制,起伏貌似没有什么规律。但是还是可以作为参考。左下角图绘制的是季度的平均开户数变化,可以发现两个季度为一个周期,因为起伏在两个周期中进行。右下角图绘制的是年平均变化图,如我们所料,随着移动互联网的普及,2013年开户平均数比2012年高。

    综上观察,我们可以得出以下结论:
    1.一个月应该是一个最小周期,两个季度是一个中周期,一年为一个确定的大周期。
    2.开户人数有明显的上升趋势。
    3.由观测值我们可以认为存在异常值。

    数据预处理

    2.1缺失值处理
    数据中不存在缺失值
    2.2异常值处理
    拟采用三倍标准差即拉以达法则筛选异常值,考虑到时间序列的短期影响性,用其周围值平均代替。

    去趋势与去周期

    进行了简单的观察和数据预处理后,我们开始正式进行时间序列平稳化的操作。考虑到有两年,我们从单独考虑2012,2013,然后集中考虑2012和2013来进行处理和检验。
    3.1去趋势
    由于数据变化有一定的集中性,且有滑动平均看来近似可以用一次函数拟合。所以采用一次差分的方法去除数据的趋势项。这里采用diff函数实现一次差分。去趋势后,我们进行了如下的观察:

    在这里插入图片描述

    在这里插入图片描述

    图三.周期为一个月的检验图
    

    我们发现相邻极值点间的时间差距十分接近于一个月,这让我们欣喜万分。

    3.2去周期
    由以上的观察数据和去趋势后数据综合考虑,采用一个月作为周期是个不错的选择。这里自定义d步差分函数对去趋势后的数据进行去周期的处理。
    经过3.1和3.2,我们得到如下结果:
    在这里插入图片描述在这里插入图片描述

    图四.2012年去趋势和去周期比较图 图五.2013年去趋势和去周期比较图

    在这里插入图片描述

    图六.2012-2013年去趋势和去周期比较图
    

    肉眼看来,效果还算不错,从均值线看来均值均十分接近于0。为了更客观的看待平稳的效果,采用自相关图还进行平稳性的验证。

    自相关性平稳性检验结果如下:
    在这里插入图片描述

    图七.自相关图检验平稳性
    

    从自相关图看来,经过去趋势和去周期后的数据的确是平稳的。 经过以上步骤,我们就成功的将非平稳的时间序列转换为了平稳的时间序列,得到了随机误差项的表示。

    截至目前以上代码总结:

    %% 计算月平均,季度平均,年平均意图找寻周期规律
    % 输入开户数据
    % 输出各有用的统计量
    function [months_mean,seasons_mean,years_mean,month_starts,month_ends,season_starts,season_ends] = Calu_mean(open_nums)
    t = 1:length(open_nums);
    nums = open_nums;
    month_days = [0,31,29,31,30,31,30,31,31,30,31,30,31,31,28,31,30,31,30,31,31,30,31,30,31]; 
    season_days = [0,sum(month_days(2:4)),sum(month_days(5:7)),sum(month_days(8:10)),sum(month_days(11:13))...
        ,sum(month_days(14:16)),sum(month_days(17:19)),sum(month_days(20:22)),sum(month_days(23:25))];
    % calu the month_mean nums
    months_mean = zeros(1,24);
    month_starts = zeros(1,24);
    month_ends = zeros(1,24);
    for ii = 1:length(month_days)-1
        start_day = sum(month_days(1:ii))+1;
        end_day = sum(month_days(1:ii+1));
        month_starts(ii) = start_day;
        month_ends(ii) = end_day;
        months_mean(ii) = mean(nums(start_day:end_day));
    end
    
    %% 去趋势和周期函数
    % 输入预处理后的时序数据向量vector和观察数据变化人为认定的周期T
    % 输出去趋势后的向量数据detrend_data和去趋势去周期后的向量数据detrend_deT_data
    function [detrend_data,detrend_deT_data] = Detrend_plot(vector,T)
        subplot(3,1,1)
        plot(1:length(vector),vector,'k')
        hold on
        plot(0:length(vector),mean(vector)*ones(1,length(0:length(vector))),'r')
        text(1,mean(vector),'均值')
        legend('趋势','均值')
        title('原开户数据趋势')
        % 去趋势项
        detrend_data = diff(vector,1);
        subplot(3,1,2)
        plot(1:length(detrend_data),detrend_data,'k')
        hold on
        plot(0:length(detrend_data),mean(detrend_data)*ones(1,length(0:length(detrend_data))),'r')
        legend('趋势','均值')
        title('去除趋势项后趋势')
        % 去季节项
        detrend_deT_data = zeros(length(detrend_data),1);
        for i=1:length(detrend_data)
            if(i<=T)
                detrend_deT_data(i) = [];
            else
                detrend_deT_data(i) = detrend_data(i)-detrend_data(i-T);
            end
        end
        subplot(3,1,3)
        plot(1:length(detrend_deT_data),detrend_deT_data,'k')
        hold on
        plot(0:length(detrend_deT_data),mean(detrend_deT_data)*ones(1,length(0:length(detrend_deT_data))),'r')
        legend('趋势','均值')
        title('去除趋势项后和季节项后趋势')
    end
    
    %% 主函数脚本,运行该脚本将输出以上所有结果
    clearvars
    %% 读取数据并预处理
    open_nums = xlsread('移动通知户开户数.xlsx',1,'B2:B732');
    %% 计算月平均,季度平均,年平均并绘图找周期规律,并处理异常值
    figure(1),[months_mean,seasons_mean,years_mean,month_starts,month_ends,season_starts,season_ends] = Calu_mean(open_nums);
    [m,n] = find(abs(open_nums-mean(open_nums))>2*std(open_nums));
    open_nums(m) = mean(open_nums);
    %% 尝试进行去趋势和去周期,考虑到存在多重周期,将年份分开按照月为周期去除周期(其中每月为多少天根据两年分别不同)
    data_2012 = open_nums(1:366);
    data_2013 = open_nums(367:end);
    figure(2),[detrend_data2012,detrend_deT_data2012] = Detrend_plot(data_2012,30);% 2012开户数变化趋势
    figure(3),[detrend_data2013,detrend_deT_data2013] = Detrend_plot(data_2013,31);% 2013开户数变化趋势
    figure(4),[detrend_data,detrend_deT_data] = Detrend_plot(open_nums,30);% 2012-2013开户数变化趋势
    figure(5),subplot(411),autocorr(open_nums),title('原数据自相关图')% 自相关图分析
    subplot(412),autocorr(detrend_data),title('2012年随机项自相关图')
    subplot(413),autocorr(detrend_deT_data2013),title('2013年随机项自相关图')
    subplot(414),autocorr(detrend_deT_data2013),title('2012-2013年随机项自相关图')
    clearvars month_starts month_ends season_starts season_ends data_2012 data2013
    

    截至目前,我们编写的代码所完成的工作有:
    1.观察数据
    2.数据预处理
    3.去趋势,去周期
    4.计算了偏相关函数和自相关函数

    我们还需要进行的工作是:
    1.判断处理后的随机项是否平稳,判断自相关/偏相关函数的拖尾性/截尾性,以确定采用什么模型来拟合随机项。去均值使该时间序列变为零均值平稳过程。
    在这里插入图片描述
    2.确定模型后,确定采用几阶进行拟合,并求解参数
    3.模型检验

    ******* 休息好了吧,我们继续

    判断去趋势和去周期后数据的平稳性

    在这里插入图片描述在这里插入图片描述

     图一  处理后的数据               图二  处理后数据的20期自相关系数
    

    自相关系数定义为:
    在这里插入图片描述
    由图二观察知道,当|h|>1时,自相关系数为近似为0.认为自协方差函数(自相关函数)有“截尾性”.可以使用MA(1)模型。为了考虑能否使用ARMA模型,进一步进行讨论。

    转换为零均值平稳序列

    采用mean函数计算该序列的均值,处理如下:
    随机变量总体X 的样本的均值估计量:
    在这里插入图片描述
    在这里插入图片描述

    转换前后序列变化如下:
    在这里插入图片描述在这里插入图片描述

      图三 非零均值平稳序列                图四 零均值平稳序列 
    

    3.无偏/有偏自相关函数的估计
    自协方差函数(或自相关函数)的样本估计量通常有两种类型:
    在这里插入图片描述(3.3.1)
    在这里插入图片描述 (3.3.2)
    关于两种估计量,前人曾经做过比较,G.M.Jenkins 结论:
    1.估计量( 3.3.1) 更满意。
    2.其中(3.3.1)是自相关函数的有偏估计,(3.3.2)是自相关函数的无偏估计。
    3.(3.3.1)式定义的估计量收敛于零的速度更快。
    4.由(3.3.1)式定义的样本自协方差函数矩阵(或相关矩阵)是正定的

    根据两种自相关系数的计算公式,我们可以自己编写函数计算自相关函数如下
    其中函数输入为零均值的平稳序列,输出为一组无偏估计的自相关系数,一组为有偏的自相关系数。完成自己的函数编写后,选择计算前面30期自相关系数与matlab自带autocorr进行比较。
    自定义计算无偏和有偏两种自相关系数代码:

    function [unbiased_autocorr,biased_autocorr] = my_autocorr(time_vector)
    %% 函数定义,计算无偏和有偏两种自相关系数
    n = length(time_vector);
    unbiased_autocorr = zeros(n,1);
    biased_autocorr = zeros(n,1);
    % 延迟期数从0到n
    for h = 0:n
        omega = 0;
        % 累加从t=1到n-h
        for t = 1:n-h
            omega = omega+time_vector(t)*time_vector(t+h);
        end
        unbiased_autocorr(h+1) = omega/(n-h);
        biased_autocorr(h+1) = omega/n;
    end
    % 自相关函数转换为自相关系数
    unbiased_autocorr = unbiased_autocorr/unbiased_autocorr(1);
    biased_autocorr = biased_autocorr/biased_autocorr(1);
    %% 绘图比较
    n_compare = 30;
    figure()
    subplot(311) 
    plot(0:n_compare-1,unbiased_autocorr(1:n_compare),'ro','MarkerFaceColor','r','markersize',4)
    hold on,plot(0:n_compare-1,zeros(1,n_compare),'b')
    title('无偏自相关系数变化'),xlabel('延迟天数'),ylabel('自相关系数')
    subplot(312) 
    plot(0:n_compare-1,biased_autocorr(1:n_compare),'ro','MarkerFaceColor','r','markersize',4)
    hold on,plot(0:n_compare-1,zeros(1,n_compare),'b')
    title('有偏自相关系数变化'),xlabel('延迟天数'),ylabel('自相关系数')
    subplot(313) 
    autocorr(time_vector,n_compare),title('内置autocorr结果')
    

    结果如图:
    在这里插入图片描述

         图五  前30期自相关系数比较图
    

    由图,计算结果与内置函数结果十分接近,验证了自己构建的函数的准确性。
    在这里插入图片描述

    图六 无偏/有偏自相关系数的收敛速度比较
    

    可以看出。该图验证了第三个结论,即有偏估计定义的估计量收敛于零的速度更快,且从收敛趋势看来效果更好。

    4.偏相关系数的估计和比较
    计算偏相关系数有两种方法,直接求解和递推求解。这里考虑递推求解。运用3求解得到的自相关系数一步步递推得到所有的偏相关系数。
    4.1 直接求解
    在这里插入图片描述(3.4.1)
    由最优线性估计的计算公式,应用矩阵按行(列)展开式的性质可得
    在这里插入图片描述(3.4.2)
    4.2 递推求解
    在这里插入图片描述(3.4.3)
    递推过程:
    在这里插入图片描述

           图七 递推求解过程
    

    理解以上递推思想后,利用3计算出来的自相关系数,编写函数如下:
    其中输入为自相关系数和之前的零均值序列。前者用于递推,后者用于利用matlab自带函数parcorr对自定义的函数计算值进行检验。
    代码:

    function [customed_parcorr] = my_parcorr(time_vector,auto_corr)
    %% 函数定义
    n = length(auto_corr);
    customed_parcorr = zeros(n,n);
    customed_parcorr(1,1) = auto_corr(2);
    for k = 1:n-2
        sum1 = 0;
        sum2 = 0;
        for j = 1:k
            sum1 = sum1 + auto_corr(k+2-j)*customed_parcorr(k,j);
            sum2 = sum2 + auto_corr(j+1)*customed_parcorr(k,j);
        end
        customed_parcorr(k+1,k+1) = (auto_corr(k+2)-sum1)/(1-sum2);
        for j = 1:k
            customed_parcorr(k+1,j) = customed_parcorr(k,j) - customed_parcorr(k+1,k+1)*customed_parcorr(k,k+1-j);
        end
    end
    %% 绘图比较
    a = diag(customed_parcorr);
    subplot(211)
    compare_n = 40;
    parcorr(time_vector,compare_n)
    subplot(212)
    plot(1:compare_n,a(1:compare_n),'ro','markerfacecolor','r','markersize',4)
    hold on,plot(1:compare_n,zeros(1,compare_n),'b')
    ylim([-0.5,1])
    title('自定义偏相关计算值')
    xlabel('延迟天数'),ylabel('偏相关系数')
    

    结果如图八所示:
    在这里插入图片描述

    图八 自定义偏相关系数计算值与parcorr前30期计算值比较
    

    由比较图看来,计算结果相当。
    由图八可知,偏相关系数具有拖尾性。

    截至目前,除了上面给过的代码外,新的部分计算代码给出如下:

    %% 主函数运行脚本
    clearvars
    %% 读取数据并预处理
    open_nums = xlsread('移动通知户开户数.xlsx',1,'B2:B732');
    %% 计算月平均,季度平均,年平均并绘图找周期规律,并处理异常值
    figure(1),[months_mean,seasons_mean,years_mean,month_starts,month_ends,season_starts,season_ends] = Calu_mean(open_nums);
    [m,n] = find(abs(open_nums-mean(open_nums))>2*std(open_nums));
    open_nums(m) = mean(open_nums);
    %% 尝试进行去趋势和去周期,考虑到存在多重周期,将年份分开按照月为周期去除周期(其中每月为多少天根据两年分别不同)
    data_2012 = open_nums(1:366);
    data_2013 = open_nums(367:end);
    figure(2),[detrend_data2012,detrend_deT_data2012] = Detrend_plot(data_2012,30);% 2012开户数变化趋势
    figure(3),[detrend_data2013,detrend_deT_data2013] = Detrend_plot(data_2013,31);% 2013开户数变化趋势
    figure(4),[detrend_data,detrend_deT_data] = Detrend_plot(open_nums,30);% 2012-2013开户数变化趋势
    figure(5),subplot(411),autocorr(open_nums),title('原数据自相关图')% 自相关图分析
    subplot(412),autocorr(detrend_data),title('2012年随机项自相关图')
    subplot(413),autocorr(detrend_deT_data2013),title('2013年随机项自相关图')
    subplot(414),autocorr(detrend_deT_data),title('2012-2013年随机项自相关图')
    clearvars month_starts month_ends season_starts season_ends data_2012 data2013
    %% 平稳序列去均值变为零均值平稳序列
    zeromean_detrend_deT_data = detrend_deT_data-mean(detrend_deT_data);
    [unbiased_autocorr,biased_autocorr] = my_autocorr(zeromean_detrend_deT_data);
    %% 计算偏相关函数
    [customed_parcorr] = my_parcorr(zeromean_detrend_deT_data,biased_autocorr);
    

    ************** 休息一会,我们继续

    处理后数据适用的模型判别

    观察平稳序列的自相关函数和偏相关函数,通过是否拖尾/结尾判断使用的模型。
    在这里插入图片描述

    图*1 模型判别流程图
    

    通过上面的分析,自相关系数和自偏相关系数均呈现拖尾性,故使用ARMA模型进行进一步分析。

    3.ARMA模型的参数估计和定阶
    拟函数法进行求解,求解步骤如下:

    3.1初定阶数p和q,运用Yule-Walker求解逆函数I
    3.2求解MA滑动平均系数
    3.3求解AR自回归系数
    3.4在求出所有参数后,利用极大似然法残差平方和求方差,算出AIC/BIC指标
    3.5重复不走3.1-3.4,在一定大范围内找出极小BIC值对应的阶数p,q
    

    4.参数检验和定阶的进一步修正
    通过模型的显著性检验和参数的显著性检验,在参数估计和定阶最小BIC情况下对应的结束p,q附近进行,最终找到最佳的ARMA阶数为ARMA(1,1),参数求解为
    在这里插入图片描述
    经检验残差序列为白噪声,认为模型效果可以接受。
    1.适用模型识别
    首先,我们需要做的是根据动态数据,从各类模型族中选择与实际过程相吻合的模型;
    即处理后的平稳序列应该用什么模型来表示最为合理。经过前期的预处理,去趋势和去周期,得到平稳时间序列的自相关系数,偏相关系数如下图1.1。

    在这里插入图片描述在这里插入图片描述

                    图1.1 平稳序列的自相关/自协相关系数
    

    不难发现,该平稳序列的自相关系数和自偏相关系数均有拖尾的性质,且自相关拖尾阶数较高分布在32-35阶左右,而自偏相关系数拖尾阶数较低,分布在12-20之间。综上,拟采用ARMA模型对其进行拟合。
    2.ARMA模型的参数估计和定阶
    确定好适用的模型之后,下一步我们要进行的是对确定的模型类别,定出模型中的阶数p 和 q ,这里采用先大范围搜索,在搜索的结束中求的模型的参数估计——自回归系数和滑动平均系数,并由此求出拟合残差的方差。最后,计算每个阶数下对应的AIC/BIC进行比较,这里适用最小BIC值对应的阶数和参数估计做下一步的分析。

    2.1 方法的选取
    课件4.3关于ARMA模型的参数估计中介绍了两种估计参数的方法,对这两种方法的理解如下:
    *ARMA模型参数的矩估计:通过Y-W方程求解出自回归系数,利用MA(q)模型参数的线性迭代法或牛顿—拉裴森算法求得滑动平均系数,最后合并可得拟合模型。这种方法 矩估计方法精度较低,通常只能作为其他迭代参数估计算法的初值。
    *模型参数的初估计法—逆函数法:利用可逆域的逆转形式进行求解。这种方法仅涉及到线性方程的求解,计算简单便于实现。
    综合上述两种方法,考虑到逆函数法对于低阶或高阶模型都很有效且求解方便。这里采用逆函数法对模型参数进行估计,逆函数法求解步骤如下
    逆函数法求解步骤

    1.令P(*) = max(p,q)+q,用y—w方法估计AR(p*)的 p* 个自回归参数,作为
    相应的ARMA( p, q)模型的前 p*个逆函数值.
    2.求解线性方程组得到滑动平均系数的估计。
    3.将前两步的结果代入课件4.3.6公式,求得自回归系数的估计。
    

    模型参数和求解和定阶

    2.2.1模型的定阶指标
    *最终预报误差准则(PDE)
    在这里插入图片描述
    其中,方差依赖于k, 其大小反映了模型与数据的拟合程度。第一个因子随 k 增大而增大, 放大了残差方差的不确定性影响.
    *最小信息准则(AIC)
    在这里插入图片描述
    AIC准则可应用于ARMA模型及其他统计模型(如多项式回归定阶).能在模型参数极大似然估计的基础上,对于ARMA(p, q)的阶数和相应的参数,同时给出一种最佳估计.
    *BIC准则
    在这里插入图片描述
    AIC准则避免了统计检验中由于选取置信度而产生的人为性,为模型定阶带来许多方便. 但AIC方法未给出相容估计.
    **注意:AIC阶数估计一般偏高,BIC阶数估计偏低。这里适用BIC准则进行初始阶数的定阶,取BIC值最小下对应的阶数p,q即为初始定阶。
    2.2.2 模型的求解
    观察之前的自相关系数图和自偏相关系数图,初定ARMA模型初始阶数的选取p和q均在1-20阶内,利用逆函数求解并算的每个p,q下参数对应的BIC值,取最小BIC对应的p,q即为初定的阶数。不同怕p,q下对应的BIC值如下图。
    在这里插入图片描述

    图2.2.2 BIC值的变化
    

    由BIC值的变化我们可以看出,在取ARMA(1,1)时BIC值最小。此时ARMA(1,1)模型建立如下:
    在这里插入图片描述

    定阶的进一步修正-模型的检验

    确定好最小BIC准则下的参数估计值和模型阶数p和q后,我们知道——以上各个问题是相互关联的,需整体进行系统化的模型优化. 而根据已有的一组样本数据建立模型,对模型阶数和参数作出判断和估计,是重要的两部分工作.所以最后,我们需要在已经初定的阶数周围小范围内进行搜索和检验,通过模型的有效性检验的参数的显著性检验进一步优化模型,寻找最优的阶数和参数估计值。统计模型只是对生成观测数据真实过程的近似,在模型拟合后,还需要进行模型的有效性检验,及检验拟合模型对序列中信息的提取是否充分。模型的有效性检验即对残差的白噪声检验。
    观察残差序列及其自相关系数如下图所示:

    在这里插入图片描述

    图3.1 残差序列自相关系数
    

    可以发现序列间没有相关性,不具有拖尾和截尾的性质,可以初步判断改模型是可靠的。为了进一步验证残差序列是否为白噪声序列,下面进行LB统计量的检验结果如下:
    延迟期数 LB统计量 卡方统计量

    在这里插入图片描述
    由LB统计量小于对应的卡方统计量,认为该序列可以认为是白噪声序列。模型效果较好,模型检验通过。
    到此,我们所有工作已经完毕。如果有什么疑问,欢迎留言,我会一一解答。

    新部分的代码:
    1主函数 main1.m
    实现功能:读取处理后的平稳数据进行建模,通过观察自相关/自偏相关系数确定选用ARMA模型,在一定确定的阶数范围内求模型的参数估计,根据最小BIC准则初定p,q的选择,最后通过模型的有效性检验和参数的显著性检验确定最终的参数估计和阶数。

    % 读取处理后的平稳时间序列
    
        processed_data = csvread('detrend_deT_data.csv');
        figure(1)
        autocorr(processed_data,60)
        figure(2)
        parcorr(processed_data,25)
        data_autocorr = autocorr(processed_data,600);
        % 自相关系数向量转换为自相关系数矩阵
        autocorr_matrix = vec2mat(data_autocorr);
        max_p = 15;
        max_q = 20;
        AICs = ones(max_p,max_q);
        BICs = ones(max_p,max_q);
        N = 600;
        for p=1:20
            for q = 1:20
                % 计算I
                P = max(p+q)+q;
                I = autocorr_matrix(1:P,1:P)\autocorr_matrix(1,2:P+1)';
                % 计算MA部分的滑动平均系数
                seta = calu_MA_parameter(I,p,q);
                % 计算AR部分的自回归系数
                fine = calu_AR_parameter(seta,I,p,q);
                % 计算方差
                residual_var = calu_var(p,q,fine,seta,N,processed_data);
                % 计算AIC和BIC并存储
                [AICs(p,q),BICs(p,q)] = calu_AIC_BIC(p,q,N,residual_var);
            end
        end
    

    % 找出最小BIC下的阶数p,q
    [min_BIC_p,min_BIC_q] = find(BICs == min(BICs));
    2.MA滑动平均系数的求解函数
    [seta]=calu_MA_parameter(I,p,q)
    函数输入:逆函数{ Ij }的估计I,给定的自回归和滑动平均阶数p和q
    函数输出:滑动平均系数的估计值seta

    function [seta]= calu_MA_parameter(I,p,q)
    P = max(p,q);
    I_matrix = zeros(q,q);
    for ii = 1:q
        I_matrix(ii,:) = I(P+ii-1:-1:P+ii-q);
    end
    seta = I_matrix\I(P+1:P+q);
    end
    

    3.AR自回归系数的求解函数
    [fine] = calu_AR_parameter(seta,I,p,q)
    函数输入:逆函数{ Ij }的估计I,给定的自回归和滑动平均阶数p和q以及滑动平均系数seta
    函数输出:自回归系数的估计值fine

    function [fine] = calu_AR_parameter(seta,I,p,q)
    fine = ones(1,p);
    for ii = 1:p
        if ii>q
            seta(ii) = 0;
        end
        fine(ii) = seta(ii)+I(ii);
        for jj = 1:ii-1
            if (ii-jj)>0
                fine(ii) = fine(ii)-seta(jj)*I(ii-jj);
            end
        end
    end
    

    4.残差方差的计算函数
    [residual_var]= calu_var(p,q,fine,seta,N,processed_data)
    函数输入:逆函数{ Ij }的估计I,给定的自回归和滑动平均阶数p和q以及滑动平均系数seta,自回归系数fine,处理后的平稳序列。
    函数输出:残差的方差

    function [residual_var] = calu_var(p,q,fine,seta,N,processed_data)
    error = zeros(1,N);
    for ii = max(p,q)+1:N
        error(ii) = [1,-fine]*processed_data(ii:-1:ii-p)+seta'*error(ii-1:-1:ii-q)';
    end
    residual_var = (error*error')/N;
    end
    

    5.AIC/BIC指标的计算函数
    [AIC,BIC] = calu_AIC_BIC(p,q,N,residual_var)
    函数输入:给定的自回归和滑动平均阶数p和q,样本个数N以及残差方差。
    函数输出:不同阶数下对应的AIC/BIC指标。

    function [AIC,BIC] = calu_AIC_BIC(p,q,N,residual_var)
    AIC = log(residual_var)+2*(p+q+1)/N;
    BIC = log(residual_var)+log(N)*(p+q+1)/N;
    End
    

    6.计算LB统计量函数

    lb = calu_LB(data, m)
    函数输入:残差序列,延迟期数
    函数输出:LB卡方统计量
    function lb = calu_LB(data, m)
    N = 25;
    power_autocorr = 0;
    data_autocorr = autocorr(data,25);
    for k=1:m
        power_autocorr = power_autocorr+data_autocorr(k+1)^2/(N-k);
    end
    lb = N*(N+2)*power_autocorr;
    End
    

    7.自相关系数向量转为矩阵 vec2mat
    [autocorr_matrix] = vec2mat(autocorr_vector)
    函数输入:自相关系数函数输出:LB卡方统计量

    function [autocorr_matrix] = vec2mat(autocorr_vector)
    n = length(autocorr_vector);
    autocorr_matrix = zeros(n);
    for ii = 1:n
        autocorr_matrix(ii,ii:n) = autocorr_vector(1:n-ii+1);
    end
    autocorr_matrix = triu(autocorr_matrix)+tril(autocorr_matrix',-1);
    end
    

    yqol 编写不易,欢迎关注。

    展开全文
  • 时间序列

    2020-11-30 14:37:58
    非平滑时间序列变动的影响因素时间序列的预测方法一次指数平滑法(不会在博客里面敲公式,直接把在word里敲再截图了)二次指数平滑法(不会在博客里面敲公式,直接把在word里敲再截图了)三次指数平滑法(不会在博客...

    时间序列应用分析

    时间序列数据,如各年度的国内生产总值、人口数量、温湿度、车辆销售数、股票、食品价格(指数)等等都是随时间变化的序列,在日产生活中屡见不鲜。考虑到时间时一直存在的变量,导致时间序列的数据量大且处理难度较大,基于随时间变化的数据模型,一般使用指数平滑预测模型。

    时间序列的基本概念

    1.时间序列的意义

    时间序列数据是指按照时间先后依次排列的观测值所构成的数列,如各年度的国内生产总值、人口数据等。研究时间序列数据模型处理的主要目的是进行数据预测,如预测下一年度的销售额,预测股票价格走势等。

    2.时间序列分析中的时间

    一般使用t表示时间,可以是年、季、月、周、日,也可以是用户自定义的时间间隔。

    3.时间序列的表示

    时间序列数列:
    在这里插入图片描述

    4.时间序列的分类

    时间序列数据分两大类。
    (1)平稳序列:不存在趋势,在某一个固定的水平上随机波动
    (2)非平稳序列:包含趋势、季节性、周期性等序列。

    5.其它概念

    (1)平均发展水平:
    在这里插入图片描述
    (2)增长量:
    在这里插入图片描述

    (3)平均增长量:
    在这里插入图片描述

    (4)发展速度:
    在这里插入图片描述

    (5)平均发展速度:
    在这里插入图片描述

    非平滑时间序列变动的影响因素预测定模型

    1.非平滑时间序列变动的影响因素

    非平滑时间序列变动影响因素分为4类。
    (1)长期趋势T
    在一个相当长的时期内,持续向上或向下发展变化的趋势。
    (2)季节变动S
    在一年内受气候变化、气象环境、节假日、风俗习惯等因素的影响所出现的有规则的波动。季节变动比较显著的行业有农业、交通运输业、旅游业、商业等。
    (3)循环变动C
    围绕长期趋势的一种高低往复、周而复始的规则性变动,周期多在一年以上。
    (4)不规则变动I
    剩余的变动,由随机因素引起的非趋势性、非周期性变动。
    2.时间序列变动因素的测定模型
    将4种因素(长期趋势、季节变动、循环变动、不规则变动)从序列中分离出来,然后按照一定的方式再组合起来,即构成了时间序列变动因素的测定模型。
    加法模型:
    在这里插入图片描述

    其中,T、S、C、I均为绝对数。
    乘法模型:
    在这里插入图片描述

    其中,Y、T为绝对数,而S、C、I为相对数,一般用百分比表示。

    时间序列的预测方法

    时间序列的预测方法有很多,一般处理方法如下:
    (1)先绘图确定时间序列的类型,再选择适当的预测方法。
    (2)平稳序列的预测方法:简单平均法、移动平均法、指数平滑法(1阶,2阶,3阶,…);
    (3)非平稳序列的预测方法:指数平滑法和自回归预测、曲线拟合和回归分析等;特别对于含季节趋势的预测方法包括时间序列分解(利用乘法模型先进行趋势预测,再进行季节变动分析,然后用它们的乘积来进行预测)和季节多元回归模型(利用加法模型把趋势和季节放在一个模型中进行回归分析,得到回归方程,然后利用该方程来进行预测)。

    (不会在博客里面敲公式,直接把在word里敲再截图了)

    一次指数平滑法(不会在博客里面敲公式,直接把在word里敲再截图了)

    在这里插入图片描述

    二次指数平滑法(不会在博客里面敲公式,直接把在word里敲再截图了)

    在这里插入图片描述

    三次指数平滑法(不会在博客里面敲公式,直接把在word里敲再截图了)

    在这里插入图片描述

    时间序列线性二次移动平均法预测法(不会在博客里面敲公式,直接把在word里敲再截图了)

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 时间序列分析

    千次阅读 2018-10-29 21:15:51
    时间序列 时间序列(简称为时序)是指同一现象在不同时间上的相继观测值排列而成的数列,一个按时间顺序排列的数列,形式上由现象所属的时间和现象在不同时间上的观测值两部分组成,排列的...通常影响时间序列变化的...

    时间序列

    时间序列(简称为时序)是指同一现象在不同时间上的相继观测值排列而成的数列,一个按时间顺序排列的数列,形式上由现象所属的时间和现象在不同时间上的观测值两部分组成,排列的时间可以是年份、季度、月份或其他任何时间形式。

    时间序列分析

    时间序列分析是一种动态数据处理的统计方法。该方法基于随机过程理论和数理统计学方法,研究随机数据序列所遵从的统计变化规律,以用于解决实际问题。通常影响时间序列变化的4个要素如下:

    • 长期趋势:是时间序列在长时期内呈现出来的持续向上或持续向下的变动。
    • 季节变动:是时间序列在一年内重复出现的周期性波动。
    • 循环波动:是时间序列呈现出得非固定长度的周期性变动。
    • 不规则变化。是时间序列中除去长期趋势、季节变动和循环波动之后的随机波动。不规则波动通常总是夹杂在时间序列中,致使时间序列产生一种波浪形或震荡式的变动。

    i2uPeJ.jpg

    时间序列的分类和平稳性判断方法

    时间序列的分类

    时间序列可以分为平稳序列和非平稳序列。

    平稳序列是指基本上不存在长期趋势的序列,各观测值基本上在某个固定的水平上波动,或虽有波动,但并不存在某种规律,而其波动可以看成是随机的。或者说只含有随机波动的序列称为平稳序列。

    非平稳序列是指有长期趋势、季节性和循环波动的复合型序列,其趋势可以是线性的,也可以是非线性的。
    i2umQO.jpg

    时间序列平稳性判断

    利用散点图进行平稳性判断。直观判断散点图是否为一条围绕其平均值上下波动的曲线,如果是,则该时间序列是一个平稳时间序列。

    利用自相关函数进行平稳性判断
    一个时间序列为X1,X2,...,Xn(X_1,X_2,...,X_n),则Xt,Xt1,...,Xtk(X_t,X_{t-1},...,X_{t-k})之间的简单相关关系称为自相关,自相关函数rkr_k表示时间序列中相隔kk期的观测值之间的相关程度:
    rk=t=1nk(XtX)(Xt+kX)t=1n(XtX)2 r_k = \frac{\sum_{t=1}^{n-k}(X_t-\overline X)(X_{t+k}-\overline X)}{\sum_{t=1}^{n}(X_t-\overline X)^2}
    其中,kk为滞后期,X\overline X为样本均值。rkr_k的取值范围为[-1,1],rk|r_k|越接近1,自相关程度越高,如果rkr_k迅速下降且趋向0,则认为该时间序列是一个平稳时间序列,否则认为它是一个非平稳时间序列。

    时间序列建摸的两种基本假设

    确定性时间序列模型假设:时间序列是由一个确定性过程产生的,这个确定性过程往往可以用时间t的函数f(t)f(t)(如y=cos(2πt)y=cos(2πt))来表示,时间序列中的每一个观测值是由这个确定性过程和随机因素决定的。

    随机性时间序列模型假设:经济变量的变化过程是一个随机过程,时间序列是由该随机过程产生的一个样本。因此,时间序列具有随机性质,可以表示成随机项的线性组合,即可以用分析随机过程的方法建立时间序列模型。

    确定性时间序列分析

    移动平均模型
    1.一次移动平均法

    已知序列y1y_1y2y_2、…、yny_n是预测前的实际数据组成的时间序列。如果过早的数据已失去意义,不能反映当前数据的规律,那么可以用一次移动平均法来作预测。即保留最近一个时间区间内的数据,用其算术平均数作为预测值。

    设时间序列为{yty_t},取移动平均的项数为n,则第t+1期预测值的计算公式为:
    y^t+1=yt+yt1+...+ytn+1n=1nj=1nytn+j \hat y_{t+1} = \frac{y_t+y_{t-1}+...+y_{t-n+1}}{n}=\frac{1}{n}\sum_{j=1}^{n}y_{t-n+j}

    2.加权一次移动平均预测法

    前面介绍的简单一次移动平均预测法,是把参与平均的数据在预测中所起的作用同等看待,但实际中参与平均的各期数据所起的作用往往是不同的。为此,需要采用加权移动平均法进行预测,加权一次移动平均预测法是其中比较简单的一种。其计算公式如下:
    y^t+1=W1yt+W2yt1+...+Wnytn+1W1+W2+...+Wn \hat y_{t+1} = \frac{W_1y_t+W_2y_{t-1}+...+W_ny_{t-n+1}}{W_1+W_2+...+W_n}

    指数平滑模型
    1.一次指数平滑法

    该方法利用前一时期的数据进行预测的方法。它适用于变化比较平稳,增长或下降趋势不明显的时间序列数据的下一期的预测。其模型是:
    y^t=kyt1+(1k)y^t1 \hat y_t = ky_{t-1}+(1-k)\hat y_{t-1}

    2.二次指数平滑法

    该方法是对一次指数平滑值再作一次指数平滑来进行预测的一种方法,但第t+1期预测值并非第t期的二次指数平滑值,而是采用下列计算公式进行预测:
    {St(1)=kyt+(1k)St1(1)St(2)=kSt(1)+(1k)St1(2)y^t+T=at+btT \begin{cases} S_t^{(1)}=ky_t+ (1-k)S_{t-1}^{(1)} \\ S_t^{(2)}=kS_t^{(1)}+ (1-k)S_{t-1}^{(2)} \\ \hat y_{t+T}=a_t+b_tT \\ \end{cases}

    例题

    i2Qj74.jpg
    i2QzN9.jpg
    i2lijK.jpg

    展开全文
  • 时间序列分析和预测(含实例及代码)

    万次阅读 多人点赞 2018-09-17 21:37:34
    研究时间序列主要目的:进行预测,根据已时间序列数据预测未来的变化。 时间序列预测关键:确定已时间序列的变化模式,并假定这种模式会延续到未来。 时间序列预测法的基本特点 假设事物发展趋势会...

    导论

    研究时间序列主要目的:进行预测,根据已有的时间序列数据预测未来的变化。

    时间序列预测关键:确定已有的时间序列的变化模式,并假定这种模式会延续到未来。

    时间序列预测法的基本特点
    • 假设事物发展趋势会延伸到未来
    • 预测所依据的数据具有不规则性
    • 不考虑事物发展之间的因果关系

    时间序列数据用于描述现象随时间发展变化的特征

    时间序列分析就其发展历史阶段和所使用的统计分析方法看:传统的时间序列分析和现代时间序列分析

    一、时间序列及其分解

    时间序列(time series)是同一现象在不同时间上的相继观察值排列而成的序列。根据观察时间的不同,时间序列中的时间可以是可以是年份、季度、月份或其他任何时间形式。

    时间序列:

    (1)平稳序列(stationary series)

    是基本上不存在趋势的序列,序列中的各观察值基本上在某个固定的水平上波动,在不同时间段波动程度不同,但不存在某种规律,随机波动

    (2)非平稳序列(non-stationary series)

    是包含趋势、季节性或周期性的序列,只含有其中一种成分,也可能是几种成分的组合。可分为:有趋势序列、有趋势和季节性序列、几种成分混合而成的复合型序列。

    趋势(trend):时间序列在长时期内呈现出来的某种持续上升或持续下降的变动,也称长期趋势。时间序列中的趋势可以是线性和非线性。

    季节性(seasonality):季节变动(seasonal fluctuation),是时间序列在一年内重复出现的周期波动。销售旺季,销售淡季,旅游旺季、旅游淡季,因季节不同而发生变化。季节,不仅指一年中的四季,其实是指任何一种周期性的变化。含有季节成分的序列可能含有趋势,也可能不含有趋势。

    周期性(cyclicity):循环波动(cyclical fluctuation),是时间序列中呈现出来的围绕长期趋势的一种波浪形或振荡式波动。周期性是由商业和经济活动引起的,不同于趋势变动,不是朝着单一方向的持续运动,而是涨落相间的交替波动;不同于季节变动,季节变动有比较固定的规律,且变动周期大多为一年,循环波动则无固定规律,变动周期多在一年以上,且周期长短不一。周期性通常是由经济环境的变化引起。

    除此之外,还有偶然性因素对时间序列产生影响,致使时间序列呈现出某种随机波动。时间序列除去趋势、周期性和季节性后的偶然性波动,称为随机性(random),也称不规则波动(irregular variations)。

    时间序列的成分可分为4种:趋势(T)、季节性或季节变动(S)、周期性或循环波动(C)、随机性或不规则波动(I)。传统时间序列分析的一项主要内容就是把这些成分从时间序列中分离出来,并将它们之间的关系用一定的数学关系式予以表达,而后分别进行分析。按4种成分对时间序列的影响方式不同,时间序列可分解为多种模型:加法模型(additive model),乘法模型(multiplicative model)。乘法模型:Y_t=T_t\times S_t\times C_t\times I_t

    二、描述性分析

    1、图形描述

    2、增长率分析

    是对现象在不同时间的变化状况所做的描述。由于对比的基期不同,增长率有不同的计算方法。

    (1)增长率(growth rate):增长速度,是时间序列中报告期观察值与基期观察值之比减1后的结果,用%表示。由于对比的基期不同,可分为环比增长率和定基增长率。

    环比增长率:是报告期观察值与前一时期观察值之比减1,说明现象逐期增长变化的程度;

    定基增长率是报告期观察值与某一固定时期观察值之比减1,说明现象在整个观察期内总的增长变化程度。

    设增长率为G:          环比增长率 :G_i=\frac{Y_i-Y_{i-1}}{Y_{i-1}}=\frac{Y_i}{Y_{i-1}}-1,i=1,2...,n

                                           定基增长率 :G_i=\frac{Y_i-Y_{0}}{Y_{0}}=\frac{Y_i}{Y_{0}}-1,i=1,2...,n

    (2)平均增长率(average rate of increase):平均增长速度,是时间序列中逐期环比值(环比发展速度)的几何平均数减1的结果:\bar{G}=\sqrt[n]{\frac{Y_1}{Y_{0}}\times \frac{Y_2}{Y_{1}}...\times \frac{Y_n-Y_{n-1}}{Y_{i-1}}}-1=\sqrt[n]{\frac{Y_n-Y_{n-1}}{Y_{0}}}-1   n:环比值的个数

    (3)增长率分析中应注意的问题

    i:    当时间序列中的观察出现0或负数时,不宜计算增长率。这种序列计算增长率,要么不符合数学公理,要么无法解释其实际意义。可用绝对数进行分析。

    ii:    有些情况下,不能单纯就增长率论增长率,注意增长率与绝对水平结合起来。增长率是一个相对值,与对比的基数值的大小有关。这种情况,计算增长1%的绝对值来克服增长率分析的局限性:

    增长1%的绝对值表示增长率每增长一个百分点而增加的绝对数量:增长1%的绝对值=前期水平/100

    三、时间序列预测的程序

    时间序列分析的主要目的之一是根据已有的历史数据对未来进行预测。时间序列含有不同的成分,如趋势、季节性、周期性和随机性。对于一个具体的时间序列,它可能含有一种成分,也可能同时含有几种成分,含有不同成分的时间序列所用的预测方法是不同的。预测步骤:

    第一步:确定时间序列所包含的成分,确定时间序列的类型

    第二步:找出适合此类时间序列的预测方法

    第三步:对可能的预测方法进行评估,以确定最佳预测方案

    第四步:利用最佳预测方案进行预测

    1、确定时间序列成分

    (1)确定趋势成分

    确定趋势成分是否存在,可绘制时间序列的线图,看时间序列是否存在趋势,以及存在趋势是线性还是非线性。

    利用回归分析拟合一条趋势线,对回归系数进行显著性检验。回归系数显著,可得出线性趋势显著的结论。

    (2)确定季节成分

    确定季节成分是否存在,至少需要两年数据,且数据需要按季度、月份、周或天来记录。可绘图,年度折叠时间序列图(folded annual time series plot),需要将每年的数据分开画在图上,横轴只有一年的长度,每年的数据分别对应纵轴。如果时间序列只存在季节成分,年度折叠时间序列图中的折线将会有交叉;如果时间序列既含有季节成分又含有趋势,则年度折叠时间序列图中的折线将不会有交叉,若趋势上升,后面年度的折线将会高于前面年度的折线,若下降,则后面年度的折线将会低于前面年度的折线。

    2、选择预测方法

    确定时间序列类型后,选择适当的预测方法。利用时间数据进行预测,通常假定过去的变化趋势会延续到未来,这样就可以根据过去已有的形态或模式进行预测。时间序列的预测方法:传统方法:简单平均法、移动平均法、指数平滑法等,现代方法:Box-Jenkins 的自回归模型(ARMA)。

    一般来说,任何时间序列都会有不规则成分存在,在商务和管理数据中通常不考虑周期性,只考虑趋势成分和季节成分。

    不含趋势和季节成分的时间序列,即平稳时间序列只含随机成分,只要通过平滑可消除随机波动。因此,这类预测方法也称平滑预测方法。

    3、预测方法的评估

    在选择某种特定的方法进行预测时,需要评价该方法的预测效果或准确性。评价方法是找出预测值与实际值的差距,即预测误差。最优的预测方法就是预测误差达到最小的方法。

    预测误差计算方法:平均误差,平均绝对误差、均方误差、平均百分比误差、平均绝对百分比误差。方法的选择取决于预测者的目标、对方法的熟悉程度。

    (1)平均误差(mean error):Y:观测值,F:预测值,n预测值个数

                   ME=\frac{\sum_{i=1}^{n}(Y_i-F_i)}{n}     

    由于预测误差的数值可能有正有负,求和的结果就会相互抵消,这种情况下,平均误差可能会低估误差。

    (2)平均绝对误差(mean absolute deviation)是将预测误差取绝对值后计算的平均无擦,MAD:

                  MAD=\frac{\sum_{i=1}^{n}|Y_i-F_i|}{n}

    平均绝对误差可避免误差相互抵消的问题,因而可以准确反映实际预测误差的大小。

    (3)均方误差(mean square error):通过平方消去误差的正负号后计算的平均误差,MSE:

                MSE=\frac{\sum_{i=1}^{n}(Y_i-F_i)^2}{n}

    (4)平均百分比误差和平均绝对百分比误差

    ME,MAD,MSE的大小受时间序列数据的水平和计量单位的影响,有时并不能真正反映预测模型的好坏,只有在比较不同模型对同一数据的预测时才有意义。平均百分比误差(mean percentage error,MPE)和平均绝对百分比误差(mean absolute percentage error,MAPE)则不同,它们消除了时间序列数据的水平和计量单位的影响,是反映误差大小的相对值。

    MPE=\frac{\sum_{i=1}^{n}(\frac{Y_i-F_i}{Y_i}\times 100)}{n} 

    MAPE=\frac{\sum_{i=1}^{n}(\frac{|Y_i-F_i|}{Y_i}\times 100)}{n}

    4、平稳序列的预测

    平稳时间序列只含有随机成分,预测方法:简单平均法、移动平均法、指数平滑法。主要通过对时间序列进行平滑以消除随机波动,又称平滑法。平滑法可用于对时间序列进行短期预测,也可对时间序列进行平滑以描述序列的趋势(线性趋势和非线性趋势)。

    (1)简单平均法:根据已有的t期观察值通过简单平均法来预测下一期的数值。设时间序列已有的t期观察值为Y_1,Y_2,...,Y_t,则t+1期的预测值F_{t+1}为:F_{t+1}=\frac{1}{t}(Y_1+Y_2+...+Y_t)=\frac{1}{t}\sum_{i=1}^{t} Y_i

    到了t+1期后,有了t+1期的实际值,t+1期的预测误差e_{t+1}为:e_{t+1}=Y_{t+1}-F_{t+1}

    t+2期预测值:F_{t+2}=\frac{1}{t+1}(Y_1+Y_2+...+Y_t+Y_{t+1})=\frac{1}{t+1}\sum_{i=1}^{t+1} Y_i

    简单平均法适合对较为平稳的时间序列进行预测,即当时间序列没有趋势时,用该方法比较好。但如果时间序列有趋势或季节成分,该方法的预测则不够准确。简单平均法将远期的数值和近期的数值看作对未来同等重要。从预测角度,近期的数值比远期的数值对未来有更大的作用,因此简单平均法预测的结果不够准确。

    (2)移动平均法(moving average):通过对时间序列逐期递移求得平均数作为预测值的一种预测方法,有简单移动平均法(simple moving average)和加权移动平均法(weighted moving average).

    简单移动平均将最近k期数据加以平均,作为下一期的预测值。设移动平均间隔为k(1<k<t),则t期的移动平均值为:

    \bar{Y}_{t}=\frac{Y_{t-k+1}+Y_{t-k+2}+...+Y_{t-1}+Y_{t}}{k}  是对时间序列的平滑结果,通过这些平滑值可描述出时间序列的变化形态或趋势。也可以用来预测。

    t+1期的简单移动平均预测值为:F_{t+1}=\bar{Y}_{t}=\frac{Y_{t-k+1}+Y_{t-k+2}+...+Y_{t-1}+Y_{t}}{k}

    t+2期的简单移动平均预测值为:F_{t+2}=\bar{Y}_{t+1}=\frac{Y_{t-k+2}+Y_{t-k+3}+...+Y_{t}+Y_{t+1}}{k}

    移动平均法只使用最近k期的数据,在每次计算移动平均值时,移动的间隔都为k,也适合对较为平稳的时间序列进行预测。应用关键是确定合理的移动平均间隔k。对于同一个时间序列,采用不同的移动间隔,预测的准确性是不同的。可通过试验的方法,选择一个使均方误差达到最小的移动间隔。移动间隔小,能快速反映变化,但不能反映变化趋势;移动间隔大,能反映变化趋势,但预测值带有明显的滞后偏差。

    移动平均法的基本思想:移动平均可以消除或减少时间序列数据受偶然性因素干扰而产生的随机变动影响,适合短期预测。

    (3)指数平滑法(exponential smoothing)是通过对过去的观察值加权平均进行预测,使t+1期的预测值等t期的实际观察值与t期的预测值的加权的平均值。指数平滑法是从移动平均法发展而来,是一种改良的加权平均法,在不舍弃历史数据的前提下,对离预测期较近的历史数据给予较大权数,权数由近到远按指数规律递减,因此称指数平滑。指数平滑有一次指数平滑法、二次指数平滑法、三次指数平滑法等。

    一次指数平滑法也称单一指数平滑法(single exponential smoothing),只有一个平滑系数,且观察值离预测时期越久远,权数变得越小。一次指数平滑是将一段时期的预测值与观察值的线性组合作为t+1时期的预测值,预测模型为:

    F_{t+1}=\alpha Y_t+(1-\alpha )F_t      \alpha:平滑系数(0\leq \alpha\leq 1

    t+1期的数据是t期的实际观察值与t期的预测值的加权平均。1期的预测值=1期的观察值

    2期预测值:F_{2}=\alpha Y_1+(1-\alpha )F_1=\alpha Y_1+(1-\alpha )Y_1=Y_1

    3期预测值:F_{3}=\alpha Y_2+(1-\alpha )F_2=\alpha Y_2+(1-\alpha )Y_1

    4期预测值:F_{4}=\alpha Y_3+(1-\alpha )F_3=\alpha Y_3+\alpha (1-\alpha )Y_2+ (1-\alpha )^2Y_1

    对指数平滑法的预测精度,用均方误差来=衡量:

    F_{t+1}=\alpha Y_t+(1-\alpha )F_t

              =F_t+\alpha (Y_t-F_t)

    F_{t+1}是t期的预测值F_{t}加上用\alpha调整的t期预测误差(Y_t-F_t)。

    使用指数平滑法时, 关键问题是确定一个合适的平滑系数\alpha,不同的\alpha对预测结果产生不同的影响。

    \alpha=0,预测值仅仅是重复上一期的预测结果;\alpha=1,预测值就是上一期的实际值;

    \alpha越接近1,模型对时间序列变化的反应就越及时,因为它给当前的实际值赋予了比预测值更大的权数;

    \alpha越接近0,给当前的预测值赋予了更大的权数,模型对时间序列变化的反应就越慢。

    当时间序列有较大随机波动时,选较大\alpha,以便能很快跟上近期的变化;当时间序列比较平稳时,选较小\alpha

    实际应用中,需考虑预测误差,用均方误差衡量预测误差大小。确定\alpha时,可选择几个\alpha进行预测,然后找出预测误差最小的作为最后的\alpha值。

    与移动平均法一样,一次指数平滑法可用于对时间序列进行修匀,以消除随机波动,找出序列的变化趋势。

    用一次指数平滑法进行预测时,一般\alpha取值不大于0.5,若大于0.5,才能接近实际值,说明序列有某种趋势或波动过大。

    阻尼系数  \beta=1-\alpha ,阻尼系数越小,近期实际值对预测结果的影响越大,反之,越小。阻尼系数是根据时间序列的变化特性来选取。

    5、趋势型序列的预测

    时间序列的趋势可分为线性趋势和非线性趋势,若这种趋势能够延续到未来,就可利用趋势进行外推预测。有趋势序列的预测方法主要有线性趋势预测、非线性趋势预测和自回归模型预测。

    (1) 线性趋势预测

    线性趋势(linear trend)是指现象随着时间的推移而呈现稳定增长或下降的线性变化规律。

    趋势方程:\hat{Y}_t=b_0+b_1t     \hat{Y}_t:时间序列Y_t的预测值;b_1是趋势线斜率,表示时间t 变动一个单位,观察值的平均变动数量

    (2) 非线性趋势预测

    序列中的趋势通常可认为是由于某种固定因素作用同一方向所形成的。若这种因素随时间推移按线性变化,则可对时间序列拟合趋势直线;若呈现出某种非线性趋势(non-linear trend),则需要拟合适当的趋势曲线。

    i:   指数曲线(exponential curve):用于描述以几何级数递增或递减的现象,即时间序列的观察值Y_t按指数规律变化,或者时间序列的逐期观察值按一定的增长率增长或衰减。一般的自然增长及大多数经济序列都有指数变化趋势。

    趋势方程:\hat{Y}_t=b_0b_1^{t}     b_0,b_1为待定系数

    b_1>1,则增长率随着时间t的增加而增加;若b_1<1,则增长率随着时间t的增加而降低;若b_0>0,b_1<1,则预测值\hat{Y}_t逐渐降低以到0为极限。

    为确定b_0,b_1,可采用线性化手段将其化为对数直线形式,两端取对数:lg\hat{Y}_t=lgb_0+tlgb_1

    根据最小二乘原理,按直线形式的常数确定方法求得 lgb_0,lgb_1,求出 lgb_0,lgb_1后,再取其反对数,即可得到b_0,b_1

    \left\{\begin{matrix}\sum lgY=nlgb_0+lgb_1\sum t\\\sum t lgY_t=lgb_0\sum t+lgb_1\sum t^2\end{matrix}\right.

    ii:   多阶曲线:

    有些现象变化形态复杂,不是按照某种固定的形态变化,而是有升有降,在变化过程中可能有几个拐点。这时就需要拟合多项式函数。当只有一个拐点时,可拟合二项曲线,即抛物线;当有两个拐点时,需要拟合三阶曲线;有k-1个拐点时,需要拟合k阶曲线。

    6、复合型序列的分解预测

    复合型序列是指含有趋势、季节、周期和随机成分的序列。对这类序列的预测方法是将时间序列的各个因素依次分解出来,然后进行预测。由于周期成分的分析需要有多年的数据,实际中很难得到多年的数据,因此采用的分解模型为:Y_t=T_t\times S_t\times I_t

    预测方法有:季节性多元回归模型、季节自回归模型和时间序列分解法预测。

    分解法预测步骤:

    第一步:确定并分离季节成分。计算季节指数,以确定时间序列中的季节成分。然后将季节成分从时间序列中分离出去,即用每一个时间序列观察值除以相应的季节指数,以消除季节性。

    第二步:建立预测模型并进行预测。对消除了季节成分的时间序列建立适当的预测模型,并根据这一模型进行预测。

    第三步:计算最后的预测值。用预测值乘以相应的季节指数,得到最终的预测值。

    (1)确定并分离季节成分

    季节性因素分析是通过季节指数来表示各年的季节成分,以此描述各年的季节变动模式。

    i:  计算季节指数(seasonal index)

    季节指数刻画了序列在一个年度内各月或各季度的典型季节特征。在乘法模型中,季节指数以其平均数等于100%为条件而构成的,反映了某一月份或季度的数值占全年平均值的大小。若现象的发展没有季节变动,则各期的季节指数应等于100%;若某一月份或季度有明显的季节变化,则各期的季节指数应大于或小于100%。因此,季节变动的程度是根据各季节指数与其平均数(100%)的偏差程度来测定的。

    季节指数计算方法较多,移动平均趋势剔除法步骤:

    第一步:计算移动平均值(若是季节数据,采用4项移动平均,月份数据则采用12项移动平均),并对其结果进行中心化处理,即将移动平均的结果再进行一次二项移动平均,即得出中心化移动平均值(CMA)。

    第二步:计算移动平均的比值,即季节比率,即将序列的各观察值除以相应的中心化移动平均值,然后计算出各比值的季度或月份平均值。

    第三步:季节指数调整。由于各季节指数的平均数应应等于1或100%,若根据第二步计算的季节比率的平均值不等于1,则需要进行调整。具体方法:将第二步计算的每个季节比率的平均值除以它们的总平均值。

    ii:  分离季节成分

    计算出季节指数后,可将各实际观察值分别除以相应的季节指数,将季节成分从时间序列中分离出去:\frac{Y}{S}=\frac{T*S*I}{S}=T*I

    结果即为季节成分分离后的序列,反映了在没有季节因素影响下时间序列的变化形态。

    iii: 建立预测模型并进行预测

    7、时序案例分析

    https://blog.csdn.net/mengjizhiyou/article/details/104765862

     

    参考:贾俊平《统计学》第六版

    《统计学》pdf及课后答案:链接: https://pan.baidu.com/s/1dZPW0smz2cO-67zfn1BFyQ 提取码: ktxq 

    展开全文
  • 时间序列预测算法总结

    万次阅读 多人点赞 2018-10-18 10:30:48
    时间序列算法 time series data mining 主要包括decompose(分析数据的各个成分,例如趋势,周期性),prediction(预测未来的值),classification(对有序数据序列的feature提取与分类),clustering(相似数列...
  • 时间序列定义: 时间序列是按照一定的时间间隔排列的一组数据,其时间间隔可以是任意的时间单位,如小时、日、周月等。比如,每天某产品的用户数量,每个月的销售额,这些数据形成了以一定时间间隔的数据。 通过对...
  • 时间序列规则和时间序列模型

    千次阅读 2020-08-22 17:57:40
    1. 时间序列规则 1.1 什么是时间序列规则 对于赛题/业务的规则之前已经描述了它的重要性和应用,在此不再赘述。这章主要了解时间序列及其规则,和周期的应用。 1.1.1 时间序列 时间序列(或称动态数列):指将同一...
  • 时间序列matlab的实现

    万次阅读 多人点赞 2019-08-23 11:14:45
    因为网上很多的资料都不全或者不能解决我的...另一方面充分考虑到由于偶然因素影响而产生的随机性,为了消除随机波动产生的影响,利用历史数据进行统计分析,并对数据进行适当处理,进行趋势预测。 二、判断序列是否...
  • 时间序列预测

    千次阅读 2018-06-01 10:33:19
    摘自知乎 “许铁-巡洋舰...” 认为:”一个时间序列,往往是外界给予的另一个时间导致的东西,而这样一个东西,可以随着外界的变化而确定,但也可以由于更复杂的原因是不确定的。”导致造成某一个结果的原因很...
  • 时间序列因素回归的区别

    千次阅读 2019-04-26 13:50:21
    时间序列分析的主要目的是根据已的历史数据对未来进行预测。 先上个时间序列的图来帮助理解 该图是某个产品指标在最近两年内每个月变化的趋势。图形能给出一个主观感受,尤其是加入目标线后,能知...
  • XGBoost和时间序列

    千次阅读 2021-03-23 09:02:51
    在很多领域和比赛中XGBoost已被用于预测此处的时间序列,它表现良好原因的在于为,需要它提供与时间相关的功能:比如滞后,频率,小波系数,周期等 由于XGBoost非常擅长识别数据模式,因此如果您足够的描述数据集...
  • 最近一直在接触时间序列,所以打算写一些有关时间序列的文章,预测部分会从规则开始、到传统模型、到机器学习、再到深度学习,此外也会介绍一些时间序列的基本概念,包括自相关、平稳性、滞后性、季节...
  • 时间序列预测法

    千次阅读 2019-04-28 11:19:09
    时间序列预测法 一种历史资料延伸预测,也称历史引伸预测法。是以时间数列所能反映的社会经济现象的发展过程和规律性,进行引伸外推,预测其发展趋势的方法。 时间序列,也叫时间数列、历史复数或动态数列。它...
  • R语言时间序列分析

    千次阅读 2020-05-23 00:29:48
    当拿到一个时间序列的时候,首先分析该时间序列的类型,不同类型的序列不同的处理方式。本文包含以下几个部分: 1、时间序列数据准备 2、时间序列平稳性检验 3、拟合ARIMA模型 4、ARIMA模型的检验诊断 ...
  • 数据挖掘之时间序列分析

    万次阅读 多人点赞 2018-08-12 23:45:16
    按时间顺序排列的一组随机变量X1,X2,…,Xt表示一个随机事件的时间序列时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。 表1 常用的时间序列模型 模型名称 描述 平滑法 常...
  • 时间序列模型

    2021-01-05 03:42:53
    时间序列是按时间顺序排列的、随时间变化且相互关联的数据序列。 时间序列分析是在时间间隔不变的情况下,根据不同时间点的历史数据集合,对未来进行预测,用来了解长期发展趋势。 构成要素 时间序列可以分为长期...
  • python时间序列分析

    万次阅读 多人点赞 2018-03-05 22:45:49
    本文转载自博客园大神“大熊猫淘沙”的一篇文章——python时间序列分析。 文章写的生动有趣干货满满,特此收藏转载一下。原文地址:https://www.cnblogs.com/foley/p/5582358.html 1. 什么是时间序列 1.1 环境...
  • 时间序列时间序列分解总结

    千次阅读 2020-10-22 18:22:00
    作者| 追光者研究| 机器学习与时间序列出品 | AI蜗牛车1.朴素分解一个时间通常由长期趋势,季节变动,循环波动,不规则波动几部分组成长期趋势指现象在较长时期内持续发展变化的一种趋...
  • 时间序列初级理论篇

    千次阅读 2017-10-23 09:11:52
    前言 数学特征 1 一般随机变量的数学特征 11 期望 12 方差 13 协方差 14 相关系数 2 随机变量序列的一些数学特征 21 随机变量序列 ...时间序列影响因素影响因素的叠加 平稳时间序列模型介绍 1 自回
  • 统计学——时间序列预测

    万次阅读 2019-02-15 10:43:12
    第13章 时间序列分析和预测 时间序列是同一现象在不同时间上的相继观测值排列而成的序列。本书中用t表示所观察的时间,Y表示观察值,则Yi( i =1, 2, …, n)为时间ti上的观察值。 时间序列可以分为平稳序列和非平稳...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,883
精华内容 111,153
关键字:

影响时间序列的因素有