优化交易机器人的算法:追溯交易一百万的有效方法

预告片

我读了一本有关交易策略的权威著作,并写了我的交易机器人。 令我惊讶的是,即使是虚拟交易,该机器人也无法带来数百万美元的收益。 原因很明显:机器人需要像赛车一样进行“调整”,以选择适合特定市场,特定时间段的参数。

由于机器人具有足够的设置,因此要遍历所有可能的组合以寻找最佳的,过于耗时的任务。 一次,解决优化问题时,我没有找到对交易机器人参数的准最佳矢量的搜索算法的合理选择。 因此,我决定独立比较几种算法...

优化问题的简要说明


我们有一个交易算法。 输入数据-观察1年的每小时间隔的价格历史记录。 输出数据-P-损益,标量值。

交易算法具有4个可配置参数:

  1. Mf是“快速” 移动平均线的时间段,
  2. “慢速”移动平均线的MS周期
  3. T-TakeProfit,每笔交易的目标利润水平,
  4. S-StopLoss,每笔交易的目标亏损水平。

我们为每个参数分配一个范围和一个固定的更改步骤,每个参数总共有20个值。

因此,我们可以在一组输入数据上搜索一个参数的最大利润(P):

  1. 改变一个参数,例如P = f(Ms),产生多达20个回测,
  2. 改变两个参数,例如P = f(Ms,T),产生多达20 * 20 = 400个回测,
  3. 改变三个参数,例如P = f(Mf,Ms,T),最多产生20 * 20 * 20 = 8,000个回测,
  4. 更改每个参数P = f(Mf,Ms,T,S),并产生多达20 ^ 4 = 160,000个回测。

但是,对于大多数交易算法而言,执行一次测试要花费几个数量级以上的时间。 这导致我们需要找到一个准最佳参数向量,而无需遍历整个可能组合的任务。

有关交易和交易机器人的详细信息
在证券交易所进行交易,在外汇交易中心进行投注,对“二元期权”进行疯狂的押注,使用加密货币进行投机-一种“诊断”,并为发展“疾病”提供了几种可能的选择。 一个非常普遍的情况是,玩家在玩了“直觉”之后开始进行自动交易。 不要误会我的意思,我不想强​​调这种方式,以至于“技术上和数学上”严格的交易机器人反对天真无助的“手动”交易。 例如,我本人相信,我通过投机从有效市场(从任何透明和流动的市场中读取)中获利的任何尝试,无论是自由决定的还是全自动的,都注定会失败。 如果,也许,不允许随机运气的因素。

但是,交易,尤其是算法交易)是许多人的普遍爱好。 一些独立编程的交易机器人,其他则走得更远,并创建自己的平台来编写,调试和回测交易策略,而另一些则下载/购买现成的电子“专家”。 但是,即使是那些不自己编写交易算法的人,也应该对如何处理这个“黑匣子”有所了解,以便根据作者的想法从中获利。 为了没有根据,我以一个简单的交易策略为例进一步说明:

简单的交易机器人


交易机器人分析了以每金衡盎司美元为单位的黄金价值动态,并决定“购买”或“出售”一定数量的黄金。 为简单起见,我们假设机器人始终以1金衡盎司交易。

例如,在购买时,每盎司黄金的成本为1075.00 美元 。 在后续销售(交易结束)时,价格增加到1079.00美元。 该交易的利润总计为4美元。

如果机器人以1075.00美元的价格“卖出”黄金,然后以1079美元的价格“回购”黄金来完成(关闭)交易,则交易的利润将为负-负4美元。 实际上,对于我们来说,机器人如何出售自己没有的黄金以随后“回购”黄金并不重要。 经纪人/交易中心允许交易者以一种或另一种方式“购买”和“出售”资产,从而根据利率差异赚取(或更经常地,损失)。

我们决定了机器人的输入数据 -实际上,这是黄金价格(报价)的时间序列。 如果您说我的例子太简单,并不重要-我可以向您保证:在市场中流通的大多数机器人(实际上也包括交易商)在交易中仅以所交易商品的价格统计为准。 无论如何,在交易策略的参数优化问题中,基于价格向量的机器人交易与访问TB级多分类市场分析阵列的机器人之间没有根本区别。 最主要的是,这两个机器人都可以(应该)在历史数据上进行测试。 必须确定算法:即,在相同的输入数据上(模型时间,如果需要,我们也可以将其作为参数),交易机器人应显示相同的结果。

有关交易机器人的更多详细信息,请参见以下扰流板:

机器人交易算法


图表上的黑色(粗)曲线是XAUUSD每小时的价格度量。 两个细虚线,红色和蓝色-平均价格值,平均周期分别为5和10。 换句话说,周期为5、10的移动平均线(MA)。例如,为了计算红色曲线的最后一个(右)点的纵坐标,我取了最后5个价格值的平均值。 因此,每个移动平均线不仅相对于价格曲线“平滑”,而且相对于价格曲线滞后一半。

