English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
판별 분석을 이용한 매매 시스템 구축

판별 분석을 이용한 매매 시스템 구축

MetaTrader 5트레이딩 시스템 | 5 8월 2021, 09:35
64 0
ArtemGaleev
ArtemGaleev

개요

기술적 분석의 가장 중요한 과제 중 하나는 가까운 미래의 시장 움직임 방향을 판단하는 것입니다. 통계적 측면에서 보자면 인디케이터와 인디케이터 값을 이용해 미래 시장 상황을 상승세와 하락세의 두 가지로 분류하는 거죠.

판별 분석은 어떤 인디케이터와 어떤 값을 사용해야 더 정확한 분류를 할 수 있을지 도와줍니다. 다시 말해, 판별 분석을 이용하면 인디케이터 데이터를 기반으로 시장 추세를 예측하는 모델을 만들 수 있습니다.

그러나 상당한 양의 인풋 데이터를 필요로 하기 때문에 꽤 복잡해지죠. 따라서 수동으로 작업하게 되면 정말 많은 시간이 걸립니다. 그러나 다행히도 MQL5와 통계 소프트웨어 덕분에 데이터 선택, 준비 및 판별 분석 적용을 자동으로 실행할 수 있게 됐습니다.

이 글은 시장 데이터 수집용 엑스퍼트 어드바이저 개발 예제를 다루고 있습니다. 스타티스티카를 이용한 외환 시장 예측 모델 구축 시의 판별 분석 적용법에 대한 튜토리얼이기도 하죠.


1. 판별 분석이란 무엇인가?

판별 분석(이하 DA)은 패턴 인식 방법 중 하나인데요. 신경망도 일종의 특수 DA가 적용된 것으로 볼 수 있겠습니다. DA는 패턴 인식을 기반으로 하는 대다수의 보안 시스템에서 사용되고 있죠.

DA를 이용하면 어떤 변수가 데이터 흐름을 구분하여 그룹화하며 데이터 흐름에 대한 구분 메커니즘은 무엇인지를 알 수 있습니다.

외환 시장에 DA가 적용된 간략한 예를 살펴봅시다. RSI, MACDRVI에서 얻은 데이터 값으로 가격 움직임의 방향을 예측해야 합니다. 다음은 DA가 적용된 결과입니다.

a. RVI 인디케이터는 예측에 도움이 되는 요인이 아닙니다. 따라서 분석 과정에서 제외합니다.

b. DA가 다음의 두 가지 판별식을 생성했습니다.

  1. 가격이 상승한 경우, G1 = a1*RSI+b1*MACD+с1
  2. 가격이 하락한 경우, G2 = a2*RSI+b2*MACD+с2

각 바의 시작 부분에서 G1과 G2를 계산하면 G1>G2인 경우 가격이 상승할 것임을, G1<G2인 경우 가격이 하락할 것임을 알 수 있습니다.

DA는 신경망을 처음 다루는 경우에 효과적입니다. DA를 사용하면 신경망 연산에 사용되는 수식과 비슷한 형식의 수식이 생성되기 때문입니다. 신경망 구조에 대한 이해를 도울뿐더러 과연 여러분의 전략에 신경망을 적용하는 게 좋을지 판단하는 데에도 도움이 됩니다.


2. 판별 분석 단계 알아보기

분석 과정은 다음의 여러 단계로 나눌 수 있습니다.

  1. 데이터 준비
  2. 준비된 데이터에서 최적 변수 선택
  3. 테스트 데이터를 이용한 결과 모델 테스트 및 분석
  4. 판별식 기반 모델 구축

현재 통계 데이터 분석에 사용되는 대부분의 소프트웨어 패키지가 판별 분석을 제공합니다. 그 중에서도 가장 잘 알려져 있는 건 스탯소프트(StatSoft Inc.)의 스타티스티카와 IBM(IBM Corporation)의 SPSS입니다. 우리는 스타티스티카를 이용한 판별 분석 적용법에 대해 더 알아보도록 하겠습니다. 제공되는 스크린샷은 스타티스티카 버전 8.0을 기준으로 하는데요. 전 버전에서도 아마 비슷한 형태일 겁니다. 스타티스티카는 신경망 외에도 투자자들에게 도움이 되는 여러 도구를 제공한다는 점을 알아 두세요.


