AUTO TRADE/Back test
백테스트 프로그램을 만드는 방법에 관한 이야기.
-
이번 게시글에서는 백테스팅을 진행하는 과정에 있어서 여러 가지 알고리즘들을 생성하게 될텐데, 그 과정에서 고려해야 하는 요소에 대해 다루어보고자 한다. 목차는 다음과 같으며, 목차를 클릭하면 해당하는 내용으로 들어가게 된다. 백테스팅 시에는 예상외로 고려해야 할 부분들이 많고 소제목 하나 하나의 내용이 길기 때문에, 차분하게 천천히 읽어나가길 권합니다. ※ 퍼갈 경우 반드시 출처를 표기해주시기 바랍니다. [목차] 백테스팅의 의의 "시점이 중요하다". 시점을 기준으로 데이터를 나누어 살펴보아야 한다. 백테스팅 시에는 나타나지 않는 실 거래의 문제점 백테스팅 시에 사용하는 알고리즘이 올바르게 동작하는지 확인해야 한다. 필요한 데이터를 모두 입력하고 확인하라. 백테스팅의 의의 백테스트(Back-test)는 기..
백테스팅 방법론이번 게시글에서는 백테스팅을 진행하는 과정에 있어서 여러 가지 알고리즘들을 생성하게 될텐데, 그 과정에서 고려해야 하는 요소에 대해 다루어보고자 한다. 목차는 다음과 같으며, 목차를 클릭하면 해당하는 내용으로 들어가게 된다. 백테스팅 시에는 예상외로 고려해야 할 부분들이 많고 소제목 하나 하나의 내용이 길기 때문에, 차분하게 천천히 읽어나가길 권합니다. ※ 퍼갈 경우 반드시 출처를 표기해주시기 바랍니다. [목차] 백테스팅의 의의 "시점이 중요하다". 시점을 기준으로 데이터를 나누어 살펴보아야 한다. 백테스팅 시에는 나타나지 않는 실 거래의 문제점 백테스팅 시에 사용하는 알고리즘이 올바르게 동작하는지 확인해야 한다. 필요한 데이터를 모두 입력하고 확인하라. 백테스팅의 의의 백테스트(Back-test)는 기..
2022.06.12 -
[파일명 : algorithm_1] 종목별 거래량과 거래대금 불러오기 종목별로 사전에 설정한 선정 기준을 충족시키는지 아닌지 그 여부를 판단하기 위해서는 반드시 종목별 거래량과 거래대금, 그리고 종가와 시가 고가 저가 등을 가져와야 한다. 그 방법은 크게 두 가지로 나뉘는데, 데이터프레임에 조건을 걸어 해당 조건을 충족시키는 값을 가져오는 것과 특정 열의 데이터를 모두 불러와서 리스트 형태로 저장한 후 인덱싱을 통해 접근하는 방법이다. ############################################## #### 데이터 변수명이 __day_dataframe일 경우 #### ############################################## self.today = 202101..
2.4 백테스팅하기 - 종목 선정하기 (2)[파일명 : algorithm_1] 종목별 거래량과 거래대금 불러오기 종목별로 사전에 설정한 선정 기준을 충족시키는지 아닌지 그 여부를 판단하기 위해서는 반드시 종목별 거래량과 거래대금, 그리고 종가와 시가 고가 저가 등을 가져와야 한다. 그 방법은 크게 두 가지로 나뉘는데, 데이터프레임에 조건을 걸어 해당 조건을 충족시키는 값을 가져오는 것과 특정 열의 데이터를 모두 불러와서 리스트 형태로 저장한 후 인덱싱을 통해 접근하는 방법이다. ############################################## #### 데이터 변수명이 __day_dataframe일 경우 #### ############################################## self.today = 202101..
2022.01.02 -
지난 게시글에서는 종목별 데이터들을 하나의 변수로 모아 종목별 변수들을 구축했으니, 이번 게시글에서는 그 종목별 변수들을 대상으로 백테스팅을 진행할 종목을 선정할 예정이다. 종목 선정 기준은 무엇으로 설정해야 할지에 대한 고민은 개개인 모두가 다르겠지만, 여러 가지 조건들을 설정해서 종목을 선정할 수 있다는 것만큼은 확실하다. 여기서 어떤 기준 하에 종목을 선정할 것인지와 같은 세부적인 기준들은 개개인이 설정할 일이고, 본인이 게시글 본문에서 사용하는 기준들은 모두 개인적인 기준이니 만큼 '이렇게 하면 수익이 나나?'하는 생각은 지양하고 읽어주길 바란다. 설령 이 기준이 수익이 날 수 있는 종목을 골라주는 기준이라 하더라도, 그를 바탕으로 거래를 해왔던 사람만 수익을 낼 수 있지 그렇지 않았던 사람이라면..
2.3 백테스팅하기 - 종목 선정하기 (1)지난 게시글에서는 종목별 데이터들을 하나의 변수로 모아 종목별 변수들을 구축했으니, 이번 게시글에서는 그 종목별 변수들을 대상으로 백테스팅을 진행할 종목을 선정할 예정이다. 종목 선정 기준은 무엇으로 설정해야 할지에 대한 고민은 개개인 모두가 다르겠지만, 여러 가지 조건들을 설정해서 종목을 선정할 수 있다는 것만큼은 확실하다. 여기서 어떤 기준 하에 종목을 선정할 것인지와 같은 세부적인 기준들은 개개인이 설정할 일이고, 본인이 게시글 본문에서 사용하는 기준들은 모두 개인적인 기준이니 만큼 '이렇게 하면 수익이 나나?'하는 생각은 지양하고 읽어주길 바란다. 설령 이 기준이 수익이 날 수 있는 종목을 골라주는 기준이라 하더라도, 그를 바탕으로 거래를 해왔던 사람만 수익을 낼 수 있지 그렇지 않았던 사람이라면..
2022.01.02 -
지난 게시글에서 일자를 계산해주는 코드를 모두 구축했으니, 이번에는 그 일자를 바탕으로 백테스팅을 진행할 때 어떤 구조로 코드를 작성해야 하는지 살펴볼 예정이다. [파일명 : algortihm_1] while문 이용해서 일자 계산하기 일단 기본적으로 boss 파일 내에 존재하는 클래스를 사용하기 위해서는 import와 인스턴스 생성을 모두 해주어야 한다. 너무 복잡한 개념처럼 들린다면 설명은 제외하고, 아래와 같이 맨 위에서 import한 후에 def __init__ 안에서 calf = cal_function()이라는 코드를 통해 인스턴스를 생성해주면 된다. from boss import cal_function class algo_1(): def __init__(self, kospi_data, kosda..
2.2 백테스팅하기 - 일자 계산 코드 구축하기 (2)지난 게시글에서 일자를 계산해주는 코드를 모두 구축했으니, 이번에는 그 일자를 바탕으로 백테스팅을 진행할 때 어떤 구조로 코드를 작성해야 하는지 살펴볼 예정이다. [파일명 : algortihm_1] while문 이용해서 일자 계산하기 일단 기본적으로 boss 파일 내에 존재하는 클래스를 사용하기 위해서는 import와 인스턴스 생성을 모두 해주어야 한다. 너무 복잡한 개념처럼 들린다면 설명은 제외하고, 아래와 같이 맨 위에서 import한 후에 def __init__ 안에서 calf = cal_function()이라는 코드를 통해 인스턴스를 생성해주면 된다. from boss import cal_function class algo_1(): def __init__(self, kospi_data, kosda..
2022.01.01 -
백테스팅을 진행하는 과정에 있어서는 많은 방법들이 존재하는데, 크게 요약하자면 아래의 두 가지 방법으로 분류할 수 있다. 그 중 본인은 두 번째 방법을 선호하는 편이다. 왜냐하면 이게 실제 시장에서 실제로 개인이 거래를 진행할 때와 가장 유사한 메커니즘으로 거래를 진행하는 방법이기 때문이다. 한 종목 한 종목씩 조건에 부합하는지 여부를 판단하고 시뮬레이션하기 하루 하루 종목을 선정하여 선정된 종목들만 시뮬레이션하기 [파일명 : boss] 일자 계산 코드 구축하기 위의 두 번째 방법으로 시뮬레이션을 진행하기 위해서는 반드시 날짜 코드를 계산해야 한다. 다시 말해, 2021년 1월 1일자를 기준으로 종목을 선정한 후에 1월 2일자를 기준으로 종목을 선정할 수 있도록 2021.1.1과 2021.1.2를 계산해..
2.1 백테스팅하기 - 일자 계산 코드 구축하기 (1)백테스팅을 진행하는 과정에 있어서는 많은 방법들이 존재하는데, 크게 요약하자면 아래의 두 가지 방법으로 분류할 수 있다. 그 중 본인은 두 번째 방법을 선호하는 편이다. 왜냐하면 이게 실제 시장에서 실제로 개인이 거래를 진행할 때와 가장 유사한 메커니즘으로 거래를 진행하는 방법이기 때문이다. 한 종목 한 종목씩 조건에 부합하는지 여부를 판단하고 시뮬레이션하기 하루 하루 종목을 선정하여 선정된 종목들만 시뮬레이션하기 [파일명 : boss] 일자 계산 코드 구축하기 위의 두 번째 방법으로 시뮬레이션을 진행하기 위해서는 반드시 날짜 코드를 계산해야 한다. 다시 말해, 2021년 1월 1일자를 기준으로 종목을 선정한 후에 1월 2일자를 기준으로 종목을 선정할 수 있도록 2021.1.1과 2021.1.2를 계산해..
2022.01.01 -
이제 algorithm_1 이라는 파일 내에 있는 class algo_1() 에서는 kospi_data 와 kosdaq_data , 그리고 item_data 라는 세 개의 데이터를 인자로 받아 각각 self.kospi_data , self.kosdaq_data , self.item_data 라는 변수에 저장해주었다. 이제 여기서 self.item_data라는 변수를 대상으로 for문을 돌면서 종목 코드를 찾아내고, 그 종목 코드를 하나의 변수로 입력해줄 예정이다. [파일명 : algorithm_1] 데이터프레임 내에서 for문 사용하기 데이터프레임 형태의 데이터를 대상으로 반복문에 해당하는 for문을 사용하기 위해서는 .itertuples() 라는 메서드만 추가해주면 된다. 일단 종목별 종목 코드를 바탕..
1.5 백테스팅하기 - 종목별 변수 자동 생성하기 (2)이제 algorithm_1 이라는 파일 내에 있는 class algo_1() 에서는 kospi_data 와 kosdaq_data , 그리고 item_data 라는 세 개의 데이터를 인자로 받아 각각 self.kospi_data , self.kosdaq_data , self.item_data 라는 변수에 저장해주었다. 이제 여기서 self.item_data라는 변수를 대상으로 for문을 돌면서 종목 코드를 찾아내고, 그 종목 코드를 하나의 변수로 입력해줄 예정이다. [파일명 : algorithm_1] 데이터프레임 내에서 for문 사용하기 데이터프레임 형태의 데이터를 대상으로 반복문에 해당하는 for문을 사용하기 위해서는 .itertuples() 라는 메서드만 추가해주면 된다. 일단 종목별 종목 코드를 바탕..
2021.12.31 -
지난 게시글에서는 코스피와 코스닥 지수의 데이터를 불러오는 코드를 구축하고 넘어왔다. 이제 다음으로 구축할 코드는 바로 종목별 데이터가 담겨 있는 변수를 생성하는 것인데, 코스피 종목과 코스닥 종목 내에 있는 종목 개수는 2020년을 기준으로 2,268개 종목으로 정말 무수하게 많다. 그렇다면 이 종목들을 하나하나 변수로 설정해주고 그 변수에 각각의 데이터들을 입력해주어야 그 데이터를 바탕으로 백테스팅을 할 수 있다는 것인데, 너무 복잡하지 않을까 싶다. 어떤 방법이 있을까? 가장 먼저 떠오르는 방법으로는 시뮬레이션을 시작한 후, 데이터베이스 내에 저장되어 있는 종목 코드들을 모두 불러온 후에 하나 하나 돌면서 주가 데이터를 불러온 후 그 주가 데이터를 바탕으로 백테스팅을 진행하고, 한 종목이 끝나면 다..
1.4 백테스팅하기 - 종목별 변수 자동 생성하기 (1)지난 게시글에서는 코스피와 코스닥 지수의 데이터를 불러오는 코드를 구축하고 넘어왔다. 이제 다음으로 구축할 코드는 바로 종목별 데이터가 담겨 있는 변수를 생성하는 것인데, 코스피 종목과 코스닥 종목 내에 있는 종목 개수는 2020년을 기준으로 2,268개 종목으로 정말 무수하게 많다. 그렇다면 이 종목들을 하나하나 변수로 설정해주고 그 변수에 각각의 데이터들을 입력해주어야 그 데이터를 바탕으로 백테스팅을 할 수 있다는 것인데, 너무 복잡하지 않을까 싶다. 어떤 방법이 있을까? 가장 먼저 떠오르는 방법으로는 시뮬레이션을 시작한 후, 데이터베이스 내에 저장되어 있는 종목 코드들을 모두 불러온 후에 하나 하나 돌면서 주가 데이터를 불러온 후 그 주가 데이터를 바탕으로 백테스팅을 진행하고, 한 종목이 끝나면 다..
2021.12.31 -
이번에는 지난 게시글에서 불러온 지수 차트 데이터를 바탕으로 이동평균선 등과 같은 여러 가지 보조 데이터를 제작하기 위해 사용되는 talib 라이브러리의 사용 방법에 대해 살펴보고자 한다. 이 라이브러리는 설치하는 절차가 다소 복잡한 편인데, 그래도 그중에 가장 직관적이고 가장 깔끔하게 설명해둔 글이 있는 것 같아서 가져왔다. 설치는 아래의 링크에 들어가서 하는 것으로 하고, 여기서는 이동평균선 구축에 대해서만 살펴볼 예정이다. ※ [TA-lib 설치 방법, 링크 바로가기] [파일명 : talib_calculator] 이동평균선 구축하기 talib을 설치했다면 여느 라이브러리와 마찬가지로 import를 해주어야 한다. 그 후 이동평균선을 제작하는 방법은 talib.MA(데이터프레임['칼럼명'], 기간)을..
1.3 백테스팅하기 - talib 라이브러리 이용하기이번에는 지난 게시글에서 불러온 지수 차트 데이터를 바탕으로 이동평균선 등과 같은 여러 가지 보조 데이터를 제작하기 위해 사용되는 talib 라이브러리의 사용 방법에 대해 살펴보고자 한다. 이 라이브러리는 설치하는 절차가 다소 복잡한 편인데, 그래도 그중에 가장 직관적이고 가장 깔끔하게 설명해둔 글이 있는 것 같아서 가져왔다. 설치는 아래의 링크에 들어가서 하는 것으로 하고, 여기서는 이동평균선 구축에 대해서만 살펴볼 예정이다. ※ [TA-lib 설치 방법, 링크 바로가기] [파일명 : talib_calculator] 이동평균선 구축하기 talib을 설치했다면 여느 라이브러리와 마찬가지로 import를 해주어야 한다. 그 후 이동평균선을 제작하는 방법은 talib.MA(데이터프레임['칼럼명'], 기간)을..
2021.12.30 -
들어가기 전에 백테스팅을 진행하기 위해 필요한 자료에는 어떤 것들이 있을지 생각해보자. 개개인이 만들고자 하는 알고리즘이 어떤 알고리즘인가에 따라 모두 다르겠지만, 기본적으로 종목별로 상이한 데이터(상장주식수, 거래량, 거래대금, 주가 차트 데이터 등)와 종목에 상관없이 공통적인 데이터(지수 데이터, 시황 데이터 등) 두 개는 반드시 필요할 것이다. 여기서 백테스팅을 진행하는 데에 있어서 필요한 여러 가지 데이터들을 백테스팅을 시작한 시점에서 데이터들을 조회하도록 하고 특정 변수에 저장하도록 한 후에 알고리즘 파일을 진행하는 것이 효과적이다. 아래의 그림을 참고해보자. 1번 작업 절차의 경우에는 boss 파일이 실행되는 순간 지수와 관련된 데이터들을 불러온 후, 알고리즘이 실행되면 데이터들이 저장되어 있..
1.2 백테스팅하기 - 필요한 자료 구축하기들어가기 전에 백테스팅을 진행하기 위해 필요한 자료에는 어떤 것들이 있을지 생각해보자. 개개인이 만들고자 하는 알고리즘이 어떤 알고리즘인가에 따라 모두 다르겠지만, 기본적으로 종목별로 상이한 데이터(상장주식수, 거래량, 거래대금, 주가 차트 데이터 등)와 종목에 상관없이 공통적인 데이터(지수 데이터, 시황 데이터 등) 두 개는 반드시 필요할 것이다. 여기서 백테스팅을 진행하는 데에 있어서 필요한 여러 가지 데이터들을 백테스팅을 시작한 시점에서 데이터들을 조회하도록 하고 특정 변수에 저장하도록 한 후에 알고리즘 파일을 진행하는 것이 효과적이다. 아래의 그림을 참고해보자. 1번 작업 절차의 경우에는 boss 파일이 실행되는 순간 지수와 관련된 데이터들을 불러온 후, 알고리즘이 실행되면 데이터들이 저장되어 있..
2021.12.30 -
이전에 제작했던 백테스팅 관련 게시글들은 한 가지 전략을 기반으로 하여 종목들의 주가 데이터 흐름을 분석하는 것이었다. 따라서 이번에는 여러 가지 전략들을 선택하여 실행할 수 있도록 하는 백테스팅 프로그램을 제작해보고자 한다. 실제로 백테스팅 과정에 있어서 다양한 설정값들을 변경하면서 실행해주어야 할 필요가 있는 만큼, 메인 화면에서 세부 값들을 설정한 후 백테스팅을 진행한다면 백테스팅을 조금 더 수월하게 진행할 수 있을 것이다. UI 파일 생성하기 기본적으로 알고리즘을 선택할 수 있도록 하는 기능만 구현하면 된다는 점을 고려하여 lineEdit 과 pushButton 하나를 추가하자. 그리고 lineEdit 에 값을 입력한 후 pushButton 이 클릭될 경우 입력된 값을 바탕으로 알고리즘을 선택한 ..
1.1 백테스팅하기 - 총괄 프로그램인 boss 파일 제작하기이전에 제작했던 백테스팅 관련 게시글들은 한 가지 전략을 기반으로 하여 종목들의 주가 데이터 흐름을 분석하는 것이었다. 따라서 이번에는 여러 가지 전략들을 선택하여 실행할 수 있도록 하는 백테스팅 프로그램을 제작해보고자 한다. 실제로 백테스팅 과정에 있어서 다양한 설정값들을 변경하면서 실행해주어야 할 필요가 있는 만큼, 메인 화면에서 세부 값들을 설정한 후 백테스팅을 진행한다면 백테스팅을 조금 더 수월하게 진행할 수 있을 것이다. UI 파일 생성하기 기본적으로 알고리즘을 선택할 수 있도록 하는 기능만 구현하면 된다는 점을 고려하여 lineEdit 과 pushButton 하나를 추가하자. 그리고 lineEdit 에 값을 입력한 후 pushButton 이 클릭될 경우 입력된 값을 바탕으로 알고리즘을 선택한 ..
2021.12.29 -
지난 게시글을 마지막으로 백테스팅 코드 구축을 마무리할 수 있을 거라 생각했지만, 거래 데이터 상에서 존재하는 오류가 있어서 다시 글을 게시하게 되었다. 일단 오류부터 살펴보도록 하자. 그렇게 고쳤는데 오류가 아직도 있다고? 바로 특정 종목 코드가 거래 데이터 변수인 self.df_tracking_data 안에서 몇 번째 인덱스에 위치해 있는지를 얻어오는 코드를 실행하는 과정에서 발생하는 오류이다. 예를 들어, 000100이라는 코드를 가진 종목을 2020년 1월 3일에 매수했고 2020년 1월 5일에 첫 번째 매도, 2020년 1월 10일에 손절매를 했다. 이후 2020년 3월 10일에 그 종목을 다시 매수했고, 2020년 3월 15일에 첫 번째 매도, 2020년 3월 20일에 두 번재 매도를 했다고 ..
백테스팅 구축 (25) - 거래별 고유정보 입력하기지난 게시글을 마지막으로 백테스팅 코드 구축을 마무리할 수 있을 거라 생각했지만, 거래 데이터 상에서 존재하는 오류가 있어서 다시 글을 게시하게 되었다. 일단 오류부터 살펴보도록 하자. 그렇게 고쳤는데 오류가 아직도 있다고? 바로 특정 종목 코드가 거래 데이터 변수인 self.df_tracking_data 안에서 몇 번째 인덱스에 위치해 있는지를 얻어오는 코드를 실행하는 과정에서 발생하는 오류이다. 예를 들어, 000100이라는 코드를 가진 종목을 2020년 1월 3일에 매수했고 2020년 1월 5일에 첫 번째 매도, 2020년 1월 10일에 손절매를 했다. 이후 2020년 3월 10일에 그 종목을 다시 매수했고, 2020년 3월 15일에 첫 번째 매도, 2020년 3월 20일에 두 번재 매도를 했다고 ..
2021.07.12 -
지난 게시글에서 전체적인 백테스팅 결과값을 확인했으니, 이번 게시글에서는 그 결과는 어떻고 중간에 추가적으로 수정할 사항이 있는지 등에 대해 확인해보도록 하겠다. 이전에도 한번 해봤던 데이터 분석 방법이므로 크게 걱정할 것은 없고, 단순히 ① 수익 거래와 손실 거래의 비율은 어떤지, ② 손익 비율은 어떻게 되는지 그리고 ③ 어떻게 하면 손실을 줄일 수 있는지에 대해 살펴보도록 하겠다. 전체 종목 수익금액 및 수익률 계산하기 수익금액의 경우에는 우리가 첫 번째 매도와 두 번째 매도, 세 번째 매도 금액을 합한 금액이고 손절 금액은 맨 마지막에 있는 매도 금액이다. 어찌됐든 간에 해당 거래를 통해서 얻어들인 수익금액은 수익 매도 금액과 손절 매도 금액을 합한 금액이기 때문에, 그 값을 모두 더해주도록 하자...
백테스팅 구축 (24) - 결과 데이터 확인하기지난 게시글에서 전체적인 백테스팅 결과값을 확인했으니, 이번 게시글에서는 그 결과는 어떻고 중간에 추가적으로 수정할 사항이 있는지 등에 대해 확인해보도록 하겠다. 이전에도 한번 해봤던 데이터 분석 방법이므로 크게 걱정할 것은 없고, 단순히 ① 수익 거래와 손실 거래의 비율은 어떤지, ② 손익 비율은 어떻게 되는지 그리고 ③ 어떻게 하면 손실을 줄일 수 있는지에 대해 살펴보도록 하겠다. 전체 종목 수익금액 및 수익률 계산하기 수익금액의 경우에는 우리가 첫 번째 매도와 두 번째 매도, 세 번째 매도 금액을 합한 금액이고 손절 금액은 맨 마지막에 있는 매도 금액이다. 어찌됐든 간에 해당 거래를 통해서 얻어들인 수익금액은 수익 매도 금액과 손절 매도 금액을 합한 금액이기 때문에, 그 값을 모두 더해주도록 하자...
2021.07.11