3. 튜토리얼/금융 분석 프로그래밍 응용

존버 vs 자동매매 백테스팅 수익률 비교(카카오) - 파이썬 금융 데이터 분석

swsong 2021. 9. 7. 19:28

Step 0. 전략

과거에 카카오 상장 초기에 배팅했다면 지금쯤 소위 대박을 터뜨렸을 것이다. 이를 아는 상황에서 과연 특정 (차트) 매매 전략이 단순 장기 보유보다 우세한지 확인해 보고자 한다.

전략은 잘 알려진 골든크로스 매수, 데드크로스 매도 방식을 시도한다. 골든크로스는 단기 이동평균선(보통 20일 이하)이 장기 이동평균선(보통 30일 이상)을 뚫고 올라가는 시점, 데드크로스는 그 반대 시점을 지칭한다. 여기에 모멘텀을 더해 상승 추세의 골든크로스를 매수 포인트로 잡을 수도 있지만, 논의를 단순화하기 위해 이 부분은 고려하지 않겠다.

Step 1. 데이터 불러오기

주가 정보를 가져오기 위해 FinanceDataReader를 사용한다.

Step 2. 장기 보유 성과 확인

1999년 11월 11일에 카카오 주식을 100만원치 샀다고 가정하면 현재 주가 기준으로 약 7천만 원이 되었다. 작년까지만 해도 주가가 15만 원을 상회했기 때문에 이는 사실 반 토막 난 가격이다. 그럼에도 불구하고 70배 이상 수익을 본 것이다.

전체 기간 주가 흐름이다.

Step 3. 장단기 이동평균 그래프 확인

전략 구현을 위해 단기(5일), 장기(30일) 이동평균을 구한다.

두 이동평균 그래프를 함께 그리면 다음과 같다.

2022년 그래프만 확대해 보자.

이렇게 기존 데이터 테이블에 단기 이동평균 데이터와 장기 이동평균 데이터를 추가했다. 이제 각 날짜(인덱스) 별로 short_window가 long_window를 역전 상승하는 지점에서 '종가'(close)에 매수하고, short_window가 long_window를 역전 하강하는 지점에서 '종가'(close)에 매도할 것이다. 즉, 위 차트에서 파란색 선이 초록색 선을 넘은 가운데 기간만 주식을 보유한다.

Step 4. 보유 구간 표기

주식을 들고 있을 구간과 그렇지 않은 구간을 마킹해준다.

우리는 해당 날짜의 단기 이동 평균이 장기 이동 평균을 넘어서는 순간 매수할 것이다. 그리고 그 반대가 될 때 매도해야 한다. 위 데이터를 보면 1999년 12월 22일부터 단기 이동평균이 장기 이동평균을 넘어서 있다. 이런 경우는 매수 포인트에 해당하지 않는다. 우리는 False에서 True로 바뀌는 순간 매수하고, True에서 False로 바뀌는 순간 매도한다.

표기는 0과 1로 바꿔주자. 0과 1을 사용해 주식을 들고 있을(파란색 선> 초록색 선) 구간을 1로, 그렇지 않은 나머지 구간을 0으로 표기한다. 자료형을 int로 바꿔주면 알아서 숫자로 변환된다.

 

Step 5. 매매 시점 표기

이번에는 매수, 매도 포인트를 마킹한다. overs 칼럼은 보유 기간을 알려준다. overs 값이 0에서 1로 전환되는 시점과 1에서 0으로 전환되는 시점을 체크하면 되겠다.

이제 두 데이터(buy_signal, sell_signal)를 더해준다. 이렇게 하면 buy_signal에 매수 포인트가 아닌 지점과 sell_signal에 매도 포인트가 아닌 지점은 모두 0이기 때문에 합산했을 때 매수 포인트는 1로, 매도 포인트는 -1로, 그리고 나머지는 0으로 표시된다.

앞에서 언급했지만 종목을 사지 않은 시작일부터 매도 신호가 포착되고 있다. 이것은 데이터가 short_window(단기 이평선)가 long_window(장기 이평선) 보다 큰 상태에서 시작했기 때문이다. 이렇게 매수 신호보다 먼저 나온 매도 신호는 0으로 수정해 주고 첫 매수 신호(1)가 나오면 그때부터 포지션을 잡는다.

Step 6. 전략 수익률 계산

전략을 통해 보유한 기간에 대한 누적 수익률을 계산한다. 즉, signal '1(매수)'과 signal '-1(매도)' 간의 수익률을 복리로 계산해 주면 전체 기간의 전략 수익률을 확인할 수 있다.

보유기간별 각 수익률은 다음과 같다.

보유기간을 차트에 표시해 본다. 붉은 영역이 매수 후 보유 기간이다.

이번에도 2022년만 확대해서 이동평균선과 함께 확인해 보겠다. 주가는 붉은색 굵은 선으로 함께 그렸고, 보유기간은 역시 붉은 영역으로 표시했다.

단순한 전략이지만 상승 기간에 잘 보유하고 있었다.

이제 누적 수익률을 확인해 보자. numpy array는 누적 곱을 계산하는 cumprod() 함수를 제공하고 있다.

전략은 총 129회 시행(매수~매도 사이클) 되었고 시행 마다의 수익률은 다음과 같다.

위 수익률을 토대로 초깃값을 100만 원으로 세팅하면, 최종 수익률은 약 609만 원이 나온다.

이렇게 오르는 추세를 포착해서 매수, 매도를 반복하는 전략을 테스트해 봤다. 상대적으로 손실 폭을 줄일 수는 있었으나 상승 폭 역시 상당 부분 놓쳤기 때문에 장기적으로는 단순 보유보다 좋지 못한 결과를 보였다. 또한 매매수수료를 고려하지 않았다는 점에서 매매가 잦은 위와 같은 전략이 더 불리하게 작용할 수 있겠다.