1. 국내주식/1-1. 국내주식 연구일지

(파이썬) threading와 time 모듈로 특정 시간마다 반복 실행

봄이오네 2022. 9. 24. 08:06
반응형

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. 4초마다 print 출력 >

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. 최초 시작되면 여기까지 실행됨")

(결과)

< 그림2. 위의 코드를 실행한 화면 >


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을 알게 되었다.

향후 주식 등의 매수/매도 때 유용하게 사용하게 될 날이 빨리 왔으면 좋겠다.

반응형