制作网站需要什么,住房和城乡建设部令第37号,外贸网站建设及优化ppt,彩票网站是怎么做的作者#xff1a;老余捞鱼 原创不易#xff0c;转载请标明出处及原作者。 写在前面的话#xff1a;我用NeuralProphet模型预测了股票价格#xff0c;发现其通过结合时间序列分析和神经网络算法#xff0c;确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…
作者老余捞鱼 原创不易转载请标明出处及原作者。 写在前面的话我用NeuralProphet模型预测了股票价格发现其通过结合时间序列分析和神经网络算法确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优其预测效果更是显著如果你也对AI金融股价预测感兴趣这篇文章会给你带来不少启发。 一、NeuralProphet 概述 在本文中我们将尝试用 NeuralProphet 来预测股票价格。NeuralProphet 是由 Meta 公司开发的据说比之前的 Prophet 软件包更强大。在之前的文章中我们用 Prophet 做过类似的任务但效果不太理想。这次我们将看看 NeuralProphet 是否能带来更好的表现。根据 NeuralProphet 官网的介绍 NeuralProphet - 使用标准深度学习方法融合传统时间序列算法基于 PyTorch 构建灵感来自 Facebook Prophet 和 AR-Net。 NeuralProphet 采用可分解的时间序列模型其模型组件包括趋势、季节性、事件效应和回归效应。它们的组合公式为: y(t) T(t) S(t) E(t) F(t) A(t) L(t),where T(t) Trend at time t
S(t) Seasonal effects at time t
E(t) Event and holiday effects at time t
F(t) Regression effects at time t for future-known exogenous variables
A(t) Auto-regression effects at time t based on past observations
L(t) Regression effects at time t for lagged observations of exogenous variables 这种可分解的时间序列在预测领域非常常见。在文章的后半部分我们会详细讲解如何调整上述方程中的各个组成部分以便更好地优化预测结果。 官网地址如下NeuralProphet 二、目的 我们的核心任务是利用过去 N 天的历史数据预测 Vanguard 全市场 ETFVTI每日调整后的收盘价。为了实现这一目标我们使用了 VTI 从 2013 年 1 月 2 日到 2018 年 12 月 28 日共 6 年的历史价格数据。这些数据可以从雅虎财经轻松获取下载后的数据集结构如下所示。通过这个项目我们旨在验证 NeuralProphet 模型在股价预测中的表现并探索其在实际投资分析中的应用潜力。 我们总共有 1509 天的数据可供使用。整个数据集中的调整后收盘价图如下所示 我们使用以下公式计算每日收益 其中r(t) 和 p(t) 分别表示第 t 天的日收益率和调整后收盘价。为了观察每日收益的分布情况我们绘制了下面的分布图 如上图所示分布图非常接近高斯分布。为了进一步验证这一点我们使用 scipy.stats 软件包绘制概率图如下所示。对于 scipy.stats 中的概率图默认情况下是将样本分布与高斯分布进行比较。与红色直线的拟合度越高则与高斯分布的拟合度越高。我们观察到除了极端值约 /- 2.5外每日回报的分布与高斯分布的拟合程度相当高。 为了全面评估 NeuralProphet 的性能仅仅在单一日期进行一次预测是远远不够的。因此我们将在数据集中的多个不同日期进行多次预测并取这些预测结果的平均值作为最终评估依据。在每次预测中我们都会将 NeuralProphet 方法与 Last Value 方法进行对比以更客观地衡量 NeuralProphet 的准确性和稳定性。这种方法不仅能减少随机误差的影响还能更好地反映模型在实际应用中的表现。 为了评估我们方法的有效性我们将使用均方根误差 (RMSE)、平均绝对百分比误差 (MAPE) 和平均绝对误差 (MAE) 指标。对于所有指标数值越小预测效果越好。 三、训练和验证 为了进行预测我们需要将数据分为训练集和验证集。具体来说我们将使用 3 年的数据约 756 天按每年 252 个交易日计算作为训练集并用接下来 1 年的数据252 天作为验证集。这意味着每次预测都需要 1,008 天的数据756 天训练 252 天验证。模型会在训练集上进行训练而验证集则用于调整超参数。 为了优化超参数我们采用了移动窗口验证法。举个例子假设我们总共有 896 天的数据并希望在第 857 天进行为期 40 天的预测。根据经验对于预测范围 H我们通常每隔 H/2 天进行一次预测。通过 756 天的训练集我们可以进行 4 次验证如下图所示。我们会计算这 4 次验证的误差指标如 RMSE、MAPE 等并取其平均值。最终选择误差平均值最小的超参数组合作为最佳模型配置。确定最佳超参数后我们将在第 857 天进行预测并报告结果。这种方法不仅能提高模型的稳定性还能更准确地评估其在实际应用中的表现。 在下文中我们将首先对数据集的第 1009 天进行预测预测期限为 21 天注意一个月约有 21 个交易日不包括周末。对于 NeuralProphet我们将使用前 1008 天作为训练集和验证集如上文所述按 756:252 的比例分割。我们将在下一节首先解释最后值方法。 四、Last Value 在Last Value方法中预测值直接采用最近一次的观测值。具体到我们的应用场景就是将当前的调整后收盘价预测为前一天的调整后收盘价。这种方法具有以下特点 实现简单计算成本最低。无需进行任何超参数调整。常被用作评估更复杂预测模型的基准。 基于该方法我们对数据集第1009天进行了21天期限的预测。这种朴素预测方法虽然简单但在某些情况下可能表现出令人惊讶的有效性特别是在时间序列具有较强持续性的情况下。 上述预测的 RMSE 为 1.89MAPE 为 1.59%MAE 为 1.80。 五、运行预测 5.1 无超参数调整的 NeuralProphet 要使用 NeuralProphet 运行预测请使用下面的代码。 from neuralprophet import NeuralProphet, set_random_seedtrain_size 252*3 # Use 3 years of data as train set
val_size 252 # Use 1 year of data as validation set
train_val_size train_size val_size # Size of trainvalidation set
i train_val_size # Day to forecast
H 21 # Forecast horizonset_random_seed(random_seed) # Set a random seed for reproducibilitym NeuralProphet()
m.set_plotting_backend(plotly-static)
metrics m.fit(df_nprophet[i-train_val_size:i])# Create dataframe with the dates we want to predict
future m.make_future_dataframe(df_nprophet[i-train_val_size:i], n_historic_predictionsTrue, periodsH)# Predict
forecast m.predict(future) 为了快速直观我们使用 Prophet 绘制预测图 m.plot(forecast) 这个模型结构较为基础其初始配置包括趋势项、每周周期性变化以及年度周期性变化。您可以根据以下方式单独查看每个组成部分的内容。 m.plot_components(forecast); 请注意观察就会发现周季节性曲线图几乎是平的这意味着 NeuralProphet 无法检测到周内差异。 单个系数的数值也可以绘制成如下图所示以获得更深入的了解。 m.plot_parameters() 请注意上面显示的 季节性年图 和 季节性周图 是成分图的一个周期。 在上图的预测中显示的是股票收益预测。我们可以使用代码将其转换为价格 # Convert back to price
est_adj_close []
prev_tg df.loc[i-1, adj_close]
for n in range(H):est_adj_close.append((float(preds_list.iloc[n])/1001)*prev_tg)prev_tg (float(preds_list.iloc[n])/1001)*prev_tg 之后股票价格的预测结果如下。 上述预测的 RMSE 为 1.60MAPE 为 1.35%MAE 为 1.52。 5.2 带有超参数调整功能的 NeuralProphet - Changepoints 时间序列的轨迹通常会发生突变。这种变化点检测的强度可以通过参数 n_changepoints 来调整。增加 n_changepoints 会使趋势更灵活导致过度拟合。减少 n_changepoints 会降低趋势的灵活性导致拟合不足。默认情况下该参数设置为 10。 在偏移量 m 的基础上再将增长率 k 乘以自起点 t0 起的时间差 (t1-t0)就得到了 t1 时刻的趋势效应。 trend(t1) m k(t1 - t0) trend(t0) k(t1-t0) 测试 n_变化点的值为 2、5、10、15 和 20。对于 n_changepoints 的每个值我们使用训练集和验证集进行预测结果如下 上述过程共耗时 8 分钟。接下来我们使用这个值在测试集上运行预测。结果如下所示。 上述预测的 RMSE 为 2.75MAPE 为 2.35%MAE 为 2.65。 5.3 带有超参数调整的 NeuralProphet - Monthly Seasonality 每月的季节性可以在 NeuralProphet 中这样设置 m NeuralProphet()
m m.add_seasonality(namemonthly, period30.5, fourier_order3) NeuralProphet 中的季节性是借助傅立叶项来建模的。上述傅立叶阶数指的是用于估计季节性的偏和中的项数。 使用 2、4、6、8 和 10 的傅立叶阶数值进行测试。对于每个傅立叶阶数值我们使用训练集和验证集进行预测结果如下 上述过程总共耗时 8 分钟。接下来我们使用这个值在测试集上进行预测。结果如下所示。 上述预测的 RMSE 为 2.19MAPE 为 1.87%MAE 为 2.12。 5.4 带有超参数调整功能的 NeuralProphet - 活动和假期 在节假日期间股市的走势可能会受到影响。以“圣诞反弹”现象为例这是指股市在圣诞节期间通常会出现的上涨趋势。NeuralProphet 在进行市场预测时能够将这些特定事件纳入考量。为此我们首先需要创建一个事件数据框如下所示这一步骤可以通过导入CSV文件轻松完成。 事件可以在 NeuralProphet 中这样设置events 就是上图所示的数据帧 m NeuralProphet()
m.add_events(hols, lower_windowlower_window, upper_windowupper_window)
history_df m.create_df_with_events(df, holidays)
m.fit(history_df)
future m.make_future_dataframe(history_df, events_dfevents, n_historic_predictionsTrue, periodsH)
forecast m.predict(future) 窗口大小超参数将假期扩展到日期周围的 [lower_window, upper_window]天数。为简单起见假设 lower_window 和 upper_window 的大小相同即 lower_window upper_window 窗口大小。我们将测试窗口大小的值 0、1 和 2。对于每个窗口大小值我们使用训练集和验证集进行预测结果如下 过程共耗时 5 分钟。接下来我们使用这个值在测试集上进行预测。结果如下所示。 预测的 RMSE 为 2.05MAPE 为 1.74%MAE 为 1.96。 5.5 带有超参数调整功能的 NeuralProphet - 自回归 自回归是一种时间序列模型它使用前一时间步的观测值作为回归方程的输入以预测下一时间步的值。 NeuralProphet 中的自回归由 n_lags 参数决定。我们将测试 n_lags 的值 0、2、5 和 10。对于每个 n_lags 值使用训练集和验证集进行预测结果如下 上述过程共耗时 7 分钟。接下来我们使用这个值在测试集上运行我们的预测。结果如下所示。 预测的 RMSE 为 1.18MAPE 为 0.89%MAE 为 1.01。 5.6 带有超参数调整功能的 NeuralProphet - 结合所有超参数 下一步将测试超参数的组合找出最佳的超参数集。以网格搜索方式测试上述每个超参数组合总共需要 5 * 5 * 3 * 4 * 7 分钟 35 小时。为了节省时间参考上述结果只用以下值进行测试 n_changepoints_list [2, 5]
fourier_order_list [6, 8]
window_list [1]
n_lags_list [0, 2] 此外我们还尝试了上述超参数首先是不带事件超参数的超参数其次是带事件超参数的超参数。以下是不带事件超参数的结果。 以下是使用事件超参数得出的结果。 从上面可以看出n_changepoints、fourier_order、window 和 n_lags 的最佳值分别为 2、6、1、2 和使用事件。接下来我们使用这些值在测试集上运行我们的预测。结果如下所示。 上述预测的 RMSE 为 1.04MAPE 为 0.81%MAE 为 0.91。 经过对所有超参数的细致优化我们在第1009天的预测中利用NeuralProphet模型取得了卓越的表现。在完成超参数的全面调整后该模型在RMSE、MAPE和MAE指标上均达到了最低值超越了包括Last Value基准在内的其他所有预测方法。接下来我们将探究NeuralProphet模型在其他日期的预测成效。 5.7 多日预测 在审视了上述超参数调整带来的成果之后我们计划将这种方法扩展应用以对连续多天进行预测。我们的预测将从数据集的第1009天起步并以42天为周期进行新一轮预测。鉴于数据集包含1509天的数据我们将执行共计12轮的预测。每轮预测都将覆盖未来21天的时间范围。同时对于每一天t的预测我们都将应用之前确定的最优超参数配置。 从上文中可以明显看出并非所有的预测结果都是理想的。有些日期的预测方向和幅度与实际值相当接近然而在其他日期预测的方向和幅度则与实际值相去甚远。以下展示了每项预测的性能指标结果。 让我们将上述结果与下图所示的 Last Value 方法进行比较。 NeuralProphet 在12次预测中的平均RMSE为2.15平均MAPE为1.41%平均MAE为1.88。相比之下Last Value方法的平均RMSE为2.53平均MAPE为1.69%平均MAE为2.26。在这些指标上NeuralProphet 显然表现更为优异。这一结果颇为有趣因为在我的先前实验中使用的是Prophet而非NeuralProphet那时Last Value方法的表现更为突出。在这个案例中NeuralProphet 的贡献不容小觑。 六、观点总结 NeuralProphet 在股价预测中表现卓越文章通过对比 Last Value 方法和 Prophet 模型证实 NeuralProphet 在预测股价时具有更高的准确性成为金融分析中的新利器。超参数调优是提升模型性能的关键作者通过调整 changepoints、fourier_order、window_size 和 n_lags 等超参数展示了如何优化模型从而显著提升预测效果。事件和假期对股市影响不可忽视文章强调了节假日和特殊事件对股价波动的重要性提醒我们在建模时需充分考虑这些因素以提高预测精度。自回归显著提升预测准确性通过引入自回归参数 n_lagsNeuralProphet 能够更好地捕捉时间序列中的动态变化从而大幅提升预测的可靠性。NeuralProphet 具备高度灵活性和扩展性作者通过添加事件数据框架和调整季节性参数展示了 NeuralProphet 如何适应复杂的市场环境满足多样化的预测需求。多日预测实验证明 NeuralProphet 的优越性在多次预测实验中NeuralProphet 的 RMSE、MAPE 和 MAE 指标均优于 Last Value 方法展现了其在股价预测领域的巨大潜力。 代码地址Stocks2025/StockReturnsPrediction_fh21/StockReturnsPrediction_v9_neuralprophet.ipynb at master · alexyu2013/Stocks2025 · GitHub 感谢您阅读到最后希望本文能给您带来新的收获。码字不易请帮我点赞、分享。祝您投资顺利如果对文中的内容有任何疑问请给我留言必复。 本文内容仅限技术探讨和学习不构成任何投资建议。