트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 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을 통해 백만 번째 문자열에서 유사한 짧은 문자열(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

1,000만 개의 문자열에서 비슷한 30만 개의 문자열을 찾는 데는 3초가 걸립니다.

 
fxsaber #:

매트릭스가 처리할 수 없는 경우.

1,000만 개의 문자열에서 비슷한 30만 개의 문자열을 찾는 데 3초가 걸립니다.

매우 멋지지만 그만큼 쓸모없습니다.
이것이 fft()의 예시인가요?
 
mytarmailS #:
fft()를 사용한 예시인가요?

300/1M은 fft가 아니고, 30K/10M은 fft입니다.

 
fxsaber #:

매트릭스가 처리할 수 없는 경우.

10M 길이의 문자열에서 30K 길이의 비슷한 문자열을 찾는 데 3초가 걸립니다.

인상적인 결과입니다!

 

2010년부터 2023년까지 샘플(4만 7천 줄)을 시간 순서대로 3개 부분으로 나누어 이 부분을 교체하면 어떤 일이 일어나는지 살펴보기로 했습니다.

하위 샘플의 크기는 훈련 - 60%, 테스트 - 20%, 시험 - 20%입니다.

이 조합(-1)을 표준 순서인 시간순으로 만들었습니다. 각 하위 샘플에는 고유한 색상이 있습니다.


각 샘플 세트에 대해 서로 다른 시드를 사용하여 101개의 모델을 훈련한 결과 다음과 같은 결과를 얻었습니다.


모든 지표가 표준이며, 모델의 평균 수익(AVR 수익)과 훈련에 참여하지 않은 마지막 샘플에서 수익이 3000 포인트를 초과하는 모델의 비율을 결정하기 어렵다는 것을 알 수 있습니다.

훈련 샘플 크기에서 -1과 0 변형의 상대적 성공률을 줄여야 할까요? 일반적으로 Recall이 이에 반응하는 것 같습니다.

이러한 조합의 결과가 우리의 경우 서로 비슷해야 한다고 생각하시나요? 아니면 데이터가 복구할 수 없을 정도로 오래된 것일까요?

사유: