Python用CNN - LSTM、ARIMA、Prophet股票价格预测的研究与分析|附数据代码

news/2024/10/12 22:41:32

全文链接: https://tecdat.cn/?p=37860

原文出处:拓端数据部落公众号 

分析师:Sabrina Huang

股票市场的波动起伏一直备受投资者关注,准确预测股票价格对于投资者制定合理的投资策略至关重要。股票价格数据具有时间序列特性,近年来,随着机器学习和深度学习技术的发展,各种模型被应用于股票价格预测。长短期记忆(LSTM)模型凭借其记忆功能在剖析时间序列数据关系方面展现出优势,ARIMA 模型在时间序列分析中也有广泛应用,此外,CNN - LSTM 等组合模型(附数据代码)也为股票价格预测提供了新的思路。本文将对 LSTM、ARIMA 以及 CNN - LSTM 等模型在股票价格预测中的应用进行研究,并对它们的预测结果进行分析与比较,以期为投资者提供更可靠的预测工具。

LSTM 与 ARIMA 模型的股票价格预测及比较研究

股票价格数据呈现出时间序列的特性。鉴于机器学习长短期记忆(LSTM)具备凭借记忆功能剖析时间序列数据间关系的优势,我们提出一种基于 LSTM 的股票价格预测方法。与此同时,本项目运用 OLS、ARIMA 以及其他预测模型对股票价格逐一进行预测。此外,还对这些模型的预测结果展开了分析与比较。

解决方案

任务 / 目标

通过运用 LSTM、ARIMA 模型对股票市场的价格趋势进行预测,并加以比较,从而选出最优模型。


数据源准备

为检验时间序列模型的预测能力,探寻预测股票价格的最佳模型,收集了 100 支股票的历史数据。数据源自雅虎财经,每支股票的时间段为 2016 年 4 月 1 日至 2022 年 10 月 3 日,未预先对名称、规模和股票价格进行筛选。在 ARIMA 预测部分,选取 AAPL、CLB 和 ELP 这三支股票作为代表。在 LSTM 部分,将所有 100 支股票合并为一个完整的系列。采用所有 100 支股票的 Adj_Close(调整后的收盘价)这一变量。该变量对一只股票的收盘价进行了修正,以反映该股票在考虑到任何公司行为(如股票拆分、股息和供股)后的价值。


特征转换

在 LSTM 模型中,计算得出以下特征:

 

构造

以上说明了如何抽取相关特征,我们大致有如
下训练样本(只列举部分特征)

 


 

划分训练集和测试集

鉴于最终模型旨在预测未来某时间段的销量,为更切实地测试模型效果,依据时间对训练集和测试集进行划分。具体操作方式为:将 2016 - 04 - 01 至 2020 - 12 - 13 的销量数据设定为训练集,而 2020 - 12 - 14 至 2022 - 10 - 03 的数据则作为测试集。

建模

ARIMA

在股票和电商销量领域,ARIMA 有着广泛应用。于统计学、计量经济学以及时间序列分析中,ARIMA 是自回归移动平均模型(ARMA)的拓展。这两种模型均被应用于时间序列数据的拟合,旨在更好地理解数据或对序列中的未来点进行预测。

长短期记忆(LSTM)

一个常规的 LSTM 单元由单元、输入门、输出门以及遗忘门构成。单元能够在任意时间间隔内记忆数值,而三个门则对进入和离开单元的信息流起到调节作用。这些门结构借助递归方程,持续在同一时间更新单元状态,同时也激活了从输入门到输出门的映射。

模型优化

包括特征提取、样本抽样以及参数调参。

ARIMA


 

 

LSTM

 

在本研究中,我们起初采用 ARIMA 模型对股票收益进行预测。然而,该模型在个别股票的预测上表现欠佳,无法对一般股票进行有效预测。为此,我们计算得出 8 个 Alphas 以构建模型。鉴于这 8 个字母是从 100 支股票的数据集中获取的,我们将其称作 “通用字母”,并试图证实它们适用于一般股票。借助这 8 个阿尔法变量,我们运用 OLS、XGBoost、LSTM 以及随机森林来预测股票收益。通过对比这四种方法的、RMSE 和 DA,我们确定 LSTM 为预测股票收益的最优模型。实际上,尽管 LSTM 相较于其他模型优势明显,但它的估计结果仍未达到我们的预期。这或许是因为这 100 支股票的特征差异过大,又或许是 100 支股票的数据集规模尚不足以让我们得出 “通用字母”。后续我们将通过收集更大规模的数据集来完善我们的研究。

股票在金融市场中占据着重要地位,是吸引众多投资者的有力手段。它在为投资者带来丰厚利益的同时,也伴随着风险。我们的报告通过长短期记忆神经网络模型对股票时间序列数据进行了分析。对于大多数投资者而言,该模型从所采用方法的合理性与有效性方面提供了有力支撑,并且其表现优于其他时间序列模型和机器学习方法。

股票市场的复杂性和不确定性使得准确预测股票收益成为一项极具挑战性的任务。在本研究中,我们不断探索和尝试不同的模型与方法,旨在为投资者提供更可靠的预测工具。虽然当前的研究存在一定的局限性,但我们相信,随着数据集的不断扩大和研究的深入,我们能够进一步优化模型,提高预测的准确性和可靠性。未来,我们将继续努力,为股票市场的研究和投资者的决策提供更有价值的参考。

 

 

Python用CNN - LSTM、ARIMA、Prophet股票价格预测的研究与分析|附数据代码

我们深入研究了股票价格预测问题,通过运用自回归移动平均(ARIMA)模型和Prophet模型,对股票数据进行分析和预测。文中详细介绍了数据预处理、模型构建、拟合、评估及预测的过程,并对结果进行了讨论和分析。

一、引言

股票价格的波动受到多种因素的影响,准确预测股票价格对于投资者制定合理的投资策略具有重要意义。时间序列分析方法在股票价格预测中得到了广泛应用,本文旨在探讨ARIMA模型和Prophet模型在股票价格预测中的应用。

二、数据来源与预处理

(一)数据来源
我们使用pandas库读取/content/RELIA.csv文件中的股票数据,该文件包含了股票的开盘价、最高价、最低价、收盘价、调整后的收盘价和成交量等信息。

 

(二)数据预处理

  1. 查看数据头部
    通过df.head()可以查看数据的前几行,了解数据的基本结构。

  2. 检查缺失值
    使用df.isna().sum()检查数据中各列的缺失值情况。结果显示,各列均无缺失值。

  3. 数据清理
    删除不需要的列,如成交量、调整后的收盘价、最低价、最高价和开盘价等,只保留收盘价。

del df['Volume'], df['Adj Close'], df['Low'], df['High'], df['Open']
  1. 对数处理与差分计算
    对收盘价进行对数处理,并计算对数收盘价的差分,以便后续分析。
 
  1.  
    df['close_log'] = np.log(df['Close'])
  2.  
    df['close_log_diff'] = df['close_log'] - df['close_log'].shift(1)
 
  1. 划分训练集和验证集
    将数据按照时间顺序划分为训练集和验证集,前 2000 个数据作为训练集,剩余数据作为验证集。
 
  1.  
    train = df[:2000]
  2.  
    val = df[2000:]
 

三、模型构建与拟合

