이번에는 지난번에 구하고 검증한 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 -
댓글