交易中的机器学习:理论、模型、实践和算法交易 - 页 3268

 
Forester #:

我认为PearsonCorrM2 可以快速运行。我们输入 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 因其大杂烩而引人注目。在任何时刻,它都拥有一切,任何场合的任何软件包。

但一两年后,它就会变得不可复制--书中的例子根本无法执行。

一个由专业团队创建的结构合理、参考性极强的系统不可能是杂乱无章 的。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();
}

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 #:

你可以用 C 语言编写 dll,而且速度会尽可能快。

我的无能限制了我的发挥。

 
Maxim Dmitrievsky #:

对我来说,mql 仍然是开仓交易的主要语言。事实上,这是正确的。

我想,还有测试和可视化,以及快速操作。