使用Prophet预测股票(pr应用范围)

由:sddy008 发布于:2023-03-22 分类:股票知识 阅读:95 评论:0

Stock market forecasting with prophet - Python Data

上一篇文章中,我使用股票市场数据来显示先知如何检测到信号中的变化。在发表了这篇文章之后,我收到了一些问题,询问能否预测股票市场,以便我们能够提供一个快速的备案来使用Prophet进行股票市场预测。

本文强调了使用Prophet预测股票市场。 你可以在这里中找到一个jupyter notebook。

对于本文,我们将使用FRED的S&P 500数据。 您可以自己下载这些数据到CSV格式,或者从我的 github examples目录中获取一份副本。 我们加载我们的数据并绘制它。

import pandas as pd import numpy as np from fbprophet import Prophet import matplotlib.pyplot as plt from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error %matplotlib inline plt.rcParams[figure.figsize]=(20,10) plt.style.use(ggplot) market_df = pd.read_csv(../examples/SP500.csv, index_col=DATE, parse_dates=True) market_df.plot()

现在,我们通过Prophet来运行这些数据。 看看有关Prophet基本知识的更多信息。

df = market_df.reset_index().rename(columns={DATE:ds, SP500:y}) df[y] = np.log(df[y]) model = Prophet() model.fit(df); future = model.make_future_dataframe(periods=365) #forecasting for 1 year from now. forecast = model.predict(future)

而且,让我们来看看我们的预测。

figure=model.plot(forecast)

有了我们的数据,很难看出预测(蓝线)与实际数据(黑点)相比有多好/坏。 我们来看看预测与实际数据的最后800个数据点(〜2年),而不考虑未来的预测(因为我们只想获得实际与预测之间的误差视觉)。

two_years = forecast.set_index(ds).join(market_df) two_years = two_years[[SP500, yhat, yhat_upper, yhat_lower ]].dropna().tail(800) two_years[yhat]=np.exp(two_years.yhat) two_years[yhat_upper]=np.exp(two_years.yhat_upper) two_years[yhat_lower]=np.exp(two_years.yhat_lower) two_years[[SP500, yhat]].plot()

从上图可以看出,我们的预测跟随趋势相当好,但在捕捉市场“波动性”方面似乎并不大。 不要担心,这对我们来说可能是一件非常好的事情,如果我们有兴趣“追随趋势”,而不是完美地切合实际。

我们来看几个准确的措施。 首先,我们将看一个基本的pandas数据框描述函数来查看事情slook,然后我们将看R平方,均方误差(MSE)和平均绝对误差(MAE)。

two_years_AE = (two_years.yhat - two_years.SP500) print two_years_AE.describe() count 800.000000 mean -0.540173 std 47.568987 min -141.265774 25% -29.383549 50% -1.548716 75% 25.878416 max 168.898459 dtype: float64

那些真的不是坏的数字,但他们并没有真正讲述所有的故事。 我们来看几个准确度的措施。

现在,我们来看看使用sklearnsr2_score函数的R平方:

r2_score(two_years.SP500, two_years.yhat)

我们得到一个0.91的值,这相当不错。 我将以任何第一轮建模方式取0.9。

现在,我们来看看使用sklearnsmean_squared_error函数的均方误差:

mean_squared_error(two_years.SP500, two_years.yhat)

我们得到一个2260.27的值。

那里我们有它...真正的指针,这种建模技术有点懦弱。

一个试图预测标准普尔500的价格,在1900到2500之间的模型的MSE是2260.28,不是很好(记住...对于MSE,接近零更好)如果你想预测精确的变化和上下移动。

现在,我们来看一下使用sklearn的mean_absolute_error函数的平均绝对误差(MAE)。 MAE是测量两个连续变量之间的绝对误差,可以比我们的标准平均值更好地了解错误率。

mean_absolute_error(two_years.SP500, two_years.yhat)

对于MAE,我们得到36.18

MAE继续告诉我们,prophet 的预测不太适合在交易中使用这种预测。

查看此预测的有用性的另一种方法是绘制预测的实际值的上限和下限。 您可以通过绘制yhat_upper和yhat_lower来执行此操作。

fig, ax1 = plt.subplots() ax1.plot(two_years.SP500) ax1.plot(two_years.yhat) ax1.plot(two_years.yhat_upper, color=black, linestyle=:, alpha=0.5) ax1.plot(two_years.yhat_lower, color=black, linestyle=:, alpha=0.5) ax1.set_title(Actual S&P 500 (Orange) vs S&P 500 Forecasted Upper & Lower Confidence (Black)) ax1.set_ylabel(Price) ax1.set_xlabel(Date)

在上图中,我们可以看到预测(以蓝色为单位)与实际(以橙色为单位),上限和下限置信度带为灰色。

你不能真正地从这个图表中说出任何可量化的东西,但是你可以对预测的价值做出判断。 如果你想短期(1天到几个星期)进行交易,这个预测几乎是无用的,但是如果你投资几个月到几年的时间,这个预测可能会提供一些价值来更好地了解市场的趋势, 预测趋势。

我们回去看一下实际的预测,看看它是否会告诉我们与预测数据不同的实际数据。

full_df = forecast.set_index(ds).join(market_df) full_df[yhat]=np.exp(full_df[yhat]) fig, ax1 = plt.subplots() ax1.plot(full_df.SP500) ax1.plot(full_df.yhat, color=black, linestyle=:) ax1.fill_between(full_df.index, np.exp(full_df[yhat_upper]), np.exp(full_df[yhat_lower]), alpha=0.5, color=darkgray) ax1.set_title(Actual S&P 500 (Orange) vs S&P 500 Forecasted (Black) with Confidence Bands) ax1.set_ylabel(Price) ax1.set_xlabel(Date) L=ax1.legend() #get the legend L.get_texts()[0].set_text(S&P 500 Actual) #change the legend text for 1st plot L.get_texts()[1].set_text(S&P 5600 Forecasted) #change the legend text for 2nd plot

这个图表对于默认的Prophet图表(至少在我看来比较容易理解)。我们可以看到,在整个实际和预测的历史上,Prophet做了一个好的工作预测,但是当市场变得非常波动时,这些领域有麻烦。

具体来看未来的预测,Prophet告诉我们,市场将会持续上涨,预计将在2750左右,信心指数从2000年的高位到4000点。如果您向任何严重的交易者/投资者展示这一预测,那么他们很快就会将其视为可怕的预测。任何2000点置信区间在短期和长期投资世界都是毫无价值的。

也就是说,Prophet对市场的预测是否有价值?也许。也许只有在未来几天/几周的预测才会比未来一年更好。也许我们可以更准确地使用每周或每月数据的预测。或者也许我们可以使用预测结合其他预测来做出更好的预测。在将来的某个时刻,我可能会深入一下。敬请关注。

作者:Eric Brown信息系统博士学位,专攻数据科学,决策支持和知识管理。 他在http://pythondata.com上写了关于利用python进行数据分析的途径,以及http://ericbrown.com上的技术与策略

相关阅读

评论

精彩评论