AUTO TRADE/Back test
백테스트 프로그램을 만드는 방법에 관한 이야기.
-
지난 게시글에서 백테스팅 결과값들을 확인해보니 002320 종목이 수익권에 도달했음에도 불구하고 매도가 이루어지지 않은 모습을 확인할 수 있었다. 따라서 이번 게시글에서는 어떤 부분이 문제였는지 확인하고, 그 부분을 수정한 후에 전체적인 백테스팅 결과를 확인해보도록 하겠다. 매도 함수 수정하기 바로 아래와 같은 부분 때문에 발생한 오류였다. 즉, 첫 번째 매도 조건을 판단하는 데에 있어서 수익률 조건이 5% 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]) * f..
백테스팅 구축 (23) - 매도 함수 수정하기 ⑦지난 게시글에서 백테스팅 결과값들을 확인해보니 002320 종목이 수익권에 도달했음에도 불구하고 매도가 이루어지지 않은 모습을 확인할 수 있었다. 따라서 이번 게시글에서는 어떤 부분이 문제였는지 확인하고, 그 부분을 수정한 후에 전체적인 백테스팅 결과를 확인해보도록 하겠다. 매도 함수 수정하기 바로 아래와 같은 부분 때문에 발생한 오류였다. 즉, 첫 번째 매도 조건을 판단하는 데에 있어서 수익률 조건이 5% 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]) * f..
2021.07.11 -
지난 게시글에서도 이야기했듯이 아직 수정해야 할 부분이 하나 있는데, 그 내용은 단순한 내용이다. 바로 현재 보유 수량에 따른 거래 진행 방법의 수정인데, 아래의 사진을 참고하도록 하자. 작아서 잘 안 보일 수도 있으니 간단하게 설명을 해보자면 초기 매수 수량은 3주인데 반해, 첫 번째 매도 조건에서는 20%에 해당하는 1주를 매도했고, 두 번째 매도 조건에서는 50%에 해당하는 2주를 매도했다. 지금까지의 상황으로 보면 3주를 매수했고 이후에는 3주를 매도했기 때문에 추가적인 매도는 이루어지지 않아야 하지만, t_sell_quantity 칼럼에도 2라는 값이 입력되어 있는 것으로 보아 3주를 매수했음에도 5주를 매도했음을 확인할 수 있다. 즉, 없는 주식을 판 것이다. 매도 좀 똑바로 해라 이제 문제가..
백테스팅 구축 (22) - 매도 함수 수정하기 ⑥지난 게시글에서도 이야기했듯이 아직 수정해야 할 부분이 하나 있는데, 그 내용은 단순한 내용이다. 바로 현재 보유 수량에 따른 거래 진행 방법의 수정인데, 아래의 사진을 참고하도록 하자. 작아서 잘 안 보일 수도 있으니 간단하게 설명을 해보자면 초기 매수 수량은 3주인데 반해, 첫 번째 매도 조건에서는 20%에 해당하는 1주를 매도했고, 두 번째 매도 조건에서는 50%에 해당하는 2주를 매도했다. 지금까지의 상황으로 보면 3주를 매수했고 이후에는 3주를 매도했기 때문에 추가적인 매도는 이루어지지 않아야 하지만, t_sell_quantity 칼럼에도 2라는 값이 입력되어 있는 것으로 보아 3주를 매수했음에도 5주를 매도했음을 확인할 수 있다. 즉, 없는 주식을 판 것이다. 매도 좀 똑바로 해라 이제 문제가..
2021.07.11 -
이전 게시글에서는 백테스팅 결과를 확인했는데, 두 번째 매도 조건인 10% 수익과 세 번째 매도 조건인 15% 수익이 발생했음에도 불구하고 매도가 이뤄지지 않았다는 사실을 확인했다. 그렇다면 왜 매도 조건이 충족됐지만 매도할 수 없었는지 다시 확인해보도록 하자. 첫 번째 매도는 잘 된 거야? 일단 가장 먼저, 첫 번째 매도는 제대로 이뤄진 것인지 확인하기 위해 매도 가격( f_sell_price )이 매수 가격( buy_price ) 대비 5%의 수익이 발생한 가격인지 그리고 매도 비율은 0.2 비율에 맞춰서 잘 이뤄진 것인지 확인해보도록 하자. 수익률은 매도 가격 나누기 매수 가격이고, 매도 비율은 매도 수량 나누기 매수 수량이다. 데이터를 보니 수익률이 정확하게 1.05, 즉 5%의 수익률을 거둔 경..
백테스팅 구축 (21) - 매도 전략 수정하기 ⑤이전 게시글에서는 백테스팅 결과를 확인했는데, 두 번째 매도 조건인 10% 수익과 세 번째 매도 조건인 15% 수익이 발생했음에도 불구하고 매도가 이뤄지지 않았다는 사실을 확인했다. 그렇다면 왜 매도 조건이 충족됐지만 매도할 수 없었는지 다시 확인해보도록 하자. 첫 번째 매도는 잘 된 거야? 일단 가장 먼저, 첫 번째 매도는 제대로 이뤄진 것인지 확인하기 위해 매도 가격( f_sell_price )이 매수 가격( buy_price ) 대비 5%의 수익이 발생한 가격인지 그리고 매도 비율은 0.2 비율에 맞춰서 잘 이뤄진 것인지 확인해보도록 하자. 수익률은 매도 가격 나누기 매수 가격이고, 매도 비율은 매도 수량 나누기 매수 수량이다. 데이터를 보니 수익률이 정확하게 1.05, 즉 5%의 수익률을 거둔 경..
2021.07.10 -
지난 게시글에서는 첫 번째 매도 조건이 충족됐을 경우 어떻게 코드를 구축하는지에 대해 살펴봤었으니, 이번 게시글에서는 두 번째 매도 조건과 세 번째 매도 조건이 충족됐을 때에는 어떤 방식으로 매도를 진행해야 하는지에 대해 살펴보도록 하자. 두 번쨰 매도 조건 수정하기 두 번째 매도 조건부터는 남아 있는 수량을 확실하게 계산해주어야 한다. 즉, 현재 보유 종목 데이터가 포함되어 있는 변수에서 현재 보유 중인 주식수에서 첫 번째 매도 조건에서 매도한 수량만큼을 제외한 나머지 수량 안에 우리가 매도할 수 있는 수량이 충분히 포함되어 있는지를 확인해주어야 한다는 것이다. 일단 첫 번째 매도 조건문 하에서 제작했던 코드를 그대로 가지고 와서 두 번째 매도 조건에도 제작해주도록 하자. 변경해주어야 할 부분은 sel..
백테스팅 구축 (20) - 매도 전략 수정하기 ④지난 게시글에서는 첫 번째 매도 조건이 충족됐을 경우 어떻게 코드를 구축하는지에 대해 살펴봤었으니, 이번 게시글에서는 두 번째 매도 조건과 세 번째 매도 조건이 충족됐을 때에는 어떤 방식으로 매도를 진행해야 하는지에 대해 살펴보도록 하자. 두 번쨰 매도 조건 수정하기 두 번째 매도 조건부터는 남아 있는 수량을 확실하게 계산해주어야 한다. 즉, 현재 보유 종목 데이터가 포함되어 있는 변수에서 현재 보유 중인 주식수에서 첫 번째 매도 조건에서 매도한 수량만큼을 제외한 나머지 수량 안에 우리가 매도할 수 있는 수량이 충분히 포함되어 있는지를 확인해주어야 한다는 것이다. 일단 첫 번째 매도 조건문 하에서 제작했던 코드를 그대로 가지고 와서 두 번째 매도 조건에도 제작해주도록 하자. 변경해주어야 할 부분은 sel..
2021.07.10 -
지난 게시글에서는 분할 매도 과정에서 발생할 수 있는 문제점을 어떻게 처리해야 하는지 그리고 조건문 아래에는 어떤 조건을 설정해두어야 오류 없이 데이터를 저장할 수 있는지에 대해 살펴보았다. 따라서 이번 게시글에서는 조건문 아래를 제작한 후 전체 코드를 디버그함으로써 결과값을 확인해보도록 하겠다. 손절 조건 수정하기 일단 기본적으로 우리는 이전에 5일 이동평균선과 20일 이동평균선의 데드 크로스가 발생했을 경우 수익 실현을 하는 코드를 제작했었는데, 저번 게시글에서 이 전략을 수정해서 데드 크로스가 발생했을 경우에는 보유 수량을 모두 매도하는 방향으로 설정했고 수익 실현 구간이 아닌 손절매 구간으로 수정했다. 따라서 해당 코드를 손절매 구간으로 설정했기 때문에 데이터를 입력하는 지점 역시 기존의 칼럼이 ..
백테스팅 구축 (19) - 매도 전략 수정하기 ③지난 게시글에서는 분할 매도 과정에서 발생할 수 있는 문제점을 어떻게 처리해야 하는지 그리고 조건문 아래에는 어떤 조건을 설정해두어야 오류 없이 데이터를 저장할 수 있는지에 대해 살펴보았다. 따라서 이번 게시글에서는 조건문 아래를 제작한 후 전체 코드를 디버그함으로써 결과값을 확인해보도록 하겠다. 손절 조건 수정하기 일단 기본적으로 우리는 이전에 5일 이동평균선과 20일 이동평균선의 데드 크로스가 발생했을 경우 수익 실현을 하는 코드를 제작했었는데, 저번 게시글에서 이 전략을 수정해서 데드 크로스가 발생했을 경우에는 보유 수량을 모두 매도하는 방향으로 설정했고 수익 실현 구간이 아닌 손절매 구간으로 수정했다. 따라서 해당 코드를 손절매 구간으로 설정했기 때문에 데이터를 입력하는 지점 역시 기존의 칼럼이 ..
2021.07.10 -
지난 게시글에서 sell() 함수 내에 있는 코드 중 수정해야 할 코드는 어떤 부분들인지, 그리고 수정하는 과정에서 발생할 수 있는 문제는 무엇이 있는지에 대해 살펴봤다. 따라서 지난 게시글에서 살펴봤던 내용들을 바탕으로 이번 게시글에서는 코드를 제작하고, 그 결과값들을 확인해보도록 하겠다. fillna() 입력하기 데이터프레임(DataFrame) 내에서는 데이터가 입력되지 않은 부분을 NaN으로 표시된다. 즉, 아직 매도했던 이력이 없다면 매도 일자( f_sell_date, s_sell_date, t_sell_date, n_sell_date ) 자리에는 데이터가 입력되어 있지 않으므로 NaN 값이 입력되어 있다. 하지만 이는 하나의 데이터가 아니기 때문에 데이터가 저장되어 있는지 아닌지의 여부를 판단하..
백테스팅 구축 (18) - 매도 전략 수정하기 ②지난 게시글에서 sell() 함수 내에 있는 코드 중 수정해야 할 코드는 어떤 부분들인지, 그리고 수정하는 과정에서 발생할 수 있는 문제는 무엇이 있는지에 대해 살펴봤다. 따라서 지난 게시글에서 살펴봤던 내용들을 바탕으로 이번 게시글에서는 코드를 제작하고, 그 결과값들을 확인해보도록 하겠다. fillna() 입력하기 데이터프레임(DataFrame) 내에서는 데이터가 입력되지 않은 부분을 NaN으로 표시된다. 즉, 아직 매도했던 이력이 없다면 매도 일자( f_sell_date, s_sell_date, t_sell_date, n_sell_date ) 자리에는 데이터가 입력되어 있지 않으므로 NaN 값이 입력되어 있다. 하지만 이는 하나의 데이터가 아니기 때문에 데이터가 저장되어 있는지 아닌지의 여부를 판단하..
2021.07.09 -
지난 게시글에서 매도 전략을 어떻게 수정할 것인지에 대한 로드맵을 설정했으니, 이번 게시글에서는 본격적으로 매도 전략을 수정해보도록 하자. 매도 변수 설정하기 매도 변수에서 설정해야 하는 변수는 수익률 변수와 각 수익률 별 매도 비율 변수이다. 즉, 5%에서 분할 매도할 비율과 10%에서 분할 매도할 비율 등을 사전에 설정해두어야 그를 바탕으로 매도를 진행하게 되며 더 나아가 추후에 매도 전략을 수정할 때에도 해당 변수만 수정해주면 되기 때문에 유지보수 측면에서도 더욱 편리하다. 아래와 같은 변수를 def __init__ 함수 아래에 제작해주도록 하자. self.first_sellprofit 변수는 첫 번째 매도 시의 수익률을 의미하는 변수이며, self.first_sellrate 변수는 첫 번째 매도 ..
백테스팅 구축 (17) - 매도 전략 수정하기 ①지난 게시글에서 매도 전략을 어떻게 수정할 것인지에 대한 로드맵을 설정했으니, 이번 게시글에서는 본격적으로 매도 전략을 수정해보도록 하자. 매도 변수 설정하기 매도 변수에서 설정해야 하는 변수는 수익률 변수와 각 수익률 별 매도 비율 변수이다. 즉, 5%에서 분할 매도할 비율과 10%에서 분할 매도할 비율 등을 사전에 설정해두어야 그를 바탕으로 매도를 진행하게 되며 더 나아가 추후에 매도 전략을 수정할 때에도 해당 변수만 수정해주면 되기 때문에 유지보수 측면에서도 더욱 편리하다. 아래와 같은 변수를 def __init__ 함수 아래에 제작해주도록 하자. self.first_sellprofit 변수는 첫 번째 매도 시의 수익률을 의미하는 변수이며, self.first_sellrate 변수는 첫 번째 매도 ..
2021.07.09 -
지난 게시글에서 백테스팅 결과값을 엑셀에 입력하고, 그 자료를 기반으로 데이터를 분석하는 방법에 대해 살펴봤었다. 이번 게시글에서는 그 자료를 바탕으로 매도 전략을 수정하고자 하는데, 바로 매도 시점을 수정할 예정이다. 일단 자료부터 보고 넘어가자. 백테스팅 결과가 좋지 않다 5일 이동평균선이 20일 이동평균선을 상향돌파할 때 매수하고, 5일 이동평균선이 20일 이동평균선을 하향돌파할 때 매도하는 거래 전략으로 1년 간의 데이터를 기반으로 백테스팅을 진행했는데, 시작금액 천만원에서 6월에는 최저 -210만원까지 내려갔다가 마지막에는 +23만원 가량으로 마무리됐다. 최종 수익률이 2%이긴 하지만, 최저 -21%까지 내려갔었던 점을 고려한다면 우리는 손실 거래분을 걸러낸다면 최대 23%의 수익을 얻어낼 수 ..
백테스팅 구축 (16) - 매도 전략 수정 로드맵 수립지난 게시글에서 백테스팅 결과값을 엑셀에 입력하고, 그 자료를 기반으로 데이터를 분석하는 방법에 대해 살펴봤었다. 이번 게시글에서는 그 자료를 바탕으로 매도 전략을 수정하고자 하는데, 바로 매도 시점을 수정할 예정이다. 일단 자료부터 보고 넘어가자. 백테스팅 결과가 좋지 않다 5일 이동평균선이 20일 이동평균선을 상향돌파할 때 매수하고, 5일 이동평균선이 20일 이동평균선을 하향돌파할 때 매도하는 거래 전략으로 1년 간의 데이터를 기반으로 백테스팅을 진행했는데, 시작금액 천만원에서 6월에는 최저 -210만원까지 내려갔다가 마지막에는 +23만원 가량으로 마무리됐다. 최종 수익률이 2%이긴 하지만, 최저 -21%까지 내려갔었던 점을 고려한다면 우리는 손실 거래분을 걸러낸다면 최대 23%의 수익을 얻어낼 수 ..
2021.07.09 -
이번 게시글에서는 엑셀에 입력된 데이터를 바탕으로 결과값들을 분석하는 방법에 대해 살펴볼 예정이다. 엑셀의 경우에는 vlookup이나 count, if 등의 다양한 함수들이 존재하지만 사실 우리가 사용할 함수는 몇 개 없다. 왜냐하면 단순하게 그 결과값을 바탕으로 가불가의 여부만 판단하는 것으로 족하기 때문이다. 함수만 간단하게 알아보고 결과값들을 분석해보도록 하겠다. 엑셀의 대표적인 함수 사실 가장 많이 사용되는 함수들이 있긴 하지만, 그건 논외로 하고 우리는 가장 많이 사용할 함수만 익히고 넘어가자. if 함수 : 조건문을 바탕으로 True와 False를 판단, 그 반환값을 바탕으로 출력값 설정 가능 count 함수 : 특정 조건에 맞는 셀의 개수를 세어주는 함수. counta, countif, co..
백테스팅 구축 (15) - 엑셀로 분석할 데이터 제작하기이번 게시글에서는 엑셀에 입력된 데이터를 바탕으로 결과값들을 분석하는 방법에 대해 살펴볼 예정이다. 엑셀의 경우에는 vlookup이나 count, if 등의 다양한 함수들이 존재하지만 사실 우리가 사용할 함수는 몇 개 없다. 왜냐하면 단순하게 그 결과값을 바탕으로 가불가의 여부만 판단하는 것으로 족하기 때문이다. 함수만 간단하게 알아보고 결과값들을 분석해보도록 하겠다. 엑셀의 대표적인 함수 사실 가장 많이 사용되는 함수들이 있긴 하지만, 그건 논외로 하고 우리는 가장 많이 사용할 함수만 익히고 넘어가자. if 함수 : 조건문을 바탕으로 True와 False를 판단, 그 반환값을 바탕으로 출력값 설정 가능 count 함수 : 특정 조건에 맞는 셀의 개수를 세어주는 함수. counta, countif, co..
2021.07.09 -
지난 게시글에서는 결과 데이터를 분석하기 위해 필요한 몇 가지 데이터들을 특정 변수에 입력한 후 그 값을 데이터프레임화 시킴으로써 우리가 전략을 수정하는 데에 있어서 필요한 데이터들을 수집했다. 그렇다면 이제 이를 바탕으로 데이터를 분석하기 위해서는 어떻게 해야 하는지 등에 대해 살펴보도록 하겠다. 데이터 분석 방법 개인적으로 가장 추천하고 싶은 방법 중 하나는 바로 엑셀을 다룰 줄만 안다면 엑셀을 이용하는 것이다. 엑셀에서는 단순한 값 비교를 통해 결과값을 보여주거나 하는 등의 동작을 간편하게 이용할 수 있도록 구축되어 있는 등 결과 데이터를 분석하는 데에도 상당히 용이한 기능들이 많이 탑재되어 있다. 물론 우리가 제작했던 self.df_tracking_data (결과값 데이터 변수)를 MySQL에 입..
백테스팅 구축 (14) - 결과값 엑셀에 입력하기지난 게시글에서는 결과 데이터를 분석하기 위해 필요한 몇 가지 데이터들을 특정 변수에 입력한 후 그 값을 데이터프레임화 시킴으로써 우리가 전략을 수정하는 데에 있어서 필요한 데이터들을 수집했다. 그렇다면 이제 이를 바탕으로 데이터를 분석하기 위해서는 어떻게 해야 하는지 등에 대해 살펴보도록 하겠다. 데이터 분석 방법 개인적으로 가장 추천하고 싶은 방법 중 하나는 바로 엑셀을 다룰 줄만 안다면 엑셀을 이용하는 것이다. 엑셀에서는 단순한 값 비교를 통해 결과값을 보여주거나 하는 등의 동작을 간편하게 이용할 수 있도록 구축되어 있는 등 결과 데이터를 분석하는 데에도 상당히 용이한 기능들이 많이 탑재되어 있다. 물론 우리가 제작했던 self.df_tracking_data (결과값 데이터 변수)를 MySQL에 입..
2021.07.08 -
지난 게시글까지가 백테스팅 전략을 수립하고 오류를 찾아내는 방법론에 대한 내용을 다루었다면, 이번 게시글부터는 백테스팅 과정에 있어서 어떤 문제점이 있었고 그를 어떻게 수정해야 하는지에 대해 살펴보고자 한다. 이동평균선 전략 백테스팅 결과 여태까지 제작했던 백테스팅 전략을 2020년 1월 1일부터 2020년 12월 31일까지 일년 간의 데이터를 백테스팅해 본 결과, 아래와 같은 결과를 얻었다. (물론 전 종목을 대상으로 하는 것이 아닌, 차트 데이터가 저장되어 있는 데이터만을 대상으로 한 것이다.) 결과값들을 계속해서 돌려보니 6월까지의 누적 손익이 최저값은 약 230만원 정도가 나오고, 어느 정도의 수익을 기록했다가 다시 손실을 기록하고 있는 모습을 보이며 결국에는 23만원의 수익을 얻었음을 확인할 수..
백테스팅 구축 (13) - 전략 수정하기지난 게시글까지가 백테스팅 전략을 수립하고 오류를 찾아내는 방법론에 대한 내용을 다루었다면, 이번 게시글부터는 백테스팅 과정에 있어서 어떤 문제점이 있었고 그를 어떻게 수정해야 하는지에 대해 살펴보고자 한다. 이동평균선 전략 백테스팅 결과 여태까지 제작했던 백테스팅 전략을 2020년 1월 1일부터 2020년 12월 31일까지 일년 간의 데이터를 백테스팅해 본 결과, 아래와 같은 결과를 얻었다. (물론 전 종목을 대상으로 하는 것이 아닌, 차트 데이터가 저장되어 있는 데이터만을 대상으로 한 것이다.) 결과값들을 계속해서 돌려보니 6월까지의 누적 손익이 최저값은 약 230만원 정도가 나오고, 어느 정도의 수익을 기록했다가 다시 손실을 기록하고 있는 모습을 보이며 결국에는 23만원의 수익을 얻었음을 확인할 수..
2021.07.07 -
지난 게시글에서 관련 오류를 모두 제거한 줄 알았는데, 매도 후 drop() 함수를 통해 특정 라인의 데이터를 삭제하는 것이 정상적으로 동작하지 않는 오류가 있었다. 왜 그런가 하고 살펴봤더니 buy() 함수에서 매수한 종목들은 self.account에 입력되었고, self.df_account는 self.account를 기반으로 제작되는데, drop()을 self.df_account를 대상으로 해버리니 암만 지워도 데이터는 정작 self.account에 남아 있기 때문에 매도한 종목이 현재 보유 종목에 계속해서 출력되는 것이다. 따라서 매수할 종목 데이터를 self.account 변수가 아닌 self.df_account 변수 내에 입력을 하게 되면 drop()으로 인해 데이터를 올바르게 삭제할 수 있다...
백테스팅 구축 (12) - buy 함수 수정하기지난 게시글에서 관련 오류를 모두 제거한 줄 알았는데, 매도 후 drop() 함수를 통해 특정 라인의 데이터를 삭제하는 것이 정상적으로 동작하지 않는 오류가 있었다. 왜 그런가 하고 살펴봤더니 buy() 함수에서 매수한 종목들은 self.account에 입력되었고, self.df_account는 self.account를 기반으로 제작되는데, drop()을 self.df_account를 대상으로 해버리니 암만 지워도 데이터는 정작 self.account에 남아 있기 때문에 매도한 종목이 현재 보유 종목에 계속해서 출력되는 것이다. 따라서 매수할 종목 데이터를 self.account 변수가 아닌 self.df_account 변수 내에 입력을 하게 되면 drop()으로 인해 데이터를 올바르게 삭제할 수 있다...
2021.07.07