• 使用Python构造VARIMA模型


    简介

    VARMA(p,q)结合了VAR和VMA模型,其中p是向量自回归(VAR)模型的滞后期数,q是VMA模型的移动平均的阶数。

    VARMA是ARMA的推广,它将ARMA模型扩展到多个时间序列变量的情况,通过VAR和VMA的线性组合来描述多个时间序列变量之间的联合变化,适合描述多个时间序列变量之间的关系。 时间序列变量。

    通过将 q 参数设置为 0,VARMA 模型可以像 VAR 模型一样工作;通过将 p 参数设置为 0,它也可以像 VMA 模型一样工作。VARMA 也不能处理非平稳金融时间序列数据。 矢量自回归积分移动平均(VARIMA)是一种经历差分过程的VARMA模型。

    首先,应用约翰森检验(Johansen test ),结果表明英国的GDP、失业率和CPIH之间存在长期均衡关系。
    因此,它们可以作为协变量来预测GDP。 正如ARIMA模型分析中提到的,GDP时间序列是不稳定的,因此必须在时间序列中实施一阶差分。 然后,还应用归一化过程。使用 MinMaxScaler() 函数后,数据将缩放到特定范围。 然后,将归一化后的数据按比例划分为训练集和测试集。
    通过使用VARMAX功能,它将能够自动与AIC标准进行比较并找到最佳模型。 最优模型将具有最小的 AIC 值。 此外,预测的GDP值需要进行非标准化处理,以便与原始数据进行比较。

    代码构建

    首先导入需要用到的Python包:

    1. import pandas as pd
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. from statsmodels.tsa.stattools import adfuller
    5. from statsmodels.tsa.statespace.varmax import VARMAX
    6. from sklearn.preprocessing import MinMaxScaler
    7. from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    8. from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error

    然后读取.csv文件的时序数据,这里使用了英国的GDP数据,CPI(通货膨胀率)和Unemployment rate(失业率)作为covariate(协变量)。

    1. # 1. 读取csv时序数据
    2. gdp_data = pd.read_csv('datasets/UK_GDP.csv')[["GDP"]]
    3. inflation_data = pd.read_csv('datasets/UK_inflation.csv')[["Inflation"]]
    4. unemployment_data = pd.read_csv('datasets/UK_unemployment.csv')[["Unemployment"]]
    5. data_origin = gdp_data.copy()

    接着对所有数据进行一阶差分,使其稳定(因为之前的博客已经对同数据进行过检测,并确定数据不稳定,所以要进行差分)。

    1. gdp_data = gdp_data.diff().dropna()
    2. inflation_data = inflation_data.diff().dropna()
    3. unemployment_data = unemployment_data.diff().dropna()

    然后对处理过的数据进行归一化。

    1. scaler1 = MinMaxScaler()
    2. scaled_gdp_data = pd.DataFrame(scaler1.fit_transform(gdp_data), columns=gdp_data.columns, index=gdp_data.index)
    3. scaler2 = MinMaxScaler()
    4. scaled_inflation_data = pd.DataFrame(scaler2.fit_transform(inflation_data), columns=inflation_data.columns, index=inflation_data.index)
    5. scaler3 = MinMaxScaler()
    6. scaled_unemployment_data = pd.DataFrame(scaler3.fit_transform(unemployment_data), columns=unemployment_data.columns, index=unemployment_data.index)

    然后自动定阶,通过AIC找出最合适的参数。

    1. merged_data = pd.concat([scaled_gdp_data, scaled_inflation_data, scaled_unemployment_data], axis=1)
    2. train_size = int(len(merged_data))-3
    3. train_data, test_data = merged_data[:train_size], merged_data[train_size:]
    4. best_aic = np.inf
    5. best_order = None
    6. best_model = None
    7. pq_range = range(2) # 取值范围
    8. for p in pq_range:
    9. for q in pq_range:
    10. try:
    11. model = VARMAX(train_data, order=(p, q))
    12. result = model.fit()
    13. aic = result.aic
    14. if aic < best_aic:
    15. best_aic = aic
    16. best_order = (p, q)
    17. best_model = result
    18. except:
    19. continue
    20. print("Best order:", best_order)
    21. print("Best AIC:", best_aic)

    使用VARIMA模型进行预测,打印预测值和真实值的对比图,并计算模型RMSE和MAPE指标。

    1. gdp_predictions = best_model.forecast(steps=len(test_data))[['GDP']]
    2. gdp_predictions = pd.DataFrame(gdp_predictions, columns=['GDP'], index=test_data.index-1)
    3. gdp_predictions = scaler1.inverse_transform(gdp_predictions)
    4. actual = scaler1.inverse_transform(test_data[['GDP']])
    5. actual = np.array(gdp_data[-3:].cumsum() + data_origin.values[127])
    6. predictions = gdp_predictions.cumsum() + data_origin.values[127]
    7. plt.figure()
    8. plt.plot(actual, label='Actual')
    9. plt.plot(predictions, label='Predicted')
    10. plt.legend()
    11. plt.show()
    12. rmse = np.sqrt(mean_squared_error(actual, predictions))
    13. mape = mean_absolute_percentage_error(actual, predictions)
    14. print(f"RMSE: {rmse}")
    15. print(f"MAPE: {mape}")

  • 相关阅读:
    字节码文件(.class文件)
    1024程序员节,给大家送份福利
    vue3在路由route.js中获取不到仓库pinia中store里面的值
    代码随想录 | Day 58 - LeetCode 739. 每日温度、496. 下一个更大元素 I
    从 wepy 到 uniapp 变形记
    【springboot】4、容器功能
    [Codeforces] number theory (R1200) Part.10
    基于51单片机的计件器设计
    MySQL索引设计原则
    确定性执行
  • 原文地址:https://blog.csdn.net/weixin_54634208/article/details/133780217