English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
데이터 과학 및 머신 러닝(파트 04): 현재 주식 시장 붕괴 예측

데이터 과학 및 머신 러닝(파트 04): 현재 주식 시장 붕괴 예측

MetaTrader 5트레이딩 | 9 1월 2023, 16:03
417 0
Omega J Msigwa
Omega J Msigwa

소개

이 기사 시리즈의 02부에서 타이타닉 데이터를 기반으로 간단한 로지스틱 모델을 만들었습니다. 오늘은 시장 충돌을 예측하는 데 도움이 되는 로지스틱 모델을 구축할 것입니다.

이 기사에서 우리는 주식 시장 붕괴의 예측 모델을 만들어 로지스틱 모델을 유용하게 적용할 것입니다. 모델을 테스트하기 위해 현재 주식 시장 붕괴에 대한 테스트 데이터를 사용할 것입니다.

주식시장 폭락 기사 이미지


주식 시장 붕괴


주식 시장 붕괴는 일반적으로 며칠 내에 가격이 10% 이상 하락하며 시장의 총 가치가 급격하고 빠르게 하락하는 경우를 말합니다. 주식 시장 붕괴의 유명한 예로는 1987년 블랙 먼데이와 2008년 부동산 거품이 있습니다. 폭락은 일반적으로 가격 거품이 붕괴하는 것에 기인하며 주식 시장 참가자의 대다수가 동시에 자산을 매각하려고 할 때 발생하는 대량 매도에 기인합니다.

이 문제에 대해 자세히 알아보기 전에 이와 관련한 면책 조항을 알려드리고 싶습니다.

이것은 금융 또는 거래와 관련한 조언이 아닙니다. 바라건대, 여러분은 제가 버핏이나 찰리 멍거 또는 전문 주식 시장 투자자가 아니라 과학적 모델을 트레이딩과 연결하는 방법을 찾는 데이터 과학자라는 것을 아시고 계실 거라 믿습니다. 여기서 다룰 내용을 너무 심각하게 받아들이지는 마십시오. 여기서 다루는 많은 내용은 온라인 및 신뢰할 수 있는 여러 출처에서 수집되었습니다. 거래 결정을 내리기 위해 이 기사에서 논의된 접근 방식을 사용하기로 하기 전에기사 끝 부분의 참조 섹션에 링크된조사를 수행하십시오.

이제 계속 진행해 보겠습니다.

우선 주가에 영향을 미치는 요인들에 대해 살펴보겠습니다. 일단 이러한 요인들에 대해 이해하게 되면 이제 우리는 우리의 작업을 시작 할 수 있습니다. 이러한 요인들을 로지스틱 모델의 데이터(독립 변수)로 사용할 수 있기 때문입니다.


주가에 영향을 미치는 요인들 


주식 시장에 영향을 미치는 많은 요인들이 있습니다. 다음은 그중 몇 가지입니다. 시장이 어떻게 움직이는지를 말해주는 명확한 지표는 없었습니다. 저는 다음과 같은 요소를 사용하겠습니다.

  1. 수요와 공급
  2. 회사 관련 요인
  3. 이자율
  4. 현재 이벤트
  5. 인플레이션 

01: 수요와 공급


주식시장에 영향을 미치는 요인은 여러 가지가 있지만 그 외적인 것을 모두 벗겨내고 아주 기본적인 요인만 본다면 단순하게 수요와 공급입니다. 수요와 공급의 불균형이 주가를 올리고 내리는 것입니다.

사과가 갑자기 부족해지면 사과를 사기 위해 줄을 서는 사람들이 늘어서 사과 가격은 순식간에 폭등합니다.

마찬가지로 회사가 잘 나가고 모두가 같은 회사의 주식을 사려고 하면 주식이 부족하게 되여 회사의 주가가 급등할 것이고 주식이 너무 많으면 그 반대가 됩니다. 하지만 아무도 사려고 하지 않는다면 주가는 급락할 것입니다.

