Keras实战:基于LSTM的股价预测方法

本文详细介绍了使用Keras构建LSTM模型进行股价预测的过程,包括数据预处理、模型构建、训练与优化。通过调整dropout值、神经元数量和decay值来优化模型性能,并对预测结果进行可视化。适合初学者了解LSTM在金融预测的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Hi,这里是一只殚精竭虑的老鼠屎。最近在处理公交数据,模型效果非常不理想。过程中学习了师兄留下的lstm做的金融数据预测,使用的是keras框架,这里整理一下。这篇博客里面交代了包括数据的处理、模型搭建、模型调参、模型评估等重要环节,十分适合新手入门。师兄留下的jupyter notebook出处不详。

目录

1 准备工作

1.1 引入相关库

 1.2 引入参数

2 构建模型

2.1 下载数据并正则化

2.2 绘制正则化后的标签数据

2.3 把最后一天的Adjusted Close作为y值

2.4 搭建神经网络 

2.5 运行模型

2.6 在训练集和测试集上的结果

2.7 可视化预测结果

2.8 保存模型

3 模型优化

3.1 定义调试的函数

3.2 调节超参数

3.2.1 优化dropoout值

3.2.2 优化神经元个数

3.2.3 优化decay值


1 准备工作

1.1 引入相关库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import datetime
import math, time
import itertools
from sklearn import preprocessing
import datetime
from sklearn.metrics import mean_squared_error
from math import sqrt
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.recurrent import LSTM
from keras.models import load_model
import keras
import pandas_datareader.data as web
import h5py
from keras.callbacks import EarlyStopping, ModelCheckpoint

 1.2 引入参数

stock_name = '^GSPC'
seq_len = 22
d = 0.2
shape = [4, seq_len, 1] # feature, window, output
neurons = [128, 128, 32, 1]
epochs = 300

2 构建模型

2.1 下载数据并正则化

    在引入库时,pandas_datareader.data里面有各种金融数据。我们就是从这里下载这次demo用的数据。使用的是1971年至现在的数据。同时,在get_stock_data函数中,我们也使用了scikit-learn中的MinMaxScaler()对数据进行了正则化。

def get_stock_data(stock_name, normalize=True):
    start = datetime.datetime(1971, 1, 1)
    end = datetime.date.today()
    df = web.DataReader(stock_name, "yahoo", start, end)
    df.drop(['Volume', 'Close'], 1, inplace=True)
    
    if normalize:        
        min_max_scaler = preprocessing.MinMaxScaler()
        df['Open'] = min_max_scaler.fit_transform(df.Open.values.reshape(-1,1))
        df['High'] = min_max_scaler.fit_transform(df.High.values.reshape(-1,1))
        df['Low'] = min_max_scaler.fit_transform(df.Low.values.reshape(-1,1))
        df['Adj Close'] = min_max_scaler.fit_transform(df['Adj Close'].values.reshape(-1,1))
    return df

df = get_stock_data(stock_name, normalize=True)

    在jupyter notebook中可以使用df.head()看一下正则化好后的数据。这里,Adj Close是我们的标签列,我们预测的是最后一列的数据。

2.2 绘制正则化后的标签数据

def plot_stock(stock_name):
    df = get_stock_data(stock_name, normalize=True)
    print(df.head())
    plt.plot(df['Adj Close'], color='red', label='Adj Close')
    plt.legend(loc='best')
    plt.show()
plot_stock(stock_name)

    经过plot_stock后的结果如下图:

2.3 把最后一天的Adjusted Close作为y值

    这里使用到了滑窗处理。在最初定义变量时,我们定义seq_len为22,即滑窗的大小为22。在预测时,滑窗拿前21天的数据(包括Adjusted Close)预测第22天的数据。在load_data模块里面,我们定义了滑窗,用result列表将数据放入滑窗内。同时划分了训练集和验证集。

def load_data(stock, seq_len):
    amount_of_features = len(stock.columns)
    data = stock.as_matrix() 
    sequence_length = seq_len + 1 # index starting from 0
    result = []
                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    for index in range(len(data) - sequence_length): # maxmimum date = lastest date - sequence length
        result.append(data[index: index + sequence_length]) # index : index + 22days
    
    result = np.array(result)
    row = round(0.9 * result.shape[0]) # 90% split
    
    train = result[:int(row), :] # 90% date
    X_train = train[:, :-1] # all data until day m
    y_train = train
### 使用机器学习进行股价预测分析的项目与教程 #### 1. 股票价格预测作为监督学习任务 股票价格预测可以被定义为一种典型的监督学习问题,其中的目标是从历史数据中学习一个映射函数,从而能够对未来的价格做出预测[^1]。常见的监督学习方法包括但不限于线性回归、逻辑回归、决策树以及随机森林等。 #### 2. LSTM模型用于多变量时间序列预测 由于股票市场的动态特性及其受多种因素影响的特点,简单的统计学模型可能无法捕捉到这些复杂的非线性关系。为了应对这一挑战,基于深度学习的方法LSTM(长短期记忆网络)逐渐成为研究热点。通过TensorFlow框架实现的LSTM模型特别适合于处理具有时间依赖性的数据集,并能有效提取长期趋势特征[^2]。 #### 3. Python编程环境下的具体实践案例 对于希望深入探索如何应用机器学习来完成实际金融数据分析工作的初学者而言,《Python机器学习实战》一书提供了详尽指导;另外,在Data Flair网站上也有针对此主题设计的教学资源可供参考[^3]。下面给出一段简单示例代码展示如何构建基本的时间序列预测流程: ```python import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM # 加载并预处理数据 data = pd.read_csv('stock_prices.csv') scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(data['Close'].values.reshape(-1, 1)) # 创建训练数据集 def create_dataset(dataset, time_step=60): X, y = [], [] for i in range(len(dataset)-time_step-1): a = dataset[i:(i+time_step), 0] X.append(a) y.append(dataset[i + time_step, 0]) return np.array(X), np.array(y) X_train, y_train = create_dataset(scaled_data) # 构建LSTM模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1))) model.add(LSTM(units=50)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mean_squared_error') # 训练模型 model.fit(X_train, y_train, epochs=1, batch_size=1, verbose=2) ``` 以上脚本展示了从加载原始数据至建立初步神经网络架构的过程概述。当然,在真实世界的应用场景下还需要考虑更多细节调整参数设置以优化性能表现。
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值