推導

優缺點

適用場景

ARMA 模型通常用于平穩時間序列的建模和預測,如股票價格、經濟指標、氣象數據的短期預測等。

核心案例代碼

我們使用 ARMA 模型預測股票市場數據。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# 生成示例數據:股票價格的時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
data = np.cumsum(np.random.randn(100)) + 100 # 隨機漫步序列

# 創建DataFrame
df = pd.DataFrame(data, index=dates, columns=['Stock Price'])

# 擬合ARMA模型 (p=2, q=2)
model = ARIMA(df['Stock Price'], order=(2, 0, 2))
arma_result = model.fit()

# 預測未來20個時間點
forecast = arma_result.get_forecast(steps=20)
forecast_index = pd.date_range(df.index[-1], periods=21, freq='D')[1:]
forecast_values = forecast.predicted_mean

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Stock Price'], label='Observed', color='blue')
plt.plot(forecast_index, forecast_values, label='Forecast', color='red', linestyle='--')
plt.fill_between(forecast_index,
forecast.conf_int().iloc[:, 0],
forecast.conf_int().iloc[:, 1],
color='pink', alpha=0.3)
plt.title('ARMA Model Forecast of Stock Price')
plt.xlabel('Date')
plt.ylabel('Stock Price')
plt.legend()
plt.grid(True)
plt.show()

整個代碼生成一個隨機漫步的股票價格序列,使用 ARMA 模型進行擬合并預測未來 20 天的股票價格。圖中展示了實際的時間序列數據(藍色)以及預測的未來值(紅色虛線),同時預測區間的置信區間以粉色陰影表示。

2. 自回歸積分滑動平均模型(ARIMA)

原理

ARIMA 模型是 ARMA 模型的擴展,適用于非平穩時間序列。ARIMA 模型通過差分操作使非平穩時間序列轉化為平穩時間序列,再對平穩時間序列進行 ARMA 模型擬合。

ARIMA 模型的三個主要參數分別是:

其中,差分次數 是用來消除時間序列中的趨勢成分,使其成為平穩序列。

核心公式

推導

差分操作

應用 ARMA 模型

對差分后的序列應用 ARMA 模型。

優缺點

適用場景

ARIMA 模型廣泛用于經濟、金融等領域的時間序列預測,如 GDP、通貨膨脹率、失業率、股票價格等。特別適合處理有趨勢但無明顯季節性的時間序列。

核心案例代碼

我們將使用 ARIMA 模型預測一個包含趨勢的時間序列數據。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# 生成示例數據:帶有趨勢的時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=200)
trend = np.linspace(10, 30, 200) # 線性趨勢
data = trend + np.random.randn(200) * 2 # 疊加噪聲

# 創建DataFrame
df = pd.DataFrame(data, index=dates, columns=['Value'])

# 擬合ARIMA模型 (p=2, d=1, q=2)
model = ARIMA(df['Value'], order=(2, 1, 2))
arima_result = model.fit()

# 預測未來30個時間點
forecast = arima_result.get_forecast(steps=30)
forecast_index = pd.date_range(df.index[-1], periods=31, freq='D')[1:]
forecast_values = forecast.predicted_mean

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Value'], label='Observed', color='blue')
plt.plot(forecast_index, forecast_values, label='Forecast', color='green', linestyle='--')
plt.fill_between(forecast_index,
forecast.conf_int().iloc[:, 0],
forecast.conf_int().iloc[:, 1],
color='lightgreen', alpha=0.3)
plt.title('ARIMA Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

使用 ARIMA 模型進行擬合和預測。預測結果用綠色虛線表示,預測的置信區間用淺綠色陰影表示。圖中展示了過去的觀測值(藍色)和未來 30 天的預測值,展示了 ARIMA 模型對趨勢的預測能力。

3. 季節性自回歸積分滑動平均模型(SARIMA)

原理

SARIMA 模型是 ARIMA 模型的擴展,用于處理具有季節性成分的時間序列。SARIMA 模型引入了季節性成分,通過增加季節性自回歸(SAR)、季節性差分(I)和季節性移動平均(SMA)項來建模。

核心公式

推導

優缺點

適用場景

SARIMA 模型適用于具有季節性波動的時間序列數據,如月度銷售數據、季節性氣象數據等。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX

# 生成示例數據:季節性時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=120, freq='M')
seasonal_component = 10 + 10 * np.sin(np.linspace(0, 3 * np.pi, 120))
data = seasonal_component + np.random.randn(120) * 2 # 疊加噪聲

# 創建DataFrame
df = pd.DataFrame(data, index=dates, columns=['Value'])

# 擬合SARIMA模型 (p=1, d=1, q=1, P=1, D=1, Q=1, s=12)
model = SARIMAX(df['Value'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
sarima_result = model.fit()

# 預測未來12個月
forecast = sarima_result.get_forecast(steps=12)
forecast_index = pd.date_range(df.index[-1] + pd.DateOffset(months=1), periods=12, freq='M')
forecast_values = forecast.predicted_mean

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Value'], label='Observed', color='blue')
plt.plot(forecast_index, forecast_values, label='Forecast', color='orange', linestyle='--')
plt.fill_between(forecast_index,
forecast.conf_int().iloc[:, 0],
forecast.conf_int().iloc[:, 1],
color='#FFA07A', alpha=0.3) # 使用有效的顏色代碼
plt.title('SARIMA Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了一個具有季節性波動的時間序列數據(藍色)和未來 12 個月的預測值(橙色虛線)。預測區間的置信區間用淺橙色陰影表示。SARIMA 模型能夠有效捕捉時間序列中的季節性模式。

4. 向量自回歸模型(VAR)

原理

VAR 模型用于建模多個時間序列變量之間的相互依賴關系。與 ARMA 模型只對單一時間序列進行建模不同,VAR 模型能夠處理多變量時間序列,捕捉它們之間的動態關系。

核心公式

推導

優缺點

適用場景

VAR 模型適用于多個經濟、金融或社會時間序列變量的建模與預測,如宏觀經濟指標(GDP、通貨膨脹率、失業率)之間的關系分析。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.api import VAR

# 生成示例數據:多變量時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
data1 = np.cumsum(np.random.randn(100)) + 50
data2 = np.cumsum(np.random.randn(100)) + 30
data = pd.DataFrame({'Variable1': data1, 'Variable2': data2}, index=dates)

# 擬合VAR模型 (p=2)
model = VAR(data)
var_result = model.fit(2)

# 預測未來10個時間點
forecast = var_result.forecast(data.values[-2:], steps=10)
forecast_index = pd.date_range(dates[-1] + pd.DateOffset(days=1), periods=10)
forecast_df = pd.DataFrame(forecast, index=forecast_index, columns=data.columns)

# 可視化
plt.figure(figsize=(14, 7))
plt.plot(data.index, data['Variable1'], label='Variable1 (Observed)', color='blue')
plt.plot(data.index, data['Variable2'], label='Variable2 (Observed)', color='green')
plt.plot(forecast_df.index, forecast_df['Variable1'], label='Variable1 (Forecast)', color='orange', linestyle='--')
plt.plot(forecast_df.index, forecast_df['Variable2'], label='Variable2 (Forecast)', color='red', linestyle='--')
plt.title('VAR Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了兩個時間序列變量的觀測數據(藍色和綠色)以及未來 10 天的預測值(橙色和紅色虛線)。VAR 模型能有效捕捉兩個變量之間的動態關系。

5. 廣義自回歸條件異方差模型(GARCH)

原理

GARCH 模型用于建模時間序列數據的條件異方差性,特別是金融時間序列數據的波動性。GARCH 模型擴展了 ARCH 模型,通過引入過去的方差來解釋當前的方差。

核心公式

推導

優缺點

適用場景

GARCH 模型廣泛用于金融時間序列數據,如股票收益率、匯率等,用于建模和預測波動性。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model

# 生成示例數據:金融時間序列(收益率)
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=250)
returns = np.random.randn(250) * 0.02 # 生成隨機收益率數據

# 創建DataFrame
df = pd.DataFrame(returns, index=dates, columns=['Returns'])

# 擬合GARCH模型 (p=1, q=1)
model = arch_model(df['Returns'], vol='Garch', p=1, q=1)
garch_result = model.fit()

# 預測未來10個時間點的波動性
forecast = garch_result.forecast(horizon=10)
forecast_index = pd.date_range(dates[-1] + pd.DateOffset(days=1), periods=10)
forecast_volatility = forecast.variance.values[-1, :]

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Returns']**2, label='Observed Variance', color='blue')
plt.plot(forecast_index, forecast_volatility, label='Forecasted Volatility', color='red', linestyle='--')
plt.title('GARCH Model Forecast')
plt.xlabel('Date')
plt.ylabel('Variance')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了實際的方差(藍色)和未來 10 天的預測波動性(紅色虛線)。GARCH 模型能有效捕捉時間序列中的波動性特征。

6. Prophet

原理

Prophet 是由 Facebook 開發的時間序列預測模型,專為處理具有強季節性、趨勢變化以及缺失值和異常值的時間序列數據設計。它的核心思想是將時間序列數據分解為趨勢、季節性和假期效應三個部分。

核心公式

推導

其中P 是季節周期, K是季節性頻率的數量。

3. 假期效應

優缺點

適用場景

Prophet 模型適用于各種具有強季節性和趨勢性的數據,例如零售銷售、網站流量、生產量等。

核心案例代碼

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from prophet import Prophet # 使用 prophet 替代 fbprophet

# 生成示例數據:帶有季節性和趨勢的時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=365)
data = np.linspace(10, 50, 365) + 10 * np.sin(np.linspace(0, 2 * np.pi, 365)) + np.random.randn(365) * 5

# 創建DataFrame
df = pd.DataFrame({'ds': dates, 'y': data})

# 擬合Prophet模型
model = Prophet(yearly_seasonality=True)
model.fit(df)

# 預測未來30天
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)

# 可視化
fig = model.plot(forecast)
plt.title('Prophet Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.show()

圖中展示了時間序列數據(黑色點)及其預測結果(藍色線)。Prophet 模型能有效捕捉時間序列中的趨勢和季節性成分,并進行未來的預測。

7. 長短期記憶網絡(LSTM)

原理

LSTM 是一種特殊類型的循環神經網絡(RNN),用于捕捉時間序列數據中的長期依賴關系。LSTM 網絡通過引入門控機制(輸入門、遺忘門和輸出門)來解決標準 RNN 中的梯度消失和爆炸問題。

核心公式

LSTM 網絡的核心公式如下:

優缺點

適用場景

LSTM 模型適用于序列預測任務,如股票價格預測、語音識別、自然語言處理等。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler

# 生成示例數據:時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
data = np.sin(np.linspace(0, 10, 100)) + np.random.randn(100) * 0.1

# 創建DataFrame
df = pd.DataFrame({'Date': dates, 'Value': data})

# 預處理數據
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df[['Value']])
X, y = [], []
for i in range(len(scaled_data) - 10):
X.append(scaled_data[i:i+10])
y.append(scaled_data[i+10])
X, y = np.array(X), np.array(y)

# 構建LSTM模型
model = Sequential()
model.add(LSTM(50, input_shape=(X.shape[1], X.shape[2])))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X, y, epochs=20, verbose=1)

# 預測
predicted = model.predict(X)
predicted = scaler.inverse_transform(predicted)
actual = scaler.inverse_transform(y.reshape(-1, 1))

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df['Date'][10:], actual, label='Actual', color='blue')
plt.plot(df['Date'][10:], predicted, label='Predicted', color='red', linestyle='--')
plt.title('LSTM Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了 LSTM 模型的預測結果(紅色虛線)與實際數據(藍色)。LSTM 能夠捕捉時間序列的長期依賴特征并進行準確預測。

8. 門控循環單元(GRU)

原理

GRU 是另一種改進的 RNN 結構,旨在克服標準 RNN 的梯度消失問題。GRU 相較于 LSTM 具有更簡潔的結構,只使用了重置門和更新門來控制信息的流動。

核心公式

優缺點

適用場景

GRU 模型適用于需要捕捉長期依賴關系的時間序列預測任務,如時間序列預測、自然語言處理等。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import GRU, Dense
from sklearn.preprocessing import MinMaxScaler

# 生成示例數據:時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
data = np.sin(np.linspace(0, 10, 100)) + np.random.randn(100) * 0.1

# 創建DataFrame
df = pd.DataFrame({'Date': dates, 'Value': data})

# 預處理數據
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df[['Value']])
X, y = [], []
for i in range(len(scaled_data) - 10):
X.append(scaled_data[i:i+10])
y.append(scaled_data[i+10])
X, y = np.array(X), np.array(y)

# 構建GRU模型
model = Sequential()
model.add(GRU(50, input_shape=(X.shape[1], X.shape[2])))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X, y, epochs=20, verbose=1)

