AUTO TRADE/Back test

백테스팅 구축 (16) - 매도 전략 수정 로드맵 수립

 

지난 게시글에서 백테스팅 결과값을 엑셀에 입력하고, 그 자료를 기반으로 데이터를 분석하는 방법에 대해 살펴봤었다. 이번 게시글에서는 그 자료를 바탕으로 매도 전략을 수정하고자 하는데, 바로 매도 시점을 수정할 예정이다. 일단 자료부터 보고 넘어가자.

 

백테스팅 결과가 좋지 않다

5일 이동평균선이 20일 이동평균선을 상향돌파할 때 매수하고, 5일 이동평균선이 20일 이동평균선을 하향돌파할 때 매도하는 거래 전략으로 1년 간의 데이터를 기반으로 백테스팅을 진행했는데, 시작금액 천만원에서 6월에는 최저 -210만원까지 내려갔다가 마지막에는 +23만원 가량으로 마무리됐다. 최종 수익률이 2%이긴 하지만, 최저 -21%까지 내려갔었던 점을 고려한다면 우리는 손실 거래분을 걸러낸다면 최대 23%의 수익을 얻어낼 수 있음을 의미하기도 한다.

하지만 결과 데이터를 보니 매수는 적절한 시점에 잘 이뤄졌는데, 매도가 너무 낮은 지점에서 이뤄지다 보니 손실로 마감하게 되는 경우가 대다수임을 확인할 수 있다. 예를 들어 가장 맨 위에 있는 값만을 대상으로 분석해보도록 하자. 매도 시점의 이동평균선과의 이격도 값을 보면 5일 이동평균선에 비해 94의 값을 가지고 있지만 20일 이동평균선과는 88의 값을 가지고 있다. 다시 말해, 5일 이동평균선이 20일 이동평균선을 하향돌파할 때 주가는 이미 20일 이동평균선과 비교하여 너무 큰 폭으로 하락한 지점에 위치해 있다는 것이다. 다시 말해, 이미 하락한 후에야 매도 조건이 충족된다는 것이다. 

이격도가 95 이하인 값을 분홍색으로 칠하도록 한 후의 화면(조건부서식에서 설정할 수 있다.)

따라서 우리는 매수 이후에, 일정 수익률을 설정한 후에 그를 바탕으로 매도를 진행하도록 해야 한다. 그리고 더 나아가서는 5일 이동평균선이 20일 이동평균선을 하향돌파할 때를 매도 조건이 충족되는 시점으로 설정할 것이 아니라, 하나의 손절 마지노선으로 설정하는 편이 더 합리적이라고 볼 수 있다. 구축하고자 하는 거래 전략을 요약하자면 아래와 같다.

  • 5일 이동평균선이 20일 이동평균선을 상향돌파할 때 매수
  • 매수 이후 수익률에 따라 분할 매도(수익 실현)
  • 5일 이동평균선이 20일 이동평균선을 하향돌파할 때 손절매(거래 중단)

 


728x90

 

매도 전략 수정하기

우리는 앞서 여러 코드들을 제작하면서 한 가지 중요한 점을 배웠다. 바로 코드를 제작하기 전에 이 코드가 불러올 수 있는 문제점(속칭 대참사)를 예방하기 위해서는 사전에 확실하게 로드맵을 구상한 후에 코드 제작을 시작해야 한다는 것이다. 일단 기본적으로 우리가 설정하고자 하는 것은 분할 매도이다. 분할 매도는 정말 간단한 예를 들어 설명하자면, 주식을 매수한 후에 5% 수익 시 30% 매도, 10% 수익 시 50% 매도, 15% 수익 시 전량 매도와 같은 방식으로 매도하는 것이다. 물론 그 비율은 본인이 설정할 수 있는 부분이므로 크게 개의치 않아도 된다. 5% 수익에서 매도하지 않고 10% 수익 시 30% 매도, 15% 수익 시 20% 매도, 20% 수익 시 나머지 50%를 매도하는 방식으로 설정해도 되니 이 부분은 문제될 것이 없다. 

그렇다면 문제가 될 수 있는 부분은 무엇인지 생각해볼 필요가 있다. 첫 번째 문제점은 바로 분할 매도 시에는 현재 보유 종목 변수 데이터를 기반으로 하는 데이터프레임을 아래와 같은 형태로 입력해줘야 한다는 것이다.

종목 매수일 매도일1 매도일2 매도일3 수익
004170 20200103 20200104 20200105 20200106 XXX,XXX
000100 20200104 20200110 20200120 20200130 XXX,XXX
종목 매수일 매수가격 매도일 매도가격 수익
004170 20200103 1000 20200104 1050 XXX,XXX
      20200105 1100 XXX,XXX
      20200106 1150 XXX,XXX