2.1. 데이터 준비

데이터 수집 과정은 수집 목적에 따라 달라지는데요. 우리의 목적은 인디케이터 값이 적용된 바를 이용해 다음 바의 가격 변동 방향을 예측하는 겁니다. 우선 데이터 수집용 EA가 인디케이터 값과 가격 데이터를 파일로 저장합니다.

다음과 같은 형식의 CSV 파일이 생깁니다. 변수는 세로로 정렬되며 각 열은 특정 인디케이터에 해당합니다. 각 행은 연속되는 값을 포함합니다. 예를 들면 특정 바에 대한 인디케이터 값 말이죠. 다르게 말하면 가로 헤더는 인디케이터, 세로 헤더는 일련의 연속되는 바를 나타낸다고 할 수 있죠.

표에 있는 변수를 기준으로 그룹화 변수가 생성됩니다. 우리의 경우, 인디케이터 값이 획득된 바 다음에 오는 바의 가격 변화를 기반으로 그룹화 변수를 생성합니다. 그룹화 변수는 동일 선상에 존재하는 데이터 그룹에 부여된 번호를 나타냅니다. 예를 들어, 가격이 상승한 경우를 1로, 가격이 하락한 경우를 2로 설정할 수 있죠.

다음 인디케이터 값이 필요한데요.

OnInit() 함수로 인디케이터 핸들을 얻고 세로 헤더 값을 저장하는 MasterData.csv 파일을 생성합니다.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- initialization of the indicators
   h_AC=iAC(Symbol(),Period());
   h_BearsPower=iBearsPower(Symbol(),Period(),BearsPower_PeriodBears);
   h_BullsPower=iBullsPower(Symbol(),Period(),BullsPower_PeriodBulls);
   h_AO=iAO(Symbol(),Period());
   h_CCI=iCCI(Symbol(),Period(),CCI_PeriodCCI,CCI_Applied);
   h_DeMarker=iDeMarker(Symbol(),Period(),DeM_PeriodDeM);
   h_FrAMA=iFrAMA(Symbol(),Period(),FraMA_PeriodMA,FraMA_Shift,FraMA_Applied);
   h_MACD=iMACD(Symbol(),Period(),MACD_PeriodFast,MACD_PeriodSlow,MACD_PeriodSignal,MACD_Applied);
   h_RSI=iRSI(Symbol(),Period(),RSI_PeriodRSI,RSI_Applied);
   h_RVI=iRVI(Symbol(),Period(),RVI_PeriodRVI);
   h_Stoch=iStochastic(Symbol(),Period(),Stoch_PeriodK,Stoch_PeriodD,Stoch_PeriodSlow,MODE_SMA,Stoch_Applied);
   h_WPR=iWPR(Symbol(),Period(),WPR_PeriodWPR);

   if(h_AC==INVALID_HANDLE || h_BearsPower==INVALID_HANDLE || 
      h_BullsPower==INVALID_HANDLE || h_AO==INVALID_HANDLE || 
      h_CCI==INVALID_HANDLE || h_DeMarker==INVALID_HANDLE || 
      h_FrAMA==INVALID_HANDLE || h_MACD==INVALID_HANDLE || 
      h_RSI==INVALID_HANDLE || h_RVI==INVALID_HANDLE || 
      h_Stoch==INVALID_HANDLE || h_WPR==INVALID_HANDLE)
     {
      Print("Error creating indicators");
      return(1);
     }

   ArraySetAsSeries(buf_AC,true);
   ArraySetAsSeries(buf_BearsPower,true);
   ArraySetAsSeries(buf_BullsPower,true);
   ArraySetAsSeries(buf_AO,true);
   ArraySetAsSeries(buf_CCI,true);
   ArraySetAsSeries(buf_DeMarker,true);
   ArraySetAsSeries(buf_FrAMA,true);
   ArraySetAsSeries(buf_MACD_m,true);
   ArraySetAsSeries(buf_MACD_s,true);
   ArraySetAsSeries(buf_RSI,true);
   ArraySetAsSeries(buf_RVI_m,true);
   ArraySetAsSeries(buf_RVI_s,true);
   ArraySetAsSeries(buf_Stoch_m,true);
   ArraySetAsSeries(buf_Stoch_s,true);
   ArraySetAsSeries(buf_WPR,true);


   FileHandle=FileOpen("MasterData2.csv",FILE_ANSI|FILE_WRITE|FILE_CSV|FILE_SHARE_READ,';');
   if(FileHandle!=INVALID_HANDLE)
     {
      Print("FileOpen OK");
      //--- saving names of the variables in the first line of the file for convenience of working with it
      FileWrite(FileHandle,"Time","Hour","Price","AC","dAC","Bears","dBears","Bulls","dBulls",
                "AO","dAO","CCI","dCCI","DeMarker","dDeMarker","FrAMA","dFrAMA","MACDm","dMACDm",
                "MACDs","dMACDs","MACDms","dMACDms","RSI","dRSI","RVIm","dRVIm","RVIs","dRVIs",
                "RVIms","dRVIms","Stoch_m","dStoch_m","Stoch_s","dStoch_s","Stoch_ms","dStoch_ms",
                "WPR","dWPR");
     }
   else
     {
      Print("FileOpen action failed. Error",GetLastError());
      ExpertRemove();
     }
