介绍
差分法(Differencing)是时间序列分析中的一种重要技术,主要用于使非平稳时间序列变得平稳,以便能够应用诸如ARIMA(AutoRegressive Integrated Moving Average)模型等线性模型。非平稳时间序列通常具有趋势或季节性成分,通过差分可以去除这些成分,从而使数据更加适合建模和预测。
差分法的基本概念
一阶差分
最常见的差分是一阶差分,计算方法是:
一阶差分主要用于去除时间序列中的线性趋势。如果原始序列有稳定的上升或下降趋势,一阶差分可以将其转化为平稳的时间序列。
二阶差分
如果一阶差分不足以去除趋势(例如,时间序列中存在二次趋势),则可以使用二阶差分:
二阶差分可以去除二次趋势。
季节性差分
对于具有季节性周期的时间序列,季节性差分可以帮助去除季节性成分:
其中
𝑠 是季节性周期(如一年中的月份数12,或一周中的天数7)。季节性差分是用当前的值减去一个周期前的值,以消除季节性波动。
差分法的应用场景
差分法广泛应用于时间序列分析的多个领域,特别是在以下场景中表现突出:
经济与金融
股票价格:股票价格通常具有长期上升或下降的趋势。通过一阶差分可以消除趋势,使价格变化率(而非价格本身)成为平稳序列,从而更好地进行预测。
经济指标:如GDP、通货膨胀率等,这些指标通常随着时间呈现出非平稳的趋势,通过差分处理,可以更有效地进行建模。
气象与环境科学
气温和降水量:季节性差分可以用于去除气温和降水量中的季节性成分,从而使这些数据更适合预测模型。
工程与信号处理
感器数据:许多工程中的传感器数据,特别是那些随着时间累积误差或趋势的信号,可以通过差分去除趋势,从而更精确地分析短期变化
差分法的优缺点
优点
平稳化序列:差分可以有效去除趋势和季节性成分,使非平稳序列转化为平稳序列,从而适合应用线性建模技术。
简单易行:差分的计算相对简单,易于理解和实现。
广泛适用:适用于各种类型的时间序列,尤其是那些带有明显趋势或季节性的序列。
缺点
信息丢失:差分可能会导致数据的部分信息丢失,尤其是在差分过度的情况下,可能会丢失原始序列中的重要特征。
噪声放大:差分过程可能会放大数据中的噪声,导致模型预测的准确性下降。
过度差分:差分次数过多可能会使时间序列过度平稳,甚至成为白噪声,这样反而不利于模型的有效建立
差分法的扩展与应用
在实际应用中,差分法常与其他方法结合使用,以处理更复杂的时间序列:
与ARIMA模型结合:差分法是ARIMA模型中的重要组成部分,ARIMA模型通过对时间序列进行差分平稳化,然后应用自回归和滑动平均模型来进行预测。
多变量差分:对多个时间序列的差分进行联合分析,可以捕捉不同时间序列之间的动态关系。
季节性ARIMA(SARIMA):在具有季节性的时间序列中,结合季节性差分和ARIMA模型,可以有效地建模和预测这些序列
本文代码
我们将使用多个相关联的时间序列(GDP,失业率,通货膨胀率)进行差分处理,以分析它们的联合动态
核心代码
% 清理工作区
clear;
clc;
close all;
%% Step 1: 生成或导入多变量时间序列数据
% 假设我们有三个相关的时间序列数据(例如:GDP、失业率、通货膨胀率)
n = 200; % 样本点数量
t = (1:n)';
% 生成相关联的时间序列数据
rng(0); % 固定随机种子
GDP = cumsum(randn(n,1)) + 0.05*t; % GDP - 增加的随机游走
Unemployment = 0.5*GDP + randn(n,1); % 失业率 - GDP的部分影响
Inflation = 0.2*GDP - 0.3*Unemployment + randn(n,1); % 通货膨胀 - 受GDP和失业率影响
% 将数据放入表格中
data = table(t, GDP, Unemployment, Inflation);
% 可视化原始数据
figure;
subplot(3,1,1);
plot(t, GDP);
title('GDP');
ylabel('Value');
grid on;
subplot(3,1,2);
plot(t, Unemployment);
title('Unemployment');
ylabel('Rate');
grid on;
subplot(3,1,3);
plot(t, Inflation);
title('Inflation');
ylabel('Rate');
xlabel('Time');
grid on;
%% Step 2: 数据预处理(差分处理)
% 对每个时间序列进行一阶差分以去除趋势
% 将差分后的数据放入新表格中
diffData = table(t(2:end), diffGDP, diffUnemployment, diffInflation);
% 可视化差分后的数据
figure;
subplot(3,1,1);
plot(t(2:end), diffGDP);
title('Differenced GDP');
ylabel('Value');
grid on;
subplot(3,1,2);
plot(t(2:end), diffUnemployment);
title('Differenced Unemployment');
ylabel('Rate');
grid on;
subplot(3,1,3);
plot(t(2:end), diffInflation);
title('Differenced Inflation');
ylabel('Rate');
xlabel('Time');
grid on;
%% Step 3: 相关性分析
% 计算差分后的时间序列之间的相关系数
corrMatrix = corr([diffGDP, diffUnemployment, diffInflation]);
% 显示相关性矩阵
disp('Correlation matrix between differenced variables:');
disp(array2table(corrMatrix, 'VariableNames', {'GDP', 'Unemployment', 'Inflation'}, ...
'RowNames', {'GDP', 'Unemployment', 'Inflation'}));
% 可视化相关性矩阵
figure;
heatmap({'GDP', 'Unemployment', 'Inflation'}, {'GDP', 'Unemployment', 'Inflation'}, corrMatrix);
title('Correlation Matrix of Differenced Variables');
colorbar;
% 拟合VAR模型
EstModel = estimate(VARmodel, Y);
% 显示VAR模型的系数
disp('Estimated VAR model coefficients:');
disp(EstModel.AR);
%% Step 5: 预测与可视化
% 进行预测(假设预测10个时间点)
% 可视化预测结果
figure;
subplot(3,1,1);
hold on;
plot(t(2:end), diffGDP, 'b', 'DisplayName', 'Observed');
plot(t(end)+[1:numPeriods]', Y_forecast(:,1), 'r', 'DisplayName', 'Forecast');
title('GDP Differenced - Forecast vs Observed');
ylabel('Value');
legend('show');
grid on;
subplot(3,1,2);
hold on;
plot(t(2:end), diffUnemployment, 'b', 'DisplayName', 'Observed');
plot(t(end)+[1:numPeriods]', Y_forecast(:,2), 'r', 'DisplayName', 'Forecast');
title('Unemployment Differenced - Forecast vs Observed');
ylabel('Rate');
legend('show');
grid on;
subplot(3,1,3);
hold on;
plot(t(2:end), diffInflation, 'b', 'DisplayName', 'Observed');
plot(t(end)+[1:numPeriods]', Y_forecast(:,3), 'r', 'DisplayName', 'Forecast');
title('Inflation Differenced - Forecast vs Observed');
ylabel('Rate');
xlabel('Time');
legend('show');
grid on;
代码说明
数据生成或导入:
在代码中,我们生成了三个相关的时间序列数据(GDP、失业率、通货膨胀率),其中每个序列都可能受到其他序列的影响。我们使用累积随机游走来模拟这些数据。
数据预处理(差分处理):
对时间序列进行一阶差分,以去除趋势并使序列平稳化。这是VAR模型分析的前提条件,因为VAR模型要求输入的时间序列是平稳的。
相关性分析:
使用相关矩阵分析差分后时间序列之间的线性关系。相关性矩阵和热图可以帮助我们直观理解变量之间的关联强度。
构建VAR模型:
使用差分后的时间序列数据构建VAR模型。在这个示例中,选择滞后阶数为2,并估计模型系数。
VAR模型是多变量时间序列分析的强大工具,能够捕捉多个时间序列之间的动态相互作用。
预测与可视化:
基于估计的VAR模型,我们对未来的时间点进行预测,并将预测结果与实际观测数据进行对比。通过可视化,我们可以看到VAR模型对未来变化的预测效果
优化方向
模型阶数优化:可以通过信息准则(如AIC、BIC)来自动选择VAR模型的最佳滞后阶数。
季节性差分:如果时间序列具有季节性特征,可以结合季节性差分来进一步去除季节性影响。
多种差分组合:在实际应用中,可能需要结合多种差分方式,如季节性差分和一阶差分组合使用,以处理更复杂的非平稳序列。
模型扩展:可以扩展到VARMA(Vector Autoregressive Moving Average)模型,以捕捉更复杂的动态模式。
效果图示
完整代码获取
关注下方卡片公众号,回复“Diff”获取完整代码