1. 들어가기
주식자동매매 프로그램으로 거래를 하다보면,
일정 시간마다 반복되는 함수를 구현할 필요가 있다.
내가 원하는 패턴에서 매수(진입)하여,
익절/손절 라인에 도달하면 칼같이 매도(청산)하고,
마지막으로 주식이 횡보하면, 일정시간이 흐른 뒤 시장가로 매도(청산)하려고 한다.
특정 시간의 매수/매도를 위해서는 함수 반복 및 시간 측정이 필요하다.
이 글에서는 파이썬이 제공하는 threading 모듈과 time 모듈을 이용할 예정이다.
- threading 모듈은 스레드를 기반으로 병렬 처리하며, timer을 이용하여, 일정시간(interval) 동안 함수를 반복 실행
- time 모듈은 시간과 관련된 함수이며, 이글에서는 현재시간을 구할 것이다.
2. 반복되는 모듈 비교
ㅇ while 반복문 : 개인적으로 for문을 선호하는 편이다.
while True / break(멈춤)을 실행시키기 위한 if문 작성 복잡 → 미활용
ㅇ schedule 반복 : 일정 시간/분/초/요일 등 반복할 수 있으나,
while True와 break(멈춤) 등 실행을 위한 if문 작성 필요 → 미활용
ex) 5초마다 함수 실행 : schedule.every(5).seconds.do(정의해 놓은 함수)
ㅇ process 반복 : time 모듈의 timeout 기능을 활용하여 종료를 시킬 수 있으나,
반복은 while이나 for 구현 필요 → 미활용
ㅇ threading 모듈 : timer을 활용하여 특정시간(초)마다 함수 반복 필요
if문을 활용하여 함수 종료 가능 → 활용
3. 코드 구현
아래 함수는 4초마다 print를 출력하되, 10초 후에 종료된다.
그림1의 4줄에서 종료시간(ending_time)를 함수 밖에서 정의한 것이 핵심이다.
- 함수 내에서 실행하면, 현재시간이 계속 갱신이 되는 문제가 있다.
→ 함수 밖에서 정의해주면, 종료시간(ending_time)이 한번 정의되면 바뀌지 않는다.
1줄 : threading 모듈을 임포트함
2줄 : timer 모듈을 임포트함
4줄 : 끝나는 시간(종료시간)을 변수로 정의함 (현재시간 + 10초 후 종료)
* 단위는 초이며, 20분을 나타내려면 (60*20)으로 작성
6줄 : 임의로 threading_timer() 함수를 정의함
7줄 : threading.Timer(반복시간, 함수)를 tt변수에 넣어준다.
8줄 : tt(반복함수) 시작
10줄 : 현재시간이 "4줄에서 정의한 종료시간"에 대해 10초가 지나면, (if문)
* time.time() : 현재시간을 나타내는 함수이다.
11줄 : tt(반복함수) 종료
15줄 : 6줄에서 임의로 정의한 threading_timer을 실행
import threading
import time
ending_time = time.time() + (10)
def threading_timer():
tt = threading.Timer(4, threading_timer)
tt.start()
print("1. threading.Timer 실행 중")
if time.time() > ending_time:
tt.cancel()
print("2. 곧 있으면 종료")
print("3. threading.Timer() 함수는 여기까지 실행/반복됨")
threading_timer()
print("4. 최초 시작되면 여기까지 실행됨")
(결과)
4. 활용처
threading.Timer를 활용하면 아래의 3가지 경우 대응할 수 있다.
- 매수 패턴에 해당하면, 매수
- 설정한 익절/손절 라인에서 매도
- 20분 동안 횡보한다면, (함수를 종료하고) 시장가로 매도
< 매수/매도를 위한 코드 예시 (향후 구현 예정) >
def investing_stock():
threading.Timer를 활용하여 매수하고, 매수완료 후 실행취소(cancel)
sendorder(가격, 수량)
if 보유수량 1개 이상, 현재가 > 매수가, 종료시간 < 현재시간이면
threading.Timer 함수를 통해 sendorer 함수 반복하여 매도
sendorder(매도 가격, 수량 등을 기재)
elif 보유수량 1개 이상, 현재가 < 매수가, 종료시간 < 현재시간이면
pass
else: (보유수량 1개 이상이고, 종료시간 > 현재시간이면)
sendorder(매도 가격, 수량 등을 기재) → 시장가로 매도
investing_stock()
5. 마치며
이글에서는 threading 모듈을 통해 함수를 반복할 수 있고,
time 모듈을 이용해 현재시간 및 종료시간 등을 설정할 수 있었다.
파이썬의 GIL(Global interpreter Lock, 인터프리터)를 우회하기 위해 threading를 공부하던 중에
threading모듈의 Timer을 알게 되었다.
향후 주식 등의 매수/매도 때 유용하게 사용하게 될 날이 빨리 왔으면 좋겠다.
'1. 국내주식 > 1-1. 국내주식 연구일지' 카테고리의 다른 글
(파이썬) 주식 자동 매매를 위한 알고리즘 패턴 찾기 (2) 패턴 빈도 계산 (0) | 2022.10.03 |
---|---|
(파이썬) 주식 자동 매매를 위한 알고리즘 패턴 찾기 (1) 엑셀 이용 (2) | 2022.10.02 |
(파이썬) pandas와 os모듈을 활용하여 데이터를 엑셀로 보내기 (2) | 2022.09.30 |
(주식 자동매매) 키움증권 영웅문4에서 1분봉 엑셀로 받는 방법 (0) | 2022.09.29 |
(파이썬) for문 활용 (2) - zip()함수 (0) | 2022.09.19 |
(파이썬) for문 활용 (1) - 기본 설명 (2) | 2022.09.16 |
(파이썬) 주식 자동매매를 위한 사전준비 (필요 모듈) (0) | 2022.09.15 |
(파이썬) 주식 multiprocessing.Process 적용하여 다중 병렬 처리하기 (0) | 2022.09.14 |