//---
   return(0);
  }

OnTick() 이벤트 핸들러 함수가 새로운 바를 구분하고 해당 파일에 데이터를 저장합니다.

가격 변화는 직전에 완성된 바의 값으로 결정되며 인디케이터 값은 그 전에 완성된 바에서 획득됩니다. 따라서 인디케이터의 절대값 외에도 직전 값과의 차이를 저장해야 가격의 변화 방향을 알 수 있습니다. 예제의 해당 변수들은 'd'로 시작하는 이름을 갖고 있습니다.

신호선 인디케이터의 경우 신호선과 기준선의 차이를 저장해야 하죠. 또한 새 바의 시간과 해당 시간 값을 저장해야 합니다. 시간별 데이터 필터링에 유용하게 쓰일 겁니다.

결과적으로 총 37개의 인디케이터를 이용해 가격 변화 예측 모델을 구축하게 됩니다.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//| Monitoring the market situation and saving values                |
//| of the indicators into the file at the beginning of every new bar|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- declaring a static variable of datetime type
   static datetime Prev_time;

//--- it will be used to store prices, volumes and spread of each bar
   MqlRates mrate[];
   MqlTick tickdata;

   ArraySetAsSeries(mrate,true);    
   
//--- obtaining the recent quotes
   if(!SymbolInfoTick(_Symbol,tickdata))
     {
      Alert("Quote update error - error: ",GetLastError(),"!!");
      return;
     }
///--- copying data of the last 4 bars
   if(CopyRates(_Symbol,_Period,0,4,mrate)<0)
     {
      Alert("Historical quote copy error - error: ",GetLastError(),"!!");
      return;
     }
//--- if both time values are equal, there is no new bar
   if(Prev_time==mrate[0].time) return;
//--- saving the time in the static variable 
   Prev_time=mrate[0].time;
 
//--- filling the arrays with values of the indicators
   bool copy_result=true;
   copy_result=copy_result && FillArrayFromBuffer1(buf_AC,h_AC,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_BearsPower,h_BearsPower,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_BullsPower,h_BullsPower,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_AO,h_AO,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_CCI,h_CCI,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_DeMarker,h_DeMarker,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_FrAMA,h_FrAMA,4);
   copy_result=copy_result && FillArraysFromBuffers2(buf_MACD_m,buf_MACD_s,h_MACD,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_RSI,h_RSI,4);
   copy_result=copy_result && FillArraysFromBuffers2(buf_RVI_m,buf_RVI_s,h_RVI,4);
   copy_result=copy_result && FillArraysFromBuffers2(buf_Stoch_m,buf_Stoch_s,h_Stoch,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_WPR,h_WPR,4);

//--- checking the accuracy of copying the data
   if(!copy_result==true)
     {
      Print("Data copy error");
      return;
     }

//--- saving to the file the price movement within the last two bars 
//--- and the preceding values of the indicators 
   if(FileHandle!=INVALID_HANDLE)
     {
      MqlDateTime tm;
      TimeCurrent(tm);
      uint Result=0;
      Result=FileWrite(FileHandle,TimeToString(TimeCurrent()),tm.hour, // time of the bar
                       (mrate[1].close-mrate[2].close)/_Point,       // difference between the closing prices of the last two bars 
                       buf_AC[2],buf_AC[2]-buf_AC[3],                // value of the indicator on the preceding bar and its dynamics
                       buf_BearsPower[2],buf_BearsPower[2]-buf_BearsPower[3],
                       buf_BullsPower[2],buf_BullsPower[2]-buf_BullsPower[3],
                       buf_AO[2],buf_AO[2]-buf_AO[3],
                       buf_CCI[2],buf_CCI[2]-buf_CCI[3],
                       buf_DeMarker[2],buf_DeMarker[2]-buf_DeMarker[3],
                       buf_FrAMA[2],buf_FrAMA[2]-buf_FrAMA[3],
                       buf_MACD_m[2],buf_MACD_m[2]-buf_MACD_m[3],
                       buf_MACD_s[2],buf_MACD_s[2]-buf_MACD_s[3],
                       buf_MACD_m[2]-buf_MACD_s[2],buf_MACD_m[2]-buf_MACD_s[2]-buf_MACD_m[3]+buf_MACD_s[3],
                       buf_RSI[2],buf_RSI[2]-buf_RSI[3],
                       buf_RVI_m[2],buf_RVI_m[2]-buf_RVI_m[3],
                       buf_RVI_s[2],buf_RVI_s[2]-buf_RVI_s[3],
                       buf_RVI_m[2]-buf_RVI_s[2],buf_RVI_m[2]-buf_RVI_s[2]-buf_RVI_m[3]+buf_RVI_s[3],
                       buf_Stoch_m[2],buf_Stoch_m[2]-buf_Stoch_m[3],
                       buf_Stoch_s[2],buf_Stoch_s[2]-buf_Stoch_s[3],
                       buf_Stoch_m[2]-buf_Stoch_s[2],buf_Stoch_m[2]-buf_Stoch_s[2]-buf_Stoch_m[3]+buf_Stoch_s[3],
                       buf_WPR[2],buf_WPR[2]-buf_WPR[3]);

      if(Result==0)
        {
         Print("FileWrite action error ",GetLastError());
         ExpertRemove();
        }
     }

  }

EA를 시작하면 MasterData.CSV 파일이 terminal_data_directory/MQL5/Files에 생성됩니다. 테스터에서 EA를 시작하는 경우에는 terminal_data_directory/tester/Agent-127.0.0.1-3000/MQL5/Files에서 찾아볼 수 있습니다. 불러온 파일 자체만으로도 이미 스타티스티카에서 사용 가능한데요.

관련 예제는 MasterData.CSV에 포함되어 있습니다. 2011년 8월 1일부터 2011년 10월 1일까지 EURUSD H1에 대한 데이터가 수집되었습니다.

다음의 설명을 따라 스타티스티카에서 파일을 여세요.

  • '파일' 메뉴의 '열기'에서 파일 타입을 데이터 파일로 설정하고 파일을 불러옵니다.
  • '텍스트 파일 불러오기 형식' 창의 탭을 닫고 확인을 누릅니다.
  • 그림과 같이 설정하세요.
  • 소수점 표시란에 반드시 점을 찍어 주세요.

그림 1. 스타티스카로 파일 불러오기

그림 1. 스타티스카로 파일 불러오기

OK를 클릭하면 데이터 표가 나타납니다.

그림 2. 스타티스카 데이터베이스

그림 2. 스타티스카 데이터베이스

이제 가격 변수를 기반으로 그룹화 변수를 만들겠습니다.

다음의 가격 움직임을 기반으로 네 가지 그룹을 만들겠습니다.

  1. 200 포인트 이상 하락
  2. 200 포인트 미만 하락
  3. 200 포인트 미만 상승
  4. 200 포인트 이상 상승

헤더 AC를 오른쪽 클릭해 '변수 추가'를 선택하세요.

그림 3. 새 변수 추가

그림 3. 새 변수 추가

창에서 변수 이름을 '그룹(Group)'으로 설정하고 변수 적용 공식을 입력하세요.

공식은 다음과 같습니다.

=iif(v3<=-200;1;0)+iif(v3<0 and v3>-200;2;0)+iif(v3>0 and v3<200;3;0)+iif(v3>=200;4;0)


그림 4. 변수 설명

그림 4. 변수 설명

이제 판별 분석을 위한 준비가 완료되었습니다. MasterData.STA에서 해당 예제 파일을 찾아볼 수 있습니다.


2.2. 최적 변수 선택

판별 분석을 실행합니다(통계->다변수 탐색 분석->판별 분석).

그림 5. 판별 분석 실행

그림 5. 판별 분석 실행

열린 창에서 '변수'를 클릭하세요.

첫 번째 필드에서 그룹화 변수를 선택하고 두 번째 필드에서 그룹화의 기준이 되는 변수를 선택합니다.

우리의 경우 첫 번째 필드에서 '그룹'이, 두 번째 필드에서 모든 인디케이터 변수와 시간이 선택됩니다.

그림 6. 변수 선택

그림 6. 변수 선택

데이터 불러오기 하단에 위치한 'S' 버튼을 클릭하세요(그림 8 참고). 판별 분석에 필요한 데이터를 선택할 수 있는 창이 열릴 겁니다. 아래의 스크린샷(그림 7)을 따라 설정하세요.

처음 700개의 관측값만 이용하도록 하겠습니다. 나머지 데이터는 예측 모델을 테스트하는 데에 사용할 겁니다. V0 변수를 이용하여 관측값의 개수를 설정합니다. 이렇게 판별 분석용 트레이닝 데이터가 완성됐습니다.

확인을 클릭하세요.

그림 7. 트레이닝 데이터 설정

그림 7. 트레이닝 데이터 설정

이제 예측 모델의 기반이 될 그룹을 선택해야 하는데요.

한 가지 주의할 점이 있습니다. 판별 분석의 단점 중 하나가 바로 극단값의 영향을 받는다는 겁니다. 따라서 아주 간혹 발생하는 강력한 이벤트, 즉 우리의 경우 가격 급증이 모델을 왜곡시킬 수 있습니다. 예를 들어, 갑작스런 뉴스 때문에 시장이 몇 시간 동안이나 크게 동요할 수 있습니다. 이 경우 인디케이터 값은 예측에 거의 영향을 끼치지 않는 반면 판별 분석에서는 큰 의미를 갖게 됩니다. 따라서 판별 분석 실행에 앞서 극단값을 확인하는 것이 좋습니다.

우리 예제에서는 극단값을 제외하기 위해 그룹 2와 3만을 다루도록 하겠습니다. 그룹 1과 4에서 큰 가격 변동이 있었으므로 극단값이 관측될 확률이 높기 때문입니다.

'그룹화 변수 코드'를 클릭하세요(그림 8 참고). 분석에 이용될 그룹의 개수를 설정합니다.

그림 8. 분석 대상 그룹 선택

그림 8. 분석 대상 그룹 선택 


고급 옵션을 활성화하세요. 나중에 필요한 단계적 회귀 분석이 활성화됩니다.

확인을 눌러 판별 분석을 실행합니다.

아래와 같은 팝업 창이 나타날 수도 있습니다. 이는 선택된 변수 중 하나가 불필요하며 다른 변수에 영향을 받음(예: 다른 두 변수의 합)을 의미합니다.

인디케이터를 통해 획득된 데이터 흐름의 경우 자주 일어날 수 있는 일입니다. 해당 변수들은 분석의 질을 저해하게 되죠. 따라서 삭제되어야 합니다. 변수 선택 창으로 돌아가 불필요한 변수를 하나씩 추가하고 판별 분석을 다시 실행합니다.


그림 9. 허용값 오류 알림

그림 9. 허용값 오류 알림


그러고 나면 판별 분석 메소드를 선택할 수 있는 창이 열립니다(그림 10). 드롭다운 메뉴에서 전진 선택법을 선택하세요. 인디케이터 값이 예측에 미치는 영향이 적으므로 전진 선택법을 사용합니다. 그룹화 변수 모델이 단계적으로 생성됩니다.

어떤 변수가 그룹화에 가장 유용한지 판단하기 위해 매 단계별로 모든 변수에 대한 검토 및 평가가 진행됩니다. 해당 과정을 통과한 변수를 모델에 포함시키는 방식으로 과정이 반복됩니다. 데이터 샘플 중에서 그룹화에 유용한 변수들이 차례로 선택되는 거죠.


그림 10. 메소드 선택

그림 10. 메소드 선택

확인을 누르면 판별 분석 완료 창이 뜹니다.

그림 11. 판결 분석 결과

그림 11. 판결 분석 결과


'요약: 적용 변수'를 클릭해 단계적 회귀 분석에 사용된 변수를 확인할 수 있습니다. 가장 정확한 그룹 구분 기준이 되는 변수들이죠. 95%(p<0.05) 이상의 정확도를 보이는 변수들은 붉은색으로 표시됩니다. 나머지 변수들은 이보다 낮은 정확도를 보이죠. 해당 모델은 최소 95%의 정확도를 보이는 변수만을 포함해야 하는데요.

사실 통계적 '황금률'을 따르면 정확도가 95%를 넘는 변수만이 사용되어야 합니다. 따라서 붉은색으로 표시된 변수를 제외한 나머지 변수를 분석에서 제외하겠습니다. dBulls, Bulls, FrAMA 및 Hour가 해당되네요. 단계적 회귀 분석 선택 창으로 돌아가 '변수'를 클릭한 후 해당 변수들을 입력합니다.

분석을 다시 한 번 실행하고요. '요약: 적용 변수'를 클릭하면 제외해야 할 변수가 세 가지 더 생긴 것을 볼 수 있죠. DeMarker, Stoch_s와 AO입니다. 해당 변수들 또한 제외하도록 하겠습니다.

이제 최고의 정확도(p<0.01)를 보이는 변수들만 남게 되었네요.


그림 12. 모델 적용 변수

그림 12. 모델 적용 변수


결론적으로 예제의 37개 변수 가운데 7개만이 예측에 유의미한 것으로 나타났습니다.

해당 접근법을 이용하면 기술적 분석을 기반으로 유용한 인디케이터를 선택해 커스텀 매매 시스템을 개발할 수 있습니다. 신경망을 이용하는 시스템도 포함되죠.


2.3. 테스트 데이터를 이용한 결과 모델 테스트 및 분석

판별 분석을 통해 얻은 예측 모델을 트레이닝 데이터에 적용해 보았는데요.

'분류' 탭에서 해당 모델 및 그룹화 결과를 확인할 수 있습니다.

그림 13. 분류 탭

그림 13. 분류 탭

트레이닝 데이터가 적용된 예측 모델 실행 결과를 확인하려면 '분류 행렬'을 누르세요.

행에는 분류 결과가 나타납니다. 열에는 예상 분류 결과가 표시되어 있죠. 정확한 예측 결과를 포함하는 셀은 녹색으로, 부정확한 결과를 포함하는 셀은 붉은색으로 표시됩니다.

첫 번째 열에 예측의 정확도가 %로 표기되고요.

그림 14. 트레이닝 데이터 분류

그림 14. 트레이닝 데이터 분류

트레이닝 데이터를 이용한 예측의 정확도는 60%네요.

이번에는 테스트 데이터를 이용해 모델을 시험해 보겠습니다. '선택(그림 13)'을 클릭해 모델에 적용될 데이터를 v0>700로 설정합니다. 모델 구축에는 사용되지 않은 데이터여야 합니다.

다음의 결과가 나옵니다.


그림 15. 테스트 데이터 분류

그림 15. 테스트 데이터 분류

테스트 데이터를 이용한 예측의 정확도 또한 55%로 비슷하게 나왔습니다. 외환 거래에서는 꽤 높은 확률이죠.


2.4. 매매 시스템 구축

판별 분석 예측 모델은 일차 방정식을 기반으로 하여 인디케이터 값을 두 그룹으로 분류합니다.

해당 함수에 대한 설명은 판별 분석 결과 창 분류 탭(그림 13)의 '분류 함수'에서 확인할 수 있습니다. 판별식의 계수가 반영된 표가 새로운 창에 나타납니다.

그림 16. 판별식

그림 16. 판별식

표에 나타난 데이터를 기반으로 두 가지 수식을 이용하는 시스템을 만들어 보겠습니다.

그룹 2=157.17*AC-465.64*Bears+82.24*dBears-0.006*dCCI+761.06*dFrAMA+2418.79*dMACDm+0.01*dStoch_ms-1.035
그룹 3=527.11*AC-641.97*Bears+271.21*dBears-0.002*dCCI+1483.47*dFrAMA-726.16*dMACDm-0.034*dStoch_ms-1.353

인디케이터 값을 수식에 적용한 후 그룹 값을 계산하면 되는데요.

그룹 값이 더 높은 쪽이 예측에 이용될 겁니다. 우리 예제를 살펴보면 그룹 2의 값이 더 크므로 다음 한 시간 동안 가격 차트가 하락세를 보일 확률이 높죠. 그룹 3의 값이 더 큰 경우 그 반대 결과가 예측되겠죠.

인디케이터 값과 분석 기간이 임의로 선택되었음에 주목할 필요가 있습니다. 그럼에도 불구하고 그 잠재력과 능력이 확인되었으니 판별 분석은 참 대단하죠.


결론

판별 분석은 외환 시장에서 유용하게 쓰입니다. 다양한 예측에 적용 가능한 인디케이터 값을 분류하는 데에 안성맞춤인 변수를 찾고 확인해 볼 수 있죠. 물론 예측 모델 구축에도 활용 가능하고요.

판별 분석을 기반으로 구축된 모델은 EA에서 쉽게 이용할 수 있으므로 개발 경험이 많지 않은 유저들이 사용하기에도 적합하죠. 판별 분석 자체도 사용하기 꽤 쉬운 편이고요. 본문의 튜토리얼만 참고하면 여러분만의 데이터를 분석할 수 있으니까요.

전자 교과서에서 판별 분석에 대한 더 많은 정보를 찾을 수 있습니다.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/335

파일 첨부됨 |
masterdata.zip (662.43 KB)
da_demo.mq5 (12.36 KB)
지수 평활법을 이용한 시계열 예측(계속) 지수 평활법을 이용한 시계열 예측(계속)
이번 글에서는 이전 글에서 만든 인디케이터를 한층 업그레이드해 보고, 부트스트랩과 분위수를 이용한 예측 신뢰 구간 측정 방법에 대해서도 간단하게 알아보겠습니다. 예측 인디케이터 개발과 예측 정확도 측정에 사용될 스크립트 작성이 목표입니다.
인디케이터 및 통계적 매개 변수 분석하기 인디케이터 및 통계적 매개 변수 분석하기
기술적 분석은 기본 시세 정보를 '보다 명확하게' 나타내는 인디케이터를 구현하여 투자자가 시장을 분석하고 가격 움직임을 예측할 수 있도록 해줍니다. 그러니 초기 시세 변동 및 획득 결과의 신뢰도와 관련된 문제를 해결할 수 없다면 인디케이터를 사용할 필요가 없겠죠. 당연히 매매 시스템에 적용할 필요도 없고요. 왜 그런지 자세히 알아보도록 하겠습니다.
엑스퍼트 어드바이저 비주얼 마법사로 엑스퍼트 어드바이저 만들기 엑스퍼트 어드바이저 비주얼 마법사로 엑스퍼트 어드바이저 만들기
MetaTrader 5 의 엑스퍼트 어드바이저 비주얼 마법사는 매우 직관적인 그래픽 환경과 다양한 매매 블록을 제공하여 단 몇 분만에 엑스퍼트 어드바이저를 만들 수 있도록 도와줍니다. 클릭, 드래그 앤드 드롭만 할 줄 알면 종이에 그리는 것처럼 외환 거래 전략을 시각화할 수 있습니다. 이렇게 만들어진 매매 다이어그램은 몰라니스(Molanis) MQL5 코드 생성기로 자동 분석되며 즉시 사용 가능한 엑스퍼트 어드바이저로 완성됩니다. 인터랙티브 그래픽 환경 덕분에 MQL5 코드를 쓰지 않고 간단하게 디자인할 수 있죠.
지수 평활을 이용한 시계열 예측 지수 평활을 이용한 시계열 예측
이 문서를 통해 시계열의 단기 예측에 사용되는 지수 평활 모형을 독자분들이 익숙해지실 수 있도록 설명해드릴 것입니다. 또한 예측 결과의 최적화 및 추정과 관련된 주제를 다루고, 스크립트와 인디케이터를 예시삼아 몇 가지 제공해드릴 것입니다. 이 문서는 지수 평활 모형에 기초한 예측 원칙을 처음 숙지하는 데 유용할 것입니다.