接上一篇文章(期货ML策略(二)构建机器学习模型),这篇文章开始对上一篇的结果进行回测分析。
上一篇文章中我简单的介绍了如何构建ML模型。当在实盘的时候,每隔一分钟我们可以获取到不同合约的实时数据(1分钟k线数据),然后构造需要的特征并将其输入模型中。模型会根据输入的特征输出20分钟后上涨概率,当达到预先设定的阈值时对其做多或做空。
在回测的过程中,为了加快回测的速度,我们只需要提前计算好在何时买入,何时卖出即可。考虑到当获得K线数据之后不能马上给出交易信号,并且存在一些时间差,所以回测的时候延后1分钟交易;即在第0分钟给出交易信号,第1分钟开仓,第20分钟平仓。因为目前考虑的是日内交易,所以策略会在尾盘清仓。
github中的Trian.ipynb程序会自动输出交易信号result.csv。回测过程中根据给定的交易信号进行交易。
因为期货交易中不同合约品种的手续费不太一样,所以这里我借助了天勤平台进行回测。
回测算法的算法步骤如下:
Step1 : 按时间顺序寻找交易信号,如果有交易信号则进入Step2,否则进入Step5
Step2 : 判断当前时间点是否开仓,如果当前时间点需要开仓,则进行开仓操作。如果当前时间点大于开仓时间,则回到Step1,否则进入Step3
Step3 : 遍历判断当前持仓是否达到平仓时间,如果是则平仓。然后进入Step4
Step4 : 如果当前时间是14点58分,清空所有仓位。然后回到Step1寻找新的交易信号
Step5 : 遍历判断当前持仓是否达到平仓时间,如果是则平仓。如果当前时间是14点58分,清空所有仓位,并结束回测程序。
Step1核心代码如下:
for trade_date, tmp_df in pred.groupby('datetime_open'):
# print(now_time_, now_time_ - trade_date)
# print(trade_date)
tmp_df = tmp_df[(tmp_df['pred'] > buying_prob)|(tmp_df['pred'] < selling_prob)]
flag = False # 判断是否有进行加减仓等一系列操作
if len(tmp_df) != 0:
trade_kind = list(tmp_df['ts_code'].values)
trade_prob = tmp_df['pred'