1. 首页
  2. 期货交易

解决方案:期货ML策略(基于交易信号的三)回测

从上一篇文章(期货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日

所有结果如下:

在这里插入图片描述

在这里插入图片描述

从结果来看,该策略几乎无法实现盈利,这也是正常现象。毕竟,我才刚刚开始做。如果这么简单,就不容易赚钱吗?我相信,如果您研究某种析因设计效果会更好。从交易的频率,可以发现交易在很多情况下没有执行。这可以根据上升和下降概率的等级长短进行。简而言之,这种简单的机器学习策略仍然具有巨大的潜力。毕竟,当前的策略只是玩具策略,而改进肯定会产生更多难以想象的效果。

END

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

联系我们

97866923

在线咨询:点击这里给我发消息

联系QQ:97866923