使用tensorflow的lstm模型编写一个根据过往6个月股票数据预测未来18个月数据的demo
时间: 2024-06-09 11:05:28 浏览: 183
这是一个比较复杂的任务,需要一些准备工作和数据处理。
首先,我们需要获取过去6个月的股票数据和未来18个月的真实数据。这些数据可以从在线数据源或本地存储中获取。对于本教程,我们将使用 Yahoo Finance API 中的数据。
接下来,我们需要对数据进行预处理和归一化。我们将使用 MinMaxScaler 对数据进行归一化。MinMaxScaler 将数据缩放到0和1之间,这使得数据更容易处理并增加了模型的准确性。
接下来,我们将数据拆分成训练集和测试集。在本教程中,我们将使用过去90%的数据作为训练集,并将剩余10%的数据用于测试。
接下来,我们将构建一个 LSTM 模型。LSTM(Long Short-Term Memory)是一种循环神经网络,它可以处理序列数据并在长时间内记住先前的状态。在本教程中,我们将使用 TensorFlow 中的 LSTM 层来构建模型。
最后,我们将使用训练集训练模型,并使用测试集评估模型的性能。我们将使用均方根误差(RMSE)作为性能度量,因为它可以告诉我们模型的预测与实际数据之间的差异。
下面是代码实现:
```python
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.models import Sequential
# 获取数据
symbol = 'AAPL'
df = pd.read_csv(f'https://query1.finance.yahoo.com/v7/finance/download/{symbol}?period1=0&period2=9999999999&interval=1mo&events=history')
df = df[['Date', 'Close']]
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
df = df.resample('M').last()
# 归一化数据
scaler = MinMaxScaler()
df['Close'] = scaler.fit_transform(df[['Close']])
# 拆分数据
train_size = int(len(df) * 0.9)
train_df = df[:train_size]
test_df = df[train_size:]
# 创建数据集
def create_dataset(X, y, time_steps=1):
Xs, ys = [], []
for i in range(len(X) - time_steps):
Xs.append(X.iloc[i:(i + time_steps)].values)
ys.append(y.iloc[i + time_steps])
return np.array(Xs), np.array(ys)
time_steps = 6
X_train, y_train = create_dataset(train_df, train_df['Close'], time_steps)
X_test, y_test = create_dataset(test_df, test_df['Close'], time_steps)
# 构建模型
model = Sequential([
LSTM(64, input_shape=(time_steps, X_train.shape[2])),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
# 训练模型
model.fit(
X_train, y_train,
epochs=50,
batch_size=16,
validation_split=0.1,
verbose=0,
shuffle=False
)
# 评估模型
y_pred = model.predict(X_test)
rmse = np.sqrt(tf.losses.mean_squared_error(y_test, y_pred))
print(f'RMSE: {rmse}')
# 可视化结果
import matplotlib.pyplot as plt
plt.plot(scaler.inverse_transform(y_test.reshape(-1, 1)))
plt.plot(scaler.inverse_transform(y_pred))
plt.legend(['实际', '预测'])
plt.ylabel('价格')
plt.xlabel('时间')
plt.show()
```
这段代码将获取苹果公司(AAPL)的股票数据并使用 LSTM 模型预测未来18个月的股票价格。它将使用过去6个月的数据来预测未来18个月的价格。
我们可以通过调整模型的超参数来改进模型的预测性能。例如,我们可以尝试增加 LSTM 层的数量或调整时间步长。
阅读全文