Facebook在2017年开源了一个时间序列预测的算法,叫做fbprophet,其功能包括:
1、为预测设置上下限;
2、设置趋势断点;
3、处理季节性和节假日效应;
4、允许乘法形式的季节性;
5、区间预测;
6、处理异常值;
7、处理非日度数据;
8、模型检测。
可以用这个算法,来为CF的日度数据进行预测,做出一个基础性的预测。初步探索如下:
我们推荐使用conda安装,由于fbprophet需要调用pyStan这个开源工具,因此安装命令为下述两条:
conda install -c conda-forge pystan
conda install -c conda-forge fbprophet
安装好之后:
导入相应的三方库
from jqdatasdk import *
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet
使用JQDATA获取CF期货主力合约期货价格,可以获取主力合约期货价格,具体代码参考:
https://www.joinquant.com/help/api/help#JQData:
auth('账号','密码')#输入jqdata的账号和密码
df = get_price('CF9999.XZCE', start_date='2010-01-01', end_date='2020-12-31', frequency='daily')
期货概况
fbprophet算法的大概步骤是,先生成一个Prophet实例,然后调用fit方法进行拟合,调用predict方法进行拟合。代码如下:
m = Prophet()
m.fit(df)
future_time = m.make_future_dataframe(periods=365)
forecast = m.predict(future_time)
fig1 = m.plot(forecast)
fig2 = m.plot_components(forecast)
运行fbprophet后对以下代码进行回测:
import matplotlib.pyplot as plt
import pandas as pd
from fbprophet import Prophet
df.rename(columns={'日期':'ds','今收盘':'y'},inplace=True)
df_price=df[['ds','y']]
m=Prophet()
m.fit(df_price)
m.add_country_holidays(country_name='CN')
future_time = m.make_future_dataframe(freq='B',periods=365)
forecast = m.predict(future_time)
m.plot(forecast)
m.plot_components(forecast)
plt.show()
获得最终的运行结果见附件:
从消费季节性上来看,俗话说金三银四,金九银十,这两个消费旺季在fpprophet中还是十分明显的,fb将趋势的价格按照趋势,周期性,随机性进行拟合得到最终的预测区间,对于短期内的趋势预测准确性尚可。
本文是针对主力合约价格进行预测拟合,比较粗糙,后续还会继续改进,考虑节假日,季节性等进行调整。