본문 바로가기
AyoProject/Ayotera-Trade

[AT] 19. MACD 지표에 대한 구현 및 매매시점 예측 (3)

by 청양호박이 2020. 11. 13.

이번에는 지난번에 구하고 검증한 MACD의 지표에 대해서 매매시점을 예측하고 자동으로 그 시점을 산출하여 해당 DB에 저장하는 로직을 구현해 보겠습니다. 이미 지난 시간에 증권사에서 제공하는 HTS에서 보여지는 MACD 및 MACD Signal 신호와는 그 값이 차이가 있음을 살펴보았습니다.

 

MA를 구하는 방법은 여러가지가 있는데, 우리는 그 방법 중 가장 기초적인 방법인 SMA(Simple Moving Average)를 통해서 MACD에 적용을 했고, 우선은 그 값을 매매시점을 예측하는 방법론에 적용해 보겠습니다.

 

  • MACD에 대한 정의 및 구현
  • 구현된 결과에 대한 정합성 확인
  • MACD를 활용한 매매기법 확인 및 적용
  • 매매기법 별 시뮬레이션 및 실험실
  • 향상된 이동평균산정 법칙 적용 및 실험실

 

그럼 한번 살펴보겠습니다. 

 

 

1. MACD를 활용한 기본 매매기법


단순히 MACD를 활용하는 방법은 어렵지 않습니다. 어차피 해당 기법은 기술적지표로 매매의 신호중에 하나이고, 그 것을 가지고 여러가지 신호와 혼합해서 결정을 할 것이니까요. 하지만 무식하게 MACD만 활용해서 감정없이 매매를 해도 어느정도 수익은 발생한다고 생각합니다.

 

MACD의 지표는 3개로 구성되기 때문에 그것을 매매기법에 적용하는데는 몇가지의 경우의 수가 존재하지 않습니다. 그 경우의 수를 가지고 여러개의 Data를 분석해서 가장 우수한 방법을 적용하면 그게 매매기법이 되는 거라고 생각합니다.

 

그렇다면 그 경우의 수는 아래와 같습니다.

 

  • MACD와 MACD Signal의 Cross(교차, 만난는 점) 여부
  • MACD가 0선에 위에 있는지... 아래 있는지 여부
  • 매매시점을 시초가로 할지 종가로 할지 여무

 

이 정도가 되겠네요... 그럼 뭐 생각할게 있나요?? 많아야 12개가 나오니... 다 적용해 보고 판단해보면 되죠... 나올 수 있는 모든 조건식은 아래와 같습니다. 

 

[MACD를 활용한 기본 매매기법 조건 - 매수]

  조건 식 매매 유무
조건 1 - MACD가 MACD Signal을 아래서 위로 교차하고 (GC, Golden Cross)
- MACD가 0선 아래에 있고
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 시초가로 함
매수
조건 2 - MACD가 MACD Signal을 아래서 위로 교차하고 (GC, Golden Cross)
- MACD가 0선 아래에 있고
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 종가로 함
매수
조건 3 - MACD가 MACD Signal을 아래서 위로 교차하고 (GC, Golden Cross)
- MACD가 0선 위에에 있고
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 시초가로 함
매수
조건 4 - MACD가 MACD Signal을 아래서 위로 교차하고 (GC, Golden Cross)
- MACD가 0선 위에에 있고
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 종가로 함
매수
조건 5 - MACD가 MACD Signal을 아래서 위로 교차하고 (GC, Golden Cross)
- MACD가 0선 상관없이
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 시초가로 함
매수
조건 6 - MACD가 MACD Signal을 아래서 위로 교차하고 (GC, Golden Cross)
- MACD가 0선 상관없이
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 종가로 함
매수

[MACD를 활용한 기본 매매기법 조건 - 매도]

  조건 식 매매 유무
조건 1 - MACD가 MACD Signal을 위에서 아래로 교차하고 (DC, Dead Cross)
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 시초가로 함
매도
조건 2 - MACD가 MACD Signal을 위에서 아래로 교차하고 (DC, Dead Cross)
- MA는 항상 이전일 종가를 기준으로 하기때문에, 실제 매매는 익일
  이루어 지며, 매매 기준은 종가로 함
