前面介绍了来自Facebook团队研制的开源时间序列预测算法。下面我们将先介绍如何安装该算法库,以及该算法的基本用法,最后将其应用于股票价格的预测当中。完整代码和数据可在文末进行获取。
conda create -n prophet python=3.6
activate prophet
conda config --add channels conda-forge
前面提到了需要pystan库,所以在这个虚拟环境下需要先安装pystan。而安装pystan时需要用到C++编译器,由于Windows下其依赖的Microsoft Visual C++ 14.0资源不太好找,并且官方提供的VC++的地址已经404了。所以这里通过conda install 的方式来安装pystan,它会默认安装将MinGW-w64进行一并安装。MinGW-w64实际上是将Linux下的开源C语言编译器GCC移植到了 Windows 平台下,也即MinGW 就是 GCC 的 Windows 版本。在安装pystan需要在网络通畅的环境下安装,否则会出现安装中断等问题。
conda install pystan -c conda-forge
conda install fbprophet -c conda-forge
from fbprophet import Prophet
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据和数据预处理
df = pd.read_csv('./000001_Daily_2006_2017.csv')
df = df[['date', 'Close']]
df['date'] = pd.to_datetime(df['date'])
df['Close'] = np.log(df['Close'])
df = df.rename(columns = {'date':'ds', 'Close':'y'})
# 训练集和测试集划分
df_train = df[:2699]
df_test = df[2699:]
print(df_train)
DataFrame数据的形式如下所示:
ds y
0 2005-11-25 7.016534
1 2005-11-28 7.012856
2 2005-11-29 7.000322
3 2005-11-30 7.002393
4 2005-12-01 7.001926
... ...
# m模型构建
model = Prophet()
model.fit(df_train)
# 模型预测
future = model.make_future_dataframe(periods=365, freq='D')
forecast = model.predict(future)
print(forecast)
print(forecast.columns.values)
ds trend ... multiplicative_terms_upper yhat
0 2005-11-25 7.001825 ... 0.0 6.974496
1 2005-11-28 7.006577 ... 0.0 6.982433
2 2005-11-29 7.008161 ... 0.0 6.983982
3 2005-11-30 7.009744 ... 0.0 6.987229
4 2005-12-01 7.011328 ... 0.0 6.988442
... ... ... ... ... ...
3059 2017-12-26 8.046088 ... 0.0 8.043073
3060 2017-12-27 8.046047 ... 0.0 8.045374
3061 2017-12-28 8.046006 ... 0.0 8.045661
3062 2017-12-29 8.045966 ... 0.0 8.047042
3063 2017-12-30 8.045925 ... 0.0 8.046149
['ds' 'trend' 'yhat_lower' 'yhat_upper' 'trend_lower' 'trend_upper'
'additive_terms' 'additive_terms_lower' 'additive_terms_upper' 'weekly'
'weekly_lower' 'weekly_upper' 'yearly' 'yearly_lower' 'yearly_upper'
'multiplicative_terms' 'multiplicative_terms_lower'
'multiplicative_terms_upper' 'yhat']
# 可视化
model.plot(forecast)
plt.show()
model.plot_components(forecast)
plt.show()
df_test = df_test.set_index('ds')
forecast = forecast[['ds','yhat']].set_index('ds')
df_test['y'] = np.exp(df_test['y'])
forecast['yhat'] = np.exp(forecast['yhat'])
df_all = forecast.join(df_test).dropna()
df_all.plot()
plt.legend(['true', 'yhat'])
plt.show()
了解更多人工智能与
量化金融知识
<-请扫码关注
让我知道你在看