AUTO TRADE/자동 매매 프로그램
-
지난 게시글에서 실시간 데이터를 얻어오는 방법과 def __getcommrealdata()를 사용해서 종목코드와 FID 번호를 전달하여 특정 FID 번호에 해당하는 데이터를 조회하는 방법까지 살펴봤다. 하지만 실질적으로 실제 거래에 사용하기 위해서는 해당 데이터를 확인하고 사용할 줄 알아야 하는데, 본인은 이 방법을 tableWidget을 사용해서 활용하고 있다. tableWidget이 뭔데? tableWidget은 단순하게 우리가 앞서 차트 데이터를 조회하고 저장하기 전에 앞서 사용했던 데이터프레임(DataFrame)과 동일한 형태의 데이터라고 보면 된다. 데이터프레임(DataFrame)은 특정 열과 특정 행에 해당하는 데이터를 정확하게 확인할 수 있는데, tableWidget 역시 마찬가지이다. 특정..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (5) - tableWidget 사용하기 ①지난 게시글에서 실시간 데이터를 얻어오는 방법과 def __getcommrealdata()를 사용해서 종목코드와 FID 번호를 전달하여 특정 FID 번호에 해당하는 데이터를 조회하는 방법까지 살펴봤다. 하지만 실질적으로 실제 거래에 사용하기 위해서는 해당 데이터를 확인하고 사용할 줄 알아야 하는데, 본인은 이 방법을 tableWidget을 사용해서 활용하고 있다. tableWidget이 뭔데? tableWidget은 단순하게 우리가 앞서 차트 데이터를 조회하고 저장하기 전에 앞서 사용했던 데이터프레임(DataFrame)과 동일한 형태의 데이터라고 보면 된다. 데이터프레임(DataFrame)은 특정 열과 특정 행에 해당하는 데이터를 정확하게 확인할 수 있는데, tableWidget 역시 마찬가지이다. 특정..
2022.07.16 -
지난 게시글에서 실시간 데이터를 추가하고 self.setrealreg 변수를 활용해서 실시간 등록 종목을 관리하는 방법까지 모두 구현했다. 하지만 아직은 실시간으로 등록한 종목들의 실시간 데이터를 얻어올 수 없다. 그 이유는 단순하게도, 실시간 데이터를 얻어오는 OnReceiveRealData 이벤트를 처리해주지 않았기 때문이다. 예전에 차트 데이터를 조회할 때 데이터를 입력하고 요청한 후 서버로부터 데이터를 얻기 위해 OnReceiveTrData 라는 이벤트를 처리해줬는데, 기억할지 모르겠지만 아무튼 했었다. 그리고 키움증권 Open API는 총 8개의 이벤트를 제공하고 있으며, 모든 이벤트를 처리해줘야 하는 것은 아니고 필요한 이벤트만 적재적소에 구현해서 사용하면 된다. OnReceiveRealDat..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (4) - OnReceiveRealData지난 게시글에서 실시간 데이터를 추가하고 self.setrealreg 변수를 활용해서 실시간 등록 종목을 관리하는 방법까지 모두 구현했다. 하지만 아직은 실시간으로 등록한 종목들의 실시간 데이터를 얻어올 수 없다. 그 이유는 단순하게도, 실시간 데이터를 얻어오는 OnReceiveRealData 이벤트를 처리해주지 않았기 때문이다. 예전에 차트 데이터를 조회할 때 데이터를 입력하고 요청한 후 서버로부터 데이터를 얻기 위해 OnReceiveTrData 라는 이벤트를 처리해줬는데, 기억할지 모르겠지만 아무튼 했었다. 그리고 키움증권 Open API는 총 8개의 이벤트를 제공하고 있으며, 모든 이벤트를 처리해줘야 하는 것은 아니고 필요한 이벤트만 적재적소에 구현해서 사용하면 된다. OnReceiveRealDat..
2022.07.16 -
지난 게시글에서 GUI 내에서 종목코드를 입력하고, 해당 종목코드 정보를 얻어서 실시간으로 등록하는 버튼을 생성한 후 넘어왔다. 이번 게시글에서는 특정 버튼을 눌렀을 때 lineEdit() 객체에 입력되어 있는 종목코드 데이터를 얻어서 종목 코드를 바탕으로 실시간으로 등록하는 함수인 def __setrealreg(self, item_code) 함수를 실행하는 코드를 구현할 예정이다. GUI 상 종목코드를 입력하는 lineEdit의 객체 이름은 lineEdit이고, 실시간 등록을 요청하는 버튼(pushButton)의 객체 이름은 pushButton_3이다. 버튼의 기능부터 구현해보자. 이전에 GUI 버튼과 함수를 연결하는 코드가 def __init__(self): 내에서 구현해두었던 것을 기억하는가? 앞으..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (3) - 실시간 등록하기지난 게시글에서 GUI 내에서 종목코드를 입력하고, 해당 종목코드 정보를 얻어서 실시간으로 등록하는 버튼을 생성한 후 넘어왔다. 이번 게시글에서는 특정 버튼을 눌렀을 때 lineEdit() 객체에 입력되어 있는 종목코드 데이터를 얻어서 종목 코드를 바탕으로 실시간으로 등록하는 함수인 def __setrealreg(self, item_code) 함수를 실행하는 코드를 구현할 예정이다. GUI 상 종목코드를 입력하는 lineEdit의 객체 이름은 lineEdit이고, 실시간 등록을 요청하는 버튼(pushButton)의 객체 이름은 pushButton_3이다. 버튼의 기능부터 구현해보자. 이전에 GUI 버튼과 함수를 연결하는 코드가 def __init__(self): 내에서 구현해두었던 것을 기억하는가? 앞으..
2022.07.16 -
지난 게시글에서 이야기했듯이, def __setrealreg() 함수를 사용하기 위해서는 현재 실시간으로 등록되어 있는 종목들이 입력되어 있는 self.setrealreg 변수 내에 입력되어 있는 종목 데이터가 가장 정확해야 한다. 다시 말해, RealType의 인자로 0을 전달할지 1을 전달할지는 실시간으로 등록되어 있는 종목의 개수에 따라 좌우되니 실시간으로 등록되어 있는 종목들의 리스트가 담겨 있는 self.setrealreg 변수는 항상 데이터를 정확하게 유지해야 한다는 것이다. 데이터를 정확하게 유지해야 한다? 실제로 거래를 진행하다보면 실시간 등록을 해야 할 때도 있겠지만, 사전에 설정해두었던 로직대로 거래가 모두 이루어진 후에는 실시간을 해지해야 하는 경우가 있을 수 있고 이외에도 거래 조건..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (2) - self.setrealreg 업데이트하기지난 게시글에서 이야기했듯이, def __setrealreg() 함수를 사용하기 위해서는 현재 실시간으로 등록되어 있는 종목들이 입력되어 있는 self.setrealreg 변수 내에 입력되어 있는 종목 데이터가 가장 정확해야 한다. 다시 말해, RealType의 인자로 0을 전달할지 1을 전달할지는 실시간으로 등록되어 있는 종목의 개수에 따라 좌우되니 실시간으로 등록되어 있는 종목들의 리스트가 담겨 있는 self.setrealreg 변수는 항상 데이터를 정확하게 유지해야 한다는 것이다. 데이터를 정확하게 유지해야 한다? 실제로 거래를 진행하다보면 실시간 등록을 해야 할 때도 있겠지만, 사전에 설정해두었던 로직대로 거래가 모두 이루어진 후에는 실시간을 해지해야 하는 경우가 있을 수 있고 이외에도 거래 조건..
2022.07.16 -
이전 게시글에서 특정 시간이 되면 자동 매매 함수를 실행하도록 하는 부분까지 구현해두었다. 하지만 아직 그 안에 실행하도록 제작한 함수라고 할 만한 게 마땅히 없기 때문에 자동 매매 시스템이라는 이름이 무색하게 느껴질 정도다. 자동적으로 매매가 이루어지도록 하기 위해서는 무엇이 필요한지에 대해 고찰하고, 필요한 데이터들을 하나씩 생성하면서 프로그램이라는 명색에 알맞게 구색을 갖춰나가는 수밖에 없다. 그 중 가장 첫 번째로 사용할 것이 실시간 등록( SetRealReg )이다. 실시간 등록이라는 것은 단순하게 설명하자면, 실시간 등록이 이루어져야만 해당 종목에 대한 주가 데이터를 실시간으로 얻어올 수 있다는 의미이다. 예를 들어, 키움증권 Open API를 이용해서 로그인을 한다는 것만으로 키움증권 서버에..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (1) - SetRealReg이전 게시글에서 특정 시간이 되면 자동 매매 함수를 실행하도록 하는 부분까지 구현해두었다. 하지만 아직 그 안에 실행하도록 제작한 함수라고 할 만한 게 마땅히 없기 때문에 자동 매매 시스템이라는 이름이 무색하게 느껴질 정도다. 자동적으로 매매가 이루어지도록 하기 위해서는 무엇이 필요한지에 대해 고찰하고, 필요한 데이터들을 하나씩 생성하면서 프로그램이라는 명색에 알맞게 구색을 갖춰나가는 수밖에 없다. 그 중 가장 첫 번째로 사용할 것이 실시간 등록( SetRealReg )이다. 실시간 등록이라는 것은 단순하게 설명하자면, 실시간 등록이 이루어져야만 해당 종목에 대한 주가 데이터를 실시간으로 얻어올 수 있다는 의미이다. 예를 들어, 키움증권 Open API를 이용해서 로그인을 한다는 것만으로 키움증권 서버에..
2022.07.09 -
지난 게시글에서 로그인이 정상적으로 처리되었다고 판단할 수 있는 기준을 제작했고, 이번 게시글에서는 해당 기준이 충족된 경우 자동 매매 코드를 실행하도록 하는 코드를 구축할 것이다. 쓰레드를 사용해야 한다. 쓰레드란 구체적으로 어떤 개념인지 이해하지는 못해도 되지만, 깊게 파고들면 들수록 복잡한 개념이 바로 쓰레드이다. 다시 말해, 제대로 알지 못한 채로 사용하게 되면 프로그램 상 오류가 발생할 수도 있다는 것이다. 일례로, 앞서 살펴봤던 이벤트루프의 경우 이벤트루프가 시작됐으나 종료시키지 못하는 바람에 무한 루프에 걸리게 되는 문제점이 발생할 수 있다고 했다. 쓰레드 역시 특정 쓰레드가 모두 완료될 때까지 다른 쓰레드의 실행 및 개입이 이루어지지 않도록 하는 쓰레드락(Thread-Lock)이라는 개념이..
[자동 매매 시스템 구축하기] 특정 시간에 특정 작업 수행하기 (2)지난 게시글에서 로그인이 정상적으로 처리되었다고 판단할 수 있는 기준을 제작했고, 이번 게시글에서는 해당 기준이 충족된 경우 자동 매매 코드를 실행하도록 하는 코드를 구축할 것이다. 쓰레드를 사용해야 한다. 쓰레드란 구체적으로 어떤 개념인지 이해하지는 못해도 되지만, 깊게 파고들면 들수록 복잡한 개념이 바로 쓰레드이다. 다시 말해, 제대로 알지 못한 채로 사용하게 되면 프로그램 상 오류가 발생할 수도 있다는 것이다. 일례로, 앞서 살펴봤던 이벤트루프의 경우 이벤트루프가 시작됐으나 종료시키지 못하는 바람에 무한 루프에 걸리게 되는 문제점이 발생할 수 있다고 했다. 쓰레드 역시 특정 쓰레드가 모두 완료될 때까지 다른 쓰레드의 실행 및 개입이 이루어지지 않도록 하는 쓰레드락(Thread-Lock)이라는 개념이..
2022.07.09 -
지난 게시글에서 차트 데이터를 요청하고 결과 데이터를 받아온 후에 해당 데이터를 데이터프레임화를 시키는 부분까지 코드를 구축하였다. 사실 이번 콘텐츠에서 궁극적으로 제작하고자 하는 자동 매매 시스템을 사용하기 위해서는 반드시 특정 시점에 특정 작업을 수행하도록 하는 코드가 구축되어 있어야 한다. 이름부터 자동 매매 시스템인데 뭐 하나하나 눌러줘야 한다면 자동 매매 시스템이라는 이름이 얼마나 구색하겠는가? 예를 들어, 아침 8시 50분이 되면 계좌 잔고를 조회한 후에 당일 거래할 종목을 실시간 등록을 한다거나 하는 등의 작업을 사전에 시간 데이터를 기반으로 해서 동작하게끔 구현해두어야 프로그램이 실행되는 동안에 특정 시점이 됐을 때 해당 작업을 자동적으로 실시하게 된다. 로그인이 완료된 시점에서 자동 매매..
[자동 매매 시스템 구축하기] 특정 시간에 특정 작업 수행하기 (1)지난 게시글에서 차트 데이터를 요청하고 결과 데이터를 받아온 후에 해당 데이터를 데이터프레임화를 시키는 부분까지 코드를 구축하였다. 사실 이번 콘텐츠에서 궁극적으로 제작하고자 하는 자동 매매 시스템을 사용하기 위해서는 반드시 특정 시점에 특정 작업을 수행하도록 하는 코드가 구축되어 있어야 한다. 이름부터 자동 매매 시스템인데 뭐 하나하나 눌러줘야 한다면 자동 매매 시스템이라는 이름이 얼마나 구색하겠는가? 예를 들어, 아침 8시 50분이 되면 계좌 잔고를 조회한 후에 당일 거래할 종목을 실시간 등록을 한다거나 하는 등의 작업을 사전에 시간 데이터를 기반으로 해서 동작하게끔 구현해두어야 프로그램이 실행되는 동안에 특정 시점이 됐을 때 해당 작업을 자동적으로 실시하게 된다. 로그인이 완료된 시점에서 자동 매매..
2022.07.09 -
지난 포스팅에서 이제 Open API 관련 코드가 저장되어 있는 파일(본인의 경우 main.py)에서 데이터베이스의 생성과 존재 여부를 자동으로 처리하도록 하는 방법까지 모두 확인했었다. 이번 포스팅에서는 이전에 제작한 분봉 차트 데이터를 본인의 데이터베이스로 입력하도록 한 후, 그를 실제로 WorkBench 프로그램을 사용하여 확인하는 방법, 그리고 저장된 차트 데이터를 불러오는 방법에 대해 다룰 계획이다. 데이터베이스와 연결하기 이전 포스팅에서 create_engine 에 대해 서술했었는데, 그 부분을 기억할지 모르겠어서 잠깐 설명하고 넘어가고자 한다. 일단 지난 포스팅에서 제작했던 def check_db 함수가 포함되어 있는 파일(본인의 경우 manage_db.py) 안에 아래와 같은 코드를 제작해..
[자동 매매 시스템 구축하기] 차트 데이터 조회 여부 (4) - 차트 데이터 저장하기지난 포스팅에서 이제 Open API 관련 코드가 저장되어 있는 파일(본인의 경우 main.py)에서 데이터베이스의 생성과 존재 여부를 자동으로 처리하도록 하는 방법까지 모두 확인했었다. 이번 포스팅에서는 이전에 제작한 분봉 차트 데이터를 본인의 데이터베이스로 입력하도록 한 후, 그를 실제로 WorkBench 프로그램을 사용하여 확인하는 방법, 그리고 저장된 차트 데이터를 불러오는 방법에 대해 다룰 계획이다. 데이터베이스와 연결하기 이전 포스팅에서 create_engine 에 대해 서술했었는데, 그 부분을 기억할지 모르겠어서 잠깐 설명하고 넘어가고자 한다. 일단 지난 포스팅에서 제작했던 def check_db 함수가 포함되어 있는 파일(본인의 경우 manage_db.py) 안에 아래와 같은 코드를 제작해..
2022.07.08 -
데이터베이스 자동 생성 절차 구축하기 지난 포스팅에서 대략적으로 다루긴 했었으나 이번 포스팅에서는 함수를 제작함으로써, 그 함수 내에 제작하고자 하는 데이터베이스 이름만 입력하면 자동으로 데이터베이스가 존재하는지 확인하고 없다면 생성하도록 하는 절차를 구축하고자 한다. 일단 생성하거나 또는 존재하는지를 확인하고자 하는 데이터베이스의 이름을 함수의 변수를 통해 받아와야 하기 때문에, 함수의 이름은 다음과 같이 제작하면 된다. def check_db(db_name): 그 후에는 이제 함수의 인자로 전달받은 db_name 을 바탕으로 해당 데이터베이스가 존재하는지를 확인하는 코드를 작성하면 되는데, 이를 처리하는 방법은 "SHOW DATABASES LIKE '~~'" 이다. def check_db(db_nam..
[자동 매매 시스템 구축하기] 차트 데이터 조회 여부 (3) - DB 자동 생성데이터베이스 자동 생성 절차 구축하기 지난 포스팅에서 대략적으로 다루긴 했었으나 이번 포스팅에서는 함수를 제작함으로써, 그 함수 내에 제작하고자 하는 데이터베이스 이름만 입력하면 자동으로 데이터베이스가 존재하는지 확인하고 없다면 생성하도록 하는 절차를 구축하고자 한다. 일단 생성하거나 또는 존재하는지를 확인하고자 하는 데이터베이스의 이름을 함수의 변수를 통해 받아와야 하기 때문에, 함수의 이름은 다음과 같이 제작하면 된다. def check_db(db_name): 그 후에는 이제 함수의 인자로 전달받은 db_name 을 바탕으로 해당 데이터베이스가 존재하는지를 확인하는 코드를 작성하면 되는데, 이를 처리하는 방법은 "SHOW DATABASES LIKE '~~'" 이다. def check_db(db_nam..
2022.07.08 -
지난 게시글을 통해 설치와 설정하는 방법에 대해 다루었고, 이번 포스팅에서는 파이썬 내에서 MySQL과 연결하는 방법과 사용방법에 대해 살펴볼 예정이다. 일단 이 MySQL은 앞전에서 다루었던 차트 데이터 조회에 대한 부분이 반드시 선행되어야만 아래의 내용들을 사용할 수 있기 때문에 아직 차트 데이터에 대한 코드 구축이 안 되어 있다면 그 글을 먼저 보고 넘어오도록 하자. 물론 차트 데이터 저장이 아닌 다른 목적으로 이용하고자 하는 경우라면 바로 읽어도 아무런 상관이 없다. 그리고 내용을 알아보기 전에 앞서, 이번 포스팅에서 사용할 모듈은 sql alchemy와 mysql 두 개인데, 파이썬에서 설치하는 방법은 파이썬 prompt를 통해 pip install sqlalchemy, pip install m..
[자동 매매 시스템 구축하기] 차트 데이터 조회 여부 (2) - MySQL 연동지난 게시글을 통해 설치와 설정하는 방법에 대해 다루었고, 이번 포스팅에서는 파이썬 내에서 MySQL과 연결하는 방법과 사용방법에 대해 살펴볼 예정이다. 일단 이 MySQL은 앞전에서 다루었던 차트 데이터 조회에 대한 부분이 반드시 선행되어야만 아래의 내용들을 사용할 수 있기 때문에 아직 차트 데이터에 대한 코드 구축이 안 되어 있다면 그 글을 먼저 보고 넘어오도록 하자. 물론 차트 데이터 저장이 아닌 다른 목적으로 이용하고자 하는 경우라면 바로 읽어도 아무런 상관이 없다. 그리고 내용을 알아보기 전에 앞서, 이번 포스팅에서 사용할 모듈은 sql alchemy와 mysql 두 개인데, 파이썬에서 설치하는 방법은 파이썬 prompt를 통해 pip install sqlalchemy, pip install m..
2022.07.08 -
지난 게시글에서 차트 데이터를 조회하는 방법에 대해 모두 살펴봤고, 이번 게시글에서는 드디어 데이터베이스(DB)와 연동하는 방법에 대해 살펴볼 예정이다. 사실 자동 매매 시스템을 구축하는 데에 있어서 데이터베이스를 활용하는 것은 상당히 중요하다. 백테스트 시에는 저장돼있는 주가 데이터를 불러와서 사용해야 하고, 실거래 시에도 분할 매매를 구현하기 위해서는 데이터베이스 내에 계좌 잔고 테이블을 생성해서 사용해줘야 하기도 하다. 따라서 이번 목차에서는 MySQL을 설치하고 MySQL과 파이썬을 연결하고 pandas의 to_sql과 real_sql을 사용하는 방법에 대해 알아볼 예정이다. 일단 프로그램부터 깔아보자. MySQL 다운로드 링크 : https://www.mysql.com/downloads/ 위 링..
[자동 매매 시스템 구축하기] 차트 데이터 조회 여부 (1) : MySQL 설치지난 게시글에서 차트 데이터를 조회하는 방법에 대해 모두 살펴봤고, 이번 게시글에서는 드디어 데이터베이스(DB)와 연동하는 방법에 대해 살펴볼 예정이다. 사실 자동 매매 시스템을 구축하는 데에 있어서 데이터베이스를 활용하는 것은 상당히 중요하다. 백테스트 시에는 저장돼있는 주가 데이터를 불러와서 사용해야 하고, 실거래 시에도 분할 매매를 구현하기 위해서는 데이터베이스 내에 계좌 잔고 테이블을 생성해서 사용해줘야 하기도 하다. 따라서 이번 목차에서는 MySQL을 설치하고 MySQL과 파이썬을 연결하고 pandas의 to_sql과 real_sql을 사용하는 방법에 대해 알아볼 예정이다. 일단 프로그램부터 깔아보자. MySQL 다운로드 링크 : https://www.mysql.com/downloads/ 위 링..
2022.07.08 -
지난 게시글에서 삼성전자(005930)의 3분봉 차트 데이터를 데이터프레임(DataFrame)을 기반으로 데이터를 정리하는 방법까지 작성했다. 사실 이번 게시글을 코드를 구축하기 보다는 코드 실행 시 발생할 수 있는 오류 상황에 대처하는 방법에 대해 소개하고자 하는 목적이 크다. 차트 데이터를 조회하는 과정에 있어서 가장 주의해야 하는 부분이 있는데, 바로 "과도한 시세 조회 요청" 오류가 빈번하게 발생한다는 것이다. 과도한 시세 조회 요청? 키움증권 사에 따르면 "서버의 안정적 운영을 위해 개인별로 데이터 요청의 횟수를 제한하고 있다."고 하는데, 이에 대한 명확한 가이드라인은 제공해주지 않고 있다.(제재 기준을 명확하게 알려준다면 서버가 감당할 수 있는 최대 수치로 사용할까봐 그러는 건가?) 이와 관..
[자동 매매 시스템 구축하기] 차트 데이터 조회하기 (4)지난 게시글에서 삼성전자(005930)의 3분봉 차트 데이터를 데이터프레임(DataFrame)을 기반으로 데이터를 정리하는 방법까지 작성했다. 사실 이번 게시글을 코드를 구축하기 보다는 코드 실행 시 발생할 수 있는 오류 상황에 대처하는 방법에 대해 소개하고자 하는 목적이 크다. 차트 데이터를 조회하는 과정에 있어서 가장 주의해야 하는 부분이 있는데, 바로 "과도한 시세 조회 요청" 오류가 빈번하게 발생한다는 것이다. 과도한 시세 조회 요청? 키움증권 사에 따르면 "서버의 안정적 운영을 위해 개인별로 데이터 요청의 횟수를 제한하고 있다."고 하는데, 이에 대한 명확한 가이드라인은 제공해주지 않고 있다.(제재 기준을 명확하게 알려준다면 서버가 감당할 수 있는 최대 수치로 사용할까봐 그러는 건가?) 이와 관..
2022.07.07