量化交易软件:利用网格和马丁交易策略系统机器学习需要怎么做?

主要任务是正确地为成交贴标签。 我们还记得以前文章中如何处理单一仓位的。 我们赫兹量化设置了随机或确定性的成交边际,例如,15 根柱线。 如果行情在这 15 根柱线上都在上涨,则该成交被贴上标签“买入”,否则被贴上标签“卖出”。 类似的逻辑也运用在订单网格,但是此处必须考虑一组持仓的总盈利/亏损。 这可以用一个简单的例子来阐述。 作者会尽力描绘蓝图。

添加图片注释,不超过 140 字(可选)

假设交易边际是15(十五)根柱线(在传统时间标尺上以垂直线标记的红色笔划)。 如果只有一笔持仓,由于行情已从一个点位上涨到另一个点位,故它将被贴上标签“买入”(绿色点划斜线)。 行情在此处显示为黑色折线。

有了这样的标签,过渡行情的波动即被忽略了。 如果我们运用订单网格(红色和绿色水平线),则必须计算所有已触发挂单的总利润,包括自最初开始的订单(您可在同一方向上开仓布局网格;或者选择放置挂单网格,无需即刻开仓)。 针对学习历史的整个深度,在滑动窗口中持续如此贴标签。 ML(机器学习)的任务是归纳各种状况,并基于新数据有效地预测(如果可能)。

在这种情况下,也许会有若干个选项用于选择交易方向,并为数据贴标签。 如何选择在此即是哲学也是实验任务。

  • 依据最大总利润进行选择。 如果“卖出”网格产生更多的利润,则为该网格贴标签。

  • 在持单数量和总利润之间进行加权选择。 如果网格中每笔持单的平均利润高于逆向的平均利润,则选择该边。

  • 依据已触发订单的最大数量进行选择。 由于所期望的机器人应遵照网格交易,该选项看起来很合理。 如果已触发订单数量最大,且总仓位处于获利状态,则选择此侧。 这一侧代表网格的方向(卖出或买入)。

这三条准测对于开始似乎已经足够了。 赫兹量化来详细研究第一个,因为它是最简单的一个,旨在获得最大的利润。

添加图片注释,不超过 140 字(可选)

在代码中为成交贴标签

现在我们回想一下以前文章中如何为成交贴标签。

 
 

def add_labels(dataset, min, max): labels = [] for i in range(dataset.shape[0]-max): rand = random.randint(min, max) curr_pr = dataset['close'][i] future_pr = dataset['close'][i + rand] if future_pr + MARKUP < curr_pr: labels.append(1.0) elif future_pr - MARKUP > curr_pr: labels.append(0.0) else: labels.append(2.0) dataset = dataset.iloc[:len(labels)].copy() dataset['labels'] = labels dataset = dataset.dropna() dataset = dataset.drop( dataset[dataset.labels == 2].index).reset_index(drop=True) return dataset

该代码需要针对常规网格和马丁格尔网格进行归纳。 另一个令人兴奋的功能是,您可以浏览含有不同数量订单的网格,订单之间的距离不同,甚至可以运用马丁格尔(手数递增)。

为此,我们添加全局变量,以后可用它来优化。

 
 

GRID_SIZE = 10 GRID_DISTANCES = np.full(GRID_SIZE, 0.00200) GRID_COEFFICIENTS = np.linspace(1, 3, num= GRID_SIZE)

GRID_SIZE 变量里包含双向订单的数量。

GRID_DISTANCES 设置订单之间的距离。 距离可以是固定的,亦或可变的(对于所有订单而言各有不同)。 这将有助于提升交易系统的灵活性。

GRID_COEFFICIENTS 变量包含每笔订单的手数乘数。 如果它们是常数,则系统将创建规则的网格。 如果手数不同,那么它会是马丁格尔或逆马丁格尔,或任何其他运用不同手数乘数的网格名称。

对于那些刚接触 numpy 函数库的人:

  • np.full 用指定数量的相同值填充数组

  • np.linspace 用指定数量的值填充数组,其值均匀地分布在两个实数之间。 在上面的示例中,GRID_COEFFICIENTS 将包含以下内容。

 
 

array([1. , 1.22222222, 1.44444444, 1.66666667, 1.88888889, 2.11111111, 2.33333333, 2.55555556, 2.77777778, 3. ])

相应地,第一个手数乘数将等于 1,因此该手数将等于交易系统参数中指定的基本手数。 在以后的网格里订单手数乘数连续从 1 到 3。 若在网格里的所有订单采用固定乘数,则需调用 np.full。

统计已触发和未触发订单可能有些棘手,故此我们需要创建某种数据结构。 我决定创建一本字典来保存每个特定案例(样本)的订单和仓位记录。 取而代之,我们可以利用数据类对象,熊猫数据框架或 numpy 结构化数组。 最后的解决方案,很可能是最快的,但在此它并不要紧。

每次迭代将样本添加到训练集合当中,并创建有关的订单网格信息,保存在字典里。 这可能需要一些解释。 grid_stats 字典包含有关当前订单网格从打开到平仓的所有必需信息。

在 MetaTrader 5 测试器中检查机器人

测试应在机器人所训练的时间帧内进行。 在这种情况下,它是 H1。 可以采用开盘价对其进行测试,因为该机器人对于柱线开盘拥有明确的控制权。 不过,由于运用的是网格,因此可以选择 M1 OHLC 来获得更高的精度。

该特定的机器人已在以下周期内经历了训练:

 
 

START_DATE = datetime(2020, 5, 1) TSTART_DATE = datetime(2019, 1, 1) FULL_DATE = datetime(2018, 1, 1) END_DATE = datetime(2022, 1, 1)

  • 从 2020 年第五个月到今天的间隔是一个训练期,将 50/50 分为训练和验证子样本。

  • 从 2019 年 1 月起,根据 R^2 对模型进行评估,然后选择最佳模型。

  • 从 2018 年第一个月起,该模型在自定义测试器中进行了测试。

  • 综合数据用于训练(由高斯混合模型生成)

  • CatBoost 模型拥有强大的正则化功能,有助于避免基于训练样本进行过度拟合。

所有这些因素表明(并经自定义测试器确认)我们在从 2018 年到今天的区间中找到了某种形态。

我们来看看在 MetaTrader 5 策略测试器中它的样子。

添加图片注释,不超过 140 字(可选)

除了我们现在可以看到净值回撤以外,余额图的图表与我的自定义测试器相同。 这是个好消息。 我们来确保该机器人正在遵照网格正确交易,且无其他干扰。

这是从 2015 年开始的测试结果。

添加图片注释,不超过 140 字(可选)

根据该图形,找到的形态从 2016 年底到今天有效,而在其余时间区间则失效。 在这种情况下,初始手数很少,这有助于该机器人得以生存。 至少我们知道该机器人自 2017 年初以来一直有效。 有基于此,我们可以增加风险,以期提高盈利效果。 该机器人展现出令人印象深刻的结果:3 年内达到 1600%,回撤 40%,有亏损全部本金的风险。

添加图片注释,不超过 140 字(可选)

此外,机器人在每笔持仓里使用了止损和止盈。 使用 SL 和 TP 会牺牲性,但同时能限制风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值