PYTHON/Back test

백테스팅 구축 (23) - 매도 함수 수정하기 ⑦

  • -

지난 게시글에서 백테스팅 결과값들을 확인해보니 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년은 어느 정도의 상승장이라고 보는게 맞기 때문에 이런 결과가 도출되었을 수도 있고, 이 거래 전략이 하락장에서도 먹히는 방법일 수도 있다. 이 내용은 본인이 하락장이라고 판단되는 시점을 대상으로 백테스팅을 돌려보면 결과값을 얻을 수 있으니, 만약 위 전략이 상승장에서만 먹히는 전략이었다면 상승장과 하락장을 어떻게 판단할지를 구분한 후에 장세에 따른 전략을 적용하면 된다. 이제 다음 게시글에서 결과값들을 분석해보면서 최종 결과값을 얻어 정리해보도록 하자.

 

 


728x90
반응형
Contents

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

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