交易开始规则


机器人有一个简单的规则来做出购买/销售决定:
-短期(“快速” MA )的移动平均线从底部向上穿越长期(“慢” MA)的移动平均线时,机器人将购买资产(黄金)。

一旦“快速” MA从上到下穿过“慢速” MA,机器人就会出售资产。 在上图中,机器人将进行5次交易:在时间戳7、31和50进行3次销售,并进行两次购买(标记16和36)。

允许机器人打开无限数量的交易。 例如,在某个时候,机器人可能同时具有多个待定的购买和销售。

交易结束规则


机器人会在以下时间立即完成交易:

  • 交易利润超过以百分比指定的阈值-TakeProfit,
  • 或交易损失(以百分比表示)超过相应的值-StopLoss。

假设止损为0.2%。
该交易是黄金的“销售”,价格为1061.50。
黄金价格上涨到1061.50 + 1061.50 * 0.2%/ 100%= 1063.12%时,交易损失显然为0.2%,机器人将自动完成交易。

在下一个XAUUSD报价发布后的每个小时结束时,机器人会决定在离散的时间点上打开/关闭交易的所有决定。

是的,机器人非常简单。 同时,它100%满足以下要求:

  1. 该算法具有确定性:每次在相同的价格数据上模拟机器人的工作,我们将获得相同的结果,
  2. 具有足够数量的可调参数,即:“快速”周期和“慢”移动平均周期(自然数),TakeProfit和StopLoss-正实数,
  3. 通常情况下,四个参数中的每个参数的变化都会对机器人的交易特性(尤其是其获利能力)产生非线性影响,
  4. 价格历史上机器人的获利能力被视为基本程序代码,并且计算本身需要花费一秒钟的时间来计算数千个报价的向量,
  5. 最后,这是无关紧要的,实际上,尽管它具有简单性,但它实际上不会比作者在互联网上以不菲的价格出售的Grail更糟(尽管可能不会更好)。

快速搜索一组最佳输入参数


以我们简单的机器人为例,可以看出,即使对于4个可变参数,完整枚举机器人设置的所有可能矢量也太昂贵了。 穷举搜索的一个明显替代方法是为特定策略选择参数向量。 我们只考虑所有可能组合中的一部分,以寻找最佳组合,其中CF接近最高(或最小,取决于我们选择的CF和获得的结果)。

对于数字滤波器的准最佳值,我们将考虑三种搜索算法。 对于每种算法,我们设置了40个测试的限制(400种可能的组合中)。

蒙特卡罗方法


或从等于N的可能集合中随机选择M个不相关的向量。该方法可能是最简单的方法。 我们将其作为与其他优化方法进行后续比较的起点。

例子1


该图显示了我们的交易机器人交易EURUSD的利润(P),该价格是从每小时价格测量历史的年度细分中获取的,该参数值是“缓慢” 移动平均线 (M)的时间段。 所有其他参数都是固定的,并且未优化。



在点M = 12处,CF(利润)最大为0.27。为了保证利润的最大值,我们需要进行20次测试迭代。 一种替代方法是在间隔[9,20]上使用参数M的随机选择值对交易机器人进行较少数量的测试。 例如,经过5次迭代(占测试总数的20%),我们发现了参数的拟最佳向量(向量,显然是一维的):M = 18,CF(M)的值等于0.18:



图中我们优化算法中的剩余值被“战争迷雾”隐藏了。

使用剩余参数的固定值对交易机器人的四个参数之一进行优化无法使我们看到整体情况。 如果您更改其他参数的值,最大0.27 CF可能不是该指标的最佳值?



这就是在间隔[0.2 ... 0.8]上,对于TakeProfit参数的各种值,利润对移动平均周期的依赖性如何变化。

蒙特卡洛方法:两个参数的优化


交易机器人的利润对两个参数的依赖关系可以用图形表示为表面:



两个轴是参数T(TakeProfit)和M(移动平均线的周期)的值,第三个轴是利润值。

对于我们的交易机器人,在一年的数据间隔(约6000小时的欧元对美元报价)上进行了400次测试之后,我们得到以下形式的表面:



或者,在用彩色表示金融资产(利润,P)的值的平面上:



在此示例中,选择平面上的任意点,该算法未找到最佳值,但与之非常接近:



蒙特卡罗方法在找到最大CF时效果如何? 在上例中进行了1000次迭代以在源数据上搜索最大CF值之后,我得到了以下统计信息:

  • 在1,000次优化迭代(400个可能的组合中的40个参数[M,T]的随机向量)中发现的DF最大值的平均值为DF全局最大值(0.279)的0.231或95.7%

