其中:

向量自回歸(VAR)模型的推導

VAR 模型擴展了自回歸模型的思路,用來處理多個相互關聯的時間序列。假設我們有??個變量(如多個公司的股票價格或不同地區的氣溫),則這些變量不僅僅是受自身過去的影響,還受到其他變量的歷史值影響。

對于一個VAR(p)模型,可以表示為:

其中:

這樣,對于多個變量,VAR模型考慮了它們之間的交互影響。我們要根據歷史數據估計這些  矩陣中的系數。

最小二乘法估計參數

為了估計 VAR 模型中的參數矩陣 ,我們通常使用最小二乘法。這涉及將歷史數據表示為線性方程組,并通過最小化誤差項  來估計模型系數。

步驟概述

完整案例

我們生成一個簡單的時間序列虛擬數據集~

接下來,我們將逐步實現VAR模型的核心步驟。

數據預處理

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 1. 生成虛擬數據作為案例數據集
np.random.seed(42)

# 定義時間長度
n = 500 # 我們生成500個時間點的數據

# 初始化變量
gdp_growth = np.zeros(n)
unemployment_rate = np.zeros(n)
cpi = np.zeros(n)

# 隨機初始值
gdp_growth[0] = np.random.normal(2, 0.5) # 初始GDP增長率
unemployment_rate[0] = np.random.normal(5, 0.5) # 初始失業率
cpi[0] = np.random.normal(100, 2) # 初始CPI

# 人為設置數據生成的規則(根據上一期的值和一些噪聲)
for t in range(1, n):
gdp_growth[t] = 0.8 * gdp_growth[t-1] - 0.2 * cpi[t-1] + np.random.normal(0, 0.5)
unemployment_rate[t] = 0.7 * unemployment_rate[t-1] - 0.1 * gdp_growth[t-1] + np.random.normal(0, 0.2)
cpi[t] = 0.5 * cpi[t-1] + 0.3 * gdp_growth[t-1] + np.random.normal(0, 1)

# 將生成的數據整理為DataFrame
data = pd.DataFrame({
'GDP_growth': gdp_growth,
'unemployment_rate': unemployment_rate,
'CPI': cpi
})
variables = ['GDP_growth', 'unemployment_rate', 'CPI']
data = data[variables].dropna()
data = (data - data.mean()) / data.std()

# 查看數據
print(data.head())

創建滯后變量

# 定義滯后變量的生成函數
def create_lagged_data(data, max_lag):
lagged_data = []
for lag in range(1, max_lag + 1):
lagged_data.append(data.shift(lag))
return pd.concat(lagged_data, axis=1)

# 假設我們使用2個滯后變量
max_lag = 2
lagged_data = create_lagged_data(data, max_lag)

# 將滯后變量與原始數據拼接,去掉缺失的初始行
lagged_data = lagged_data.dropna()
X = lagged_data.values
Y = data[max_lag:].values

參數估計(最小二乘法)

# 使用最小二乘法估計VAR模型參數
def estimate_var(X, Y):
# 增加常數項(攔截項)
X = np.hstack([np.ones((X.shape[0], 1)), X])

# OLS公式: B = (X^T X)^(-1) X^T Y
B = np.linalg.inv(X.T @ X) @ X.T @ Y
return B

# 估計參數矩陣
B = estimate_var(X, Y)
print("估計的系數矩陣:\n", B)

預測未來值

# 進行預測
def predict(X, B):
X = np.hstack([np.ones((X.shape[0], 1)), X]) # 加入常數項
return X @ B

# 預測未來值
predicted_values = predict(X, B)

繪制數據分析圖

圖1:變量趨勢圖

plt.figure(figsize=(10, 6))
for col in data.columns:
plt.plot(data.index, data[col], label=col)
plt.title("Trends of Variables Over Time") # 標題改為英文
plt.xlabel("Time") # x軸標簽改為英文
plt.ylabel("Standardized Value") # y軸標簽改為英文
plt.legend()
plt.show()

圖2:滯后相關性圖

from pandas.plotting import lag_plot
plt.figure(figsize=(10, 6))
for i, var in enumerate(variables):
plt.subplot(2, 2, i+1)
lag_plot(data[var], lag=1)
plt.title(f'{var} Lag Relationship')
plt.tight_layout()
plt.show()

圖3:殘差分析圖

residuals = Y - predicted_values
plt.figure(figsize=(10, 6))
plt.plot(residuals)
plt.title("Residual Analysis")
plt.xlabel("Time")
plt.ylabel("Residuals")
plt.show()

圖4:預測結果對比圖

plt.figure(figsize=(10, 6))
plt.plot(Y[:, 0], label="True Values")
plt.plot(predicted_values[:, 0], label="Predicted Values", linestyle="--")
plt.title("Comparison of Predicted and True Values (GDP Growth Rate)")
plt.xlabel("Time")
plt.ylabel("Value")
plt.legend()
plt.show()

通過這個案例,我們從零實現了向量自回歸模型(VAR)的核心步驟,并進行了多種數據分析和圖形展示,大家可以依照理論進行學習~

最后

通過手動實現 ARMA 模型,可以深刻理解其數學推導和實現細節,同時通過圖形直觀地理解模型的擬合效果和殘差分布。

本文章轉載微信公眾號@深夜努力寫Python

上一篇:

SOFTS模型的單特征時間序列預測實現

下一篇:

突破LSTM,消費預測 !!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費