# 預測
predicted = model.predict(X)
predicted = scaler.inverse_transform(predicted)
actual = scaler.inverse_transform(y.reshape(-1, 1))

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df['Date'][10:], actual, label='Actual', color='blue')
plt.plot(df['Date'][10:], predicted, label='Predicted', color='red', linestyle='--')
plt.title('GRU Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了 GRU 模型的預測結果(紅色虛線)與實際數據(藍色)。GRU 能夠有效處理時間序列數據并進行預測。

9. 貝葉斯結構時間序列模型(BSTS)

原理

BSTS 模型是基于貝葉斯框架的時間序列建模方法,它允許對時間序列數據中的趨勢、季節性和假期效應進行建模。BSTS 模型結合了結構時間序列模型和貝葉斯推斷方法,以提供靈活的建模能力。

核心公式

推導

  1. 趨勢: 使用隨機游走模型或加法趨勢模型。
  2. 季節性: 建模季節性波動。
  3. 假期效應: 通過特定的假期效應模型引入。

優缺點

適用場景

BSTS 模型適用于具有復雜結構的時間序列數據,如業務銷售數據、經濟指標預測等。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import numpyro
from bsts import BSTS
import jax
import jax.numpy as jnp

# 確認可用設備數量
print(f"Number of available devices: {jax.local_device_count()}")

# 設置主機設備數量(根據實際情況調整)
numpyro.set_host_device_count(1) # 設置為實際可用的設備數量

# 生成示例數據
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=365)
data = np.linspace(10, 50, 365) + 10 * np.sin(np.linspace(0, 2 * np.pi, 365)) + np.random.randn(365) * 5
df = pd.DataFrame({'Date': dates, 'Value': data})

