Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 3268

 
Forester #:

PearsonCorrM2 'nin hızlı çalışacağını düşünüyorum. 1 matrisi tam, 2. matrisi kontrol edilecek bir satırdan besliyoruz. Ve sondan giderseniz, ilk matrisin boyutunu bir sonraki satırın numarası olarak belirleyebilirsiniz, böylece korelasyonu test edilen satırın altındaki satırlara tekrar tekrar hesaplamazsınız.

İlk başta önden varyantı yapmaya çalıştım - her seferinde tüm satırları saymak için. Alglib'de bir hata olduğu izlenimine kapıldım, çünkü kendim bulamadım.

#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)));  
}


Sonuç genellikle çakışıyor.

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


Ancak bazı durumlarda uyuşmuyor.

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


Eğer her zaman böyle olsaydı, bu kesinlikle benim hatam olurdu. Ama burada kirli bir şeyler var.

 
Maxim Kuznetsov #:

R, karmakarışık yapısıyla dikkat çekicidir. Herhangi bir anda her şeye, her durum için herhangi bir pakete sahiptir.

Ancak bir ya da iki yıl sonra taklit edilemez hale gelir - kitaptaki örnekleri uygulamak imkansız olacaktır.

Profesyonel bir ekip tarafından oluşturulan mükemmel bir referans aygıtına sahipiyi yapılandırılmış bir sistem,karmakarışık olamaz. Sistem R, evrensellik ve popülizm uğruna her şeye ve her şeye dikkat dağıtmadan ticarete yöneliktir.

Kitabın gösterdiği de tam olarak budur.

R'ye dayalı kitabın yaptığı bir başka şey de, geniş bir araç setine sahip olmadan ve en önemlisi, şu veya bu araca (paket, işlev) neden ihtiyaç duyduğunuzu, model oluşturmanın şu veya bu aşamasına neden ihtiyaç duyduğunuzu anlamadan, bir şeyi atamayacağınızı anlamadan MO'ya dayalı bir modeli aceleyle elde edebileceğiniz yanılsamasını kırmaktır - her şey parçalanacaktır.

 

NE yapıldığına dair tam bir anlayış eksikliğinin mükemmel bir örneği, bir şeyin bir şeyle olan düzinelerce sayfalık korelasyonlarıdır.

Korelasyonu hesaplamadan önce şu soruya cevap verilmelidir: kullanılan seri için korelasyon var mı? Finansal seriler için - bu ilk ve en önemli sorudur, çünkü finansal seriler için korelasyon mevcut değildir, çünkü onlar için matematiksel bir beklenti yoktur ve kullanılan ortalamanın matematiksel bir beklenti olarak kullanılabileceğini kanıtlamak gerekir.

Bu arada, R'de bir hapşırık, rutin bir kez kontrol etmektir.

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

Harika bir kitap!

Savunma Bakanlığı'nın tüm sorunlarını kapsamalıdır.

yeni başlayanlar için, ki şimdilik öylesiniz.

Genel olarak erkekler için. Tideverse.

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

NE yapıldığının tam olarak anlaşılmadığının mükemmel bir örneği, bir şeyin bir şeyle ilişkilendirildiği düzinelerce sayfadır.

Anlamadığınız için açıklayacağım.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerini test etme üzerine forum

Ticarette Makine Öğrenimi: Teori, Modeller, Uygulama ve Algoritma Ticareti

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 rastgele bir sayıdır. Yani korelasyon rastgele matrisler üzerinde hesaplanır. Amaç, algoritma uygulamalarının farklı varyantlarının aynı sonucu verdiğinden emin olmaktır. Algoritma yürütme hızı ve bellek tüketimi karşılaştırılır. Eğer beceriksizseniz, bu işe karışmayın.

 
fxsaber #:

Satır satır hesaplama için standart bir tane bulamadım. Alglib yavaş görünüyordu. Kendi varyantımı deniyorum.

#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)));
}


Sonuç.

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 

Öz tasarımın standart varyanttan daha hızlı olduğu, ancak Alglib'den daha yavaş olduğu ortaya çıktı (algoritmayı anlayamadım). Aynı zamanda, ev yapımı versiyon, diğer varyantların aksine, herhangi bir boyuttaki matrisleri sayabilir.

 
fxsaber #:


Sonuç.

Kendi tasarımı standart varyanttan daha hızlıydı, ancak Alglib'den daha yavaştı (algoritmayı anlayamadım). Aynı zamanda, diğer varyantların aksine, herhangi bir boyuttaki matrisleri okuyabilir.

Hesaplamalar için mql'i neden bu kadar çok seviyorsunuz? C'de dll yazabilirsiniz ve mümkün olduğunca hızlı olacaktır.

Bana göre mql hala çoğunlukla işlem açmak için kullanılan bir dil. Ve aslında doğru olan da bu.

 
fxsaber #:
Eğer anlamadıysanız, açıklamama izin verin.

MathRand rastgele bir sayıdır. Yani korelasyon rastgele matrisler üzerinde hesaplanır. Amaç, farklı algoritma uygulamalarının aynı sonucu verdiğinden emin olmaktır. Algoritma yürütme hızı ve bellek tüketimi karşılaştırılır. Eğer beceriksizseniz, bu işin dışında kalın.

Peki tüm bu korelasyon destanının nihai amacı nedir?

Peki hangi uygulamanın daha hızlı olduğunu.... hangisinin aynı sonuçları verdiğini.... hangisinin vermediğini öğrendiniz. Bu bilgiyle ne yapacaksınız?
 
Maxim Dmitrievsky #:

Ve neden hesaplamalar için mql'i bu kadar çok seviyorsunuz? C'de dll'ler yazabilirsiniz ve mümkün olduğunca hızlı olacaktır.

Yetersizliğim beni sınırlıyor.

 
Maxim Dmitrievsky #:

bana göre mql hala çoğunlukla işlem açmak için kullanılan bir dil. Ve aslında haklı olarak öyle.

Ayrıca test etme ve görselleştirme ve sanırım hızlı hareket etme