显然,在比较交易机器人的参数优化方法时,一个样本不是指标。 但就目前而言,这种评估就足够了。 我们继续进行下一个方法- 梯度下降法。

梯度下降法


正式地,顾名思义,该方法用于搜索DF的最小值。
根据该方法,我们选择坐标为[x0,y0,z0,...]的起点。 在一个参数优化的示例中,这可以是一个随机选择的点:



坐标为[5],DF值为148。以下是三个简单步骤:

  1. 检查当前位置附近的CF值(149和144)
  2. 移至CF值最小的点
  3. 如果不存在,则找到局部极值,算法完成



为了优化DF作为两个参数的函数,我们使用相同的算法。 如果早些时候我们在两个相邻点计算CF [xi1][xi+1] ,现在我们检查4点:

[xi1yi][xi+1yi][xiyi1][xiyi+1]




当测试空间中的DF中只有一个极值时,该方法绝对是好方法。 如果存在多个极值,则搜索将不得不重复几次,以增加找到整体极值的可能性:



在我们的示例中,我们正在寻找最大 DF。 为了保持在算法的定义之内,我们可以假设我们正在搜索最小值“减去DF”。 相同的示例,交易机器人的利润与移动平均线的周期和TakeProfit值的函数,一次迭代:



在这种情况下,发现了一个局部极值,该极值远未达到CF的全局最大值。 通过梯度下降法搜索FS极值的几次迭代示例,计算FS值40次(400个可能中的40点):



现在,我们比较使用蒙特卡洛(Monte Carlo)和梯度下降算法在初始数据上搜索CF(利润)的全局最大值的效率。 在每种情况下,都要进行40次测试(CF计算)。 每种方法执行了1,000次优化迭代:
蒙特卡洛梯度下降
求得的CF最佳值的平均值0.2310.200
从CF的最大值获得的值95.7%92.1%

从表中可以看出,在此示例中,梯度下降方法的任务更糟-搜索数字资产的全局极值-最大利润。 但是我们并不急于放弃它。

交易算法的参数稳定性


查找数字滤波器的全局最大值/最小值的坐标通常不是优化目标。 假设在图形上有一个“尖锐的”峰值-一个全局最大值,其附近的CF值远低于该峰值:



假设我们选择了与所发现的数字资产最大值相对应的交易机器人的设置。 如果我们至少略微改变至少一个参数的值-移动平均线的周期和/或TakeProfit-机器人的获利能力将急剧下降(变为负数)。 关于真实交易,至少可以预期,我们的机器人交易的市场将与我们优化交易算法的历史时期明显不同。

因此,在选择交易机器人的“最佳”设置时,有必要了解一下机器人对找到的DF极值点附近的设置变化有多敏感。

显然,通常使用梯度下降法可以得出极值附近的TF值。 蒙特卡洛方法更有可能达到平方。

在测试自动化交易策略的多条指令中,优化完成后,建议在找到的参数向量附近检查机器人的目标指标。 但是这些是附加测试。 此外,如果策略的利润随着设置的微小变化而下降,该怎么办? 显然,您必须重复测试过程。

一种算法对我们很有用,在寻找CF极值的同时,我们可以评估交易策略的稳定性,以相对于发现的峰值在狭窄范围内更改设置。 例如,不要直接搜索最大CF

P=fmiti


加权平均值考虑目标函数的邻近值,其中权重与到邻近值的距离成反比(以优化两个参数x,y和目标函数P):

Pxiyi= fracwi\乘Pxiyi+wj\乘Pxjyj+wk\乘Pxkyk+...wi+wj+wk+...


wj= sqrtxjxi2+yjyi2


wi+wj+wk+...=1


换句话说,当选择参数的准最佳矢量时,该算法将评估“平滑的”目标函数:

原为



已经成为



“海战”的方法


为了结合两种方法(蒙特卡罗方法和梯度下降方法)的优势,我尝试了一种类似于“海战”中游戏算法的算法:

  • 首先,我在整个区域上击了几下
  • 然后,在“打击”的地方,我开了大火。

换句话说,对输入参数的随机不相关向量进行前N次测试。 其中,选择M个最佳结果。 在这些测试附近(每个坐标加上-分钟0..L),又进行了K个测试。

对于我们的示例(400分,总共40次试验),我们有:



再一次,我们比较了现在三种优化算法的有效性:
蒙特卡洛梯度下降“海战”
求出的CF极值的平均值占总值的百分比。
40个测试,1,000次优化迭代
95.7%92.1%97.0%


结果令人鼓舞。 当然,比较是针对一个特定的数据样本进行的:一种针对欧元对美元价值的时间序列的交易算法。 , , , (?) — () . , .

Source: https://habr.com/ru/post/zh-CN430134/


All Articles