(一)ARIMA 模型

  1. 单位根检验
    使用adfuller函数对对数收盘价的差分进行单位根检验,以确定数据的平稳性。
    adfuller(df['close_log_diff'].dropna())
  2. 自相关函数和偏自相关函数计算
    通过计算自相关函数(ACF)和偏自相关函数(PACF),初步确定 ARIMA 模型的阶数。
 
  1.  
    lag_acf = acf(df['close_log_diff'].dropna(), nlags = 30)
  2.  
    lag_pacf = pacf(df['close_log_diff'].dropna(), nlags = 50, method = 'ols')
 

  1. 模型自动拟合与手动拟合
    • 自动拟合:使用pmdarima库的auto_arima函数自动搜索最优的 ARIMA 模型参数。
 
  1.  
    !pip install pmdarima
  2.  
    from pmdarima.arima import auto_arima
  3.  
     
  4.  
    smodel = auto_arima(train['Close'], start_p = 0, start_q = 0,
  5.  
    test = 'adf',
  6.  
    max_p = 10, max_q = 10,
  7.  
    m = 1,
  8.  
    d = None,
  9.  
    seasonal = False,
  10.  
    start_P = 0,
  11.  
    D = 0,
  12.  
    trace = True,
  13.  
    error_action = 'ignore',
  14.  
    suppress_warnings = True,
  15.  
    stepwise = True)
  16.  
    print(smodel.summary())
 

  • 手动拟合:手动指定阶数(2, 0, 0)再次拟合 ARIMA 模型。
 
  1.  
    from statsmodels.tsa.arima.model import ARIMA
  2.  
     
  3.  
    model = ARIMA(train['Close'], order = (2, 0, 0))
  4.  
    result = model.fit()
  5.  
    result.summary()
 

  1. 模型诊断
    使用result.plot_diagnostics(figsize=(20, 14))绘制模型的诊断图,检查模型的拟合效果。
 
  1.  
     
  2.  
    result.plot_diagnostics(figsize=(20, 14))
  3.  
    plt.show()
 

 

 

 

(二)Prophet 模型

  1. 数据准备
    将日期列作为ds列,收盘价作为y列,以便输入到 Prophet 模型中。
 
  1.  
    df['ds'] = df.index
  2.  
    df['y'] = df['Close']
 
  1. 模型拟合
    创建Prophet对象,并使用准备好的数据进行拟合。
 
  1.  
    import prophet
  2.  
     
  3.  
    m = Prophet()
  4.  
    m.fit(df)
 
  1. 未来数据生成与预测
    使用make_future_dataframe函数生成未来一段时间的数据框,然后使用拟合好的模型进行预测。
 
  1.  
    future = m.make_future_dataframe(periods = 30, freq = 'D')
  2.  
    forecast = m.predict(future)
 

四、模型评估与预测

(一)ARIMA 模型预测

  1. 对验证集进行预测
    使用训练好的 ARIMA 模型对验证集进行预测,并将预测值存储在新的列中。
 
  1.  
    fore = result.predict(start = len(train), end = len(df) - 1)
  2.  
    fores = pd.Series(fore)
  3.  
    val['d'] = fores.values
 
  1. 绘制验证集的真实值与预测值
    通过val[['Close', 'd']].plot(figsize=(12, 8))直观地比较真实值与预测值。

  2. 未来预测
    生成未来日期序列,并进行未来价格预测。

 
  1.  
    index_future_dates = pd.date_range(start = '2023 - 03 - 13', end = '2023 - 03 - 31')
  2.  
    pred = result.predict(start = len(df), end = len(df) + 18, ).rename('ARIMA Predictions')
  3.  
    pred.index = index_future_dates
  4.  
    print(pred)
  5.  
    pred.plot(figsize = (12, 5), legend = True)
 

(二)Prophet 模型预测结果分析

  1. 查看预测结果的尾部信息
    通过forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()查看预测结果的最后几行,包括预测日期、预测值、预测下限和预测上限。

  2. 绘制预测结果
    使用m.plot(forecast, xlabel='Date', ylabel='Price (USD)')绘制预测结果图,并添加标题Bitcoin price forecast (USD)

  3. 绘制预测结果的组件
    通过m.plot_components(forecast)分析预测结果的趋势、季节性等组件。

 

m.plot_components(forecast)

五、结论

本文通过对股票数据的分析,构建并应用了 ARIMA 模型和 Prophet 模型进行股票价格预测。实验结果表明,两种模型在不同方面都有一定的表现。ARIMA 模型在处理线性时间序列数据方面具有一定的优势,而 Prophet 模型在处理具有季节性和趋势性的数据方面表现较好。然而,股票价格预测仍然存在一定的不确定性,未来可以进一步探索更复杂的模型或模型组合,以提高预测的准确性。同时,还可以考虑结合更多的影响因素,如宏观经济数据、公司财务指标等,为股票价格预测提供更全面的信息。

 

CNN - LSTM的股票价格预测研究|附数据代码

我们在研究使用卷积神经网络 - 长短期记忆网络(CNN - LSTM)模型对股票价格进行预测。通过对股票数据的预处理、特征工程、模型构建、训练与评估,展示了该模型在股票价格预测中的应用。文中详细介绍了数据来源、处理方法、模型架构及实验结果,并对结果进行了分析和讨论。

一、引言

股票价格的预测一直是金融领域的研究热点,准确预测股票价格对于投资者制定合理的投资策略具有重要意义。传统的时间序列分析方法在处理复杂的股票数据时存在一定的局限性,而深度学习方法,如CNN - LSTM模型,结合了卷积神经网络(CNN)和长短期记忆网络(LSTM)的优点,能够更好地捕捉股票价格数据中的时空特征,提高预测精度。

二、数据来源与预处理

(一)数据来源
我们从"X:\\Project\\TSA\\TSA\\RE.NS.csv"文件中读取股票数据,该数据包含了日期、开盘价、最高价、最低价、收盘价等信息。

 

(二)数据可视化

  1. 绘制烛台图
    使用plotly.graph_objects库绘制股票的烛台图,直观展示股票价格的波动情况。
 
  1.  
    import plotly.graph_objects as go
  2.  
    fig = go.Figure(data=[go.Candlestick(x=df.index,
  3.  
    open=df.Open, high=df.High,
  4.  
    low=df.Low, close=df.Close)])
  5.  
     
  6.  
    fig.show()
 
  1. 计算移动平均线
    计算不同天数的移动平均线,如 50 天、100 天和 200 天的移动平均线,以平滑股票价格数据,更好地观察价格趋势。
  2. 绘制移动平均线图
    通过绘制收盘价与不同天数移动平均线的图像,更清晰地展示价格趋势与移动平均线的关系。
 
  1.  
    plt.figure(figsize=(20, 8))
  2.  
    plt.plot(df.index, df["Close"])
  3.  
    plt.plot(df.index, df["Moving Average for 50 days"], color='red', label='MA for 50 days')
  4.  
    plt.plot(df.index, df["Moving Average for 100 days"], color='green', label='MA for 100 days')
  5.  
    plt.plot(df.index, df["Moving Average for 200 days"], color='orange', label='MA for 200 days')
  6.  
    plt.legend()
 

 

  1. 绘制布林带
    计算股票价格的滚动均值和标准差,进而绘制布林带,用于分析股票价格的波动范围和趋势。

(三)数据缩放与划分

  1. 数据缩放
    使用StandardScaler对数据进行标准化处理,使不同量级的数据具有可比性。
 
  1.  
    scaler = StandardScaler()
  2.  
    scaler = scaler.fit(df)
  3.  
    df_s = scaler.transform(df)
 
  1. 划分训练集和测试集
    按照一定比例将数据划分为训练集和测试集,以便模型进行训练和评估。
 
  1.  
    train_size = int(len(df_s) * 0.8)
  2.  
    train_data = df_s[:train_size]
  3.  
    test_data = df_s[train_size - window_size:]
 
  1. 构建窗口数据函数
    定义函数将数据转换为适合模型输入的窗口数据格式,即Xy,其中X为输入特征,y为目标值。
 
  1.  
    def df_to_x_y(data, window_size=7):
  2.  
    X = []
  3.  
    y = []
  4.  
    for i in range(len(data) - window_size):
  5.  
    row = [r for r in data[i:i + window_size]]
  6.  
    X.append(row)
  7.  
    label = [data[i + window_size][3]]
  8.  
    y.append(label)
  9.  
    return np.array(X), np.array(y)
 

三、模型构建与训练

(一)模型架构
构建 CNN - LSTM 模型,该模型首先使用一维卷积层提取局部特征,然后通过池化层降低维度,接着使用多个 LSTM 层捕捉时间序列特征,最后通过全连接层输出预测值。

 
  1.  
     
  2.  
    model.add(Dense(1))
  3.  
    model.compile(loss='mse', optimizer='adam')
  4.  
     
  5.  
    model.summary()
 
 
 

 

(二)模型训练
使用训练集数据对模型进行训练,并在训练过程中使用验证集数据进行验证。

history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))

(三)训练过程可视化
绘制训练过程中训练集和验证集的损失函数值变化曲线,观察模型的训练效果和收敛情况。

 
  1.  
    plt.plot(history.history['loss'], label='train')
  2.  
    plt.plot(history.history['val_loss'], label='test')
  3.  
    plt.legend()
  4.  
    plt.show()
 

 

四、模型评估与预测

(一)模型评估
使用均方根误差(RMSE)和平均绝对误差(MAE)评估模型在测试集上的性能。

 
  1.  
    yhat = model.predict(x_test)
  2.  
    yp = yhat.reshape(yhat.shape[0], 1)
  3.  
    test_RMSE = np.sqrt(mean_squared_error(y_test, yp))
  4.  
    test_MAE = mean_squared_error(y_test, yp)
  5.  
     
  6.  
    print(f"Test RMSE: {test_RMSE}")
  7.  
    print(f"Test MAE: {test_MAE}")
 

(二)预测结果可视化
绘制测试集上的实际股票价格与模型预测价格的对比图,直观展示模型的预测效果。

 
  1.  
    # 创建空表并填充预测值
  2.  
    trainPredict_dataset_like = np.zeros(shape=(len(yp), 5))
  3.  
    trainPredict_dataset_like[:, 0] = yp[:, 0]
  4.  
    # 反标准化并绘制图像
  5.  
    trainPredict = scaler.inverse_transform(trainPredict_dataset_like)[:, 0]
 

五、结论

本文通过构建 CNN - LSTM 模型对股票价格进行预测,经过数据预处理、模型训练和评估,取得了一定的预测效果。实验结果表明,该模型能够较好地捕捉股票价格数据中的时空特征,在一定程度上提高了预测精度。然而,股票价格受到多种复杂因素的影响,模型仍存在一定的局限性。未来可以进一步优化模型结构、增加数据量、引入更多的特征,以提高股票价格预测的准确性和可靠性。同时,还可以将该模型与其他预测方法进行比较和结合,探索更有效的股票价格预测策略,为投资者提供更有价值的决策支持。

 

分析师

 

在此对 Sabrina Huang 对本文所作的贡献表示诚挚感谢,她毕业于加州大学圣地亚哥分校,专业为金融数学,拥有硕士学位。她擅长软件 SQL 语言、Python、R,擅长领域包括机器学习、数理金融、数据采集等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

方法的回顾

1.静态方法与非静态方法静态方法即在方法前面有static,更加方便调用非静态方法书写的方法前面没有static修饰符,需要使用new进行实例化才可进行调用 未使用new实例化:使用new实例化后:2.静态方法与非静态方法之间的调用 方法可以调用方法,静态方法是与类一同生成的,所以我…

第109天:免杀对抗-PowerShell混淆分离加载特征修改EXE生成填充替换

知识点 知识点: 1、Powershell-对变量数据做文章 2、Powershell-对Shellcode做文章 3、Powershell-对执行代码特征做文章 章节点: 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源…

第110天:免杀对抗-GOC#反VT沙盒逆向调试参数加载资源分离混淆加密

知识点 #知识点: 1、C#-混淆&分离&反调试 2、GO-混淆&分离&反调试 3、成品程序-包含反调试VT #章节点: 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 代码加载…

2024-2025-1 20241413 《计算机基础与程序设计》第三周学习总结

作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标 数字分类与计数法 位置计数法 进制转换 模拟数据与数字数据 压缩与解压 数字化 信息安全---- -…

第108天:免杀对抗-Python混淆算法反序列化打包生成器Py2exeNuitka

知识点 #知识点: 1、Python-对执行代码做文章 2、Python-对shellcode做文章 3、Python-对代码打包器做文章 #章节点: 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 代码加载面-…

107-免杀对抗-CC++溯源ShellCode上线混淆变异算法回调编译执行

知识点 #知识点: 1、ShellCode-分析&朔源&感知 2、ShellCode-混淆&编码&算法 3、回调执行解析-API&汇编&句柄 #章节点: 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加…

axios二次封装

axios二次封装有利于减少代码量,更好的管理api ①在src目录下创建api目录。api目录用于存放今后页面不同模块的接口信息。 具体的接口含义如下:②将来要实现的效果如下:import axiosRequest from "./utils/request/http"; axiosRequest({path: "product"…