交易中的机器学习:理论、模型、实践和算法交易 - 页 2065

 
Evgeniy Chumakov:

假设历史上没有空隙,而且所有的日子都有1440分钟(星期五较少),代码应该是这样的

即使是欧元区也有差距。与酒吧的工作时间
 
elibrarius:
即使在eurusd上也会出现缺口。 与酒吧时间的工作


这是可以理解的,如果是我,我也会这么做。这只是为了让它更容易解释。

 

为了保存,在 rates[i].high 中收集了一个新的行,这似乎是有效的。

#property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00';  // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00';   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt"; // text file name
//+------------------------------------------------------------------+
#define  NM 1440
ulong NSM = 60;
ulong NSD = 60 * 1440;
//+------------------------------------------------------------------+
void OnStart()
{
  MqlRates rates[];
  double vol[NM] = {0.0}, d;
  int n[NM] = {0}, t;
  int nprice = CopyRates(Symbol(), PERIOD_M1, tstart, tstop, rates);
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
  for(int i = 0; i < NM; ++i)
  {
    if(n[i] > 1) vol[i] /= n[i];
    vol[i] = sqrt(vol[i]);
  }
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    if(vol[t] > 0) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
    if(i > 0) rates[i].high += rates[i - 1].high;
  }
  int ft = FileOpen(zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT);
  FileWriteString(ft, "t p");
  for(int i = 0; i < nprice; ++i)
    FileWriteString(ft, "\n" + (string)((ulong)rates[i].time) + " "  + (string)rates[i].high);
  FileClose(ft);
}
 
Aleksey Nikolayev:

为了保存,新的一行被收集在 rates[i].high 中,这似乎是有效的。

你把过去的条形图,例如从2020.5.1 00:00到未来的条形图,c 2020.10.1 00:00和那些在两者之间的条形图正常化。
你不能在真正的市场上这样做。
你必须对每个柱子进行同样的计算,但只对过去的柱子进行计算。

 
Aleksey Nikolayev:

为了保存,新的一行被收集在rate[i].high中。

即使你做得很好,你也可以用net/forest非常准确地再现那些规范化的蜡烛图高度。
作为取数,我们提供了60个蜡烛图的高度,其中有一天的偏移量,并教授在你的代码中获得的归一化高度。
训练应该接近100%的准确性。

也就是说,规范化的蜡烛图高度不包含任何新的信息。
唯一的好处是不需要通过60个额外的特征来进行模型训练。
这是不可能的,有人会提交作为fiches酒吧2个月前,即新的信息,对于那些没有提交的人,仍然有)。

当然,我们应该检查这些归一化烛台的高度是否提高了模型的效率,当然我们也应该使用它(或你的一个筹码,这更可取,或由它组成的60分之一)。

 
让我们已经检查了一些东西,否则已经写了三页,浪费了精力,而且错误的增量上帝也不允许它是半个百分点。
 
elibrarius:

这很奇怪。我想知道如何能解释这个问题?
我有另一个版本的评论,但由于逻辑原因我不喜欢它。

你用哪个RandomInteger()? 我是XOR。

我不知道该如何解释 :)

我把这个功能

int RandomInteger(int max_vl)
{
   return (int)MathFloor((MathRand()+MathRand()*32767.0)/1073741824.0*max_vl);  //случайное Int от 0 до  1073741824
}
 

马克西姆,我怀疑C++的模型没有从CatBoost 中正确卸载--你能和python的模型进行比较吗?

我在MQL5中的模型解释值与二进制模型的值之间存在差异,其中CPP模型的值取自于二进制模型。三角值约为0.15--这是个很大的数字。

 
elibrarius:

你将过去的条形图,例如从2020.5.1 00:00到未来的条形图,从2020.10.1 00:00以及两者之间的条形图进行归一化。
你在现实世界中不会这样做。
你必须从每个条形图中做大约相同的计算,但只从过去的条形图中计算。

是的,展望未来的问题是存在的,还有其他没有立即显现的问题。它不太适用于直接交易,但对于初步分析来说,它是不可替代的。例如,非相对增量之间的关联性是没有意义的。

 
Aleksey Nikolayev:

是的,可以窥见未来,以及其他不是很明显的问题。直接来说,对于直接交易,它不太适用,但对于初步分析,它是不可缺少的。例如,计算非相对增量之间的相关关系是没有意义的。

我会考虑到这一点,也许有一天我会为以前的酒吧重新做一遍,并检查是否提高了训练性。
如果有人早些检查过,请告诉我。

初步分析是什么?你把模型送入输入,并比较是否有这个功能。

我认为最好是按最后30分钟进行正常化。
作为一种选择,这一天的最后30分钟和最后5天的30分钟。

对于3月份的波动方式,你的变体将需要很长的时间来适应,一个月或一个半月当前的价值将比一两个月前高很多。因此,该模型将在一个未知区域工作。它根本就没有这种工作的例子,无法在此基础上进行预测。

随着过去一周的正常化,它将更快地学习新的游戏规则。
原因: