文章 "蒙特卡洛方法在交易策略优化中的应用"

 

新文章 蒙特卡洛方法在交易策略优化中的应用已发布:

在交易账户上运行 EA 交易之前,我们通常会在报价历史上测试和优化它。然而,这里会有一个合理的问题: 过去的结果怎么会对我们的未来有所帮助呢?本文描述了使用蒙特卡洛方法来为交易策略的优化构建自定义的标准,另外,还会探讨 EA 交易的稳定性标准。

让我们通过图片来解释上面的内容,它显示了几条资金曲线,它们中的每个都是根据生成的交易序列决定的。为了更方便,我使用不同的颜色对曲线做了标记,实际上,它们的数量要大得多 — 有好几万。对于它们中的每一个,我们都计算所需的参数并根据其整体性做出统计结论,很明显,这些特性中最重要的就是最终的利润。

生成的资金曲线

其他形式的概率形式化和进一步的EA操作建模也是可能的,例如,不是通过交易序列,我们可以模拟价格序列和研究EA所获得的总利润。可以根据要解决的任务来选择生成价格系列的原理,然而,这种方法需要更多的计算资源。此外,MetaTrader 目前还没有提供使用随机EA的常规方法。

作者:Aleksey Nikolayev

 

Функция setks() вычисляет массив прибылей сделок, исходя из истории торговли. 

bool setks(double &k[])
  {
   if(!HistorySelect(0,TimeCurrent())) return false;
   uint nhd=HistoryDealsTotal();
   int nk=0;
   ulong hdticket;
   double capital=TesterStatistics(STAT_INITIAL_DEPOSIT);
   long hdtype;
   double hdcommission,hdswap,hdprofit,hdprofit_full;
   for(uint n=0;n<nhd;++n)
     {
      hdticket=HistoryDealGetTicket(n);
      if(hdticket==0) continue;

      if(!HistoryDealGetInteger(hdticket,DEAL_TYPE,hdtype)) return false;
      if(hdtype!=DEAL_TYPE_BUY && hdtype!=DEAL_TYPE_SELL) continue;

      hdcommission=HistoryDealGetDouble(hdticket,DEAL_COMMISSION);
      hdswap=HistoryDealGetDouble(hdticket,DEAL_SWAP);
      hdprofit=HistoryDealGetDouble(hdticket,DEAL_PROFIT);
      if(hdcommission==0.0 && hdswap==0.0 && hdprofit==0.0) continue;

      ++nk;
      ArrayResize(k,nk,NADD);
      hdprofit_full=hdcommission+hdswap+hdprofit;
      k[nk-1]=1.0+hdprofit_full/capital;
      capital+=hdprofit_full;
     }
   return true;
  }

突出显示的假设是,一些利润为零的平仓 交易没有包含在样本中,而一些开仓交易包含在样本中。

试试 DEAL_ENTRY。


在分析蒙特卡罗交易时,是否必须计算掉期和佣金?它们没有系统价值。

我建议使用开盘价和收盘价的比率作为利润。这里我们可以讨论 "是否应该考虑手数?

 

一方面,假定交易是独立的。

另一方面,很难想象 TS 中的交易是独立的。


例如,如果您已经持有头寸,那么在决定进行交易时就不能忽略这种情况。

原来蒙特卡洛姆是一个非随机值。还是我有什么不明白的地方?

 
fxsaber:

突出显示的假设是,一些利润为零的平仓 交易在某种程度上不包括在样本中,而一些开仓交易则包括在样本中。

试试 DEAL_ENTRY。

为简化模型,我们只将影响资本曲线的交易视为交易。

 
fxsaber:

在分析 Monte Carlo 交易时,是否必须计算掉期和佣金?它们没有系统值。

我认为这取决于 EA 设备。如果它们的值很小,就不会影响优化标准的计算;如果它们的值很大,忽略它们就会扭曲优化结果

 

fxsaber:

我建议使用开盘价和收盘价的比率作为利润。在这里,我们可以讨论 "是否应该考虑手数?

您所说的与我在关于风险的文章 中所说的盈利能力类似 在那篇文章中,我们从内部研究 EA,而在这里,我们将其视为一个既定的 "黑盒子",管理交易规模是其不可分割的一部分。这意味着利润的分布可能与收益的分布截然不同。因此,如果我们只依赖收益,那么我们优化的 EA 将截然不同。

 
fxsaber:

一方面,假设交易是独立的。

另一方面,很难想象 TS 中的交易是独立的。


例如,如果您已经有一个未结头寸,在决定进行交易时就不能忽略这一情况。

原来蒙特卡洛姆是一个非随机值。还是我有什么不明白的地方?

当然,交易的独立性只是一种理想化。如果两笔交易在时间上没有太多重叠,我们就可以认为它们是独立的,因为价格可以被视为一个随机过程,其增量在第一近似值上是独立的。也就是说,独立性和随机性由交易的退出价格决定。为了明确起见,这里的交易在 MT4 中称为头寸。我在文章 中已经尝试对交易的独立性进行了一些考虑。
 
Aleksey Nikolayev:
当然,交易的独立性只是一种理想化。如果两笔交易在时间上没有太多重叠,那么我们就可以认为它们是独立 的,因为价格在第一近似值中可以被视为具有独立增量的随机过程。也就是说,独立性和随机性是由交易的退出价格决定的。为了明确起见,这里的交易在 MT4 中称为头寸。我在文章 中已经尝试对交易的独立性这一主题进行了一些考虑。

但是,其他因为已经开仓而没有开仓的交易又是怎么回事呢?那些根据相同的环形逻辑信号开仓的交易,只是幸运地在交易信号发出时没有其他交易开仓--它们有什么特别之处吗?

这就是矛盾所在。将交易信号货币化也许是合理的。它们确实互不相关,因为它们只是价格的函数。

 
fxsaber:

但是,那些因为已经开仓而没有开仓的交易又是怎么回事呢?那些根据同样的环形逻辑信号开仓的交易,只是幸运地在开仓信号发出时没有其他交易开仓--它们有什么特别之处吗?

这就是矛盾所在。也许将交易信号货币化是合理的。它们确实互不依赖,因为它们只是价格的函数。

这篇文章的做法恰恰是,我们不去探究智能交易系统的逻辑,而是 "原封不动 "地接受它的工作结果。您的方法可能会得到更准确的结果,但需要更多的编程和结果分析工作。
 

感谢您的文章,但没有看到对正向的测试,因为主要目标是通过引入新的优化标准 来提高 TS 在新样本上的稳健性

但有很多问题需要思考。

 
Maxim Dmitrievsky:

由于主要目标是通过引入新的优化标准 来提高 TS 在新样本上的稳定性,因此没有对前锋进行测试

您说得没错,我们缺乏这方面的经验。但要得出有意义的结果,就必须对足够多的时间间隔、符号和 EA(大数定律)进行测试。我们并不想让文章过于冗长。