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

  • 相关阅读:
    腾讯云服务器2023最新活动入口(特价攻略渠道)
    LeetCode【13】罗马数字转整数
    JS前端读取文件夹中文件(基于webpack)
    【极速审稿】物联网传感器类SCI&EI,仅17天录用,计算机领域SCI快刊盘点
    react create-react-app v5 从零搭建项目
    通过私钥连接腾讯云,实现免密远程登录
    git Husky
    微信小程序导航组件 navigator使用
    野火FPGA强化(1):串口
    Tomcat部署及优化
  • 原文地址:https://blog.csdn.net/weixin_54634208/article/details/133780217