JRHU0048 / blog

0 stars 0 forks source link

时间序列分析 #5

Open JRHU0048 opened 9 months ago

JRHU0048 commented 9 months ago

在计量经济学中,单位根检验是用来检验时间序列数据是否具有单位根(非平稳性)的方法之一。常用的单位根检验方法包括ADF检验(Augmented Dickey-Fuller test)和PP检验(Phillips-Perron test)。以下是使用Python和MATLAB进行ADF检验的代码示例:

Python代码(使用Statsmodels库(测试通过)

import pandas as pd
from statsmodels.tsa.stattools import adfuller
import chardet

# 使用 chardet 来检测文件编码
with open('全球汽车销量数据.csv', 'rb') as f:   #文件名
    result = chardet.detect(f.read())
    encoding = result['encoding']

# 使用检测到的编码来读取文件
data = pd.read_csv('全球汽车销量数据.csv', encoding=encoding)   

# 进行ADF检验
result = adfuller(data['销量'])
print('ADF统计量:', result[0])
print('P值:', result[1])
print('关键值:', result[4])

# 检查P值是否小于显著性水平(通常选择0.05)
if result[1] <= 0.05:
    print('拒绝原假设,数据平稳')
else:
    print('接受原假设,数据非平稳')

上面的代码基本实现了当差分阶数为0时的ADF检验相关结果,若想要一次输出差分阶数为0,1,2时的各个结果,若数据量较少,可以人工差分处理后多次使用上面的代码,也可以使用下面的代码一次输出:(测试不通过)

import pandas as pd
from statsmodels.tsa.stattools import adfuller
import chardet

# 使用 chardet 来检测文件编码
with open('全球汽车销量数据.csv', 'rb') as f:
    result = chardet.detect(f.read())
    encoding = result['encoding']

# 使用检测到的编码来读取文件
data = pd.read_csv('全球汽车销量数据.csv', encoding=encoding)

# 打印原始数据的一些统计信息
print("原始数据的统计信息:")
print(data['销量'].describe())

# 进行差分阶数分别为0、1、2的ADF检验
for d in range(1):  # 0, 1, 2
    differenced_data = data['销量'].diff(d).dropna()

    print(f"\n差分阶数 {d} 的 ADF检验结果:")

    result = adfuller(differenced_data)
    print('ADF统计量:', result[0])
    print('P值:', result[1])
    print('关键值:', result[4])

    # 检查P值是否小于显著性水平(通常选择0.05)
    if result[1] <= 0.05:
        print('拒绝原假设,数据平稳')
    else:
        print('未拒绝原假设,数据非平稳')

1.通过分析t值,分析其是否可以显著地拒绝序列不平稳的原假设(P<0.05)。 2.若呈显著性,表明拒绝序列不平稳的原假设,该序列为一个平稳的时间序列。 3.若不呈显著性,表明不能拒绝序列不平稳的原假设,该序列为一个不平稳的时间序列,考虑对数据进行差分,一般不超过二阶差分。

MATLAB代码 (没有测试过)

% 假设你的时间序列数据存储在名为 'data' 的向量中
data = load('your_data.mat');  % 替换成你的数据文件路径或直接输入数据向量

% 进行ADF检验
[h, pValue, stat, cValue] = adftest(data);

% 显示结果
disp(['ADF统计量:', num2str(stat)]);
disp(['P值:', num2str(pValue)]);
disp(['关键值:', num2str(cValue')]);

% 检查P值是否小于显著性水平(通常选择0.05)
if pValue <= 0.05
    disp('拒绝原假设,数据平稳');
else
    disp('未拒绝原假设,数据非平稳');
end
JRHU0048 commented 9 months ago

在确定的pdq之后就可以使用时间序列分析ARIMA模型来预测

% Raw data  
data = [6.1000;30.0500 ;8.0000 ; 23.1000 ; 46.0000; 2.5000 ;28.1000;222.1000;332.6000];

% time points
time_points = 1:numel(data);

% Converts data into double array
data_array = double(data);

% Fit the ARIMA model
arima_order = [5, 1, 1];   %模型的参数需要设置

% Fit the model with existing data
arima_model = arima('ARLags', 1:arima_order(1), 'D', arima_order(2), 'MALags', 1:arima_order(3));
fit = estimate(arima_model, data_array);

% Forecast data for the next ten years
future_years = 12;   %预测的年份
future_time_points = time_points(end) + (1:future_years);
forecast_data = forecast(fit, future_years, 'Y0', data_array);

% Plot line charts of raw and forecasted data
plot(time_points, data_array, 'o-', future_time_points, forecast_data, 'x-');
title('ARIMA Model Fitting');
xlabel('point in time');
ylabel('data-value');
legend('raw data', 'predicted data');

% Display Gridlines (Optional)
grid on;

% Print the forecast results
disp('raw data:');
disp(data');

disp('Forecast data:');
disp(forecast_data');