交易员的自欺欺人:对前锋的不信任。 - 页 2

 
Youri Tarshecki:

任何人都可以做最简单的体验--在模拟账户上获得交易结果,并在其测试器中以相同的设置运行相同的系统。即得到一个真实的和一个测试的虚拟前进,并进行比较。

这不是一个有效的比较,因为策略测试者 只使用了条形开盘、收盘、最大和最小的4个报价。 作为一项规则,专家顾问在模拟或真实账户上使用所有条形内的报价。

尤里-塔舍基

事实上,通过在非优化的历史时期运行系统行为的模拟是交易者最有效的分析方式。现实检查当然是最可靠的方式,但不幸的是,一个人必须永远活在真实账户中,才能经历所有的变体。也就是说,像往前走一样建立模型是最有效的研究方式。但是,为什么前锋在讨论中完全缺席?也许是因为没有方便的软件来处理和分析多次测试的结果,包括前后两次测试?

我同意你的观点。你似乎做了很多这样的事。请告诉我你喜欢哪种金融工具来进行这种分析。我有一个只在开盘时触发的EA,我想用类似的模型来测试它。

 

 Скажите пожалуйста какой финансовый инструмент Вы предпочитаете для подобного анализа. У меня есть советник который срабатывает только на открытие бара. Хочу проверить его подобным моделированием.

我的意思是,不管是哪种工具,测试方法都应该包括前进。但人们却集体忽视了它们。那些使用它们的人,通常都是用眼睛来估计它们。换句话说,没有任何方案可以将客观的标准引入到对前进的评估中。
 
Youri Tarshecki:
我的意思是,不管是哪种工具,测试方法都应该包括前进。但人们却集体忽视了它们。那些使用它们的人,通常都是用眼睛来估计它们。也就是说,没有任何方案会将客观标准引入到对转发的评估中。
不同的工具有不同的市场行为属性。将 "盈利的惯性 "包括在前进的测试中。这就是为什么我想问:你是否找到了一种仪器(或一种仪器)在你的实验中显示出最好的结果,所有其他条件都相同?
 
Youri Tarshecki:
我的意思是,不管是什么仪器,测试方法都应该包括前向。但人们却集体忽视了它们。使用它们的人,通常是用眼睛来估计。也就是说,没有任何方案可以将客观标准引入远期定价中。

大幅忽视前方测试。原因很简单--成功通过转发只表明转发部分的市场与优化部分相似。Strategy Tester 完美地适应了当前市场的动态。因此,在将优化段分为12个前向部分后,我们将得到12个不相关的参数集,每个参数集将舍弃12个时间段中的11个。相反,最好是为漫长的历史找到一套尽管是平均的参数,而不是急于从一套参数到另一套。

市场并没有改变,只是每个交易系统只能捕捉到市场的一个特定状态,而市场有很多这样的状态。

 
与其相信前锋,不如不相信他们。如果你这样做,那也只是在你使用WFA的情况下。
 
Vasiliy Sokolov:

大幅忽视前方测试。原因很简单--成功通过转发只表明转发部分的市场与优化部分相似。Strategy Tester 完美地适应了当前市场的动态。因此,在将优化段分为12个前向部分后,我们将得到12个不相关的参数集,每个参数集将舍弃12个时间段中的11个。相反,最好是为漫长的历史找到一套尽管是平均的参数,而不是急于从一套参数到另一套。

市场并没有改变,只是每个交易系统只捕捉到市场的一个特定状态,而市场上有很多这样的状态。

你不能把 "优化的部分分成12个前进的部分",因为根据定义,一个前进的部分就是一个未优化的部分。也就是说,你是在对比向前检查的方法本身和简单的平均化概念。

前瞻性的目的是要找出顾问在非优化的未来情况下的行为方式。你所谈论的更多的是为优化寻找最好的历史片断。也就是说,如果你认为长历史的效果更好,没问题,让我们在测试器上加载2年的Back - 1年的Forward。然后2个月后-1个月前12次。如果第一种方法的远期表现好于第二种方法的远期表现之和,那么第一种方法就更好,反之亦然。你确实对专家顾问进行了优化,这一事实表明你相信市场的惯性,但只是相信它表现在一个明显更大的时间段。但这并不像你在所有可用的30年历史中进行优化,所以你也要考虑到市场的波动性。这是一个永恒的不变性和可变性的矛盾,但通过比较不同测试期的前锋,你可以更准确地了解这个矛盾在现实中是如何解决的。在你检查过之前--你的陈述是纯粹的直觉还是只是习惯性的。

 
Youri Tarshecki:
假设我在测试的EA的代码中使用OnTesterPass。它怎么会知道这个运行是一个前瞻性的运行,而不是一个普通的变量优化运行?即使他能做到这一点,也会是不同的文件,而我们需要一个表来处理一个EA的许多转发。然后是另一个表,还有另一个表的另一个表,所有这些都在一个文件里。

在我的记忆中,这就是我所做的--我把第一次交易的时间保存到框架中--这就是 "平衡"。因此,当在一个文件中记录所有运行的参数和指标时,很容易通过两个不同的日期来区分回测和正测。我把所有的运行都准确地保存在一个文件中(在OnTesterInit中打开,在OnTesterDeinit中关闭)。

细节在这里。

关于交易、自动交易系统和测试交易策略的论坛

使用框架工作

Stanislav Korotky, 2014.11.07 15:23

在OnTester处理程序中,你可以使用FrameAdd添加你自己的数据框架--重要的是,这一切都在测试代理 中完成,它可以是远程的(例如在云中)。

OnTesterInit, OnTesterDeinit, OnTesterPass在终端上被调用,测试/优化过程在这里开始,任务在这里被分配给代理。在OnTesterPass里面,你可以使用FrameAdd访问所有那些已经添加到测试代理的框架,大致是这样的(从老EA中咬出来的,可能无法编译)。

void OnTesterPass()
{
  string  name;
  ulong   pass;
  long    id;
  double  value, data[];
  string  params[];
  uint    par_count;
  string  output = "";
  ushort eq = StringGetCharacter("=", 0);

  while(FrameNext(pass, name, id, value, data)) // data - массив положенный во фрейм с помощью FrameAdd
  {
    output = pass + ";" + (data[0]);
    
    for(int i = 1; i < 10; i++) output += ";" + data[i];
    
    if(FrameInputs(pass, params, par_count))
    {
      for(uint i = 0; i < par_count; i++)
      {
        string pair[];
        int n = StringSplit(params[i], eq, pair);
        if(n == 2)
        {
          long pvalue, pstart, pstep, pstop;
          bool enabled = false;
          if(ParameterGetRange(pair[0], enabled, pvalue, pstart, pstep, pstop))
          {
            if(enabled)
            {
              output += ";" + pair[1];
            }
          }
        }
      }
    }
    
    output += "\n";
    // TODO: FileWriteString(fhandle, output);
  }
}

和这里。

关于交易、自动交易系统和测试交易策略的论坛

使用框架工作

Stanislav Korotky, 2014.11.07 20:15

你应该像我上面写的那样,在运行中添加框架。理论上,如果EA有参数,你应该在框架内与你的数据一起得到它们,即params不应该是空的。下面是同一专家顾问的一些更多代码。

int fhandle = -1;

void OnTesterInit()
{
  // готовим каким-то образом файл, как нам нужно
  fhandle = FileOpen("tester-" + _Symbol + GetTickCount() + ".csv", FILE_WRITE|FILE_CSV|FILE_ANSI);
  FileWriteString(fhandle, "Pass;First;LR;Profit;Expected Payoff;Profit Factor;Recovery Factor;Sharpe Ratio;Custom;Equity DD %;Trades\n");
}

void OnTesterDeinit()
{
  FileClose(fhandle);
}

double OnTester()
{
  // собираем данные по эквити
  double LR = CountChannels(Equity);
  
  // конструируем собственный критерий оптимизации
  double result = MathAbs(LR) * TesterStatistics(STAT_PROFIT) * TesterStatistics(STAT_PROFIT_FACTOR) * TesterStatistics(STAT_TRADES) * (100 - TesterStatistics(STAT_EQUITY_DDREL_PERCENT));

  // рассчитываем еще какие-то данные
  //...

  // складываем все в массив
  double data[10];
  // data[0] = first;
  // data[1] = LR;
  // data[2] = TesterStatistics(STAT_PROFIT);
  // ...
  // data[7] = result;
  // ...
  // data[9] = ...

  // отправляем данные в терминал
  if(!FrameAdd(MQL5InfoString(MQL5_PROGRAM_NAME), 1, LR, data))
    Print("Frame add error: ", GetLastError());
  else
    Print("Frame added, Ok");

  return(result);
}

 

我个人认为,检查过去而不是未来的结果更符合逻辑,因为最近的市场变化是最重要的。

在15分钟内,我进行了优化,筛掉了不必要的结果,并将剩下的5-10个保存到集上,在历史上运行,直到优化的那一刻--按图索骥,选择最好的结果。

我也在考虑将这些行动自动化的过程......

一个简单的解决方案似乎是简单地在时间范围内对交易进行限制,可以在EA本身进行切换,结果是我们将在历史上得到两个虚拟的运行,以换取一个真实的运行,这可以很容易地在EXCEL中进行比较。

 
-Aleks-:

我个人认为,检查过去而不是未来的结果更符合逻辑,因为最近的市场变化是最重要的。

在15分钟内,我进行了优化,筛掉了不必要的结果,并将剩下的5-10个保存到集上,在历史上运行,直到优化的那一刻--按图索骥,选择最好的结果。

我也在考虑将这些行动自动化的过程......

一个简单的解决方案似乎是简单地在时间范围内对交易进行限制,可以在EA本身进行切换,结果是我们将在历史上得到两个虚拟的运行,以换取一个真实的运行,这可以很容易地在EXCEL中进行比较。

专注于最后的变化是另一种自欺欺人。自然,你需要使用新的设置进行交易。但是把自己限制在最近一段时间的优化上,你将永远无法了解你的专家顾问是否能抵抗未来的变化。看看我帖子中的第二张图片--你可以清楚地看到它。前进是对过去的比较。你的方法与前瞻性分析毫无关系。几乎所有的专家顾问都可以被优化成一个漂亮的回测。这里的规律是这样的--设置越是优化,回测越是漂亮。而越是丑陋的就是越是前进。前进有助于准确找到使用更多长期模式的逻辑,因此更有希望。
 
前进是一个有用的检查,但不是万能的。有可能在优化结果 中选择一个参数的变体,提供一个良好的前向,但它并不能保证在实际中获得良好的结果。