欢迎访问宙启技术站
智能推送

Python实现的循环神经网络在股票价格预测中的应用研究

发布时间:2024-01-15 04:07:34

循环神经网络 (Recurrent Neural Network, RNN) 在股票价格预测中是一种常用的人工智能算法。RNN 是一种具有记忆功能的神经网络,能够根据过去的信息来预测未来的走势。它能够捕捉到股票价格序列中的时序关系和长短期的依赖关系,从而提高预测的准确性。

下面以一个使用 Python 实现的股票价格预测案例来说明 RNN 在股票预测中的应用。

首先,我们需要准备股票价格数据。这里使用一个包含苹果公司 (AAPL) 的每日股票价格的数据集。数据集中包含日期和当天的开盘价、最高价、最低价、收盘价和调整后的收盘价。

首先,我们导入相关的库和数据集:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 读取数据集
data = pd.read_csv('stock_prices.csv')

接下来,我们对数据进行预处理。首先,我们将日期列转换为 datetime 类型,并将其设置为数据集的索引。然后,我们选取调整后的收盘价作为我们的目标变量。最后,我们使用 MinMaxScaler 对数据集进行归一化处理。

# 将日期列转换为 datetime 类型并设置为索引
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)

# 选取调整后的收盘价作为目标变量
target = data[['Adj Close']]

# 归一化处理
scaler = MinMaxScaler()
target_scaled = scaler.fit_transform(target)

接下来,我们将数据集划分为训练集和测试集。我们选取了前 80% 的数据作为训练集,后 20% 的数据作为测试集。

# 划分训练集和测试集
train_size = int(len(target_scaled) * 0.8)
test_size = len(target_scaled) - train_size
train, test = target_scaled[0:train_size,:], target_scaled[train_size:len(target_scaled),:]

接下来,我们需要将数据转换成适合 RNN 输入的格式。RNN 需要接收一个三维的输入,包括样本数量、时间步长和特征数量。在我们的案例中,我们的样本数量是股票价格序列的长度,时间步长是我们选择的窗口大小,特征数量是 1(即调整后的收盘价)。

# 转换数据为 RNN 输入格式
def create_dataset(dataset, window_size):
    X, Y = [], []

    for i in range(len(dataset)-window_size):
        window = dataset[i:(i+window_size), 0]
        X.append(window)
        Y.append(dataset[i + window_size, 0])

    return np.array(X), np.array(Y)

window_size = 10
train_X, train_Y = create_dataset(train, window_size)
test_X, test_Y = create_dataset(test, window_size)

# 将输入调整为 RNN 需要的格式
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))
test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1))

然后,我们可以定义一个简单的 RNN 模型。在这个模型中,我们使用一个 LSTM 层和一个全连接层来进行预测。

from keras.models import Sequential
from keras.layers import LSTM, Dense

np.random.seed(0)

model = Sequential()
model.add(LSTM(1, input_shape=(window_size, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

接下来,我们可以使用训练集对模型进行训练,并使用测试集评估模型的预测性能。

model.fit(train_X, train_Y, epochs=100, batch_size=1, verbose=2)

# 使用测试集评估模型
train_predict = model.predict(train_X)
test_predict = model.predict(test_X)

最后,我们可以使用反归一化处理将预测结果转换为真实的股票价格,并计算预测误差。

train_predict = scaler.inverse_transform(train_predict)
train_Y = scaler.inverse_transform([train_Y])
test_predict = scaler.inverse_transform(test_predict)
test_Y = scaler.inverse_transform([test_Y])

# 计算误差
train_rmse = np.sqrt(((train_predict - train_Y) ** 2).mean())
test_rmse = np.sqrt(((test_predict - test_Y) ** 2).mean())

print('Train RMSE: %.2f' % train_rmse)
print('Test RMSE: %.2f' % test_rmse)

通过这个简单的示例,我们可以看到 RNN 在股票价格预测中的应用。它可以根据过去的股票价格走势来预测未来的股票价格,并且能够捕捉到时序关系和长短期依赖关系。然而,需要注意的是,股票价格预测是一个复杂的问题,很多因素会影响股票的走势,单独使用股票价格序列可能无法准确地预测未来的走势。因此,在实际应用中,需要考虑其他的因素并结合其他的预测模型来提高预测的准确性。