ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MACD를 이용한 매매 : MySQL 활용
    금융퀀트/자산평가&프로그램매매 2022. 9. 27. 08:04
    반응형

    이동평균의 개념

    일정 기간동안의 평균을 이동 평균이라고 한다. 이동평균은 크게 단순이동평균(SMA), 지수이동평균(EMA) 두 가지 종류가 있다. 단순이동평균(SMA)는 우리가 일반적으로 아는 평균 개념으로 지난 3일 동안 주가가 이틀 전 100, 어제 200, 오늘 300 이었다고 하면, 평균을 200 이라고 하는 것이다. ( (100 + 200 + 300 ) / 3 )  지수이동평균은 최근 수치에 더 큰 "가중치"를 부여하고, 과거 수치에 더 작은 "가중치"를 부여해서 평균을 구하는 것이다. 방금 든 예시에서 주가가 최근에 더 높으므로 지수이동평균을 구하면 200 보다 높은 갚이 나올 것이다. 구체적인 평균 값은 "가중치"를 어떻게 만드냐에 따라서 달라진다. 

    MACD ( Moving Average Convergence Divergence ) 를 통한 매매 정의

    이동평균을 연결한 이동평균선의 움직임을 보고 매매를 하는 것이 MACD 를 이용한 매매라고 한다. 이 때 중요한 개념이 골든 크로스( Golden Cross), 데드 크로스( Dead Cross) 라는 개념이다. 골든 크로스는 아래 그림1의 왼쪽처럼 기준이 되는 선을 상향돌파 하는 지점을 의미하며, 데드 크로스는 아래 그림1의 오른쪽처럼 기준이 되는 선을 하향돌파 하는 지점을 의미한다. 

    그림1: 골든 크로스, 데드 크로스

    우리나라에서는 단기로 5일 이동평균선이 20일 이동평균선을 상향 돌파, 중기로 20일 이동평균선이 60일 이동평균선을 상향 돌파, 장기로 60일 이동평균선이 100일 이동평균선을 상향 돌파 하는 골든 크로스를 주로 본다.

    골든 크로스, 데드 크로스를 통한 투자의사 결정

    기초 데이터

    골든 크로스인지 데드 크로스인지 판단하는데는 각 주식의 기간별 종가 데이터만 있으면 된다. 아래에 2022-03-15 ~ 2022-09-15 까지의 코스피 전 종목에 대한 종가를 정리한 파일이다. 이 파일 SQL DB 서버에 import 해서 DB 를 만들고 추가 작업을 진행하면 된다. SQL DB 에 csv 파일을 import 하는 것은 03 MYSQL에 CSV file 삽입하기: DATA IMPORT WIZARD 등 을 참조하면 된다.

    220925_202203_202209_코스피종목별종가.csv
    6.00MB
    그림1: csv 파일 데이터구조

    5일 이동평균, 20일 이동평균, 60일 이동평균, 100일 이동평균

    이동평균을 구할 때 이동평균 시작일을 ( ex.5일 이동평균이면 5영업일 전 ) 잡는 것이 중요하다. 이 때는 date_sub 함수를 쓰는데,  date_sub(종료일, interval 100 day) 하면 종료일에서 100 영업일 전 값을 의미한다. 시작일이 정해지면 우리는 컴퓨터에 다음과 같은 쿼리문을 만들어야 한다.

    pDate 이라는 날짜 컬럼 값이 시작일~ 종료일 사이에 있는 데이터들의 AjdClose(조정종가)를 kospicode(거래소코드) 별로 평균(average)값을 계산해라

    결국 아래와 같은 쿼리문을 실행하면 종목별 단순이동평균(SMA)을 구할 수 있다.( 아래는 100일 단순이동평균(SMA) 구하는 예시이다. )

    /* 100 일 단순이동평균(SMA) 구하는 쿼리 */ 
    /* 기준일을 v_date 으로 설정 */ 
    set @v_date = '2022-09-20';
    
    /* 예시코드는 테이블명을 result2로 했는데 내가 설정한 테이블 명을 넣어주면 된다. */ 
    select kospicode, round(avg(AdjClose),2) macd100
    from result2
    where pDate between date_sub(@v_date, interval 100 day) and @v_date
    group by kospicode

    거래신호 찾기

    이제 골든 크로스, 데드 크로스를 구해보자. 먼저, 100일 종목별 평균 데이터, 60일 종목별 평균 데이터를 만들어서 kospicode 가 같다는 점을 이용해서 두 데이터를 붙인다. 그리고 case when 조건을 이용해서 100 일 이동평균선보다 60 일 이동평균선이 더 큰 경우에는 "BUY"로 표시하도록 쿼리문을 작성하면 된다. 

    /* 기준일을 v_date 으로 설정 */ 
    set @v_date = '2022-09-20';
    
    /* 예시코드는 테이블명을 result2로 했는데 내가 설정한 테이블 명을 넣어주면 된다. */ 
    select macd100.kospicode,  
        macd100.macd100,
    	macd60.macd60,
        case when macd100.macd100 < macd60.macd60 then 'BUY'
        end trd_signal
      
    from
    /* 100 일 이동평균 선 */ 
    (select kospicode, round(avg(AdjClose),2) macd100
    from result2
    where pDate between date_sub(@v_date, interval 100 day) and @v_date
    group by kospicode) macd100,
    
    /* 60 일 이동평균 선 */
    (select kospicode, round(avg(AdjClose),2) macd60
    from result2
    where pDate between date_sub(@v_date, interval 60 day) and @v_date
    group by kospicode) macd60
    
    where macd100.kospicode = macd60.kospicode
    order by trd_signal desc

    투자의사 결정하기

    지금까지 내용을 종합해서 5일 이동평균선이 20일 이동평균선을 상향 돌파, 20일 이동평균선이 60일 이동평균선을 상향 돌파, 60일 이동평균선이 100일 이동평균선을 상향 돌파 하는 상황이 겹치면 "BUY" signal 표시, 그 반대이면 "SELL" signal 표시를 하도록 쿼리문을 작성할 수 있다.

    /* 기준일을 v_date 으로 설정 */ 
    set @v_date = '2022-09-20';
    
    /* 예시코드는 테이블명을 result2로 했는데 내가 설정한 테이블 명을 넣어주면 된다. */ 
    select macd100.kospicode,  
        macd100.macd100,
    	macd60.macd60,
        macd20.macd20,
        macd5.macd5,
        case when macd100.macd100 < macd60.macd60 and macd60.macd60 < macd20.macd20 and
    	macd20.macd20 < macd5.macd5 then 'BUY'
        when macd100.macd100 > macd60.macd60 and macd60.macd60 > macd20.macd20 and
    	macd20.macd20 > macd5.macd5 then 'SELL'
        end trd_signal
    
    from
    /* 100 일 이동평균 선 */ 
    (select kospicode, round(avg(AdjClose),2) macd100
    from result2
    where pDate between date_sub(@v_date, interval 100 day) and @v_date
    group by kospicode) macd100,
    
    /* 60 일 이동평균 선 */
    (select kospicode, round(avg(AdjClose),2) macd60
    from result2
    where pDate between date_sub(@v_date, interval 60 day) and @v_date
    group by kospicode) macd60,
    
    /* 20 일 이동평균 선 */
    (select kospicode, round(avg(AdjClose),2) macd20
    from result2
    where pDate between date_sub(@v_date, interval 20 day) and @v_date
    group by kospicode) macd20,
    
    /* 5 일 이동평균 선 */
    (select kospicode, round(avg(AdjClose),2) macd5
    from result2
    where pDate between date_sub(@v_date, interval 5 day) and @v_date
    group by kospicode) macd5
    
    where macd100.kospicode = macd60.kospicode and
    	  macd100.kospicode = macd20.kospicode and
          macd100.kospicode = macd5.kospicode
    
    order by trd_signal desc

    위 쿼리문을 실행하면 아래와 같이 주식에 "BUY', "SELL" 을 표시해서 사야할 주식인지 팔아야할 주식인지 표시해 준다. 

    그림2: 최종 투자판단 결과

    반응형
Designed by Tistory.