トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 2065

 
Evgeniy Chumakov:

履歴に空白がなく、全日で1440分(金曜日は少ない)あると仮定すると、コードは以下のようになります。

eurusdでもギャップがある。バータイムを使った作業
 
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);
}
 
アレクセイ・ニコラエフ

どうにか動くようです) 保存するために、新しい行はrates[i].highに収集されます。

過去のバー、例えば2020.5.1 00:00から未来のバー、c 2020.10.1 00:00とその間のバーを正規化するのです。
現実の市場ではできないことです。
すべてのバーについて同じ計算をする必要がありますが、過去のバーについてだけです。

 
アレクセイ・ニコラエフ

どうにか動くようです)保存するために、新しい行を rates[i].high に収集します。

ネット/フォレストでは、正しい操作を行ったとしても、その正規化されたローソク足の高さを非常に正確に再現することができるのです。
フェッチとして、日オフセット付きの60本のローソク足の高さをフィードし、あなたのコードで得られた正規化された高さを教えます。
トレーニングの精度は100%に近いはずです。

すなわち、正規化されたローソク足の高さは、新しい情報を含んでいません。
唯一の利点は、モデルトレーニングに60の余分な機能を渡す必要がないことです。
それは、誰かが2ヶ月古いバー、すなわちそれらを提出していない人のための新しい情報として提出することはほとんどありません、まだある)。

もちろん、これらの正規化されたローソク足の高さがモデルの効率を向上させるかどうかを確認すべきですし、もちろんそれを使うべきです(あるいは、あなたのチップの1つがより好ましいですが、それが構成する60分の1でもかまいません)。

 
そうしないと、3ページも書いてしまって、エネルギーが無駄になるし、誤差が半端なく大きくなってしまう。
 
elibrarius:

それは不思議ですね。どう説明すればいいんだろう?
別バージョンをコメントアウトしてあるのですが、論理的な理由で好きになれなかったんです。

どのRandomInteger()を使っているのですか? 私はXORです。

どう説明したらいいのかわからない :)

この機能を利用した

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

Maximさん、CatBoostから C++用のモデルが正しくアンロードされていないのではないかという疑いがあります。

MQL5のモデル解釈で、CPPモデルから取得した値と、バイナリモデルから取得した値に食い違いがあるのですが、どうしたらいいでしょうか?デルタは約0.15-。

 
elibrarius:

過去のバー、例えば2020.5.1 00:00から未来のバー、2020.10.1 00:00からとその間のバーを正規化することができます。
現実の世界では、こんなことはしない。
各バーからほぼ同じ計算をする必要がありますが、それについては過去のバーからだけです。

そう、未来を見据えることはもちろん、すぐにはわからない問題もそこにあるのです。直接取引にはなかなか応用できないが、事前分析には代えがたい。例えば、非相対的な増分の相関は意味をなさない。

 
アレクセイ・ニコラエフ

たしかに、すぐにはわからない問題点も垣間見えます。直接取引には、あまり適用できませんが、事前分析には、欠かせません。例えば、非相対的な増分の相関を計算しても意味がない。

それを踏まえて、いつか以前のバーについてもやり直し、トレーニング性が向上するかどうかをチェックすることになるかもしれませんね。
どなたか先に確認された方がいらっしゃいましたら、教えてください。

事前分析とは?入力にモデルを与えて、この機能の有無で比較するのです。

過去30分で正規化した方が良いと思う。
代替案として、この日の最後の30分と5日前の30分。

3月のボラティリティの変化については、バリアントが適応するのに非常に時間がかかり、1ヶ月、2ヶ月前に比べて現在の値はずっと高くなります。その結果、モデルは未知の領域で動作することになります。また、そのような作品の事例がないため、予測を立てることができません。

先週から正常化したことで、新しいゲームのルールをより早く学ぶことができるだろう。
理由: