AUTO TRADE/Back test

백테스팅 구축 (10) - 차트와 대조하기

지난 게시글까지 백테스팅을 제작하는 방법에 대해 살펴보았고, 이번 게시글부터는 차트를 보면서 발생하고 있는 오류는 없는지 등에 대해 살펴보는 백테스팅의 유지 보수에 관한 내용을 다룰 계획이다. 물론 파이썬을 통해서 차트를 출력하는 matplotlib와 같은 라이브러리가 있긴 하지만, 차트를 출력하는 코드를 제작하는 게 귀찮기도 하지만 무엇보다도 시간이 오래 걸린다. 따라서 그 방법보다는 차라리 우리가 이용하는 증권사에서 제공하는 차트를 가지고 분석하고 문제점을 찾는 것이 더 편하고 빠르다.

일단 우리가 제작했던 백테스팅 코드는 기본적으로 5일 이동평균선과 20일 이동평균선 간에 발생하는 골든 크로스와 데드 크로스를 기반으로 매수와 매도를 진행하고 있다. 그렇기 때문에 차트를 기반으로 분석하기 위해서는 차트 내에서 5일 이동평균선과 20일 이동평균선을 제외한 나머지를 삭제하고, 골든 크로스와 데드 크로스를 나타내주는 신호를 추가해준 후에 비교해보면 된다.

 

키움증권 수식 수정

일단 기본적으로 키움증권의 차트에서 보여지는 보조 지표로 5일 이동평균선과 20일 이동평균선만 남겨놓고 다 끈 다음에, 이동평균선의 두께를 2point로 설정해서 두껍게 만들어주자. 아래의 화면은 이동평균선 선을 더블 클릭 하면 나오는 화면이다.

[왼쪽 사진] 5와 20에만 체크, [오른쪽 사진] 선 너비를 2pt로 설정 

그 후에는 이제 신호 검색 수식을 추가함으로써 골든 크로스가 발생한 시점과 데드 크로스가 발생한 시점을 보다 손쉽게 확인할 수 있도록 하자. 신호 검색 수식은 차트 화면 위에서 오른쪽 클릭을 한 후에 [수식 관리자(M)]를 누르면 메뉴가 나오게 되는데, 그 왼쪽에 [신호 검색]이 있다. 그걸 누르고 사용자 지표를 클릭한 후 화면의 윗쪽에 있는 [새로 만들기]를 눌러서 수식을 만들어보자.

 

새로 만들기를 하면 검색식명과 그 아래에 수식이라는 부분이 나오게 되고 오른쪽에는 색상과 표시를 설정하는 창이 뜬다. 키움증권 수식은 파이썬과 다소 다르긴 하나, 키움증권에서 자체적으로 지원하고 있는 수식들이 있기 때문에 우리는 그 함수를 이용해서 제작해주면 된다. 일단 골든 크로스와 데드 크로스 두 개를 만들 것이고, 수식은 아래와 같다.

  • 골든 크로스 : CrossUp(avg(C, period1), avg(C, period2))
  • 데드 크로스 : CorssDown(avg(C, period1), avg(C, period2)) 

그 후에 지표변수 메뉴를 눌러서 period1은 5, period2는 20을 입력해주자. 그 후에는 화면의 상단 부분에 있는 수식 검증을 클릭한 후, 작업 저장을 해주고 나서 데드 크로스도 같은 방식으로 제작해주도록 하자. 본인은 골든 크로스의 경우 색상을 빨간색으로, 데드 크로스의 경우 색상을 파란색으로 나타내도록 했다.

 

작업 저장을 눌렀으면, 차트 위에서 오른쪽 클릭을 누른 후에 [신호검색적용(R)] 버튼을 누른 후 '골든'과 '데드'를 검색해서 적용해주도록 하자. 그러면 이제 아래의 오른쪽과 같이 빨간색 화살표와 파란색 화살표들이 차트 위에 표시된다.

 

 


728x90

 

 

백테스팅 자료와 대조

일단 지난 게시글에서도 확인할 수 있듯이, 최초로 매도 조건이 충족되어 매도하는 종목이 발생한 시점은 2020년 1월 20일이기 때문에 차트 역시 2020년 1월 20일까지만 표시하도록 설정한 후에 백테스팅 결과값과 차트를 대조해보자.

달력 버튼을 눌러서 일자를 2020년 1월 20일로 맞추면 그 날 까지의 데이터를 보여준다

 

우리의 백테스팅 결과에서 가장 처음으로 매도 조건을 충족시킨 종목의 종목 코드는 000100이었고, 매도 일자는 2020년 1월 20일로 출력되었었다. 일단 매수를 올바르게 했고 매도를 올바르게 했는지, 만원의 손실이 날 수 있는 지점에서 매수를 한 것인지 확인해보도록 하자.

손실이 날 만한 지점에서 매수를 했다는 것을 알 수 있다. 즉, 우리는 골든 크로스가 이루어진 시점의 종가에 매수한 후 데드 크로스가 이루어진 시점의 종가에 매도하는 것이기 때문에 손실을 보는 지점에서 매수와 매도를 진행했고, 백테스팅은 올바르게 이루어졌다. 

그럼 이제 보유 종목들은 매도를 안 하는 것이 맞는지 확인해보도록 하자. 아래의 결과값에서도 확인할 수 있지만, 2020년 1월 20일을 기준으로 보유하고 있는 종목은 004170, 000100, 002450, 003580, 000080, 001630, 002320, 003690, 000720, 001390의 10개 종목이고 이 중 000100은 매도되었으므로 9개 종목에 대해 차트를 살펴보도록 하자. 여기서 주의 깊게 보아야 하는 것은 2020년 1월 3일 이후에 골든 크로스가 발생했고, 2020년 1월 20일을 기준으로 아직 데드 크로스가 발생하지 않았어야 한다는 것이다.

현재 조회일자: 20200120 (self.today값),  20200117 (self.yesterday값)
현재 보유 종목
       date    code buy_price  quantity
0  20200103  004170    292500         3
1  20200113  000100     44692        22
2  20200113  002450      1980       505
3  20200114  003580      8400       119
4  20200115  000080     31650        31
5  20200115  001630    113000         8
6  20200115  002320     30426        32
7  20200115  003690      9310       107
8  20200117  000720     42050        23
9  20200117  001390     12800        78

 

결과를 보면 9개 종목 모두 2020년 1월 20일을 기준으로는 데드 크로스가 발생하지 않아(파란색 화살표가 등장하지 않아) 아직 보유하고 있는 것이 맞다는 결론을 얻을 수 있다. 

그렇다면 가장 먼저 매수했던(2020년 1월 3일에 매수) 종목코드 004170(신세계)의 경우에는 언제 데드 크로스가 발생하는지 확인해보도록 하자. 차트를 돌려보니 2020년 1월 28일에 데드 크로스가 발생했기 때문에 매도해야 하지만, 백테스팅 결과에 따르면 1월 28일에 매도된 종목은 없는 것으로 출력된다. 즉, 매수는 잘 이뤄지지만 매도가 이뤄지지 않았다는 것이다. 

 

문제가 있다는 것을 확인했으니, 다음 게시글에서 과연 매도 함수에 어떤 문제가 있는지 살펴보고 그 부분을 수정한 후에 결과값을 다시 확인해보도록 하자.

 

 


728x90
반응형
Contents

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

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