PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 차트 데이터 조회 여부 (4) - 차트 데이터 저장하기

  • -

지난 포스팅에서 이제 Open API 관련 코드가 저장되어 있는 파일(본인의 경우 main.py)에서 데이터베이스의 생성과 존재 여부를 자동으로 처리하도록 하는 방법까지 모두 확인했었다. 이번 포스팅에서는 이전에 제작한 분봉 차트 데이터를 본인의 데이터베이스로 입력하도록 한 후, 그를 실제로 WorkBench 프로그램을 사용하여 확인하는 방법, 그리고 저장된 차트 데이터를 불러오는 방법에 대해 다룰 계획이다.

 

 

데이터베이스와 연결하기

이전 포스팅에서   create_engine  에 대해 서술했었는데, 그 부분을 기억할지 모르겠어서 잠깐 설명하고 넘어가고자 한다. 일단 지난 포스팅에서 제작했던   def check_db  함수가 포함되어 있는 파일(본인의 경우 manage_db.py) 안에 아래와 같은 코드를 제작해주도록 하자.

## 사용 시 PASSWORD 양 옆의 ★표만 제거하면 됨.
## PASSWORD★@의 @는 삭제하면 안 됨.

from sqlalchemy import create_engine

engine_3min = create_engine('mysql+mysqldb://root:★PASSWORD★@127.0.0.1:3306/3min_data', encoding = 'utf8')
connection_3min = engine_3min.connect()

"""또는 아래와 같은 방법으로 사용해도 됨"""
engine_3min = create_engine('mysql+pymysql://root:★PASSWORD★@127.0.0.1:3306/3min_data', encoding='utf-8')
connection_3min = engine_3min.connect()

위의 코드 안에 보면   PASSWORD  라는 부분과   db_name  이라는 부분이 있는데,   PASSWORD  자리에는 mysql에 접속할 때 입력하는 비밀번호를 입력하고   DB NAME  에는 본인의 일봉 차트 데이터를 저장할 데이터베이스의 이름을 입력하면 된다. 만약 그 데이터베이스가 없다면, 지난 포스팅에서 다루었듯이   def check_db   함수를 통해 만들어주면 된다. 또한, 이번 절차에서는 분봉 차트 데이터를 저장할 것인데, 분봉 차트 데이터를 저장할 데이터베이스의 이름을   3min_data  로 하도록 하겠다.

그렇다면 지금 manage_db.py 파일 안에 위와 같은 코드가 제작되어 있고, 해당 변수를 사용하기 위해서는 우리가 지난 포스팅에서 작성했던 manage_db.check_db()처럼, manage_db.connect_to_sqlal()을 사용하면 된다. 즉, 방금 제작한 connect_to_sqlal이라는 함수에 사용하고자 하는 db_name인   3min_data  를 입력하게 되면 해당 데이터베이스와 연결한 이후에 engine_all을 반환받게 되는데, 이 engine_all을 반환받는 이유는 pandas의 to_sql에서 사용되는 것이기 때문이다.

 

 

to_sql 사용하기

to_sql 역시 이전 포스팅에서 설명했었는데, to_sql의 가장 기본적인 코드 형태는 아래와 같다.

DATA_NAME.to_sql(name=, con=, index=, if_exists=)

각각 하나씩 설명해보자면 DATA_NAME의 경우에는 to_sql이라는 함수를 통해 전송하고자 하는 데이터의 이름이다. 이 경우에는 앞에서 살펴봤듯이   3min_data  가 전송할 데이터가 되는 것이다. 다음으로 name의 경우에는 해당 데이터베이스 내에서 사용할 table_name을 의미하는 것이다. 다음으로 con의 경우에는 connection의 약자로, 바로 앞에서 설정했던 engine이 들어가는 부분이며 index는 True 또는 False 형태의 Bool 형식으로 입력하게 되는데, 굳이 사용하지 않아도 된다면 index= 부분을 제거해도 된다. 마지막으로 if_exists=는 '만약 존재한다면'이라는 의미로 replace를 사용하게 되면 교체('삭제-입력')의 절차를 거치고 append를 사용하게 되면 '입력'의 절차를 거친다.

위의 내용을 바탕으로, 저장하고자 하는 DataFrame 변수가 chart_data라면 아래와 같은 코드를 제작해야 한다.

chart_data.to_sql(name='s005930', con=engine, index=False, if_exists='replace')

[주의] 데이터베이스 내에서 데이터베이스의 이름이나 또는 테이블 명(위의 경우 's005930'를 가리킴)은 숫자로 시작하면 오류가 발생한다. 하지만 종목 코드는 모두 숫자로 이루어져 있기 때문에 앞에 알파벳 아무거나 입력해주도록 하자. i005930이든, a005930이든 뭐든 간에 알파벳으로 시작되어야 한다.

 

위의 내용에 따라 제작한 request_opt10080 함수는 아래와 같다.
※ Line : 25