# 確保數據格式正確
values = np.asarray(df['Value'], dtype=np.float32)

# 初始化 BSTS 模型
model = BSTS(values)

# 擬合模型
model.fit(values)

# 預測未來30天
forecast = model.predict(steps=30)

# 生成未來日期
forecast_index = pd.date_range(dates[-1] + pd.DateOffset(days=1), periods=30)
forecast_values = forecast['mean'] # 根據實際返回值的結構調整

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df['Date'], df['Value'], label='Observed', color='blue')
plt.plot(forecast_index, forecast_values, label='Forecast', color='red', linestyle='--')
plt.title('BSTS Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了時間序列數據(藍色)及其預測結果(紅色虛線)。BSTS 模型能夠捕捉時間序列的復雜成分并進行預測。

10. 序列到序列模型(Seq2Seq)

原理

Seq2Seq 模型是一種深度學習模型,用于處理序列到序列的任務,如機器翻譯和時間序列預測。Seq2Seq 模型通常由一個編碼器和一個解碼器組成,其中編碼器處理輸入序列,解碼器生成輸出序列。

核心公式

Seq2Seq 模型的核心公式包括編碼器和解碼器:

優缺點

適用場景

Seq2Seq 模型適用于需要進行序列轉換的任務,如時間序列預測、自然語言處理等。

核心案例代碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler

# 生成示例數據:時間序列
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
data = np.sin(np.linspace(0, 10, 100)) + np.random.randn(100) * 0.1

# 創建DataFrame
df = pd.DataFrame({'Date': dates, 'Value': data})

# 預處理數據
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df[['Value']])
X, y = [], []
for i in range(len(scaled_data) - 10):
X.append(scaled_data[i:i+10])
y.append(scaled_data[i+10])
X, y = np.array(X), np.array(y)

# 構建Seq2Seq模型
model = Sequential()
model.add(LSTM(50, input_shape=(X.shape[1], X.shape[2])))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X, y, epochs=20, verbose=1)

# 預測
predicted = model.predict(X)
predicted = scaler.inverse_transform(predicted)
actual = scaler.inverse_transform(y.reshape(-1, 1))

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(df['Date'][10:], actual, label='Actual', color='blue')
plt.plot(df['Date'][10:], predicted, label='Predicted', color='red', linestyle='--')
plt.title('Seq2Seq Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

圖中展示了 Seq2Seq 模型的預測結果(紅色虛線)與實際數據(藍色)。Seq2Seq 模型能有效進行時間序列的預測任務。

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

上一篇:

十大回歸算法模型 最強總結 ?。?/h5>

下一篇:

選擇最佳模型,輕松上手 GBDT、LightGBM、XGBoost、AdaBoost ??!
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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