트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 3268

 
Forester #:

PearsonCorrM2가 빠르게 작동할 것 같아요. 하나의 행렬을 가득 채우고 한 행에서 두 번째 행렬을 검사합니다. 그리고 끝에서 이동하면 첫 번째 행렬의 크기를 다음 행의 수로 지정하여 테스트 중인 행 아래의 행에 대해 상관 관계를 반복해서 다시 계산하지 않도록 할 수 있습니다.

처음에는 매번 모든 행을 계산하는 정면 변형을 시도했습니다. 제가 직접 찾을 수 없었기 때문에 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에서는 재채기, 루틴을 한 번 확인하는 것입니다.

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

멋진 책입니다!

국방부의 모든 문제를 다뤄야 합니다.

초보자를 위해, 지금은 당신이 있습니다.

일반적으로 소년을위한 타이드 버스.

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

무엇을 하고 있는지 완전히 이해하지 못하는 완벽한 예는 수십 페이지에 걸쳐 무언가와 무언가의 상관관계를 나열하는 것입니다.

이해가 안 되시니 설명해 드리겠습니다.

트레이딩, 자동매매 시스템 및 테스트 트레이딩 전략에 관한 포럼

트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩

FXSABER, 2023.10.01 09:38

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

마트랜드는 난수입니다. 즉, 상관관계는 랜덤 행렬에서 계산됩니다. 알고리즘 구현의 다양한 변형이 동일한 결과를 제공하는지 확인하는 것이 목적입니다. 알고리즘 실행 속도와 메모리 소비량을 비교합니다. 무능하다면 참여하지 마세요.

 
fxsaber #:

줄 단위 계산을 위한 표준을 찾지 못했습니다. 알글리브는 느려 보였습니다. 저만의 변형을 시도하고 있습니다.

#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은 여전히 트레이딩을 시작할 때 주로 사용하는 언어입니다. 사실 그럴 만도 합니다.

테스트와 시각화, 그리고 빠른 작업도 마찬가지입니다.
사유: