지난 게시글에서 백테스팅 결과값들을 확인해보니 002320 종목이 수익권에 도달했음에도 불구하고 매도가 이루어지지 않은 모습을 확인할 수 있었다. 따라서 이번 게시글에서는 어떤 부분이 문제였는지 확인하고, 그 부분을 수정한 후에 전체적인 백테스팅 결과를 확인해보도록 하겠다.
매도 함수 수정하기
바로 아래와 같은 부분 때문에 발생한 오류였다. 즉, 첫 번째 매도 조건을 판단하는 데에 있어서 수익률 조건이 5% <= < 10% 범위 내로 한정되어 있었기 때문에 발생한 오류이다.
## 첫 번째 수익률 조건
if (float(row[3]) * float(self.sec_sellprofit)) > float(self.chart_data['high'].iloc[1]) >= (float(row[3]) * float(self.first_sellprofit)):
## 두 번째 수익률 조건
if float(self.chart_data['high'].iloc[1]) >= (float(row[3]) * float(self.sec_sellprofit)):
## 세 번째 수익률 조건
if float(self.chart_data['high'].iloc[1]) >= (float(row[3]) * float(self.third_sellprofit)):
따라서 각각의 수익률 조건을 아래와 같이 수정해준 후에, 다시 002320 종목의 거래 이력을 조회해보도록 하자.
## 첫 번째 수익률 조건
if float(self.chart_data['high'].iloc[1]) >= (float(row[3]) * float(self.first_sellprofit)):
## 두 번째 수익률 조건
if float(self.chart_data['high'].iloc[1]) >= (float(row[3]) * float(self.sec_sellprofit)):
## 세 번째 수익률 조건
if float(self.chart_data['high'].iloc[1]) >= (float(row[3]) * float(self.third_sellprofit)):
종목코드
매수일
매도1
매도2
매도3
002320
20200115
20200116
20200116
20200117
거래 데이터를 확인해보니 위와 같은 결과값이 입력되었다. 이전 게시글에서 살펴봤던 내용처럼 매수일은 20200115이지만, 매도일은 곧바로 다음 날에 두 번, 다다음 날에 한 번의 매도가 이루어지는 모습을 확인해볼 수 있다. 그럼 이제 차트를 가지고 와서 1월 15일에 매수하는 것이 맞는지, 그리고 1월 16일에는 두 번 매도하는 게 맞는지와 세 번째 매도는 1월 17일에 진행되는 게 맞는지 한번 확인해보도록 하자.
위의 차트 내에서 확인할 수 있듯이, 빨간색 화살표(파란색 선)가 표시된 부분이 바로 1월 15일이다. 그리고 빨간색 네모칸은 코드를 수정한 이후의 분할 매도 구간이며, 주황색 네모칸은 코드를 수정하기 이전의 분할 매도 구간이다. 즉, 분할 매도가 올바르게 이루어지고 있다는 사실을 확인할 수 있다.
728x90
전체적인 백테스팅 결과 조회하기
2020년 1월 1일부터 2021년 1월 1일까지의 데이터를 바탕으로 5일 이동평균선이 20일 이동평균선을 상향돌파 시 매수하고 5일 이동평균선이 20일 이동평균선을 하향돌파 시 손절매하는 거래 전략을 수립해서 거래를 진행해본 결과, 다음과 같은 결과를 얻었다. 분할 매도 조건을 추가하기 전의 데이터와 비교해보면 괄목할 만한 개선이 이루어졌다고 볼 수 있다.
분할 매도 조건 추가 전의 백테스팅 결과 6월 30일까지의 누적손익 : -2,090,622원 12월 31일까지의 누적손익 : 238,108원
분할 매도 조건 추가 후의 백테스팅 결과 6월 30일까지의 누적손익 : 607,394원 12월 31일까지의 누적손익 : 1,626,661원
## 출력 결과 ##
현재 조회일자: 20201231 (self.today값), 20201230 (self.yesterday값)
현재 보유 종목
date code buy_price quantity profit
0 20200103 004170 292500 3.0 NaN
1 20200115 001630 113000 8.0 NaN
2 20200115 002320 30426 32.0 NaN
3 20200117 001390 12800 78.0 NaN
4 20200207 004140 1685 593.0 NaN
.. ... ... ... ... ...
68 20200915 001450 22800 43.0 NaN
69 20201102 000180 1860 537.0 NaN
70 20201110 000640 122500 8.0 NaN
71 20201112 000210 73553 13.0 NaN
72 20201202 000640 136500 7.0 NaN
[73 rows x 5 columns]
현재 잔고: 393573
일별 손익: 0
누적 손익: 1626661
거래 이력:
code buy_date buy_price ... ma20_buy ma60_buy ma120_buy
0 004170 20200103 292500 ... 286325.00 264433.333333 257000.000000
1 000100 20200113 44692 ... 44028.20 41481.250000 41220.108333
2 002450 20200113 1980 ... 1841.75 1796.916667 1801.041667
3 003580 20200114 8400 ... 7907.00 7900.333333 5924.083333
4 000080 20200115 31650 ... 28227.50 28614.166667 26329.166667
.. ... ... ... ... ... ... ...
145 000180 20201102 1860 ... 1778.75 1700.583333 1634.333333
146 002900 20201103 1620 ... 1414.25 1294.333333 1162.516667
147 000640 20201110 122500 ... 114125.00 113248.333333 105968.333333
148 000210 20201112 73553 ... 73268.40 74690.116667 76389.608333
149 000640 20201202 136500 ... 129475.00 120683.333333 111042.500000
[150 rows x 30 columns]
거래 데이터가 저장되었습니다.
이처럼 가장 이상적인 거래 전략은 손실을 줄이는 방법이라는 것을 알았으면 한다. 물론 2020년은 어느 정도의 상승장이라고 보는게 맞기 때문에 이런 결과가 도출되었을 수도 있고, 이 거래 전략이 하락장에서도 먹히는 방법일 수도 있다. 이 내용은 본인이 하락장이라고 판단되는 시점을 대상으로 백테스팅을 돌려보면 결과값을 얻을 수 있으니, 만약 위 전략이 상승장에서만 먹히는 전략이었다면 상승장과 하락장을 어떻게 판단할지를 구분한 후에 장세에 따른 전략을 적용하면 된다. 이제 다음 게시글에서 결과값들을 분석해보면서 최종 결과값을 얻어 정리해보도록 하자.