在这个属于AI的新时代当中,相信有很多大学生像我一样苦于一身ML/DL/AI的技能却无法施展,那我个人认为这个依托于python这种简单代码的ML项目非常适合各位想要联系数学建模技能或者是纯入门的小白。以下是在跑代码之前需要部署好的内容。
python编译器(作者用的Pycharm)
安装项目需要用的库:
- yfinance - 用于从Yahoo Finance下载历史市场数据。
- numpy - 用于处理数组和进行数值计算。
- pandas - 用于数据操作和分析,尤其是表格数据。
- matplotlib - 用于数据可视化和绘图。
- sklearn.preprocessing (MinMaxScaler) - 用于数据预处理,特别是将数据缩放到一个特定范围。
- tensorflow.keras.models (Sequential) - 用于创建深度学习模型。
- tensorflow.keras.layers (LSTM, Dense, Dropout, Input) - 用于构建神经网络的不同层类型。
以上package都可以在终端用pip下载
pip install yfinance numpy pandas matplotlib scikit-learn tensorflow
然后我们就可以开始建立项目了:
# 安装必要的库
# pip install tensorflow yfinance numpy pandas scikit-learn matplotlib
import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, Input
# 获取股票数据
stock_symbol = 'AAPL' # 使用苹果公司的股票作为示例
data = yf.download(stock_symbol, start='2010-01-01', end='2023-01-01')
# 只使用“Adj Close”列进行预测
data = data[['Adj Close']]
# 数据预处理
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# 创建训练和测试数据集
train_size = int(len(scaled_data) * 0.8)
train_data = scaled_data[:train_size]
test_data = scaled_data[train_size:]
def create_dataset(dataset, time_step=1):
X, y = [], []
for i in range(len(dataset) - time_step):
X.append(dataset[i:(i + time_step), 0])
y.append(dataset[i + time_step, 0])
return np.array(X), np.array(y)
time_step = 60
X_train, y_train = create_dataset(train_data, time_step)
X_test, y_test = create_dataset(test_data, time_step)
# Reshape为LSTM输入格式 [samples, time steps, features]
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
# 构建LSTM模型
model = Sequential()
model.add(Input(shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test), verbose=1)
# 预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)
# 反归一化
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
y_train_inv = scaler.inverse_transform([y_train])
y_test_inv = scaler.inverse_transform([y_test])
# 绘制结果
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Adj Close'], label='Actual Price')
# 确保 x 和 y 的长度一致
train_index = data.index[time_step:train_size]
test_index = data.index[train_size + time_step:train_size + time_step + len(test_predict)]
plt.plot(train_index, train_predict[:, 0], label='Train Predict')
plt.plot(test_index, test_predict[:, 0], label='Test Predict')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
我的代码是用yfinance从雅虎上抓取的苹果公司历史股票数据,如果想要预测别的公司的股票,可以对获取股票数据的部分进行修改。然后摁下运行,我们的LSTM模型 就会开始训练了。
结果如下图所示:
我们可以看到预测出来的部分和实际的价格是非常吻合的。
以上就是关于这个项目的所有内容。
这个项目是作者在练习python的时候做的,如果有问题或者更好的方法,欢迎指正!