우리 모델에서 사용할 수 있는 모든 공급 및 수요의 데이터를 얻는 것은 불가능합니다(이렇게 말할 수도 있습니다). 따라서 데이터 세트에 이러한 요소를 남겨둘 것이지만 이 요소를 정확하게 얻을 수 있는 사람은 거룩한 성배에 한 걸음 더 다가가는 것입니다.


02: 회사 관련 요인


회사 내에서 일어나는 모든 일은 주가에 직접적인 영향을 미칩니다. 제품의 성공적인 출시, 매출의 증가, 부채의 감소, 투자자의 유입 증가 등 회사가 상승세에 있다면 회사의 가격은 상승할 수밖에 없습니다. 누구나 급등에서 급등으로 가는 그런 회사의 주식을 사고 싶어할 것이 때문입니다.

그러나 회사가 손실을 기록하고 제품에 오류가 발생하고 부채가 증가하게 되면 대다수의 주주가 회사의 주식을 매도하게 될 것이 이에 따라 주가는 낮아질 것입니다.

이 점을 명확하게 보여주는 좋은 예는 Netflix와 Apple입니다.

일부 회원에 대에 높은 가격을 책정하고 회사 내에서 발생한 기타 여러 상황으로 인해 Netflix의 주가가 직접적으로 하락하여 Netflix가 2022년 첫 3개월 동안 200,000명 이상의 서비스 가입자를 잃었습니다.

반면에 Apple은 성공적인 제품 출시, 회사의 우수한 리더십 및 최근 몇 년 동안 주가 상승으로 이어진 회사 내부의 기타 긍정적인 상황으로 인해 매우 오랫동안 성공적인 회사였습니다.

회사의 건전성을 판단하기 위해 우리는 가격 대비 수익 비율이라는 메트릭을 사용할 것입니다.

주가수익비율(Price-To-Earnings Ratio)

주당순이익(EPS) 대비 현재 주가를 측정하는 회사의 가치를 평가하기 위한 주가수익비율. PE 비율은 회사의 건전성을 나타내는 지표로 사용할 수 있습니다. Apple 및 Netflix의 주가와 PE 비율을 기반으로 한 차트는 다음과 같습니다.

APPLE:

사과 주가 대 수익 비율 차트

데이터 소스:macrotrends.net


NETFLIX

넷플릭스 주가 대 수익 비율

데이터 소스:macrotrends.net

PE 비율은 1년에 분기별로 계산되는것으로 보입니다. 우리의 경우 무료 데이터 소스가 제공하는 데이터를 확인하면 됩니다. 유료 소스에 더 많은 것이있는 것 같기도 합니. 모델의 계산이 효과적으로 작동하려면 모든 데이터 세트 열에 동일한 수의 행이 있어야 하므로APPLEL의 데이터는 다음과 같습니다.

의 구멍 사과주가수익비율의 구멍

데이터가 1년의 매 분기마다 계산되는 경우 나머지 분기에는 다음 분기까지 미리 계산된 동일한 데이터를 사용하므로 이 경우 데이터를 복사해 보겠습니다:

중복 데이터 PE 비율 사과

NETFLIX에 대해서도 동일한 작업이 수행됩니다.


03: 이자율


연방 준비 은행의 정책은 주가에 직접적인 영향을 미치며 준비 은행은 경제를 안정시키기 위해 정기적으로 금리를 변경합니다. 당연히 이자율이 높아지면 기업은 대출에 더 많은 비용을 지불해야 하므로 이윤이 줄어들게 됩니다. 이는 기업의 주가를 떨어뜨릴 것입니다. 반대로 이자율이 낮아지면 기업은 대출에 더 적은 비용을 지불해야 하므로 이윤이 늘어나게 됩니다, 이 경우 주식 가격은 상승합니다.

