• 使用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}")

  • 相关阅读:
    torch 的 3种矩阵乘法运算
    物联网AI MicroPython学习之语法 SPI串行外设通信
    基于TCP的聊天系统
    springboot+redis+sse+vue实现分布式消息发布/通知
    在linux上脱离hadoop安装hbase-2.5.6集群
    php+mysql实现补齐24小时时间段同时赋值0的后端解决方案
    LLVM(6)ORC实例分析:Transform in cpp
    没有几十年功力,写不出这一行“看似无用”的代码!!
    UDP协议
    【SQL解析】- SQL血缘分析实现篇01
  • 原文地址:https://blog.csdn.net/weixin_54634208/article/details/133780217