如何预测股票分析--先知(Prophet)
在上一篇中,我们探讨了自动ARIMA,但是好像表现的还是不够完善,接下来看看先知的力量!
先知(Prophet)
有许多时间序列技术可以用在股票预测数据集上,但是大多数技术在拟合模型之前需要大量的数据预处理。Prophet(先知)由Facebook设计和开发,是一个时间序列预测库,不需要数据预处理,并且非常容易实现。先知的输入是一个带有两列的数据框:日期和目标(ds和y)。
时间序列预测一直是预测问题中的难点,人们很难找到一个适用场景丰富的通用模型,这是因为现实中每个预测问题的背景知识,例如数据的产生过程,往往是不同的,即使是同一类问题,影响这些预测值的因素与程度也往往不同,再加上预测问题往往需要大量专业的统计知识,这又给分析人员带来了难度,这些都使得时间序列预测问题变得尤其复杂。传统的时间序列预测方法通常有如下缺陷:
1. 适用的时序数据过于局限
2. 缺失值需要填补
3. 模型缺乏灵活性
4. 指导作用较弱
2017年2月24号facebook开源了时间序列预测框架prophet,目前支持R语言和python语言。托管在github上:https://github.com/facebookincubator/prophet。prophet是基于可分解(趋势+季节+节假日)模型的开源库,Prophet充分的将业务背景知识和统计知识融合起来,它让我们可以用简单直观的参数进行高精度的时间序列预测,并且支持自定义季节和节假日的影响。
Prophet官方文档:https://facebook.github.io/prophet/
Prophet论文:https://peerj.com/preprints/3190/
Prophet-github:https://github.com/facebook/prophet
先知试图在过去的数据中捕捉季节性,并且在数据集很大的时候依然表现良好。
#importing prophet 导入库函数
from fbprophet import Prophet
#creating dataframe 建立新的数据集框架,以长度为索引,取date和close这两列
new_data = pd.DataFrame(index=range(0,len(df)),columns=['Date', 'Close'])
#给这个框架灌输数据
for i in range(0,len(data)):
new_data['Date'][i] = data['Date'][i]
new_data['Close'][i] = data['Close'][i]
#对于数据内容表现形式的转换,这里是转化为年-月-日的格式,同时建立以这个时间的索引
new_data['Date'] = pd.to_datetime(new_data.Date,format='%Y-%m-%d')
new_data.index = new_data['Date']
#preparing data对数据集的列名重命名
new_data.rename(columns={'Close': 'y', 'Date': 'ds'}, inplace=True)
#train and validation划分训练集和测试集
train = new_data[:987]
valid = new_data[987:]
#fit the model建立模型,给模型喂训练集
model = Prophet()
model.fit(train)
#predictions 预测,make_future_datafram是库自带的函数,新建一个数据框,指明需要预测到将来多长时间
close_prices = model.make_future_dataframe(periods=len(valid))
forecast = model.predict(close_prices)
结果
#rmse 计算rms
forecast_valid = forecast['yhat'][987:]
rms=np.sqrt(np.mean(np.power((np.array(valid['y'])-np.array(forecast_valid)),2)))
rms
57.494461930575149
#plot 绘图(老三样)
valid['Predictions'] = 0
valid['Predictions'] = forecast_valid.values
plt.plot(train['y'])
plt.plot(valid[['y', 'Predictions']])
推论
先知(像大多数时间序列预测技术一样)试图从过去的数据中捕捉趋势和季节性。该模型通常在时间序列数据集上表现良好,但在本例中没有达到预期效果。
事实证明,股票价格没有特定的趋势或季节性。价格的涨跌很大程度上取决于目前市场上的情况。因此,像ARIMA、SARIMA和Prophet这样的预测技术并不能很好地解决这个特殊的问题。
跟多的关于理论的知识,你可以访问
https://blog.csdn.net/h4565445654/article/details/78398089 fbProphe时序预测----论文总结以及调参思路
http://blog.51cto.com/13591395/2066888 腾讯技术工程 | 基于Prophet的时间序列预测