> 연준은 최근 수요를 낮추고 기업이 가격을 낮추도록 하여 궁극적으로는 인플레이션을 낮추기 위해 금리를 인상하고 있습니다.

2010년부터 현재까지 연준의 기금 금리 그래프는 다음과 같습니다.

연방기금금리

04: 현재 이벤트


일반적으로 국가 또는 전 세계에서 진행 중인 이벤트는 주식 시장에도 막대한 영향을 미칠 수 있습니다. 코로나19 대유행이 2019년 말과 2020년 주식 시장에 매우 강력한 부정적인 영향을 미쳤다는 사실을 누구도 부인할 수 없습니다. 그리고 같은 해에 미국에서는 평등을 위한 폭동이 일어기도 했습니다. 

주식 시장 가격에 영향을 미치는 다른 이벤트에는 전쟁과 테러가 포함됩니다. 

이러한 모든 이벤트는 주가를 급격하게 하락시키고 시장 변동성에 영향을 미칠 수밖에 없습니다.

이러한 이벤트에 대해 훈련하려면 너무 많은 작업과 더 많은 모델이 필요하기 때문에 저는 이들 요소에서 데이터를 수집하지 않을 것입니다. 이는 이 기사의 범위를 벗어납니다.


05: 인플레이션


인플레이션은 시간이 지남에 따라 주어진 통화의 구매력이 감소하는 것입니다. 구매력 감소가 발생하는 비율의 정량적 추정치는 특정 기간 동안 경제에서 선택된 상품 및 서비스 바구니의 평균적인 가격 수준의 증가에 반영될 수 있습니다. 종종 백분율로 표시되는 일반적인 가격 수준의 상승은 통화 단위가 이전 기간보다 적게 구매함을 의미합니다.

여기에서 인플레이션에 대해 자세히 알아보세요https://www.investopedia.com/terms/i/inflation.asp

인플레이션에는 기본적으로 Core CPI와 CPI에는 두 가지 유형이 있습니다.

  • Core CPI -에너지 및 식품 가격을 제외한 모든 것
  • CPI -경제 내부의 모든 것입니다. 에너지, 식량 가격, 교육, 엔터테인먼트 등 특정 경제에 속하는 사람들의 일상에 존재하는 모든 것

인플레이션이 1달러의 수익 가치를 잠식함에 따라 시장 지수를 구성하는 회사의 현재 가치를 시장에서 측정하는 것을 어렵게 만들 수 있습니다. 또한 기업이 재료, 재고 및 인건비의 상승을 조정함에 따라 수익에 영향을 미칠 수 있습니다. 그 결과 주가가 변동할 수 있으며 이로 인해 변동성이 발생합니다. 

좋은 소식은 연준의 긴축이 채권 투자에는 부정적인 영향을 미칠 수 있지만 주식은 역사적으로 이러한 주기 동안 좋은 성과를 거둔 경우가 많다는 것입니다.

1970년 이후 미국 CPI 차트를 살펴봅시다.

  미국 cpi 그래프 이미지


이제 필요한 모든 데이터를 수집하여 하나의 CSV 파일에 저장해 보겠습니다.

APPLE부터:

데이터 수집


CSV 파일에 수집할 데이터는 핵심 CPI, CPI, 연준 펀드 금리, EPS 및 PE 비율입니다. 이 모든 데이터를 사용할 수 있습니다.

데이터 세트에서 누락된 데이터는 종속 변수 하나뿐이며 우리는 주가의 원시 값만 있습니다. 특정 달에 주식 시장이 폭락했는지 여부를 알려주는 스크립트를 만들어 봅시다.

CrashClassifyScript.mq5의 내부

void DetectCrash(double &prices[], int& out_binary[])
 {
     double prev_high = prices[0];
     
     ArrayResize(out_binary,ArraySize(prices)-1); //we reduce the size by one since we ignore the current we predict the previous one
     for (int i=1; i<ArraySize(prices); i++)
        {
           int prev = i-1;
            if (prices[i] >= prev_high)
                prev_high = prices[i]; //grab the highest price 
                
            double percent_crash = ((prev_high - prices[i]) / prev_high) * 100.0; //convert crash to percentage
            printf("crash percentage %.2f high price %.4f curr price %.4f ", percent_crash,prev_high,prices[i]);  
          
            //based on the definition of a crash; markets has to fall more than 10% percent
            if (percent_crash > 10)
                out_binary[prev] = 0; //downtrend (crash)
            else
                out_binary[prev] = 1; //uptrend (no crash )
        }
 }

첫 번째prev_high에 주의해서 보면 이전 가격의 값을 사용했다는 것을 알 수 있을 것입니다. 왜냐하면 2010년 1월 1일 대신 2009년 12월 1일의 애플의 값을 복사했기 때문입니다. 그 이유는 첫 번째 계산에서 충돌을 감지하기 위해서입니다. 그러나 더 이상 필요하지 않기 때문에 해당 월을 출력 데이터 세트에서 무시합니다. 그래서 내부의out_binary[prev] 인덱스 prev는 기본적으로 i입니다. -1 은 인덱스 1에서 시작하여 반복하기 때문입니다.

다음은output binary배열을 인쇄할 때의 출력입니다.

 CrashClassifyScript  DATE 1/1/2010 TREND 1

 CrashClassifyScript  DATE 2/1/2010 TREND 1

.........

 CrashClassifyScript  DATE 4/1/2022 TREND 0

 CrashClassifyScript  DATE 5/1/2022 TREND 0

모든 데이터 열을 excel의 하나의 csv 파일에 추가하면 다음과 같은 csv 파일이 생성됩니다.

Apple 데이터세트 개요

훌륭합니다. 이제 모든 설정이 끝났습니다. 코드 작업을 좀더 해야 합니다.

우리는 로지스틱 모델의 배후에 선형 회귀 알고리즘이 있다는 것을 알고 있으며 선형 모델에서 데이터를 사용하기 전에 독립 변수와 상관관계가 있는지 확인해야 합니다. corrcoeff 메서드를 호출하여 확인하겠습니다. corrcoeff 메서드는 이전기사에서 만든 LinearRegression 라이브러리에 추가했습니다.

TestScript.mq5 내부

m_lr = new CMatrixRegression;
      
Print("Matrix multiple regression");
m_lr.Init(8,"2,4,5,6,7",file_name,",",0.7);
      
m_lr.corrcoeff();
m_lr.MultipleMatLinearRegMain();    
delete m_lr;       

출력은 다음과 같을 것입니다:

행렬 다중 회귀

TestScript  Init, number of X columns chosen =5

TestScript  "2" "4" "5" "6" "7"

TestScript  모든 데이터 배열 크기 740은 52바이트의 메모리를 사용합니다.

TestScript  상관계수

TestScript  Independent Var Vs Trend = 0.225

TestScript  Independent Var Vs CPI = -0.079

TestScript  Independent Var Vs Core CPI  = -0.460

TestScript  Independent Var Vs EPS($) = -0.743

TestScript  Independent Var Vs PE Ratio = -0.215

여러 곳에서 수집한 모든 데이터는 주식 가격과 상관관계가 없는 것으로 보입니다. 온라인에서 많은 사람들이 이것이 주식 시장에 영향을 미치는 요인이라고 소리치고 있음에도 불구하고 말입니다. 그러나 선형 모델의 수치는 그렇지 않습니다. 예를 들어 CPI대 애플의 가격을 보면 저는 이 둘간에 매우 강력한 상관관계가 있을 것이라고 예상했지만 선현회귀에 사용하기에는 상관관계가 너무 약해 보입니다. 핵심 CPI만 약 -0.46의 의미있는 음의 상관관계를 보이고 있고 가장 강력한 것은 EPS로 략 0.743의 음의 상관관계를 보여줍니다. 이는 -74.3%로 변환 될 수 있습니다.

여기서 끝내지 말자. 계산이 제대로 되지 않을 경우를 대비하여 숫자에서 무언가를 놓치는 경우를 대비하여 Python에서 데이터를 시각화하고 직접 확인하는 것이 매우 중요합니다.

seaborn pair plot 시각화

출력

sns 애플 주가 분석

제 생각에는 우리가 수집한 대부분의 데이터 사이에 강력한 관계가 많지 않다는 것이 매우 분명합니다. 데이터를 필터링 해 보겠습니다.

우리는 세 가지 독립 변수만 사용하여 모델을 구축할 것입니다. 

  • 핵심 CPI(절반에 가까운 약 -46%로 상관됨)
  • EPS(모든 데이터보다 약 -74.2%로 가장 잘 상관됨)
  • FED의 펀드 비율(약 -33%와 상관관계가 가장 낮으며 중대한 모델을 구축할 때는 이 방법을 권장하지 않습니다)

이제 원하는 열로만 라이브러리를 초기화하겠습니다:

log_reg.Init(file_name,delimiter,2,"3,5,6",0.7);

로지스틱 회귀의 기본적인 기능을 놓친 사용자는 이문서를 참조하시기 바랍니다.

라이브러리의 추가 개선 

//These should be called before the Init 
                           
void    FixMissingValues(string columns);
void    LabelEncoder(string columns, string members);

로지스틱 모델은 누락된 값에 민감하며 분류하는 머신러닝 모델이므로데이터가 누락되었음을 나타낼 수 있는 제로 데이터를분류된 클래스로 처리합니다. 또한 nan 값과 string을 제로로 처리하기도 며 이는 우리가 MQL5의 파일을 어떻게 읽느냐에 달려 있습니다. 이것이 제가 라이브러리를 일부 개선한 이유입니다.

누락된 값을 평균으로 대체하는 함수와 문자열을 레이블로 인코딩하는 함수, 

이들 함수들은 Init 함수 전에 호출해야 합니다.

이제 우리의 물류 라이브러리는 이전기사 에서 생성한 MatrixRegression 라이브러리의 구성 요소를 상속합니다.

class CLogisticRegression: protected CMatrixRegression

좋은 부분으로 가서 우리 모델이 얼마나 좋은지 봅시다.

호출 로지스틱 회귀 라이브러리 호출

출력을 하면 다음과 같을 것입니다. 

  Confusion Matrix 
   [ 0  13 ]
    [  0  31  ] 
  Tested model accuracy =0.7045

우리의 모델 정확도는 테스트 데이터 세트에서 70.45%입니다😲 이 시점에서 저는 어안이 벙벙합니다

이전에 가지고 있던 데이터의 부족 때문에 50%도 못 맞추는 줄 알았는데 그렇지 않았습니다. 파이썬으로 검증을 하면 오류가 있을 것이라 생각했지만 그렇지 않았습니다.

테스트된 모델 정확도 파이썬

B A M

우리의 종속 변수는 충돌을 감지하기 위해 스크립트로 수집한 추세 열이라는 점을 명심하십시오. 가격 열은 각각의 추세를 나타내는0과 1의 이진수 값을 사용할 수 없기 때문에 선형 모델의 상관 계수를 표시하는 데만 사용되었습니다.

이제 NETFLIX 로 이동해 보겠습니다.

이 NETFLIX에 대한 상관 계수 수치는 다음과 같습니다.

        Correlation Coefficients
         Independent Var Vs Trend = 0.071
         Independent Var Vs  rate (FEDs rate) = 0.310
         Independent Var Vs CPI = 0.509
         Independent Var Vs Core CPI  = 0.607
         Independent Var Vs  EPS = 0.917
         Independent Var Vs PE Ratio = -0.213

아래에서 논의한 대부분의 요인들은 NETFLIX에 긍정적인 영향을 미치는 것으로 보입니다. 주가수익비율만이 부정적인 영향을 미치며 가장 강력한 요인은 주당순이익으로 주가와 약 92%의 상관관계가 있습니다. 이외 핵심 CPI 및 CPI가 있으며 세 가지 데이터만 사용하여 모델을 구축할 것입니다.

  • EPS
  • Core CPI 
  • 와 CPI

다시 데이터를 시각화해 보겠습니다.

넷플릭스 데이터 카운트플롯

지난번 애플보다 넷플릭스가 훨씬 좋아보이네요,

요약하면,

   log_reg = new CLogisticRegression();
    
    Print("NETFLIX"); 
    
    file_name =  "Netflix Dataset.csv";
    
    log_reg.Init(file_name,delimiter,2,"4,5,6",0.7);
    log_reg.LogisticRegressionMain(accuracy);
    
    printf("Tested model accuracy =%.4f",accuracy);
    delete log_reg;

출력 

FN      0       07:54:45.106    TestScript      NETFLIX
PN      0       07:54:45.108    TestScript      ==== TRAINED LINEAR REGRESSION MODEL COEFFICIENTS ====
ED      0       07:54:45.108    TestScript      [ 
RO      0       07:54:45.108    TestScript       1.43120 -0.05632 -0.54159  0.48957
EE      0       07:54:45.108    TestScript      ] 
CQ      0       07:54:45.108    TestScript      columns = 4 rows = 1
PH      0       07:54:45.108    TestScript      ========= LINEAR REGRESSION MODEL TESTING STARTED =========
QP      0       07:54:45.108    TestScript      Tested Linear Model R square is = -0.35263665822405277
GR      0       07:54:45.108    TestScript      Confusion Matrix 
EE      0       07:54:45.108    TestScript       [ 0  18 ]
HN      0       07:54:45.108    TestScript        [  0  26  ] 
MJ      0       07:54:45.108    TestScript      Tested model accuracy =0.5909

주가와 강한 선형 상관 관계가 있는 데이터가 있음에도 불구하고 NETFLIX모델은 APPLE모 델정확도가 70%인 것에 비해정확도가 약 60%정도로 습니다. 여러분이 나머지 데이터 세트를 가지고 다른 모델을 만들어 볼 수 있을 것입니다


실시간 주식 시장 테스트


Expert Advisor로 라이브 시장에서 테스트할 수 있으려면 기본 LogisticRegression 함수를 약간 수정해야 합니다. 함수가 전략에서 사용할 CSV 파일에 각각의 날짜와 함께 예측 값을 저장하도록 해야 합니다. 테스터는 우리의 모델에 따라 시장이 어디로 갈 것인지 신호를 보냅니다.

데이터를 수집하고 csv 파일에 저장하는 방법은 다음과 같습니다:

WriteToCSV(TestPredicted,dates,"Predicted "+m_filename,m_delimiter);

테스트 데이터 세트 결과만 수집한다는 점 을 기억하십시오.

다음은 데이터가 csv 파일에 어떻게 저장되는지에 대한 간략한 보기입니다:

NETFLIX

Predicted, date_time
1,8/1/2018
1,9/1/2018
1,10/1/2018
1,11/1/2018
1,12/1/2018
1,1/1/2019

APPLE 

Predicted, date_time
1,9/1/2018
1,10/1/2018
1,11/1/2018
1,12/1/2018
1,1/1/2019
1,2/1/2019      

혼동 매트릭스 부분에 주의를 기울인 경우 우리 모델이 상승 추세를 잘 예측할 수 있음을 알 수 있습니다. TP(true positive가 행렬의 행에서 큰값을 가지고 있습니다)

실시간 주가 테스트 EA

EA를 생성하는 첫 번째 단계는 CSV 파일에서 데이터를 수집하는 것이지만 그 전에 테스트하는 동안 이 파일을 사용할 것임을 전략 테스터에게 알려야 합니다.

#property tester_file "Predicted Apple Dataset.csv"

제가 OnInit함수에서 코딩하고 호출한 함수에 대한 간략한 개요입니다.

 GetColumnDatatoArray(1,Trend);
 GetColumnDatatoArray(2,dates);

이러한 함수는 매우 일반적이며 라이브러리에서 많이 사용한 것들입니다. 기본적으로 첫 번째 열에서 데이터를 수집한 다음dates[]배열에 대해 동일한 프로세스로 Trend[]배열에 저장합니다.

다음으로 중요한 것은 csv 파일에서 수집한 시간을MQL5 에서 이해할 수 있는 표준 시간 형식으로 변환하는 것입니다.

ConvertTimeToStandard();

다음은 해당 함수 내부에 있는 내용입니다:

void ConvertTimeToStandard()
 {
// A one time attempt to convert the date to yy.mm.dd
    
    ArrayResize(date_datetime,ArraySize(dates));
    for (int i=0; i<ArraySize(dates); i++)
       {
         StringReplace(dates[i],"/","."); //replace comma with period in each and every date
         //Print(dates[i]);
         string mm_dd_yy[];
         
         ushort sep = StringGetCharacter(".",0);
         StringSplit(dates[i],sep,mm_dd_yy); //separate month, day and year 
         
         //Print("mm dd yy date format");
         //ArrayPrint(mm_dd_yy);
         
         string year = mm_dd_yy[2];
         string  day = mm_dd_yy[1];
         string month = mm_dd_yy[0];
                
         dates[i] = year+"."+month+"."+day; //store to a yy.mm.dd format
         
         date_datetime[i] = StringToTime(dates[i]); //lastly convert the string datetime to an actual date and time
       }  
 }

설명할 가치가 있다고 생각되는 함수,Init()함수에서 수행된 것들입니다.

다음은Ontick함수에서 모델 예측을 테스트하는 것입니다. 여기 Expert Advisor의 기둥이 있습니다:

    datetime today[1];
    int trend_signal = -1; //1 is buy signal 0 is sell signal
    
    CopyTime(Symbol(),PERIOD_D1,0,1,today);
    
    if (isNewBar())
     for (int i=0; i<ArraySize(date_datetime); i++)
      {
          if (today[0] == date_datetime[i]) //train in that specific day only
              {
                 
                  if ((int)Trend[i] == 1)
                    trend_signal = 1;
                  else 
                     trend_signal = 0; 
                     
                  // close all the existing positions since we are coming up with new data signals    
                  ClosePosByType(POSITION_TYPE_BUY);
                  ClosePosByType(POSITION_TYPE_SELL);
                  break;
              }
          
          if (MQLInfoInteger(MQL_TESTER) && today[0] > date_datetime[ArrayMaximum(date_datetime)])
             {
                 Print("we've run out of the testing data, Tester will be cancelled");
                 ExpertRemove();
             }
     } 
     
//--- Time to trade

      MqlTick tick;
      SymbolInfoTick(Symbol(),tick);
      double ask = tick.ask , bid = tick.bid;

//---

      if (trend_signal == 1 && PositionCounter(POSITION_TYPE_BUY)<1)
        {
           m_trade.Buy(Lots,Symbol(),ask,0,0," Buy trade ");
           ClosePosByType(POSITION_TYPE_SELL); //if the model predicts a bullish market close all sell trades if available
        }
        
      if (trend_signal == 0 && PositionCounter(POSITION_TYPE_SELL)<1)
        {
            m_trade.Sell(Lots,Symbol(),bid,0,0,"Sell trade");
            ClosePosByType(POSITION_TYPE_BUY); //vice versa if the model predicts bear market
        }
  }

제가 특정 날짜와 isNewBar이벤트 핸들에서 모델을 훈련시키기로 한 주된 이유는 응용 프로그램의 테스트 비용을 줄이기 위한 것입니다. 이 비용을 더 줄이기 위해 테스트 데이터 세트가 소진되면 전략 테스터가 중지되는 조건도 하드 코딩했습니다.

