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

 
Forester #:

PearsonCorrM2 はすぐに機能すると思います。1つの行列を満杯にし、1行から2番目の行列をチェックする。そして、最後から行く場合は、最初の行列のサイズを次の行の番号として指定することで、検査対象の行より下の行まで何度も相関を再計算する必要がなくなります。

私は最初、すべての行を毎回数えるという、正面からの変形を試みました。Alglibに何らかのエラーがあるような気がした。

#include <Math\Alglib\statistics.mqh> // https://www.mql5.com/ru/code/11077

const matrix<double> CorrMatrix( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble MatrixOut;  

  if (CBaseStat::PearsonCorrM(MatrixIn, MatrixIn.Rows(), MatrixIn.Cols(), MatrixOut)) // https://www.mql5.com/ru/code/11077
    Res = MatrixOut.ToMatrix();
  
  return(Res);
}

const matrix<double> CorrMatrix2( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  Res.Init(Matrix.Cols(), Matrix.Cols());
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble Vector(Matrix);
  CMatrixDouble Corr;

  for (int i = 0; i < (int)Matrix.Cols(); i++)
  {
    if (i)
      Vector.SwapCols(0, i);
    
    CBaseStat::PearsonCorrM2(Vector, MatrixIn, MatrixIn.Rows(), 1, MatrixIn.Cols(), Corr);
      
    Res.Col(Corr.Row(0), i);
  }
  
  return(Res);
}

#property script_show_inputs

input int inRows = 5; // Длина строки
input int inCols = 100; // Количество строк

void FillArray( double &Array[], const int Amount )
{
  for (uint i = ArrayResize(Array, Amount); (bool)i--;)
    Array[i] = MathRand();
}

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2, const double Sens = 1 e-10 )
{
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathMax(MathAbs(Matrix1.Max()), MathAbs(Matrix1.Min())) < Sens);
  
  Matrix1 += Matrix2;
  
  return(Res);
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnStart()
{  
  double Array[];
  FillArray(Array, inRows * inCols);

  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));
  
  matrix<double> Matrix1 = CorrMatrix(Matrix);
  matrix<double> Matrix2 = CorrMatrix2(Matrix);
  matrix<double> Matrix3 = Matrix.CorrCoef(false);
  
  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));  
  Print(TOSTRING(IsEqual(Matrix1, Matrix3)));  
}


結果はしばしば一致する。

inRows = 5 inCols = 90 
IsEqual(Matrix1, Matrix2) = true 
IsEqual(Matrix1, Matrix3) = true 


しかし、状況によっては一致しないこともある。

inRows = 5 inCols = 100 
IsEqual(Matrix1, Matrix2) = false 
IsEqual(Matrix1, Matrix3) = true 


いつもこうなら、間違いなく私のミスだろう。しかし、ここには何か不純なものがある。

 
Maxim Kuznetsov #:

Rはそのごった煮ぶりが際立っている。どんな時でも、どんな時でも、どんなパッケージでも、何でもある。

しかし、1年や2年経てば、この本の例を実行することは不可能になるだろう。

プロフェッショナルなチームによって作成された、優れた参照装置を備えたよく構造化されたシステムが、寄せ集めであるはずがない。システムRは、普遍性と大衆性のためにあらゆるものに気を取られることなく、取引を志向している。

これこそが、この本が示していることである。

そしてもう一つ、Rをベースにした本がやっていることは、MOをベースにしたモデルを大急ぎで手に入れられるという幻想を打ち砕くことであり、大規模なツール一式を所有することなく、そして最も重要なことは、なぜこれこれのツール(パッケージ、関数)が必要なのか、なぜモデル構築のこの段階、この段階が必要なのかを理解することなく、何かを捨てることはできないということを理解することなく-すべてが崩れてしまうのだ。

 

何かと何かの相関関係が何十ページにもわたって書かれているのは、何が行われているのかをまったく理解していない典型的な例である。

相関関係を計算する前に、「使用する系列に相関関係は存在するのか?なぜなら、金融系列には相関が存在しないからである。金融系列には数学的期待値が 存在せず、使用する平均が数学的期待値として使用できることを証明する必要があるからである。

ちなみにRでは、くしゃみ1回をチェックするのがルーチンです。

 
СанСаныч Фоменко #:

素晴らしい本だ!

MoDのすべての問題を網羅しているに違いない。

初心者向け。

タイドバース。

 
СанСаныч Фоменко #:

何が行われているのかをまったく理解していない典型的な例が、何十ページにもわたる何かと何かの相関関係である。

あなたは理解していないので、私が説明する。

取引、自動取引システム、取引戦略のテストに関するフォーラム

トレーディングにおける機械学習:理論、モデル、実践とアルゴリズム取引

fxsaber、2023.10.01 09:38

