PYTHON/AUTO TRADE SYSTEM

[자동 매매 시스템 구축하기] 일자 데이터 구현하기 ②

  • -

지난 게시글에 이어 이번 게시글에서는 현재 시각이 15시 30분 이전인가 이후인가에 따라 당일 기준 최신 거래일을 어떻게 반환할 것인가에 대한 이야기를 해볼까 한다. 이 내용이 중요한 이유는 바로 추후에 구현할 기능 때문이다. 사실 이유를 알고 나면 간단한 내용이지만, 막상 구현할 때에는 이번 게시글에서 설명하고자 하는 부분을 놓치기 쉽다. 

 

 

15시 30분을 기준으로 최신 거래일 데이터를 결정하는 이유

예를 들어, 8월 26일과 8월 25일 모두 정상적인 거래일이며 지금 현재 시각은 8월 26일 오전 9시 01분이라고 가정해보자. 그렇다면 지금 시점에서 가장 최신의 거래일자는 8월 26일이겠지만 예상외로 우리는 8월 25일이라는 값을 최신 거래일로 가져가야 한다. 이제부터 그 이유를 한 번 살펴보자.

기본적으로 자동 매매 시스템을 시작시키기 위해 우리는 거래할 종목의 리스트를 전달해줘야 하는데, 이 때 우리는 이전에 제작했던 것처럼 DB 내 테이블의 이름을 기준으로 데이터를 불러와야 한다. 그렇다면 8월 26일 오전 9시 01분에 거래를 시작하기 위해 당장 필요한 데이터는 바로 8월 25일에 집계된 종목 데이터이다. 한 가지 예시를 더 생각해보자. 8월 26일 오후 4시 30분 경에 우리가 필요한 데이터는 언제의 데이터일까? 바로 8월 26일의 데이터이다. 즉, 오늘 거래를 하기 위해 필요한 데이터는 전일까지의 데이터이기 때문에 시간을 기준으로 최신 거래일을 반환하는 것이다. 그렇기 때문에 당일 장이 마감되기 전까지는 최신 거래일 데이터를 전일로 유지하는 것이다.

더 나아가 만약 당일 기준 최근 5 거래일 간 집계된 종목 데이터를 당일에 거래하고자 할 경우 8월 26일 오전 9시 01분인 상황에서 최신 거래일자가 8월 26일이 된다면, 8월 26일의 조건검색식 데이터는 없기 때문에 실제로는 4 거래일의 종목 데이터만을 바탕으로 거래를 진행하게 되는 문제점이 발생하는 것이다.

 

 


728x90

 

 

시간을 기준으로 어떻게 나눌 수 있을까?

사실 이 기능을 구현한다 하더라도 만약 이 글을 보면서 기능을 구현하는 독자가 주말에 구현하고 있다면 이 기능이 정상적으로 동작하는지 확인하기 어렵다. 왜냐하면 주말이기 때문에 시간적인 기준을 고려할 필요가 없기 때문에 이 기능은 동작하지 않기 때문이다. 시간 데이터는   datetime()  이 아닌   time()  모듈을 사용해서 얻어올 수 있다.
※ Line : 7~13

temp_date = datetime.datetime.now()
latest_date = temp_date

while latest_date.weekday() > 4:
    latest_date = latest_date - datetime.timedelta(days=1)

now_time = time.strftime("%H%M")
print(now_time)

if now_time <= "1530":
    pass
else:
    pass

latest_date = latest_date.strftime("%Y%m%d")
date = temp_date.strftime("%Y%m%d")

print(f"오늘 날짜는 {date}입니다.. 최신 거래일은 {latest_date}입니다.")

 

  strftime()  을 사용해서 현재 시간을   HHMM  과 같은 형태로 나타내도록 했기 때문에, 현재 시간이 16:40이라면 1640으로, 15:00이라면 1500과 같은 형태로 출력될 것이다. 따라서 우리는 이 점을 이용해서   if now_time <= "1530":  인 경우 앞서 계산된   latest_date  라는 변수에서 하루를 더 뺀 값을 최신 거래일로 하도록 하는 것이다.
※ Line : 11

temp_date = datetime.datetime.now()
latest_date = temp_date

while latest_date.weekday() > 4:
    latest_date = latest_date - datetime.timedelta(days=1)

now_time = time.strftime("%H%M")
print(now_time)

if now_time <= "1530":
    latest_date = latest_date - datetime.timedelta(days=1)
else:
    pass

latest_date = latest_date.strftime("%Y%m%d")
date = temp_date.strftime("%Y%m%d")

print(f"오늘 날짜는 {date}입니다.. 최신 거래일은 {latest_date}입니다.")

 

 

 


728x90
반응형
Contents

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

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