이제 아래에 링크된 전체 코드를 볼 수 있습니다. 이제 전략 테스터에서 모델을 테스트할 시간입니다.

APPLE 테스트 결과

Apple 테스터 보고서

그래프

Apple 테스터 그래프

반면 넷플릭스 테스터 보고서

넷플릭스 테스터 보고서

테스터 그래프

넷플릭스 테스터 그래프

좋습니다. 보시다시피 Apple 모델의 정확도는 약 70%였으며 경쟁사인 NETFLIX와 비교해 멋진 그래프의 전략 테스터이고 지금까지 좋은 예측 모델을 만들었습니다.


결론

로지스틱 모델의 좋은 점은 구축 및 훈련이 쉬우면서도 데이터 분류를 꽤 잘한다는 것입니다. 반면에 모델에서 찾아낼 데이터를 수집하는 것이 가장 중요한 부분이며 결코 쉬운 일이 아닙니다. 만약 여기서 한 번 실수를 하게 되면 비효율적인 모델이 될 수도 있습니다.

그럴 경우라도 라이브러리를 더 개선하고 데이터를 다시 수집할 수 있습니다. 저는 데이터를 수집하고 Crashclassify 스크립트 내에서 분류한 방식이 크래시를 관찰하는 효과적인 방법이 아니라고 생각합니다.

이 문서에 대한 Github 리포지토리는 여기에 링크되어 있습니다 >https://github.com/MegaJoctan/LogisticRegression-MQL5-and-python.



MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/10983

파일 첨부됨 |
Files.zip (26.58 KB)
데이터 과학 및 머신 러닝(파트 05): 의사 결정 트리 데이터 과학 및 머신 러닝(파트 05): 의사 결정 트리
의사 결정 트리는 인간이 데이터를 분류하기 위해 생각하는 방식을 모방합니다. 트리를 구축하고 트리를 사용하여 데이터를 분류하고 예측하는 방법에 대해 알아보겠습니다. 의사 결정 트리 알고리즘의 주요 목표는 불순물이 있는 데이터를 순수한 것으로 분리하거나 노드에 가깝게 분리하는 것입니다.
MQL5에서 행렬 및 벡터 MQL5에서 행렬 및 벡터
특수한 데이터 유형인 '매트릭스' 및 '벡터'를 사용하여 수학적 표기법에 매우 가까운 코드를 생성할 수 있습니다. 이러한 메서드를 사용하면 중첩된 루프를 만들거나 계산시 배열의 올바른 인덱싱을 염두에 둘 필요가 없습니다. 따라서 행렬 및 벡터 메서드를 사용하면 복잡한 프로그램을 개발할 때 안정성과 속도가 향상됩니다.
볼륨으로 거래 시스템을 설계하는 방법 알아보기 볼륨으로 거래 시스템을 설계하는 방법 알아보기
이 글은 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법과 관련한 시리즈의 새로운 글입니다. 이 기사에서는 볼륨 지표에 대해 설명합니다. 볼륨의 개념은 금융 시장 거래에서 매우 중요한 요소 중 하나이며 우리 모두 주의를 기울여야 할 요소입니다. 이 글을 통해 볼륨 지표로 간단한 거래 시스템을 설계하는 방법에 대해서 알아보겠습니다.
Expert Advisor 개발 기초부터 (파트 12): 시간과 거래(I) Expert Advisor 개발 기초부터 (파트 12): 시간과 거래(I)
오늘은 주문의 흐름을 알아보기 위해 Times & Trade를 만들 것입니다. 이는 우리가 앞으로 구축할 시스템의 첫 번째 부분입니다. 다음 글에서는 추가적인 내용을 더해 시스템을 완성하도록 하겠습니다. 이 새로운 기능을 구현하려면 Expert Advisor 코드에 몇 가지의 새로운 항목을 추가해야 합니다.