import manage_db

    """opt10080 : 분봉차트조회요청"""
    def request_opt10080(self):
        self.chart_data = {'time':[], 'now':[], 'open':[], 'high':[], 'low':[]}
        self.__setinputvalue("종목코드", "005930")
        self.__setinputvalue("틱범위", "30")
        self.__setinputvalue("수정주가구분", "1")
        self.__commrqdata("분봉차트조회요청", "opt10080", 0, "0600")
        self.event_loop = QEventLoop()
        self.event_loop.exec_()
        time.sleep(0.5)

        while self.remained_data == True:
            self.__setinputvalue("종목코드", "005930")
            self.__setinputvalue("틱범위", "30")
            self.__setinputvalue("수정주가구분", "1")
            self.__commrqdata("분봉차트조회요청", "opt10080", 2, "0600")
            self.event_loop = QEventLoop()
            self.event_loop.exec_()
            time.sleep(0.5)

        chart_data = pd.DataFrame(self.chart_data, columns=['time', 'now', 'open', 'high', 'low'])
        print(chart_data)
        chart_data.to_sql(name="s005930", con=manage_db.engine_3min, index=False, if_exists='replace')
        print("차트데이터 저장이 완료되었습니다.")

 

 

이제 코드를 실행해보면 아래와 같은 결과물을 확인할 수 있다. (조회는 30분봉을 기준으로 하였다.)

RQNAME:분봉차트조회요청, TRCODE:opt10080, RECORDNAME:, PRENEXT:2
RQNAME:분봉차트조회요청, TRCODE:opt10080, RECORDNAME:, PRENEXT:2
RQNAME:분봉차트조회요청, TRCODE:opt10080, RECORDNAME:, PRENEXT:2
RQNAME:분봉차트조회요청, TRCODE:opt10080, RECORDNAME:, PRENEXT:0
                time     now    open    high     low
0     20220708153000  +58700  +58700  +58700  +58700
1     20220708150000  +58700  +58800  +58800  +58600
2     20220708143000  +58800  +58800  +59000  +58600
3     20220708140000  +58800  +59000  +59000  +58800
4     20220708133000  +59000  +58800  +59000  +58700
...              ...     ...     ...     ...     ...
3521  20210701110000  -80300  -80100  -80300  -80100
3522  20210701103000  -80200  -80100  -80300  -80100
3523  20210701100000  -80200  -80200  -80200  -80100
3524  20210701093000  -80200  -80200  -80300  -80100
3525  20210701090000  -80300  -80500  -80600  -80000
[3526 rows x 5 columns]
차트데이터 저장이 완료되었습니다.

 

 


728x90

WorkBench 확인해보기

이제 MySQL WorkBench를 열어서 데이터가 잘 저장되었는지 확인해보도록 하자.

 

WorkBench 사용 방법에 대해서는 별도로 언급하지 않았었는데, 여기서 간략하게 설명해보도록 하겠다. 일단 가장 먼저 사용하고자 하는 데이터베이스를 활성화시켜야 한다. 아래 사진을 보면 3min_data가 굵은 글씨로 되어 있는데 그것이 바로 활성화된 상태라는 것을 의미한다. 활성화된 상태와 활성화되지 않은 상태에서 사용해야 하는 방법은 각각 다른데, 아래의 코드를 보면 어렵지 않게 이해할 수 있다. 

# 비활성화 상태
SELECT * FROM '3min_data'.'s005930';

# 활성화 상태
SELECT * FROM s005930;

즉, 활성화 상태에서는 검색 대상을 해당 데이터베이스 안으로 한정지었기 때문에 별도의 데이터베이스 명을 입력하지 않아도 되지만, 비활성화 상태에서는 특정된 데이터베이스가 없기 때문에 '3min_data'라는 부분을 추가로 입력해주어야 한다는 것이다.

그 후 위와 같은 코드를 실행하는 방법은 바로  해당 코드의 윗 부분에 있는 번개 모양을 클릭하는 것이다. 물론 우리는 이게 아니라 단축키를 사용할 것이다. 단축키는 실행하고자 하는 코드를 한 번 클릭해서 커서를 실행하고자 하는 코드의 줄에 놓은 후에 Ctrl + Enter 키를 누르면 된다. 그렇게 실행이 되면 바로 아래의 Result Grid 안에 우리가 입력했던 데이터들이 출력되는 것을 확인할 수 있다.

 

여기까지의 내용을 바탕으로 종목 별 데이터를 DataFrame화 시켜서 DB에 저장할 수도 있고, 해당 차트 데이터를 불러옴으로써 백테스팅을 한다거나 또는 거래 전략을 검증한다거나 하는 등의 여러 가지 작업들을 수행할 수 있다.

 

이제 차트 데이터를 저장했는지 저장하지 않았는지를 확인해서 저장되어있지 않은 데이터만 업데이트하고 싶은 경우에는 이전에 작성했던 네 개의 게시글을 참고하면 된다.

 

다음 게시글에서는 로그인이 정상적으로 처리되었는지 등과 같은 여부를 판단한 후에, 정상적으로 처리되었다면 자동 매매 코드를 실행하도록 하는 코드를 제작해볼 예정이다.

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.