000100 20200104 1000      

위의 두 가지 형태 중에서 위에 있는 방법은 데이터가 좌우로 너무 길어지기 때문에 결과값을 확인하는 것이 엑셀을 통해서 확인하는 게 아니라면 확인이 불가능하다는 단점(파이참 내에서는 중간 값들이 ...으로 생략되기 때문에)이 있고, 아래의 방법은 매도 정보를 입력하고자 할 때 중간에 새롭게 추가해주어야 하기 때문에(말은 쉬워보이지만 실제로는 특정 인덱스를 기준으로 인덱스 번호 위의 데이터와 인덱스 번호 아래의 데이터로 나눈 후, 인덱스 번호 위의 데이터의 맨 아레 부분에 매도 데이터를 입력한 후, 두 개의 데이터를 합쳐주어야 한다.) 데이터 관리가 복잡하다는 단점이 있다. 따라서 우리는 첫 번째의 방법처럼 구현하되, 최대 3회의 분할매수를 조건으로 두어 첫 번째 매도와 두 번째 매도, 세 번째 매도를 입력한 후 우리가 기존에 제작했던 이동평균선 데드 크로스 시의 매도는 손절매 구간으로 보아 총 네 번의 매도 조건을 설정할 예정이다. 이러한 형태로 데이터를 입력한다면 아래와 같은 결과값을 얻을 수 있을 것이다.

종목코드 매수일 매도일1 매도일2 매도일3 손절일 수익
004170 20200103 20200104 20200105   20200107 XXX,XXX
000100 20200104 20200110     20200120 XXX,XXX

 

다음으로 발생할 수 있는 두 번째 문제점은 바로 '우리가 매수한 종목의 개수가 분할 매도 비율인 20%로 나눌 수 없을 경우에는 어떻게 할 것인가?'이다. 예를 들어 우리는 종목 당 매수 금액을 100만원으로 설정했기 때문에, 주가가 30만원 정도 하는 종목은 최대로 매수해봤자 3주밖에 못 산다. 그러면 3주를 샀을 때 5% 수익이 발생했고 5%에서 20%를 분할매도 하려고 했다면, 0.6주를 매도하는 게 가능한 일인가? 불가능하다.

물론 이 문제는 파이썬 내장 함수인 math()를 통해 반올림함으로써 해결이 가능하다. 즉, 0.6을 반올림하면 1이 되기 때문에 5%에서 1주를 매도하고, 나머지 2주를 대상으로 다시 또 비율을 계산하게 된다. 물론 이 경우에는 현재 보유 중인 종목의 수를 불러와서 보유 중인 종목 수가 있을 경우에만 매도를 진행하도록 구축해야 한다.

무슨 말인가 하면, 우리는 5% 수익구간에서 20%, 10% 수익 구간에서는 50%, 15% 수익 구간에서는 30%를 매도할 것이며 매수한 종목의 주식수는 3주라고 가정해보도록 하자. 일단 5% 구간에서는 3주의 20%에 해당하는 0.6이라는 값이 나오기 때문에 반올림하여 1주를 매도하게 된다. 다음으로 10% 수익 구간에서는 전체 보유 종목인 3주의 50%에 해당하는 1.5라는 값이 나오기 때문에 반올림하여 2주를 매도하게 된다. 마지막으로 15% 구간에서는 보유 주식인 3주의 30%에 해당하는 0.9, 반올림하여 1주를 매도하게 되는데, 우리는 이미 3주를 모두 매도했기 때문에 없는 주식을 매도하는 게 된다. (분할매도는 현재 보유 주식수를 기준으로 하는 게 아니라 기존 매수했던 주식수를 기준으로 계산한다.)

그렇다면 이 방법이 아니라 분할 매도 비율을 현재 보유 주식수를 기준으로 하면 어떻게 될까? 예를 들어 현재 3주를 보유하고 있고 5% 수익률에서는 20%, 10% 수익률에서는 50%, 15% 수익률에서는 100%를 매도하는 것이다. 물론 계산의 기준은 현재 보유 주식수를 기준으로 하자. 이 경우에는 5% 수익률에서는 1주를 매도하고 10% 수익률에서도 1주를 매도하게 되며, 15% 수익률에서는 1주를 매도하게 된다. 물론 최대 수익률이 13%였다면 5%에서 1주, 10%에서 1주를 매도한 후 이후에 데드 크로스가 발생했을 때 손절을 진행하게 된다.

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.