자동매매 시스템에서 데이터 수집은 지속적으로 이루어져야 합니다. 최신 데이터를 기반으로 전략을 판단해야 하기 때문입니다. 따라서 데이터 로딩 및 관리 과정을 자동화하는 것이 중요합니다. 이 섹션에서는 파이썬 스크립트를 사용하여 데이터 수집을 자동화하는 방법을 알아봅니다. 스케줄링 라이브러리를 활용하여 주기적으로 데이터를 업데이트합니다. 이를 통해 시스템 운영 효율성을 높이고, 데이터 누락을 방지할 수 있습니다.
1단계: 스케줄링 라이브러리 선택 및 설치
데이터 수집 자동화를 위해 스케줄링 라이브러리를 선택해야 합니다. schedule
, APScheduler
등 다양한 라이브러리가 존재합니다. 각 라이브러리는 특징과 사용법이 다릅니다. 본 튜토리얼에서는 사용이 간편한 schedule
라이브러리를 사용합니다. schedule
라이브러리는 특정 시간 또는 간격으로 함수를 실행할 수 있습니다.
schedule
라이브러리를 설치합니다. 터미널 또는 명령 프롬프트에서 다음 명령어를 실행합니다.
pip install schedule
2단계: 데이터 수집 함수 정의
데이터 수집 함수를 정의합니다. 이 함수는 거래소 API를 통해 데이터를 수집하고, 데이터베이스에 저장합니다. 이전에 작성한 데이터 수집 코드를 활용합니다. 함수는 예외 처리를 포함해야 합니다. 예외 처리를 통해 오류 발생 시에도 스크립트가 중단되지 않도록 합니다.
import schedule
import time
import pyupbit
import cx_Oracle
def collect_and_store_data():
"""
업비트에서 데이터를 수집하여 Oracle Autonomous Database에 저장하는 함수
"""
try:
# 데이터베이스 접속 정보
dsn_tns = cx_Oracle.makedsn('<호스트>', '<포트>', service_name='<서비스 이름>')
db_user = '<DB 사용자 이름>'
db_password = '<DB 비밀번호>'
# 데이터베이스 접속
conn = cx_Oracle.connect(user=db_user, password=db_password, dsn=dsn_tns)
cursor = conn.cursor()
# 업비트에서 데이터 가져오기
df = pyupbit.get_ohlcv("KRW-BTC", count=200)
# 데이터베이스에 데이터 삽입
for index, row in df.iterrows():
sql = """
INSERT INTO BTC_OHLCV (TRADING_DATE, OPEN_PRICE, HIGH_PRICE, LOW_PRICE, CLOSE_PRICE, VOLUME)
VALUES (:1, :2, :3, :4, :5, :6)
"""
cursor.execute(sql, [index.to_pydatetime(), row['open'], row['high'], row['low'], row['close'], row['volume']])
conn.commit()
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - 데이터 수집 및 저장 성공")
except Exception as e:
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - 데이터 수집 및 저장 실패: {e}")
if conn:
conn.rollback()
finally:
if cursor:
cursor.close()
if conn:
conn.close()
3단계: 스케줄링 설정
schedule
라이브러리를 사용하여 데이터 수집 함수를 스케줄링합니다. 스케줄링 주기를 설정합니다. 매일 특정 시간에 실행하거나, 특정 간격으로 실행할 수 있습니다. 다음은 매일 오전 9시에 데이터 수집 함수를 실행하는 예제 코드입니다.
schedule.every().day.at("09:00").do(collect_and_store_data)
다음은 10분마다 데이터 수집 함수를 실행하는 예제 코드입니다.
schedule.every(10).minutes.do(collect_and_store_data)
4단계: 스케줄러 실행
스케줄러를 실행하여 스케줄링된 작업을 수행합니다. while
루프를 사용하여 스케줄러를 계속 실행합니다. schedule.run_pending()
함수는 스케줄링된 작업 중 실행할 시간이 된 작업을 실행합니다. time.sleep(1)
함수는 CPU 사용량을 줄이기 위해 1초 동안 대기합니다.
while True:
schedule.run_pending()
time.sleep(1)
5단계: 전체 코드
다음은 전체 코드입니다.
import schedule
import time
import pyupbit
import cx_Oracle
def collect_and_store_data():
"""
업비트에서 데이터를 수집하여 Oracle Autonomous Database에 저장하는 함수
"""
try:
# 데이터베이스 접속 정보
dsn_tns = cx_Oracle.makedsn('<호스트>', '<포트>', service_name='<서비스 이름>')
db_user = '<DB 사용자 이름>'
db_password = '<DB 비밀번호>'
# 데이터베이스 접속
conn = cx_Oracle.connect(user=db_user, password=db_password, dsn=dsn_tns)
cursor = conn.cursor()
# 업비트에서 데이터 가져오기
df = pyupbit.get_ohlcv("KRW-BTC", count=200)
# 데이터베이스에 데이터 삽입
for index, row in df.iterrows():
sql = """
INSERT INTO BTC_OHLCV (TRADING_DATE, OPEN_PRICE, HIGH_PRICE, LOW_PRICE, CLOSE_PRICE, VOLUME)
VALUES (:1, :2, :3, :4, :5, :6)
"""
cursor.execute(sql, [index.to_pydatetime(), row['open'], row['high'], row['low'], row['close'], row['volume']])
conn.commit()
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - 데이터 수집 및 저장 성공")
except Exception as e:
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - 데이터 수집 및 저장 실패: {e}")
if conn:
conn.rollback()
finally:
if cursor:
cursor.close()
if conn:
conn.close()
# 스케줄링 설정 (매일 오전 9시)
schedule.every().day.at("09:00").do(collect_and_store_data)
# 스케줄러 실행
while True:
schedule.run_pending()
time.sleep(1)
6단계: 스크립트 실행 및 확인
파이썬 스크립트를 실행합니다. 스크립트는 지정된 시간에 데이터 수집 함수를 실행합니다. 데이터베이스에 데이터가 정상적으로 저장되는지 확인합니다. 로그를 통해 스크립트 실행 결과를 확인할 수 있습니다.
요약
이 섹션에서는 데이터 수집 및 관리 자동화 방법을 설명했습니다. schedule
라이브러리를 사용하여 데이터 수집을 자동화했습니다. 스케줄링 주기를 설정하고, 스케줄러를 실행했습니다. 이 과정을 통해 자동매매 시스템의 데이터 관리 효율성을 높일 수 있습니다.