一、学习内容
在本次项目实战中,我们将使用一个复杂的时间序列数据集,展示完整的时间序列分析流程,包括:
- 数据探索与预处理:初步分析数据的特征,处理缺失值和异常值,进行必要的转换。
- 建模:使用多个模型(例如 ARIMA、SARIMA、LSTM)对数据进行建模,并比较它们的表现。
- 预测与评估:对模型的预测结果进行评估,通过均方误差 (MSE)、均方根误差 (RMSE) 等指标进行对比。
我们可以使用来自 yfinance
的股票市场数据来替代原数据进行时间序列分析。yfinance
提供了方便的 API 来获取股票历史数据。接下来我们将使用 yfinance
获取股票数据并进行时间序列分析。
二、使用 yfinance
的完整项目实战案例
2.1 Python 代码实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
import yfinance as yf
# 1. 数据加载与探索
stock_ticker = 'AAPL' # 选择苹果公司作为示例
data = yf.download(stock_ticker, start='2015-01-01', end='2022-01-01')
# 使用调整后的收盘价作为时间序列数据
stock_data = data[['Adj Close']]
# 2. 数据可视化
plt.figure(figsize=(14, 7))
plt.plot(stock_data.index, stock_data['Adj Close'], label='Apple Stock Price')
plt.title('Apple Stock Price from 2015 to 2022')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.grid(True)
plt.show()
# 3. 数据拆分
train_size = int(len(stock_data) * 0.8)
train, test = stock_data.iloc[:train_size], stock_data.iloc[train_size:]
# 4. 模型1:ARIMA
p, d, q = 5, 1, 0
arima_model = ARIMA(train['Adj Close'], order=(p, d, q))
arima_model_fit = arima_model.fit()
arima_pred = arima_model_fit.predict(start=len(train), end=len(train)+len(test)-1, typ='levels')
# 5. 模型2:SARIMA
sarima_model = SARIMAX(train['Adj Close'], order=(1,1,1), seasonal_order=(1,1,1,12))
sarima_model_fit = sarima_model.fit()
sarima_pred = sarima_model_fit.predict(start=len(train), end=len(train)+len(test)-1, typ='levels')
# 6. 模型3:LSTM
# 数据标准化
scaler = MinMaxScaler(feature_range=(0, 1))
train_scaled = scaler.fit_transform(train[['Adj Close']])
# 构建 LSTM 数据格式
def create_lstm_data(data, time_steps=1):
X, y = [], []
for i in range(len(data) - time_steps):
X.append(data[i:(i + time_steps), 0])
y.append(data[i + time_steps, 0])
return np.array(X), np.array(y)
time_steps = 10
X_train, y_train = create_lstm_data(train_scaled, time_steps)
# Reshape input to be [samples, time steps, features]
X_train = X_train.reshape(X_train.shape[0], time_steps, 1)
# 构建 LSTM 模型
lstm_model = Sequential()
lstm_model.add(LSTM(50, return_sequences=True, input_shape=(time_steps, 1)))
lstm_model.add(LSTM(50, return_sequences=False))
lstm_model.add(Dense(1))
lstm_model.compile(optimizer='adam', loss='mean_squared_error')
lstm_model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=1)
# LSTM 预测
test_scaled = scaler.transform(test[['Adj Close']])
X_test, y_test = create_lstm_data(test_scaled, time_steps)
X_test = X_test.reshape(X_test.shape[0], time_steps, 1)
lstm_pred_scaled = lstm_model.predict(X_test)
lstm_pred = scaler.inverse_transform(lstm_pred_scaled)
# 7. 模型对比与结果可视化
plt.figure(figsize=(14, 7))
plt.plot(test.index, test['Adj Close'], label='Actual Price')
plt.plot(test.index, arima_pred, label='ARIMA Prediction', color='red')
plt.plot(test.index, sarima_pred, label='SARIMA Prediction', color='green')
plt.plot(test.index[time_steps:], lstm_pred, label='LSTM Prediction', color='blue')
plt.title('Model Predictions vs Actual Stock Price')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.grid(True)
plt.show()
# 8. 模型评估
arima_mse = mean_squared_error(test['Adj Close'], arima_pred)
sarima_mse = mean_squared_error(test['Adj Close'], sarima_pred)
lstm_mse = mean_squared_error(test['Adj Close'][time_steps:], lstm_pred)
print(f'ARIMA MSE: {arima_mse}')
print(f'SARIMA MSE: {sarima_mse}')
print(f'LSTM MSE: {lstm_mse}')
2.2 代码解释
-
数据加载与预处理:使用
yfinance
获取苹果公司 (AAPL) 从 2015 年到 2022 年的股票价格数据,主要分析调整后的收盘价 (Adj Close
)。 -
数据可视化:使用
matplotlib
绘制股票价格的时间序列图,可以看到股票价格的历史趋势。
-
数据拆分:将数据集分为 80% 的训练集和 20% 的测试集。
-
ARIMA 模型:使用 ARIMA 模型对训练数据进行建模,并预测测试集的股票价格。
-
SARIMA 模型:SARIMA 模型可以捕捉时间序列中的季节性变化。在这个例子中,我们使用了季节性成分为 12 个月的 SARIMA 模型。
-
LSTM 模型:LSTM 模型通过深度学习方法捕捉时间序列的长序列依赖关系。我们将数据标准化,并创建 LSTM 需要的格式来进行训练和预测。
-
模型对比与可视化:将 ARIMA、SARIMA 和 LSTM 模型的预测结果与实际数据进行对比,绘制预测曲线和实际价格的图表。
-
模型评估:使用均方误差 (MSE) 评估每个模型的性能,MSE 越低,模型的预测性能越好。
ARIMA MSE: 776.4477055228828
SARIMA MSE: 62.18438569258952
LSTM MSE: 23.93587715477301
三、结果分析
3.1 ARIMA 模型
- ARIMA 模型适合平稳的时间序列,能够捕捉自回归和移动平均成分。
3.2 SARIMA 模型
- SARIMA 模型适合具有季节性变化的时间序列,能够更好地捕捉数据中的季节性波动。
3.3 LSTM 模型
- LSTM 模型通过深度学习方法,可以捕捉更复杂的时间序列模式,特别适合长时间依赖的序列。
3.4 模型评估
- 通过对比 ARIMA、SARIMA 和 LSTM 模型的均方误差,我们可以判断哪个模型在股票价格预测中表现更好。
四、总结
通过本项目,我们展示了如何使用 yfinance
获取股票市场数据,并应用多种时间序列模型(ARIMA、SARIMA、LSTM)进行建模与预测。每个模型有其优势和适用场景,在金融领域的应用中可以根据具体数据选择合适的模型。