从上一篇文章(期货ML策略(二)构建机器学习模型))继续,本文开始回测和分析上一篇文章的结果。
在上一篇文章中,我简要介绍了如何构建ML模型。在实际市场中,我们可以每分钟获取不同合约的实时数据(1分钟K线数据),然后构造所需的特征并将其输入到模型中。该模型将根据输入的特征输出20分钟后上升的概率,并在达到预设阈值时变长或变短。
在回测过程中期货配资,为了加快回测,我们只需要预先计算何时购买和何时出售。考虑到在获得K线数据后不能立即提供交易信号期货交易信号,并且存在一定的时间差,因此将回测延迟1分钟交易。也就是说期货交易信号期货配资,在第0分钟,第1分钟给出交易信号,在第20分钟打开头寸并关闭它。由于目前的考虑是当日交易,因此该策略最终将被清算。
github中的Trian.ipynb程序将自动输出交易信号result.csv。在回测过程中根据给定的交易信号交易。
由于期货交易中不同合约品种的手续费不同,因此在这里我使用天琴平台进行回测。
回测算法的算法步骤如下:
步骤1:按时间顺序搜索交易信号,如果有交易信号,请转到步骤2,否则转到步骤5
步骤2:判断是否在当前时间点开仓,以及是否需要在当前时间点开仓,请平仓。如果当前时间点大于开放时间,请返回步骤1,否则返回步骤3
第3步:遍历以确定当前位置是否已达到关闭时间,如果是期货开户,则关闭该位置。然后输入Step4
Step4:如果当前时间是14:58,请清除所有头寸。然后回到步骤1查找新的交易信号
第5步:遍历以确定当前位置是否已达到关闭时间,如果是,则关闭该位置。如果当前时间为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'].values
close_time = list(tmp_df['datetime_close'])
Step2的核心代码如下:
# 进行做多或者做空操作
if pd.Timedelta(seconds=-15) < trade_date - now_time_ < pd.Timedelta(seconds=15):
for kind, prob, tmp_close_time in zip(trade_kind, trade_prob, close_time):
target_pos = TargetPosTask(api, kind)
hold_pos = api.get_position(kind).pos
if prob > buying_prob:
target_pos.set_target_volume(hold_pos + 1)
direction.append(1)
else:
target_pos.set_target_volume(hold_pos - 1)
direction.append(-1)
hold_kind.append(kind)
close_datetime.append(tmp_close_time)
# set_kind.add(kind)
print(kind, direction[-1], now_time_)
api.wait_update()
flag = True
trade_kind = []
trade_prob = []
# break
elif now_time_ - trade_date > pd.Timedelta(seconds=15):
break
Step3的核心代码如下:
# 查看是否已满20分钟
while True:
if len(hold_kind) == 0:
break
# print(now_time-hold_time[0])
for i in range(len(hold_kind)-1, -1, -1):
if now_time_ - close_datetime[i] >= pd.Timedelta(seconds=-15):
target_pos = TargetPosTask(api, hold_kind[i])
hold_pos = api.get_position(hold_kind[i]).pos
if direction[i] == 1 and hold_pos != 0:
target_pos.set_target_volume(hold_pos - 1)
elif hold_pos != 0:
target_pos.set_target_volume(hold_pos + 1)
print('time end, 平1手 ' + hold_kind[i])
hold_kind.pop(i)
direction.pop(i)
close_datetime.pop(i)
api.wait_update()
flag = True
break
Step4的核心代码如下:
# 当日清仓
if now_time_.hour == 14 and now_time_.minute >= 58:
# tmp_kind = []
# print(api._serials.items())
print(now_time_)
for tmp in set(hold_kind):
target_pos = TargetPosTask(api, tmp)
if target_pos != 0:
target_pos.set_target_volume(0)
print('清空 '+str(tmp))
api.wait_update()
flag = True
hold_kind = []
close_datetime = []
direction = []
回测结果
重新测试时间:2019年9月1日-> 2020年4月20日
所有结果如下:
从结果来看,该策略几乎无法实现盈利,这也是正常现象。毕竟,我才刚刚开始做。如果这么简单,就不容易赚钱吗?我相信,如果您研究某种析因设计效果会更好。从交易的频率,可以发现交易在很多情况下没有执行。这可以根据上升和下降概率的等级长短进行。简而言之,这种简单的机器学习策略仍然具有巨大的潜力。毕竟,当前的策略只是玩具策略,而改进肯定会产生更多难以想象的效果。

文章来源:期货开户,如若转载,请注明出处:http://www.hjczyzs.com/338.html