매도

이렇게 12가지를 모두 구현해보고 가장 수익이 높은 경우를 확인해 보면 좋을 것 같습니다. 그럼 Cross여부를 구할 수 있는 코드를 구현해 보겠습니다.

 

 

2. MACD와 MACD Signal의 Cross 구현


구현 방식은 간단합니다. MACD가 MACD Signal보다 수치가 작다가 커지는 순간을 GC (Golden Cross)로 찍어주고, 그 반대로 MACD가 MACD Signal보다 수치가 크다가 작아지는 순간을 DC (Dead Cross)로 찍어주면 됩니다. 제가 구현한 세부 로직은 아래와 같습니다.

 

최초일때, (chk - 1일때)
    macd signal보다 크거나 같으면 chk 1
    macd signal보다 작으면 chk 0
기존에 signal이 위에 있을때, (chk 0일때)
    macd signal보다 작으면 chk 유지 결과는 NA
    macd signal보다 크거나 같으면 chk 1 결과는 GC
기존에 MACD가 위에 있을때, (chk 1일때)
    macd signal보다 작으면 chk 0 결과는 DC
    macd signal보다 크거나 같으면 chk는 유지 결과는 NA

 

chk를 두어서 항상 현재의 MACD와 MACD Signal사이의 상대적 위치를 체크하고 있다가 해당 일자가 되었을때, chk상태 대비 변화를 측정하여 그 결과를 찍어주는 방식을 사용했습니다.

    def CalcMACDCross(self, maMACD, maSignal):
        macdCross = []
        chkMACDOver = -1
        lenBoth = len(maMACD)
        for i in range(len(maMACD)):
            if math.isnan(maSignal[lenBoth-i-1]):
                macdCross.append('NA')
            else:
                if chkMACDOver == -1:
                    if maMACD[lenBoth-i-1] >= maSignal[lenBoth-i-1]: chkMACDOver = 1
                    else: chkMACDOver = 0
                    macdCross.append('NA')
                elif chkMACDOver == 0:
                    if maMACD[lenBoth - i - 1] < maSignal[lenBoth - i - 1]:
                        macdCross.append('NA')
                    else:
                        chkMACDOver = 1
                        macdCross.append('GC')
                else:
                    if maMACD[lenBoth - i - 1] < maSignal[lenBoth - i - 1]:
                        chkMACDOver = 0
                        macdCross.append('DC')
                    else:
                        chkMACDOver = 1
                        macdCross.append('NA')
        return macdCross

이렇게 작성해주고, DB에 넣기전에 DataFrame에 추가하여 저장하였습니다.

혹시나 해서 구현한 코드를 추가 하였습니다. 

    # MACD와 Signal의 교차점을 구한 후 dataframe에 추가
    macdCross = kd.CalcMACDCross(opt10081_res_pd['maMACD'], opt10081_res_pd['maSignal'])
    opt10081_res_pd['macdCross'] = macdCross

 

 

3. 구현 검증


이제는 실제로 잘 구현이 되었는지 검증해 보도록 하겠습니다. 

 

[종목코드 : 066570, 종목명 : LG전자]

 

측정기간 : 2020년 11월 12일 기준으로 업무일 기준 60일 전까지의 Data

 

해당 결과를 살펴보면, 총 3번의 Cross가 있었습니다.

 

(1) 2020/08/31의 DC (Dead Cross)

(2) 2020/09/18의 GC (Golden Cross)

(3) 2020/10/05의 DC (Dead Cross)

 

그럼 이게 정확한지 matplotlib로 그린 그림을 통해서 확인해 보겠습니다.

 

아주아주 정확합니다. 그럼 이제 다음시간에는 각 조건 식 별로 실제 매매 시, 발생 가능한 수익을 백테스팅을 통해서 시뮬레이션을 해보겠습니다.

 

- Ayotera Lab -

댓글