백테스팅
-
지난 게시글에서 백테스팅 결과값을 엑셀에 입력하고, 그 자료를 기반으로 데이터를 분석하는 방법에 대해 살펴봤었다. 이번 게시글에서는 그 자료를 바탕으로 매도 전략을 수정하고자 하는데, 바로 매도 시점을 수정할 예정이다. 일단 자료부터 보고 넘어가자. 백테스팅 결과가 좋지 않다 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 -
지난 게시글에서 백테스팅 결과를 실제 자료와 대조하면서 결과값을 확인해 본 결과, 매수 함수는 정상적으로 동작하지만 매도 함수는 정상적으로 동작하지 않음을 확인할 수 있었다. 따라서 이번 게시글에서는 오류가 발생한 원인이 무엇인지 확인하고, 그를 해결하고자 한다. 왜 매도를 안 해? 지난 게시글에서 004170(신세계) 종목이 2020년 1월 28일에 매도가 이뤄져야 했음에도 불구하고 매도가 이뤄지지 않았음을 확인할 수 있었다. 따라서 문제를 확인하고자 키움증권 데이터를 확인해보니 2020년 1월 28일은 화요일이었기 때문에 우리가 기존에 제작했던 날짜 계산 함수(cal_subday())는 2020년 1월 27일자의 데이터를 불러오고자 했을 것이다. 하지만 실제 데이터에 따르면 2020년 1월 28일 화..
백테스팅 구축 (11) - check_list 함수 수정하기지난 게시글에서 백테스팅 결과를 실제 자료와 대조하면서 결과값을 확인해 본 결과, 매수 함수는 정상적으로 동작하지만 매도 함수는 정상적으로 동작하지 않음을 확인할 수 있었다. 따라서 이번 게시글에서는 오류가 발생한 원인이 무엇인지 확인하고, 그를 해결하고자 한다. 왜 매도를 안 해? 지난 게시글에서 004170(신세계) 종목이 2020년 1월 28일에 매도가 이뤄져야 했음에도 불구하고 매도가 이뤄지지 않았음을 확인할 수 있었다. 따라서 문제를 확인하고자 키움증권 데이터를 확인해보니 2020년 1월 28일은 화요일이었기 때문에 우리가 기존에 제작했던 날짜 계산 함수(cal_subday())는 2020년 1월 27일자의 데이터를 불러오고자 했을 것이다. 하지만 실제 데이터에 따르면 2020년 1월 28일 화..
2021.07.06 -
매도 대상 종목, 보유 종목에서 제거하기 데이터프레임 내에서 특정 행을 삭제하기 위해서는 인덱스를 입력해서 해당 인덱스를 제거해야 한다. 데이터프레임 자료형(변수 이름은 df라고 가정)에서 특정 데이터가 입력되어 있는 위치의 인덱스 값을 얻어오는 방식은 아래와 같다. df.index(df['column_name'] == data) 우리가 제작한 코드 내에서 df에 해당하는 변수는 바로 self.df_account이다. 현재 보유 종목을 데이터프레임 형태로 만들어서 출력했고 sell() 함수 내에서도 그를 바탕으로 for문을 돌리고 있으니, 매도 후에는 조회하고 있는 종목 코드가 위치한 행의 인덱스 값을 반환받아서 self.df_account 변수 내에서 제거해야 하는 것이다. 아래는 특정 자료가 위치해 ..
백테스팅 구축 (9) - 실시간 잔고 업데이트매도 대상 종목, 보유 종목에서 제거하기 데이터프레임 내에서 특정 행을 삭제하기 위해서는 인덱스를 입력해서 해당 인덱스를 제거해야 한다. 데이터프레임 자료형(변수 이름은 df라고 가정)에서 특정 데이터가 입력되어 있는 위치의 인덱스 값을 얻어오는 방식은 아래와 같다. df.index(df['column_name'] == data) 우리가 제작한 코드 내에서 df에 해당하는 변수는 바로 self.df_account이다. 현재 보유 종목을 데이터프레임 형태로 만들어서 출력했고 sell() 함수 내에서도 그를 바탕으로 for문을 돌리고 있으니, 매도 후에는 조회하고 있는 종목 코드가 위치한 행의 인덱스 값을 반환받아서 self.df_account 변수 내에서 제거해야 하는 것이다. 아래는 특정 자료가 위치해 ..
2021.07.06 -
지난 게시글에서는 매수 조건 충족 종목(self.buy_list 변수)을 대상으로 for문을 통해 한 종목 한 종목 매수하는 방법에 대해 알아보았다. 이번 게시글에서는 일단 먼저 self.account를 보기 좋게 좀 편집하고, 현재 잔고가 부족한 경우에는 매수를 못하도록 하는 코드를 제작해보도록 하겠다. self.account, 데이터프레임화 class algorithm1(): def __init__(self, start_date, end_date, all_range): self.all_range = all_range self.today = start_date self.account = {'date':[], 'code':[], 'buy_price':[], 'quantity':[]} self.init_m..
백테스팅 구축 (8) - 매도 함수 구축지난 게시글에서는 매수 조건 충족 종목(self.buy_list 변수)을 대상으로 for문을 통해 한 종목 한 종목 매수하는 방법에 대해 알아보았다. 이번 게시글에서는 일단 먼저 self.account를 보기 좋게 좀 편집하고, 현재 잔고가 부족한 경우에는 매수를 못하도록 하는 코드를 제작해보도록 하겠다. self.account, 데이터프레임화 class algorithm1(): def __init__(self, start_date, end_date, all_range): self.all_range = all_range self.today = start_date self.account = {'date':[], 'code':[], 'buy_price':[], 'quantity':[]} self.init_m..
2021.07.06 -
지난 포스팅에서 길고 긴 오류 수정 과정을 거치고 넘어왔다. 이제 오류가 없었으면 하지만 사실 오류는 언제 발생할지도 모르고 어디서 발생할지도 모른다. 기껏 게시글을 보면서 "오... 잘 따라하기만 하면 나도 할 수 있을 것 같아."라는 생각에 따라하기 시작했다가 "아 뭔데... 왜 제대로 안 만드는데.."라는 생각이 들었다면 변명의 여지가 없지만, 너그러운 마음으로 이해해주십사 하는 마음으로 이번 게시글을 작성한다. 디테일한 매수 조건 설정 일전에 시작일자를 20200103으로 설정하고 백테스팅을 진행해본 결과, 2020년 1월 3일에 매수할 종목이 총 10개가 나왔다. 아래에 나와 있는 종목의 종가 중 가장 작은 값이 30만원이니 종목당 30만원씩만 매수한다고 가정하면 하루에만 300만원 어치를 매수..
백테스팅 구축 (7) - 매수 조건 설정 및 계좌 현황 제작지난 포스팅에서 길고 긴 오류 수정 과정을 거치고 넘어왔다. 이제 오류가 없었으면 하지만 사실 오류는 언제 발생할지도 모르고 어디서 발생할지도 모른다. 기껏 게시글을 보면서 "오... 잘 따라하기만 하면 나도 할 수 있을 것 같아."라는 생각에 따라하기 시작했다가 "아 뭔데... 왜 제대로 안 만드는데.."라는 생각이 들었다면 변명의 여지가 없지만, 너그러운 마음으로 이해해주십사 하는 마음으로 이번 게시글을 작성한다. 디테일한 매수 조건 설정 일전에 시작일자를 20200103으로 설정하고 백테스팅을 진행해본 결과, 2020년 1월 3일에 매수할 종목이 총 10개가 나왔다. 아래에 나와 있는 종목의 종가 중 가장 작은 값이 30만원이니 종목당 30만원씩만 매수한다고 가정하면 하루에만 300만원 어치를 매수..
2021.07.05 -
지난 게시글에서 이동평균선 간 대소 비교를 통해 매수 가능 종목을 튜플 형태로 자료를 정리한 후에 마지막에는 데이터프레임으로 만들어서 print()문을 적용해서 출력했었다. 하지만 언뜻 봐도 매수 대상 종목이 많았고, 매일 매일 매수 종목들이 10개씩 생긴다면 단순한 모의 백테스팅에서 뿐만 아니라 실전 투자에 있어서도 문제가 발생하게 된다. 하지만 이 문제는 나중에 해결하는 거로 하고, 이번 게시글부터는 buy_list 변수에 입력된 모든 종목을 매수한다고 가정하고 각각 얼만큼의 금액만큼 매수할 것인지를 설정하고 그 결과를 살펴볼 예정이다. 코드 오류 수정 (1) - def __init__ 부분 빨간 글씨로 오류가 발생하지는 않았지만 일자 계산에 있어서 오류가 발생했다. 입력한 일자가 20200101인 ..
백테스팅 구축 (6) - 오류 수정지난 게시글에서 이동평균선 간 대소 비교를 통해 매수 가능 종목을 튜플 형태로 자료를 정리한 후에 마지막에는 데이터프레임으로 만들어서 print()문을 적용해서 출력했었다. 하지만 언뜻 봐도 매수 대상 종목이 많았고, 매일 매일 매수 종목들이 10개씩 생긴다면 단순한 모의 백테스팅에서 뿐만 아니라 실전 투자에 있어서도 문제가 발생하게 된다. 하지만 이 문제는 나중에 해결하는 거로 하고, 이번 게시글부터는 buy_list 변수에 입력된 모든 종목을 매수한다고 가정하고 각각 얼만큼의 금액만큼 매수할 것인지를 설정하고 그 결과를 살펴볼 예정이다. 코드 오류 수정 (1) - def __init__ 부분 빨간 글씨로 오류가 발생하지는 않았지만 일자 계산에 있어서 오류가 발생했다. 입력한 일자가 20200101인 ..
2021.07.05 -
지난 게시글에서는 특정 일자의 차트 데이터를 조회하는 코드를 모두 구축했고, 잘 조회되는 것을 확인했다. 이번 게시글에서는 이전부터 계속 설명했던 이동평균선 간의 골든크로스와 데드크로스를 기준으로 매수가 가능한 종목인지 아닌지를 판단하는 코드를 구축하고자 한다. 여느 때처럼, 함수부터 제작하자. 거래의 가불가 판단하기 거래의 가불가를 판단하기 위해서는 일단 데이터가 필요하고, 우리는 그 데이터를 check_list() 함수의 self.chart_data라는 변수 안에 저장했다. 따라서 self.chart_data라는 변수를 또 다른 함수(justify_ma 함수)로 전달해준 후에, 그 함수 내에서 거래의 가능 여부를 판단한 후에 거래가 가능하다면 True를, 불가능하다면 False를 반환함으로써 해당 종..
백테스팅 구축 (5) - 매수 조건 제작지난 게시글에서는 특정 일자의 차트 데이터를 조회하는 코드를 모두 구축했고, 잘 조회되는 것을 확인했다. 이번 게시글에서는 이전부터 계속 설명했던 이동평균선 간의 골든크로스와 데드크로스를 기준으로 매수가 가능한 종목인지 아닌지를 판단하는 코드를 구축하고자 한다. 여느 때처럼, 함수부터 제작하자. 거래의 가불가 판단하기 거래의 가불가를 판단하기 위해서는 일단 데이터가 필요하고, 우리는 그 데이터를 check_list() 함수의 self.chart_data라는 변수 안에 저장했다. 따라서 self.chart_data라는 변수를 또 다른 함수(justify_ma 함수)로 전달해준 후에, 그 함수 내에서 거래의 가능 여부를 판단한 후에 거래가 가능하다면 True를, 불가능하다면 False를 반환함으로써 해당 종..
2021.07.04 -
지난 게시글에서 while문을 통해 백테스팅을 진행하는 일자가 우리가 입력했던 종료일자(end_date)와 같아지는 순간 진행을 멈추도록 하는 코드를 구축했다. 이번 게시글에서는 while문 아래에서 하루 하루 돌면서 그 날의 종목의 차트 데이터를 불러오고 그를 바탕으로 매수 조건에 충족하는지를 살펴보는 코드를 구축할 예정이다. 실제 거래와 백테스팅 간의 괴리 사실 우리가 구현하고자 하는 거래 전략을 검증(백테스팅) 해보는 방법은 크게 두 가지가 있다. 머리로 가볍게 생각해낼 수 있는 전략들을 직접 차트를 보면서 어렵지 않게 분석할 수 있지만 그 수치들을 일일이 직접 계산하고 엑셀 등과 같은 데이터 관리 프로그램에 저장해야 한다는 단점이 있는 방법과 머리로 생각해낸 전략을 오랜 시간 정상적으로 동작하는 ..
백테스팅 구축 (4) - 일자별 차트 데이터 불러오기지난 게시글에서 while문을 통해 백테스팅을 진행하는 일자가 우리가 입력했던 종료일자(end_date)와 같아지는 순간 진행을 멈추도록 하는 코드를 구축했다. 이번 게시글에서는 while문 아래에서 하루 하루 돌면서 그 날의 종목의 차트 데이터를 불러오고 그를 바탕으로 매수 조건에 충족하는지를 살펴보는 코드를 구축할 예정이다. 실제 거래와 백테스팅 간의 괴리 사실 우리가 구현하고자 하는 거래 전략을 검증(백테스팅) 해보는 방법은 크게 두 가지가 있다. 머리로 가볍게 생각해낼 수 있는 전략들을 직접 차트를 보면서 어렵지 않게 분석할 수 있지만 그 수치들을 일일이 직접 계산하고 엑셀 등과 같은 데이터 관리 프로그램에 저장해야 한다는 단점이 있는 방법과 머리로 생각해낸 전략을 오랜 시간 정상적으로 동작하는 ..
2021.07.04