
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
推導:
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 天的股票價格。圖中展示了實際的時間序列數據(藍色)以及預測的未來值(紅色虛線),同時預測區間的置信區間以粉色陰影表示。
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 模型對趨勢的預測能力。
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 模型能夠有效捕捉時間序列中的季節性模式。
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 模型能有效捕捉兩個變量之間的動態關系。
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 模型能有效捕捉時間序列中的波動性特征。
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 模型能有效捕捉時間序列中的趨勢和季節性成分,并進行未來的預測。
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 能夠捕捉時間序列的長期依賴特征并進行準確預測。
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 能夠有效處理時間序列數據并進行預測。
BSTS 模型是基于貝葉斯框架的時間序列建模方法,它允許對時間序列數據中的趨勢、季節性和假期效應進行建模。BSTS 模型結合了結構時間序列模型和貝葉斯推斷方法,以提供靈活的建模能力。
推導:
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 模型能夠捕捉時間序列的復雜成分并進行預測。
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 模型能有效進行時間序列的預測任務。