void FillArray( double &Array[], const int Amount )
{
  for (uint i = ArrayResize(Array, Amount); (bool)i--;)
    Array[i] = MathRand();
}

MathRandは乱数です。つまり、相関はランダムな行列で計算されます。その目的は、アルゴリズム実装の異なるバリエーションが同じ結果を与えることを確認することです。アルゴリズムの実行速度とメモリ消費量が比較されます。無能な人は手を出すな。

 
fxsaber #:

行ごとの計算のための標準的なものは見つかっていない。Alglibは遅いようだ。私自身の変種を試して います。

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

matrix<double> CorrMatrix( const double &Array[], const int PatternLen, const bool CreateMatrix = true )
{
  matrix<double> Res = {};
  const int Size = ArraySize(Array) / PatternLen - 1;
  
  if (CreateMatrix)
  {
    Res.Init(Size + 1, Size + 1);
    Res[Size][Size] = 1;
  }
  
  double Corr[];

  DEJAVU Dejavu;
  Dejavu.SetSignal(Array);
  
  if (CreateMatrix)
    for (int i = 0, j; i < Size; i++)
    {
      Res[i][i] = 1;
      j = i + 1;

      Dejavu.SetPattern(PatternLen, i * PatternLen);
      Dejavu.GetCorrelation(Corr, PatternLen, j * PatternLen);
      
      for (; j <= Size; j++)
      {
        const double Tmp = Corr[(j + 1) * PatternLen - 1];
        
        Res[i][j] = Tmp;
        Res[j][i] = Tmp;
      }    
    }
  else
    for (int i = 0; i < Size; i++)
    {
      Dejavu.SetPattern(PatternLen, i * PatternLen);
      Dejavu.GetCorrelation(Corr, PatternLen, (i + 1) * PatternLen);
    }
        
  return(Res);
}

#property script_show_inputs

input int inRows = 100; // Длина строки
input int inCols = 15000; // Количество строк

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

// NumPy: https://www.mql5.com/ru/forum/86386/page3257#comment_49545300
void OnStart()
{  
  PrintCPU(); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

  double Array[];
  FillArray(Array, inRows * inCols); // https://www.mql5.com/ru/forum/86386/page3267#comment_49671602

  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  ulong StartTime, StartMemory;
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));
  
  BENCH(matrix<double> Matrix1 = CorrMatrix(Matrix)) // https://www.mql5.com/ru/forum/86386/page3267#comment_49671602
  BENCH(matrix<double> Matrix2 = Matrix.CorrCoef(false)); // https://www.mql5.com/ru/docs/basis/types/matrix_vector
  BENCH(matrix<double> Matrix3 = CorrMatrix(Array, inRows)); // https://www.mql5.com/ru/code/17982

  BENCH(CorrMatrix(Array, inRows, false)); // https://www.mql5.com/ru/code/17982

  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));
  Print(TOSTRING(IsEqual(Matrix1, Matrix3)));
}


結果。

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 = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 13795998 mcs, 1717 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 38346008 mcs, 1717 MB
matrix<double> Matrix3 = CorrMatrix(Array, inRows) - 26632760 mcs, 1716 MB
CorrMatrix(Array, inRows, false) - 19412824 mcs, 0 MB
IsEqual(Matrix1, Matrix2) = true 
IsEqual(Matrix1, Matrix3) = true 

自作バージョンは標準的なバリアントより速いことがわかったが、Alglibより遅い(アルゴリズムが理解できなかった)。同時に、自作バージョンは他の変種と違って、どんなサイズの行列でも数えることができる。

 
fxsaber #:


結果

自己設計は標準的なバリアントより速かったが、Alglibよりは遅かった(アルゴリズムは理解できなかった)。同時に、他のバリアントと違って、どんなサイズの行列でも読むことができる。

なぜそんなにmqlが好きなのかというと、C言語でdllを書けばいくらでも速くなるからだ。

僕にとって、mqlはまだ取引を開始するための言語なんだ。実際、それが正しい。

 
fxsaber #:
理解できないなら、説明しよう。

MathRandは乱数である。つまり、相関はランダムな行列で計算される。目的は、異なるアルゴリズム実装が同じ結果を与えることを確認することである。アルゴリズムの実行速度とメモリ消費量が比較される。無能なら手を出すな。

では、この相関関係の壮大な叙事詩の最終的なゴールは何でしょうか?

さて、あなたはどの実装がより速く、どの実装が同じ結果を与え、どの実装がそうでないかを発見した。この知識を使って何をするつもりですか?
 
Maxim Dmitrievsky #:

それに、どうしてそんなにmqlが好きなんだ? cでdllを書けば、いくらでも速くなる。

僕の無能さには限界がある。

 
Maxim Dmitrievsky #:

私にとっては、mqlはまだ取引を開始するための言語だ。実際、その通りだ。

また、テストや視覚化、素早いアクションも重要だと思う。
理由: