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

 
Maxim Dmitrievsky #:

非正規化相互相関 )

相互共分散。

ピアソンが必要。

 
fxsaber #:

ピアソンが必要だ。

どうしたらいいのかわからないし、眠いし。

似たようなものだ。

>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([1, 2, 3])
>>> a = (a - np.mean(a)) / (np.std(a))
>>> b = (b - np.mean(b)) / (np.std(b))
>>> np.correlate(a, b, 'full')
array([-1.8973666 , -1.42302495,  0.9486833 ,  0.9486833 ,  0.9486833 ,
        0.9486833 ,  0.9486833 ,  0.9486833 ,  0.9486833 , -1.42302495,
       -1.8973666 ])
>>> 
 
Maxim Dmitrievsky #:

ーどうしたらー、ーどうしたらー

似たようなもの

うん、それじゃない。

 
fxsaber #:

その通りだ。

もう少しで何かわかるから調べてみて。

 
fxsaber #:

長い文字列の中から似たような短い文字列を素早く見つけようとする。

Alglibを使ったこのような実装では、100万番目の文字列の中から似たような短い文字列(300個)を探すのに6秒以上かかる。

それを高速化した。

#include <fxsaber\Math\Math.mqh> // https://www.mql5.com/ru/code/17982

const vector<double> GetCorr( const double &Array[], const double &Pattern[], const int Step = 1 )
{
  double Corr[];  
  MathCorrelationPearson(Array, Pattern, Corr, Step);
  
  ArrayRemove(Corr, 0, ArraySize(Pattern) - 1);  
  
  vector<double> Res;
  Res.Swap(Corr);
  
  return(Res);
}

#property script_show_inputs

input int inRows = 300; // Длина короткой строки
input int inCols = 1000000; // Длина длинной строки

// Поиск похожей строки в длинной строке.
void OnStart()
{  
  if (inRows < inCols)
  {
    PrintCPU(); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685
    
    double Array[]; // Длинная строка, где будет искать.
    double Pattern[]; // Короткая строка, с которой будем сравнивать.
    CMatrixDouble Matrix;
    
    FillData(Array, Pattern, Matrix, inRows, inCols); // https://www.mql5.com/ru/forum/86386/page3278#comment_49725614
            
    Print(TOSTRING(inRows) + TOSTRING(inCols));

    vector<double> vPattern;  
    vPattern.Assign(Pattern);

    ulong StartTime, StartMemory; // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

    BENCH(vector<double> Vector1 = GetCorr(Matrix, vPattern)) // https://www.mql5.com/ru/forum/86386/page3278#comment_4972561 4
    BENCH(vector<double> Vector2 = GetCorr(Array, Pattern))
    BENCH(vector<double> Vector3 = GetCorr(Array, Pattern, -1))
    
    Print(TOSTRING(IsEqual(Vector1, Vector2)));
    Print(TOSTRING(IsEqual(Vector3, Vector2)));
  }      
}


結果はこうだ。

EX5: 4000 AVX Release.
TerminalInfoString(TERMINAL_CPU_NAME) = Intel Core i7-2700 K  @ 3.50 GHz 
TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
inRows = 300 inCols = 1000000 
vector<double> Vector1 = GetCorr(Matrix, vPattern) - 7158396 mcs, 8 MB
vector<double> Vector2 = GetCorr(Array, Pattern) - 364131 mcs, 8 MB
vector<double> Vector3 = GetCorr(Array, Pattern, -1) - 323935 mcs, 7 MB
IsEqual(Vector1, Vector2) = true 
IsEqual(Vector3, Vector2) = true 

今度は300ミリ秒。

 
fxsaber #:

あと300ミリ秒だ。

どんなマトリックスでもできないのに。

inRows = 30000 inCols = 10000000 
vector<double> Vector2 = GetCorr(Array, Pattern) - 10567928 mcs, 76 MB
vector<double> Vector3 = GetCorr(Array, Pattern, -1) - 3006838 mcs, 77 MB

10Mの文字列から30Kの類似文字列を見つけるのに3秒かかる。

 
fxsaber #:

どのマトリックスも対応できないとき

10Mのストリングから30Kの類似したストリングを見つけるのに3秒かかる。

とてもクールだが、役に立たない。
これはfft()の例か?
 
mytarmailS #:
これはft()を使った例ですか?

300/1Mはftではなく、30K/10Mがftです。

 
fxsaber #:

どのマトリックスも対応できないとき

10Mの文字列から長さ30Kの類似文字列を見つけるのに3秒かかる。

印象的な結果だ!

 

2010年から2023年までのサンプル(4万7000行)を取り、時系列で3つのパートに分け、これらのパートを入れ替えたらどうなるか見てみることにした。

サブサンプルのサイズは、トレーニング60%、テスト20%、試験20%である。

私はこれらの組み合わせを作った(-1) - これは標準的な順序である - 時系列順。各サブサンプルにはそれぞれの色があります。


各サンプルのセットに対して異なるSeedで101個のモデルを訓練し、以下の結果を得た。


すべての指標は標準的であり、モデルの平均利益(AVR Profit)、およびトレーニングに参加しなかった最後のサンプルで利益が3000ポイントを超えたモデルの割合を決定することは困難であることがわかります。

たぶん、トレーニング・サンプル・サイズにおける-1と0のバリアントの相対的な成功率を減らすべきでしょうか?一般的に、Recallはこれに反応するようです。

あなたの意見では、私たちの場合、このような組み合わせの結果は互いに比較可能であるべきでしょうか?それとも、データは取り返しがつかないほど古くなっているのでしょうか?