본문 바로가기
AyoProject/Ayotera-Trade

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

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

지난 시간을 되돌아 보면, SMA (Simple Moving Average)를 통해서 MACD와 그 관련된 지표를 구해서 무엇인가를 해보았습니다. 그래서 얻은 1차 결론은... 

 

삼성전자로 적용한 결과는 아래의 조건일때, 생각하지않고 단순 투자를 할 경우 SMA상황에서 가장 큰 수익을 얻을 수 있습니다.

 

(4) 조건 : MACD가 0선 아래서 MACD Signal과 GC(Golden Cross)하고, 매수는 종가, 매도는 종가

 

하지만 증권사에서 제공하는 HTS에 나오는 지표와는 다소 다른 값을 표출하고 있음을 확인했습니다. 그 이유는 MACD를 도출하는데 사용하는 값이 SMA가 아니고 EMA (Exponential Moving Average)라는 다른 가중평균식을 사용하기 때문입니다.

 

증권사들이 EMA를 사용하는 이유는 다 있습니다. 왜 그럴까요?? 이제 알아보도록 하겠습니다.

 

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

 

이동평균값을 구하는 방법은 여러가지가 있지만, 여기에서는 모든 것을 알아보지는 않을 것 입니다. 가장 일반적인 SMA는 이미 알아보았고, MACD에서 사용하는 EMA만 추가로 알아보겠습니다.

 

 

1. EMA (Exponential Moving Average) 


EMA는 단순히 용어로만 풀어보면, 지수이동평균 입니다. 뭔가 기본 이동평균에서 지수값을 추가인자로 해서 뭔가를 하는 느낌이네요.

 

사실 지수이동평균을 사용하는 목적은, 최근에 적재되는 데이터에 대해서는 그 영향력을 크게하고, 과거의 오래된 데이터에 대해서는 그 영향력은 낮게하기 위함입니다. 사실 주가에 영향을 미치는 요인은 최근의 벌어지는 사건을 반영하는 데이터 일테고... 이미 오래전에 주가 데이터는 영향이 미비하다고 볼 수 있습니다. 그렇다면, 이를 가능하게 하는 것이 바로 가중변수(Weight Multiplier) 입니다.

 

기존에 SMA는 원하는 기간만큼의 데이터를 다 더하고... 그 결과를 기간으로 나누는 방식으로 아주 간단했으며, 모든 기간에 동일한 가중치를 가지게 됩니다. 하지만 EMA는 가중변수를 통해서 최근의 데이터에 더 가중치를 주는 방식을 사용합니다.

 

그렇다면 단도직입적으로 구하는 방식을 알아보겠습니다.

 

(1) 가중변수 구하기 = 2 / (1 + n)   여기서 n은 원하는 기간

(2) EMA 계산 = (금일종가 x 가중변수) + (전일 EMA x (1 - 가중변수))

 

음청 간단하죠?? 실제로 구현도 음청 간단합니다. 따로 sample로 계산하지 않고 기존에 SMA을 통해서 구한 MACD와 HTS의 데이터값과 백테스팅(Back Testing)을 통해서 확인했던 결과에 같이 비교해 보겠습니다.

 

 

2. EMA 구현


주의할 점은 가장 첫 데이터는 EMA를 따로 계산하지 않고, 첫날 종가를 첫 EMA로 합니다. 그리고 그 이후부터 EMA를 구할때 전일 EMA를 활용합니다.

    # EMA 방식으로 이동평균값 구하기
    def CalcEMA(self, days, finish):
        maEMA = []
        for i in range(len(finish)):
            if i == 0:
                maEMA.append(float(finish[len(finish)-i-1]))
            else:
                maEMA.append(float(finish[len(finish)-i-1]) * 2 / (days + 1) + maEMA[i-1] * (1 - (2 / (days + 1))))

        # days만큼의 데이터는 미발생 처리
        for i in range(days-1):
            maEMA[i] = np.nan

        return maEMA

