AUTO TRADE/자동 매매 프로그램
-
지난 게시글에서는 원주문번호가 발생하는 논리구조에 대해 살펴보았다. 이번 게시글에서는 종목 별로 발생하는 원주문번호를 어떻게 관리해야 할지에 대해 살펴볼 예정이다. 원주문번호를 관리하는 것은 여태 구현하는 모든 기능들이 그러했듯이, 별도의 데이터프레임( DataFrame )을 만들어서 관리할 예정이다. 이 데이터프레임의 이름은 바로 self.order_info 가 되는데, 이 데이터프레임의 칼럼으로는 어떠한 것들을 생성해줘야 추후에 데이터를 정확하게 관리할 수 있을까? order_info 변수에 어떤 구조의 기능을 구현할 것인가? 우리가 구현해야 할 내용에 대해 조금만 생각해보면 이 변수가 가지고 있어야 할 데이터는 의외로 단순하다. 우리가 주문 정보를 관리하는 데에 있어서 필요한 건 말 그대로 주문 정..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (3) - order_info 변수 생성하기 ①지난 게시글에서는 원주문번호가 발생하는 논리구조에 대해 살펴보았다. 이번 게시글에서는 종목 별로 발생하는 원주문번호를 어떻게 관리해야 할지에 대해 살펴볼 예정이다. 원주문번호를 관리하는 것은 여태 구현하는 모든 기능들이 그러했듯이, 별도의 데이터프레임( DataFrame )을 만들어서 관리할 예정이다. 이 데이터프레임의 이름은 바로 self.order_info 가 되는데, 이 데이터프레임의 칼럼으로는 어떠한 것들을 생성해줘야 추후에 데이터를 정확하게 관리할 수 있을까? order_info 변수에 어떤 구조의 기능을 구현할 것인가? 우리가 구현해야 할 내용에 대해 조금만 생각해보면 이 변수가 가지고 있어야 할 데이터는 의외로 단순하다. 우리가 주문 정보를 관리하는 데에 있어서 필요한 건 말 그대로 주문 정..
2022.09.04 -
지난 게시글에서 OnReceiveChejanData 이벤트가 발생했을 때 def receive_chejandata 함수로 연결되도록 하는 기능까지 구현했으며, 이번 게시글에서는 해당 함수 내에서 어떤 로직의 코드를 구현해야 하는지에 대해 살펴보자. Gubun에 따른 데이터 구분하기 def receive_chejandata(self, Gubun, ItemCnt, FidList): """ Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보 FidList(string) - 데이터 구분은 ;이다. """ pass 위의 코드에서 확인할 수 있듯이, Gubun이라는 것은 0일 경우 주문체결통보를 의미하며 1일 경우 국내주식 잔고통보를 의미한다. 자세한 설명은 넘어가고, 일단 Gu..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (2) - chejandata 이벤트 처리하기지난 게시글에서 OnReceiveChejanData 이벤트가 발생했을 때 def receive_chejandata 함수로 연결되도록 하는 기능까지 구현했으며, 이번 게시글에서는 해당 함수 내에서 어떤 로직의 코드를 구현해야 하는지에 대해 살펴보자. Gubun에 따른 데이터 구분하기 def receive_chejandata(self, Gubun, ItemCnt, FidList): """ Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보 FidList(string) - 데이터 구분은 ;이다. """ pass 위의 코드에서 확인할 수 있듯이, Gubun이라는 것은 0일 경우 주문체결통보를 의미하며 1일 경우 국내주식 잔고통보를 의미한다. 자세한 설명은 넘어가고, 일단 Gu..
2022.09.04 -
키움증권 Open API를 활용한 자동 매매 시스템을 구현하기 위해서는 주문과 그 결과로 발생하는 데이터, 그리고 그 과정에서 발생하는 데이터를 관리해줘야 할 필요성이 있다. 그렇게 하기 위해 가장 먼저 구현해야 하는 기능은 주문 기능인데, 이 역시 다른 함수와 마찬가지로 캡슐화된 주문 함수를 제작해보도록 하자. 주문 함수 제작하기 여느 함수와 마찬가지로, 주문 함수를 제작하는 것은 크게 어렵지 않다. 개발가이드 내에서는 SendOrder라는 개념을 사용하고 있기 때문에, 다른 함수와 동일한 로직에 따라 주문 함수를 제작하면 된다. """SendOrder 함수 실행""" def __sendorder(self): pass 그렇다면 여기서 함수를 실행하기 위해 함수 내에 전달해줘야 하는 인자로는 어떤 인자들..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (1) - 주문 접수 함수 제작하기키움증권 Open API를 활용한 자동 매매 시스템을 구현하기 위해서는 주문과 그 결과로 발생하는 데이터, 그리고 그 과정에서 발생하는 데이터를 관리해줘야 할 필요성이 있다. 그렇게 하기 위해 가장 먼저 구현해야 하는 기능은 주문 기능인데, 이 역시 다른 함수와 마찬가지로 캡슐화된 주문 함수를 제작해보도록 하자. 주문 함수 제작하기 여느 함수와 마찬가지로, 주문 함수를 제작하는 것은 크게 어렵지 않다. 개발가이드 내에서는 SendOrder라는 개념을 사용하고 있기 때문에, 다른 함수와 동일한 로직에 따라 주문 함수를 제작하면 된다. """SendOrder 함수 실행""" def __sendorder(self): pass 그렇다면 여기서 함수를 실행하기 위해 함수 내에 전달해줘야 하는 인자로는 어떤 인자들..
2022.09.04 -
지난 게시글에 이어 이번 게시글에서는 현재 시각이 15시 30분 이전인가 이후인가에 따라 당일 기준 최신 거래일을 어떻게 반환할 것인가에 대한 이야기를 해볼까 한다. 이 내용이 중요한 이유는 바로 추후에 구현할 기능 때문이다. 사실 이유를 알고 나면 간단한 내용이지만, 막상 구현할 때에는 이번 게시글에서 설명하고자 하는 부분을 놓치기 쉽다. 15시 30분을 기준으로 최신 거래일 데이터를 결정하는 이유 예를 들어, 8월 26일과 8월 25일 모두 정상적인 거래일이며 지금 현재 시각은 8월 26일 오전 9시 01분이라고 가정해보자. 그렇다면 지금 시점에서 가장 최신의 거래일자는 8월 26일이겠지만 예상외로 우리는 8월 25일이라는 값을 최신 거래일로 가져가야 한다. 이제부터 그 이유를 한 번 살펴보자. 기본..
[자동 매매 시스템 구축하기] 일자 데이터 구현하기 ②지난 게시글에 이어 이번 게시글에서는 현재 시각이 15시 30분 이전인가 이후인가에 따라 당일 기준 최신 거래일을 어떻게 반환할 것인가에 대한 이야기를 해볼까 한다. 이 내용이 중요한 이유는 바로 추후에 구현할 기능 때문이다. 사실 이유를 알고 나면 간단한 내용이지만, 막상 구현할 때에는 이번 게시글에서 설명하고자 하는 부분을 놓치기 쉽다. 15시 30분을 기준으로 최신 거래일 데이터를 결정하는 이유 예를 들어, 8월 26일과 8월 25일 모두 정상적인 거래일이며 지금 현재 시각은 8월 26일 오전 9시 01분이라고 가정해보자. 그렇다면 지금 시점에서 가장 최신의 거래일자는 8월 26일이겠지만 예상외로 우리는 8월 25일이라는 값을 최신 거래일로 가져가야 한다. 이제부터 그 이유를 한 번 살펴보자. 기본..
2022.08.28 -
지난 게시글까지가 알고리즘을 이용해서 종목별 매수 예정 가격 데이터를 계산해내는 기능을 구현하는 방법에 대한 설명이었다. 이번 게시글에서는 일자 데이터를 구현할 예정인데, 일자 데이터를 구현하는 것은 생각보다 다양한 요소들을 고려해야 한다. 왜냐하면 주식 시장에는 장이 시작되고 종료되는 일정한 시간이 있기 때문이다. 일자 데이터를 어떻게 구현할까? 일단 방법론만 생각해보자면 상당히 간단한 모듈로 일자 데이터를 얻어올 수 있다. 가장 대표적인 것이 datetime 모듈인데, 예제로 간단하게 살펴보도록 하자. >>> import datetime >>> datetime.datetime.now() >>> datetime.datetime(2022, 8, 28, 15, 17, 27, 453139) 일단 dateti..
[자동 매매 시스템 구축하기] 일자 데이터 구현하기 ①지난 게시글까지가 알고리즘을 이용해서 종목별 매수 예정 가격 데이터를 계산해내는 기능을 구현하는 방법에 대한 설명이었다. 이번 게시글에서는 일자 데이터를 구현할 예정인데, 일자 데이터를 구현하는 것은 생각보다 다양한 요소들을 고려해야 한다. 왜냐하면 주식 시장에는 장이 시작되고 종료되는 일정한 시간이 있기 때문이다. 일자 데이터를 어떻게 구현할까? 일단 방법론만 생각해보자면 상당히 간단한 모듈로 일자 데이터를 얻어올 수 있다. 가장 대표적인 것이 datetime 모듈인데, 예제로 간단하게 살펴보도록 하자. >>> import datetime >>> datetime.datetime.now() >>> datetime.datetime(2022, 8, 28, 15, 17, 27, 453139) 일단 dateti..
2022.08.28 -
지난 게시글에서는 차트 데이터를 알고리즘 파일에 전달한 후 계산 절차를 거쳐 매수 예정 가격 데이터를 얻어오는 기능까지 모두 구현했다. 이번 게시글에서는 종목별로 계산된 매수 예정 가격 데이터 데이터프레임을 모두 합쳐서 하나의 파일로 만든 후에, 그 결과 데이터를 확인하는 것까지 구현할 예정이다. 합칠 대상이 되는 데이터프레임 변수 생성하기 algorithm_1.py 파일 내에서는 _df.py 파일 내에 있는 def algo1_df() 를 호출해서 함수에서 반환되는 데이터프레임에 데이터를 입력했었다. 이와 마찬가지로 main.py 파일 내에서도 동일한 변수를 호출해서 algorithm_1.py 파일로부터 전달받은 데이터를 입력할 변수를 생성한 후에 해당 변수에 매수 예정 가격 데이터가 담긴 result[..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (14) - 매수 예정 종목 데이터프레임 확인하기 ③지난 게시글에서는 차트 데이터를 알고리즘 파일에 전달한 후 계산 절차를 거쳐 매수 예정 가격 데이터를 얻어오는 기능까지 모두 구현했다. 이번 게시글에서는 종목별로 계산된 매수 예정 가격 데이터 데이터프레임을 모두 합쳐서 하나의 파일로 만든 후에, 그 결과 데이터를 확인하는 것까지 구현할 예정이다. 합칠 대상이 되는 데이터프레임 변수 생성하기 algorithm_1.py 파일 내에서는 _df.py 파일 내에 있는 def algo1_df() 를 호출해서 함수에서 반환되는 데이터프레임에 데이터를 입력했었다. 이와 마찬가지로 main.py 파일 내에서도 동일한 변수를 호출해서 algorithm_1.py 파일로부터 전달받은 데이터를 입력할 변수를 생성한 후에 해당 변수에 매수 예정 가격 데이터가 담긴 result[..
2022.08.28 -
이전 게시글까지 알고리즘에 의해 매수 예정 가격 등을 포함한 결과 데이터가 정상적으로 전달되고 있음을 확인했으므로 main.py 파일 내에서 조건검색식에 의해 집계된 종목의 일봉 및 분봉 데이터를 algorithm_1.py 파일로 전달한 후 그 결과값을 반환받아보도록 하자. 근본적으로 삼성전자는 조건검색식에 의해 잘 집계되지 않으므로, 여태까지 살펴봤던 삼성전자는 이제 더 이상 등장하지 않을 것이다. 차트 데이터를 전달해보자. 이제 구현해야 할 기능은 바로 조건검색식에 의해 집계된 종목의 차트 데이터를 조회하는 버튼( pushButton_7 )이 클릭된 순간 해당 종목의 차트 데이터를 조회함과 동시에 조회가 완료된 경우 algorithm_1.py 파일로 해당 차트 데이터를 전달하여 알고리즘에 의해 계산된..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (13) - 매수 예정 종목 데이터프레임 확인하기 ②이전 게시글까지 알고리즘에 의해 매수 예정 가격 등을 포함한 결과 데이터가 정상적으로 전달되고 있음을 확인했으므로 main.py 파일 내에서 조건검색식에 의해 집계된 종목의 일봉 및 분봉 데이터를 algorithm_1.py 파일로 전달한 후 그 결과값을 반환받아보도록 하자. 근본적으로 삼성전자는 조건검색식에 의해 잘 집계되지 않으므로, 여태까지 살펴봤던 삼성전자는 이제 더 이상 등장하지 않을 것이다. 차트 데이터를 전달해보자. 이제 구현해야 할 기능은 바로 조건검색식에 의해 집계된 종목의 차트 데이터를 조회하는 버튼( pushButton_7 )이 클릭된 순간 해당 종목의 차트 데이터를 조회함과 동시에 조회가 완료된 경우 algorithm_1.py 파일로 해당 차트 데이터를 전달하여 알고리즘에 의해 계산된..
2022.08.28 -
지난 게시글에서 매수 예정 가격 데이터를 데이터프레임화 하였다. 따라서 이번 게시글에서는 해당 파일로부터 데이터를 어떻게 반환받을 수 있는지 살펴보고자 한다. 기본적인 방법론 사실 쓸데없는 내용이라 생각할 수도 있겠지만(정말로 쓸데없는 내용일 수도 있겠지만), 클래스(class)와 클래스 내 함수(def)로부터 반환값을 얻어오는 방법은 단순하다. 예를 들어 아래와 같이 calculator 라는 클래스 내에 add, sub, multiple 이라는 세 개의 함수가 있다고 가정해보자. 해당 클래스는 value1 과 value2 라는 두 개의 변수를 요구하고 있으며, 각각 특정 함수가 실행될 경우 해당 함수에서는 사전에 받은 값 두 개에 대한 산식을 처리한 결과값을 반환하도록 하고 있다. class calcu..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (12) - 매수 예정 종목 데이터프레임 확인하기 ①지난 게시글에서 매수 예정 가격 데이터를 데이터프레임화 하였다. 따라서 이번 게시글에서는 해당 파일로부터 데이터를 어떻게 반환받을 수 있는지 살펴보고자 한다. 기본적인 방법론 사실 쓸데없는 내용이라 생각할 수도 있겠지만(정말로 쓸데없는 내용일 수도 있겠지만), 클래스(class)와 클래스 내 함수(def)로부터 반환값을 얻어오는 방법은 단순하다. 예를 들어 아래와 같이 calculator 라는 클래스 내에 add, sub, multiple 이라는 세 개의 함수가 있다고 가정해보자. 해당 클래스는 value1 과 value2 라는 두 개의 변수를 요구하고 있으며, 각각 특정 함수가 실행될 경우 해당 함수에서는 사전에 받은 값 두 개에 대한 산식을 처리한 결과값을 반환하도록 하고 있다. class calcu..
2022.08.27 -
지난 게시글에서 특정 종목의 매수 예정 가격을 계산해두었는데, 아직 수행되지 않은 한 가지 작업이 남아 있다. 바로 매도 예정 가격이다. 사실 첫 게시글에서 5일 이동평균선이 10일 이동평균선을 이탈했을 때 매도하는 전략을 수립해서 그 전략을 기반으로 거래를 진행하도록 하는 자동 매매 시스템을 구현하고자 했으나, 사실 따지고 보면 5일 이동평균선과 10일 이동평균선 간 데드 크로스 역시 특정 봉이 발생해야 판단할 수 있는 개념이기 때문에, 사전에 매도 예정 가격을 계산하기가 어렵다. 따라서 원래는 매도 예정 가격도 함께 계산하여 매수 함수와 매도 함수를 모두 작성하려 했으나, 아쉽게도 매수 함수만 작성하고 그 방법을 응용해서 매도 함수를 직접 작성하는 방법밖에는 없을 것 같다는 생각을 하게 된다. 매도 ..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (11) - 알고리즘 구현하기 ⑥지난 게시글에서 특정 종목의 매수 예정 가격을 계산해두었는데, 아직 수행되지 않은 한 가지 작업이 남아 있다. 바로 매도 예정 가격이다. 사실 첫 게시글에서 5일 이동평균선이 10일 이동평균선을 이탈했을 때 매도하는 전략을 수립해서 그 전략을 기반으로 거래를 진행하도록 하는 자동 매매 시스템을 구현하고자 했으나, 사실 따지고 보면 5일 이동평균선과 10일 이동평균선 간 데드 크로스 역시 특정 봉이 발생해야 판단할 수 있는 개념이기 때문에, 사전에 매도 예정 가격을 계산하기가 어렵다. 따라서 원래는 매도 예정 가격도 함께 계산하여 매수 함수와 매도 함수를 모두 작성하려 했으나, 아쉽게도 매수 함수만 작성하고 그 방법을 응용해서 매도 함수를 직접 작성하는 방법밖에는 없을 것 같다는 생각을 하게 된다. 매도 ..
2022.08.27 -
지난 게시글에서는 매수 가격과 매도 가격을 계산하는 과정에서 발생할 수 있는 몇 가지 오류와 추후 직면하게 될 오류 상황에 대해 간단하게 살펴봤다. 이번 게시글에서부터는 다시 본론으로 돌아와서, 매수 가격을 기반으로 해당 매수 가격에 닿았던 이력이 있는지 확인하는 방법에 대해 살펴보고자 한다. 매수가 진행된 종목인가, 아니면 상승만 했던 종목인가? 우리는 현재, 5일 이동평균선이 20일 이동평균선을 상향돌파한 시점에서의 시가 데이터와 이후 형성된 고가 데이터를 기반으로 하여 그 중심값에 해당하는 매수 예정 가격을 계산해냈다. 이제는 고가가 형성된 이후 매수 예정 가격에 닿았는지를 확인해봐야 한다. 어떤 방법으로 확인할 수 있을까? 일단 기본적으로, 현재 반복문(for 문) 내부에서는 고가 데이터가 갱신된..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (10) - 알고리즘 구현하기 ⑤지난 게시글에서는 매수 가격과 매도 가격을 계산하는 과정에서 발생할 수 있는 몇 가지 오류와 추후 직면하게 될 오류 상황에 대해 간단하게 살펴봤다. 이번 게시글에서부터는 다시 본론으로 돌아와서, 매수 가격을 기반으로 해당 매수 가격에 닿았던 이력이 있는지 확인하는 방법에 대해 살펴보고자 한다. 매수가 진행된 종목인가, 아니면 상승만 했던 종목인가? 우리는 현재, 5일 이동평균선이 20일 이동평균선을 상향돌파한 시점에서의 시가 데이터와 이후 형성된 고가 데이터를 기반으로 하여 그 중심값에 해당하는 매수 예정 가격을 계산해냈다. 이제는 고가가 형성된 이후 매수 예정 가격에 닿았는지를 확인해봐야 한다. 어떤 방법으로 확인할 수 있을까? 일단 기본적으로, 현재 반복문(for 문) 내부에서는 고가 데이터가 갱신된..
2022.07.25 -
이번 게시글에서는 지난 게시글에서 구현하지 못했던 일자 데이터를 함께 출력하는 기능을 구현하는 것부터 시작해서, 오류를 바로 잡아 매수 예정 가격 데이터까지 모두 계산해보도록 하자. 일자 데이터 출력하기 사실 파이썬의 print("")문보다도 더 좋은 게 print(f"")이다. 왜냐하면 그 안에 중괄호, 즉 {}를 넣어 해당 위치에 변수를 직접 입력할 수 있기 때문이다. 이제 코드를 돌려서 언제 고가 데이터가 갱신되었는지 확인해보도록 하자. ※ Line : 8 def run(self): self.highest_price = self.start_price for data in self.min5_data.itertuples(): high = int(data.high) if high > self.highes..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (9) - 알고리즘 구현하기 ④이번 게시글에서는 지난 게시글에서 구현하지 못했던 일자 데이터를 함께 출력하는 기능을 구현하는 것부터 시작해서, 오류를 바로 잡아 매수 예정 가격 데이터까지 모두 계산해보도록 하자. 일자 데이터 출력하기 사실 파이썬의 print("")문보다도 더 좋은 게 print(f"")이다. 왜냐하면 그 안에 중괄호, 즉 {}를 넣어 해당 위치에 변수를 직접 입력할 수 있기 때문이다. 이제 코드를 돌려서 언제 고가 데이터가 갱신되었는지 확인해보도록 하자. ※ Line : 8 def run(self): self.highest_price = self.start_price for data in self.min5_data.itertuples(): high = int(data.high) if high > self.highes..
2022.07.22 -
지난 게시글에서는 매수 가격의 기준이 되는 시가(self.start_price) 변수 값을 구했으니, 이번 게시글에서는 5분봉 차트 데이터가 담긴 변수인 self.min5_data 변수를 대상으로 for문을 사용하여 예정 매수 가격 데이터를 구해보자. 매수 예정 가격 계산하기 일단 기본적으로 이동평균선 간 골든 크로스가 발생한 시점의 봉의 시가 값인 self.start_price를 기준으로 해서 고가가 갱신될 때마다 해당 고가와 self.start_price 의 중간 가격을 매수 예정 가격으로 할 것이다. 그러기 위해서는 for문을 통해 특정 고가 데이터가 이전의 고가 데이터보다 높은지를 지속적으로 확인해줘야 한다. 이러한 기능은 어떻게 구현할 수 있을까? 기본적으로 데이터프레임을 대상으로 for문을 돌..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (8) - 알고리즘 구현하기 ③지난 게시글에서는 매수 가격의 기준이 되는 시가(self.start_price) 변수 값을 구했으니, 이번 게시글에서는 5분봉 차트 데이터가 담긴 변수인 self.min5_data 변수를 대상으로 for문을 사용하여 예정 매수 가격 데이터를 구해보자. 매수 예정 가격 계산하기 일단 기본적으로 이동평균선 간 골든 크로스가 발생한 시점의 봉의 시가 값인 self.start_price를 기준으로 해서 고가가 갱신될 때마다 해당 고가와 self.start_price 의 중간 가격을 매수 예정 가격으로 할 것이다. 그러기 위해서는 for문을 통해 특정 고가 데이터가 이전의 고가 데이터보다 높은지를 지속적으로 확인해줘야 한다. 이러한 기능은 어떻게 구현할 수 있을까? 기본적으로 데이터프레임을 대상으로 for문을 돌..
2022.07.22