AUTO TRADE
좌측 카테고리를 눌러서 주제를 선택하시기 바랍니다.
-
지난 게시글에서는 매수 가격과 매도 가격을 계산하는 과정에서 발생할 수 있는 몇 가지 오류와 추후 직면하게 될 오류 상황에 대해 간단하게 살펴봤다. 이번 게시글에서부터는 다시 본론으로 돌아와서, 매수 가격을 기반으로 해당 매수 가격에 닿았던 이력이 있는지 확인하는 방법에 대해 살펴보고자 한다. 매수가 진행된 종목인가, 아니면 상승만 했던 종목인가? 우리는 현재, 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 -
지난 게시글에서는 이상한 차트 데이터를 재수정하는 기능을 추가했으니, 이번 게시글에서는 제발 매수 가격과 매도 가격을 계산할 수 있길 바란다. 우리가 구현할 전략에 알맞은 데이터인가?이전 게시글에서 우리가 수립할 전략에 대해 다음과 같은 세 가지 기준을 설정했었다.5일 이동평균선이 20일 이동평균선을 상향 돌파(골든 크로스)한 시점에서 매수5일 이동평균선이 10일 이동평균선을 하향 돌파(데드 크로스)한 시점에서 손절매수가 대비 5% 지점에서 수익 실현하지만 이 전략을 보면, 명확한 기준이 없다. 왜냐하면 골든 크로스나 데드 크로스가 발생하는 시점에서, 해당 봉의 종가에 매수에 가담할 것인지 내지는 골든 크로스 또는 데드 크로스가 발생하게 되는 명확한 가격을 넘어설 때 매수에 가담할 것인지와 같은 세부..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (7) - 알고리즘 구현하기 ②지난 게시글에서는 이상한 차트 데이터를 재수정하는 기능을 추가했으니, 이번 게시글에서는 제발 매수 가격과 매도 가격을 계산할 수 있길 바란다. 우리가 구현할 전략에 알맞은 데이터인가?이전 게시글에서 우리가 수립할 전략에 대해 다음과 같은 세 가지 기준을 설정했었다.5일 이동평균선이 20일 이동평균선을 상향 돌파(골든 크로스)한 시점에서 매수5일 이동평균선이 10일 이동평균선을 하향 돌파(데드 크로스)한 시점에서 손절매수가 대비 5% 지점에서 수익 실현하지만 이 전략을 보면, 명확한 기준이 없다. 왜냐하면 골든 크로스나 데드 크로스가 발생하는 시점에서, 해당 봉의 종가에 매수에 가담할 것인지 내지는 골든 크로스 또는 데드 크로스가 발생하게 되는 명확한 가격을 넘어설 때 매수에 가담할 것인지와 같은 세부..
2022.07.21 -
이번 게시글부터는 사전에 만들어 둔 차트 데이터를 기반으로 매수 가격과 매도 가격을 추출하는 알고리즘을 구현할 것이다. 알고리즘 디버깅 현재 제작하고 있는 알고리즘이 정상적으로 동작하는지 확인하는 방법은 크게 두 가지가 있다. 바로 사전에 MySQL 내에 저장해둔 데이터베이스를 불러와서 사용하는 방법과 키움증권 Open API 코드가 구현되어 있는 main.py 파일 내에서 우리가 원하는 종목의 차트 데이터를 바로 전달해준 후에 계산 과정을 보는 방법이다. 첫 번째 방법의 경우 데이터가 저장되어 있는 시점까지만을 대상으로 알고리즘을 확인할 수 있다는 단점이 있지만 로그인하지 않아도 되어 시간을 단축시킬 수 있다는 장점이 있다. 두 번째 방법의 경우 디버깅을 할 때마다 로그인을 해야 하고 차트 데이터를 불..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (6) - 알고리즘 구현하기 ①이번 게시글부터는 사전에 만들어 둔 차트 데이터를 기반으로 매수 가격과 매도 가격을 추출하는 알고리즘을 구현할 것이다. 알고리즘 디버깅 현재 제작하고 있는 알고리즘이 정상적으로 동작하는지 확인하는 방법은 크게 두 가지가 있다. 바로 사전에 MySQL 내에 저장해둔 데이터베이스를 불러와서 사용하는 방법과 키움증권 Open API 코드가 구현되어 있는 main.py 파일 내에서 우리가 원하는 종목의 차트 데이터를 바로 전달해준 후에 계산 과정을 보는 방법이다. 첫 번째 방법의 경우 데이터가 저장되어 있는 시점까지만을 대상으로 알고리즘을 확인할 수 있다는 단점이 있지만 로그인하지 않아도 되어 시간을 단축시킬 수 있다는 장점이 있다. 두 번째 방법의 경우 디버깅을 할 때마다 로그인을 해야 하고 차트 데이터를 불..
2022.07.21 -
여태까지 조건검색식에 저장되어 있는 종목코드 리스트를 불러와서 해당 종목의 차트 데이터를 조회하는 부분까지 기능을 구현하였으니, 이제는 차트 데이터를 기반으로 알고리즘에 전달해서 우리가 원하는 매수 가격과 매도 가격을 계산해줄 차례이다. 어디까지나 방법론에 대해 설명하고 있을 뿐, 여기서 소개하는 알고리즘은 실제 거래에 사용하는 알고리즘이 아니며 수익이 발생할 것으로 검증된 알고리즘도 아님을 사전에 고지하고자 한다. 알고리즘 폴더·파일 생성하기 폴더의 이름은 Algorithm으로, 파일의 이름은 algorithm_1으로 하여 생성하도록 하자. 이제 algorithm_1.py 파일 내에서는 전달받은 데이터를 기반으로 하여 매수 가격과 매도 가격을 전달받아 하나의 데이터프레임으로 저장하고, 매일 장 시작 전..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (5) - 알고리즘 파일 생성하기여태까지 조건검색식에 저장되어 있는 종목코드 리스트를 불러와서 해당 종목의 차트 데이터를 조회하는 부분까지 기능을 구현하였으니, 이제는 차트 데이터를 기반으로 알고리즘에 전달해서 우리가 원하는 매수 가격과 매도 가격을 계산해줄 차례이다. 어디까지나 방법론에 대해 설명하고 있을 뿐, 여기서 소개하는 알고리즘은 실제 거래에 사용하는 알고리즘이 아니며 수익이 발생할 것으로 검증된 알고리즘도 아님을 사전에 고지하고자 한다. 알고리즘 폴더·파일 생성하기 폴더의 이름은 Algorithm으로, 파일의 이름은 algorithm_1으로 하여 생성하도록 하자. 이제 algorithm_1.py 파일 내에서는 전달받은 데이터를 기반으로 하여 매수 가격과 매도 가격을 전달받아 하나의 데이터프레임으로 저장하고, 매일 장 시작 전..
2022.07.20 -
지난 게시글에서 조건검색기에 따른 종목 코드 리스트를 반환하도록 했으니, 이번 게시글에서는 self.code_list 변수 내에 입력되어 있는 종목코드를 기반으로 차트 데이터를 조회하도록 하는 기능을 구현해보자. 차트 데이터 조회 버튼 구현하기 현재 구현한 기능은 아래와 같은 3개이다. [조건식 조회] (pushButton_5) → 서버에 저장되어 있는 조건검색식 리스트를 사용자 컴퓨터에 저장함 [콤보박스] (comboBox) → 조건검색식 정보를 comboBox 내에 차례차례 입력함 [조회] (pushButton_6) → comboBox 내 활성화된 조건검색식에 따라 집계된 종목코드를 조회함(self.code_list 생성) 이제 객체 이름을 pushButton_7로 하는 차트 데이터 조회 버튼을 생성..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (4) - 차트 데이터 요청하기지난 게시글에서 조건검색기에 따른 종목 코드 리스트를 반환하도록 했으니, 이번 게시글에서는 self.code_list 변수 내에 입력되어 있는 종목코드를 기반으로 차트 데이터를 조회하도록 하는 기능을 구현해보자. 차트 데이터 조회 버튼 구현하기 현재 구현한 기능은 아래와 같은 3개이다. [조건식 조회] (pushButton_5) → 서버에 저장되어 있는 조건검색식 리스트를 사용자 컴퓨터에 저장함 [콤보박스] (comboBox) → 조건검색식 정보를 comboBox 내에 차례차례 입력함 [조회] (pushButton_6) → comboBox 내 활성화된 조건검색식에 따라 집계된 종목코드를 조회함(self.code_list 생성) 이제 객체 이름을 pushButton_7로 하는 차트 데이터 조회 버튼을 생성..
2022.07.20 -
지난 게시글에서 조건검색식을 생성하고, 해당 조건검색식에 의해 집계된 종목의 리스트를 얻어오는 기능까지 구현했다. 이번 게시글에서는 조회된 종목 코드 변수를 가지고 차트 데이터를 조회하고, 해당 차트 데이터를 기반으로 매수가와 매도가를 계산할 알고리즘을 어떻게 구현해야 하는지에 대해 살펴볼 예정이다. 버튼부터 만들어주자 아직 조건검색식을 사용할 수 있도록 하는 버튼이 존재하지 않는다. GUI 상에서 여러 기능들을 사용할 예정인데, 콤보 박스와 같은 전에는 사용하지 않았던 기능들이 추가될 예정이니 잘 따라오도록 하자. 가장 먼저 구현할 버튼은 서버로부터 조건검색식과 관련된 데이터를 시스템 내에 저장하는 def __getconditionload(self) 를 실행할 버튼이다. 조건검색식 조회 버튼은 push..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (3) - 조건검색식 사용하기 ③지난 게시글에서 조건검색식을 생성하고, 해당 조건검색식에 의해 집계된 종목의 리스트를 얻어오는 기능까지 구현했다. 이번 게시글에서는 조회된 종목 코드 변수를 가지고 차트 데이터를 조회하고, 해당 차트 데이터를 기반으로 매수가와 매도가를 계산할 알고리즘을 어떻게 구현해야 하는지에 대해 살펴볼 예정이다. 버튼부터 만들어주자 아직 조건검색식을 사용할 수 있도록 하는 버튼이 존재하지 않는다. GUI 상에서 여러 기능들을 사용할 예정인데, 콤보 박스와 같은 전에는 사용하지 않았던 기능들이 추가될 예정이니 잘 따라오도록 하자. 가장 먼저 구현할 버튼은 서버로부터 조건검색식과 관련된 데이터를 시스템 내에 저장하는 def __getconditionload(self) 를 실행할 버튼이다. 조건검색식 조회 버튼은 push..
2022.07.20 -
이번 게시글에서는 영웅문 상에서 제작한 조건검색식을 기반으로, 조건검색식에 의해 집계된 종목 데이터를 조회하는 기능을 구현할 계획이다. 조건검색식 설정하기 키움증권 사에서 제공하는 홈 트레이딩 시스템(HTS, Home Trading System) 내에서 화면번호 [0151]로 분류되는 조건검색식 내에서는 여러 가지 조건들을 설정해서 당일당일 해당 조건에 부합하는 종목을 선별해낼 수 있다. 거래량부터 거래대금, 이동평균선의 배열, 전일 대비 거래량 증가율 등등 키움증권에서 제공하는 조건 안에서는 어떤 조건이든 사용할 수 있다. 다만 이 게시글 내에서 확인하고자 하는 바는 조건검색식 상에서 집계된 종목의 데이터를 얻어오는 것이니 자세한 조건식 설정 방법은 차치하고, 아래와 같이 간단한 조건 검색식만 만들어서..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (2) - 조건검색식 사용하기 ②이번 게시글에서는 영웅문 상에서 제작한 조건검색식을 기반으로, 조건검색식에 의해 집계된 종목 데이터를 조회하는 기능을 구현할 계획이다. 조건검색식 설정하기 키움증권 사에서 제공하는 홈 트레이딩 시스템(HTS, Home Trading System) 내에서 화면번호 [0151]로 분류되는 조건검색식 내에서는 여러 가지 조건들을 설정해서 당일당일 해당 조건에 부합하는 종목을 선별해낼 수 있다. 거래량부터 거래대금, 이동평균선의 배열, 전일 대비 거래량 증가율 등등 키움증권에서 제공하는 조건 안에서는 어떤 조건이든 사용할 수 있다. 다만 이 게시글 내에서 확인하고자 하는 바는 조건검색식 상에서 집계된 종목의 데이터를 얻어오는 것이니 자세한 조건식 설정 방법은 차치하고, 아래와 같이 간단한 조건 검색식만 만들어서..
2022.07.19 -
이제 차트 데이터를 요청하고 그 데이터를 수신받아 사용할 수 있는 수준의 기능까지 구현한 시점에서, 자동 매매 시스템이 동작하도록 하기 위해서는 우리가 설정한 조건에 알맞은 종목의 데이터를 얻어다가 매수 가격과 매도 가격을 구현하고, 해당 가격을 기준으로 거래를 진행하도록 해야 한다. 이러한 일련의 절차를 알고리즘(Algorithm)이라고 할 수 있는데, 알고리즘의 정확한 사전적 의미는 아래와 같다. 알고리즘, (정보·통신) 어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다. 사전적 의미만 봐도 알겠지만, "입력된 자료를 토대로 하여 원하는 출력을 유도해 내는 규칙의..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (1) - 조건검색식 사용하기 ①이제 차트 데이터를 요청하고 그 데이터를 수신받아 사용할 수 있는 수준의 기능까지 구현한 시점에서, 자동 매매 시스템이 동작하도록 하기 위해서는 우리가 설정한 조건에 알맞은 종목의 데이터를 얻어다가 매수 가격과 매도 가격을 구현하고, 해당 가격을 기준으로 거래를 진행하도록 해야 한다. 이러한 일련의 절차를 알고리즘(Algorithm)이라고 할 수 있는데, 알고리즘의 정확한 사전적 의미는 아래와 같다. 알고리즘, (정보·통신) 어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다. 사전적 의미만 봐도 알겠지만, "입력된 자료를 토대로 하여 원하는 출력을 유도해 내는 규칙의..
2022.07.19 -
지난 게시글까지의 내용은 실시간을 등록하고 해제하는 기능을 구현하는 것이었다. 하지만 아직 발생할 수 있는 오류가 남아 있는데, 바로 동일한 종목을 실시간으로 등록하거나 실시간으로 등록되어 있지 않은 종목을 대상으로 실시간 해제를 했을 경우에 발생할 수 있는 오류이다. 이러한 문제를 해결하는 것은 의외로 단순하게 처리할 수 있다. 실시간 등록 시 오류 처리 : def add_to_setrealreg(self, item_code) 일단 어떤 오류가 발생하는지에 대해 먼저 살펴보자면, 아래와 같은 ValueError 가 발생한다. 이는 .item() 메서드를 원인으로 발생하는 것인데, 애당초 그 앞 부분의 코드에서 얻어온 값이 없기 때문에 빈 데이터에 대고 .item() 메서드를 적용했을 때 발생하는 오류이..
[자동 매매 시스템 구축하기] 실시간 해제하기 (3) - 오류 처리지난 게시글까지의 내용은 실시간을 등록하고 해제하는 기능을 구현하는 것이었다. 하지만 아직 발생할 수 있는 오류가 남아 있는데, 바로 동일한 종목을 실시간으로 등록하거나 실시간으로 등록되어 있지 않은 종목을 대상으로 실시간 해제를 했을 경우에 발생할 수 있는 오류이다. 이러한 문제를 해결하는 것은 의외로 단순하게 처리할 수 있다. 실시간 등록 시 오류 처리 : def add_to_setrealreg(self, item_code) 일단 어떤 오류가 발생하는지에 대해 먼저 살펴보자면, 아래와 같은 ValueError 가 발생한다. 이는 .item() 메서드를 원인으로 발생하는 것인데, 애당초 그 앞 부분의 코드에서 얻어온 값이 없기 때문에 빈 데이터에 대고 .item() 메서드를 적용했을 때 발생하는 오류이..
2022.07.19 -
지난 게시글에서는 실시간 해제와 함께 self.setrealreg 변수를 업데이트하는 기능을 구현했으니, 이번 게시글에서는 tableWidget 내에서 데이터를 삭제하는 방법에 대해 살펴볼 예정이다. tableWidget은 어떻게 삭제하나? Method : removeRow() 사실 self.setrealreg 변수 내에서 데이터를 삭제하는 건 간단했지만, tableWidget을 수정하는 것은 별도의 게시글로 분리한 이유가 있다. 바로 데이터프레임 내에서 데이터를 삭제하는 것처럼 간단하지가 않기 때문이다. 아니, 간단하지 않다기 보다는 코드는 간단하지만, 그 개념을 이해하는 것이 조금 어려울 수도 있다. (쉽게 느껴진다면 다행이다.) 일단 tableWidget 객체에서 특정 데이터를 삭제하는 메서드는 ...
[자동 매매 시스템 구축하기] 실시간 해제하기 (2) - tableWidget 업데이트지난 게시글에서는 실시간 해제와 함께 self.setrealreg 변수를 업데이트하는 기능을 구현했으니, 이번 게시글에서는 tableWidget 내에서 데이터를 삭제하는 방법에 대해 살펴볼 예정이다. tableWidget은 어떻게 삭제하나? Method : removeRow() 사실 self.setrealreg 변수 내에서 데이터를 삭제하는 건 간단했지만, tableWidget을 수정하는 것은 별도의 게시글로 분리한 이유가 있다. 바로 데이터프레임 내에서 데이터를 삭제하는 것처럼 간단하지가 않기 때문이다. 아니, 간단하지 않다기 보다는 코드는 간단하지만, 그 개념을 이해하는 것이 조금 어려울 수도 있다. (쉽게 느껴진다면 다행이다.) 일단 tableWidget 객체에서 특정 데이터를 삭제하는 메서드는 ...
2022.07.19