몇줄 안됩니다. 그리고 나름 MA이기 때문에 계산에 사용되었지만, 필요없는 데이터는 NaN(Not a Number)처리 합니다.

 

그럼... EMA를 적용한 MA12, MA26을 구해서 DataFrame에 넣어 보겠습니다.

    # EMA로 MA12, MA26 구하기
    ema12 = kd.CalcEMA(12, opt10081_res_pd['finish'])
    ema26 = kd.CalcEMA(26, opt10081_res_pd['finish'])
    opt10081_res_pd['ema12'] = ema12
    opt10081_res_pd['ema26'] = ema26

너무너무 궁금하지만... HTS를 통해서 다운받은 데이터는 12일 이동평균선, 26일 이동평균선을 SMA방식을 통해서 구현한 값만 존재합니다. 결국 MACD는 그 두 값의 차이이기 때문에... 이후 MACD 지표값을 산출 해보고 비교해 보겠습니다.

 

 

3. EMA적용 MACD 지표 구하기


MACD를 구할때는 기존에 함수(Function)을 그대로 이용하면 됩니다. 

    # EMA로 구한 12와 26을 가지고 MACD 구하기
    emaMACD = kd.CalcMACD(opt10081_res_pd['ema12'], opt10081_res_pd['ema26'])
    opt10081_res_pd['emaMACD'] = emaMACD

따라서, 별도 언급없이 해당 함수를 통해서 DataFrame안에 넣어줍니다.

 

이번에는 MACD Signal을 구해보겠습니다. 아참!!! MACD Signal은 그냥 단순히 9일 이동평균선을 구하듯이 하면 안되고, 이 역시 EMA방식으로 구현해야 합니다. 하지만 우리는 걱정할 것이 없죠... 왜냐하면 EMA를 구하는 함수를 이미 만들었기 때문에... 그냥 호출해서 사용하면 됩니다.

 

[MACD Signal 구하기]

    # EMA로 구한 MACD를 가지고 EMA 방식으로 signal 구하기
    emaSignal = kd.CalcEMA(9, opt10081_res_pd['emaMACD'])
    opt10081_res_pd['emaSignal'] = emaSignal

 

이제 두근두근... 한번 결과를 HTS의 데이터와 비교해 볼까요??

 

[Ayotera Trader]

[영웅문 HTS]

아주 정확히 일치 했음을 확인했습니다. 그렇다면 이제는 마지막 관문인 Cross 포인트를 찾아내서 결과를 DB에 저장해 보도록 하겠습니다.

 

 

4. MACD와 MACD Signal의 Cross 구현


SMA로 구현했을때, 우린 모든것을 구현해 놨습니다. 따라서 이것도 그냥 함수를 불러다가 사용하면 됩니다~!!

 

    # emaMACD와 emaSignal의 교차점을 구한 후 dataframe에 추가
    emaMacdCross = kd.CalcMACDCross(opt10081_res_pd['emaMACD'], opt10081_res_pd['emaSignal'])
    opt10081_res_pd['emaMacdCross'] = emaMacdCross

지금까지 SMA를 통해서 구현한 MACD 매매를 위한 모든 값들을 DB에 저장하였습니다.

 

 

 

5. 구현 검증


그렇다면, 실제로 구현한 값과... HTS를 통해서 보여지는 MACD와 MACD Signal그래프가 동일한지 확인해 보겠습니다.

 

[종목코드 : 005930, 종목명 : 삼성전자]


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


[Ayotera Trader]

보시다시피 9월8일에는 GC(Golden Cross) 이하 골든크로스가 있었고, 11월9일에 역시 골든크로스가 있었습니다. 반대로 9월 23일과 10월 23일에는 DC(Dead Cross) 이하 데드크로스가 있었습니다.

 

[영웅문 HTS]

아주 일치하네요... 그럼 잘 개발되어 적용 된 것 같습니다. 그럼 다음에는 전에 해본 시뮬레이션을 통해서 과연 더 나은 이익률을 보여준지 한번 보겠습니다.

 

- Ayotera Lab -

댓글