본인이 만든 트레이딩 시스템을 사용할 때 고민해야 할 부분이 하나 있습니다. 바로 아래 질문이죠.
"어떻게 매일 내 프로그램을 재실행할 수 있을까?"
재시작해야 하는 이유는 명확합니다. 주식시장의 경우 매일 장 시작/종료 시점이 있고, 그 시점 전후로 증권사 API도 리셋되기 때문이죠.
즉, API를 제대로 연결하기 위해선 매일 아침 프로그램을 재시작해야 합니다.
재시작을 위한 가장 단순무식한 방법은 매일 아침 내가 직접 파이썬 코드를 실행시켜 주는거겠죠. 하지만, 힘듭니다. 늦잠자거나 전날 과음이라도 했다면 그날 전략은 돌아가지 않겠죠.
때문에, 우린 자동으로 프로그램이 재실행되도록 코드를 짜야합니다.
이를 하는 방법을 알아봅시다.
자동실행을 위한 프로그램 구조
자동실행 코드는 아래 3가지 부분으로 나눠집니다.
1. tmux: 가상 터미널 프로그램. 코드가 백그라운드에 실행되는동안 모니터링이 용이하도록 해줌
2. shell script: 터미널에서 전략코드를 실행시킬 코드
3. crontab: 주기적으로 쉘 스크립트를 실행시키는 프로그램
전체 구조는 이렇게 생겼죠.
그냥 전략 코드만 실행시키는 건데 무슨 프로그램이 이렇게 많이 붙어있나 싶으실텐데요, 각 파트마다 기능이 있습니다. 아래에서 설명드릴게요
전략 자동실행에서의 주요 마일스톤
전략을 단순히 매일 실행시키기만 하려면 Crontab -> 전략코드 로 바로 실행시키기만 하면 됩니다. 하지만, 내 돈이 달린 일인데 최대한 정교하고 안전하게 프로그램을 만들고 싶지 않으신가요?
때문에 전략 자동실행을 할 때에도 몇몇 마일스톤이 있습니다.
1. 매일 정확히 동일한 시간에 시작할 수 있는가?
가장 중요하죠. 예를 들어 매일 정확히 아침 8시에 실행시켜야 한다면, crontab으로 8시에 프로그램이 실행되도록 만들어두기만 하면 됩니다. crontab이 백그라운드에서 돌면서, 자동으로 원하는 시간에 프로그램을 실행시켜줍니다.
컴퓨터는 물론 켜져있어야겠죠.
2. 어제 실행시킨 프로그램이 꺼지지 않아 중복실행되는 경우가 없는가?
매일 프로그램을 실행시키다보면, 모종의 이유로 어제 실행시킨 프로그램이 종료되지 않아 동일한 전략이 동시에 두 개 돌아가는 경우가 발생합니다. 그렇다면 로그를 두 번 작성하거나 최악의 경우 주문이 두 번 들어갈 수도 있겠죠.
때문에, 매일 프로그램을 확실히 종료시키고, 새로운 프로그램을 실행시켜야 합니다.
shell script를 사용해, 스크립트가 실행될 때마다 기존 전략 코드를 종료하고, 새로 전략 프로그램을 켜줄 수 있습니다.
3. 프로그램 실행 도중 쉽게 전략을 모니터링할 수 있는가?
shell script로 파이썬 프로그램을 다이렉트로 실행시키면, 백그라운드에선 전략 코드가 실행되지만 그 전략이 print하는 로그는 실시간으로 확인하기 어렵습니다.
때문에, 백그라운드에서 작동하는 터미널 창을 하나 열어 그곳에서 전략코드를 실행시킨 후, 원할때마다 그 터미널에 접속할 수 있도록 만들어줍니다.
Tmux를 사용하면 쉽게 이 기능을 구현할 수 있고, 모니터링하기도 몇 배로 편리해집니다.
이렇게 세 프로그램을 사용해 전략 자동실행에 필요한 주요 마일스톤을 달성할 수 있습니다.
그럼, 각 프로그램의 작성 방법을 살펴보도록 하겠습니다.
Crontab 구현
먼저 Crontab은 아래 코드로 설치합니다. crontab 사용을 위해선 리눅스 OS가 필요합니다.
sudo apt install cron
Crontab에 새로운 스케쥴을 등록하려면 터미널 창에 아래 코드를 입력하세요
crontab -e
위 코드를 입력하면 아래와 같이 터미널에서 텍스트 문서가 하나 열립니다.
맨 아래 두 줄은 뜨지 않을건데요, 각각의 줄을 해석하면
CRON_TZ는 크론탭의 현재 timezone을 설정하는 코드입니다. Asia/Seoul로 입력하면, 한국 시간 기준으로 크론탭 프로그램을 실행합니다.
10 22 * * * /usr/bin/bash /home/user/daily_investors.sh는 본격적으로 크론탭에서 shell script를 실행하는 코드입니다.
cron 문법으로 작성되었으며, cron 문법에 대한 설명은 아래 이미지를 참고해주세요.
간단히 살펴보면, 매일 밤 10시 10분에 /usr/bin/bash /home/user/daily_investors.sh 코드를 터미널에서 실행하라는 의미를 가지고 있네요.
여기서 요일은 0 ~ 7 값을 가지며, 0과7은 일요일입니다. 주중에만 실행하려면 1-5 와 같이 입력하면 됩니다.
내가 매일 월-금 아침 8시 /home/user/my_script.sh 쉘 스크립트를 실행하고 싶다면, 아래와 같이 crontab에 입력해주면 됩니다.
0 8 * * 1-5 /usr/bin/bash /home/user/my_script.sh
이렇게 작성을 마쳤다면, Ctrl + X를 눌러 스크립트를 저장해줍니다.
터미널에 installing new crontab이란 메세지가 뜬다면 성공입니다.
Shell Script 구현
쉘 스크립트는 아래 논리구조로 실행됩니다.
1. 실행할 tmux 프로그램 이름(SESSION_NAME), 실행할 파이썬 경로(PYTHON), 실행할 파이썬 코드(STRATEGIES)를 정한다
2. 기존에 동일한 이름의 tmux 프로그램이 실행중인지 확인한다. 실행중인 프로그램이 있다면, 종료한다.
3. 새로운 tmux 프로그램을 실행한다.
4. tmux 내부에서 파이썬 코드를 실행시킨다.
이 논리구조대로 코드를 작성하면, 아래와 같이 작성할 수 있습니다.
사용자는 맨 위 세 개의 변수만 수정하면 됩니다.
SESSION_NAME="test_tmux"
PYTHON="/root/.virtualenv/trader/bin/python3"
STRATEGIES=(
"/root/LiveStrategy/my_strategy.py"
"/root/LiveStrategy/my_strategy2.py"
)
COMMANDS=()
for STRATEGY in "${STRATEGIES[@]}"
do
COMMAND="cd $(dirname $STRATEGY) && $PYTHON $(basename $STRATEGY)"
COMMANDS+=("$COMMAND")
done
# 세션이 존재하는지 체크하고 존재할 경우에만 명령어 실행
if /usr/bin/tmux has-session -t $SESSION_NAME 2>/dev/null; then
/usr/bin/tmux send-keys -t $SESSION_NAME C-c
/usr/bin/tmux kill-session -t $SESSION_NAME
fi
# 새 세션 생성 및 첫 번째 윈도우에 첫 번째 커맨드 실행
/usr/bin/tmux new-session -d -s $SESSION_NAME -n window0
/usr/bin/tmux send-keys -t $SESSION_NAME:window0 "${COMMANDS[0]}" C-m
# 나머지 커맨드들에 대한 윈도우 생성 및 실행
for ((idx=1; idx<${#COMMANDS[@]}; idx++))
do
/usr/bin/tmux new-window -t $SESSION_NAME -n "window$idx"
/usr/bin/tmux send-keys -t $SESSION_NAME:"window$idx" "${COMMANDS[idx]}" C-m
done
session_name에는 실행시킬 tmux의 이름을 정해줍니다. 서로 다른 스크립트끼린 이 이름이 겹치면 안됩니다.
python은 내 파이썬 프로그램을 실행시킬 파이썬이 설치되어있는 경로를 적어줍니다.
strategies에는 실행시킬 전략들 루트를 적어줍니다.
모든 경로는 절대경로로 적어주세요.
이렇게 실행시키면, 새로운 tmux 프로그램이 실행되고, 자동으로 아래 커맨드가 실행됩니다.
cd /root/LiveStrategy
/root/.virtualenv/trader/bin/python3 my_strategy.py
cd /root/LiveStrategy
/root/.virtualenv/trader/bin/python3 my_strategy2.py
내가 지정해둔 디렉토리에 접속해, my_strategy.py와 my_strategy2.py를 실행시킵니다.
이제 이렇게 작성한 쉘 스크립트를 crontab이 실행하도록 등록해주면 됩니다.
Tmux 구현
마지막으로, 전략 코드를 담고있을 터미널 프로그램인 tmux를 구현합니다.
tmux 설치는 아래 코드로 진행합니다.
sudo apt install tmux
tmux는 정말 단순히, "백그라운드에 실행되는 터미널"입니다. 그 이상도, 이하도 아니죠. 다만, 내가 지금 보고있는 터미널 창은 내가 이 창을 닫는 순간 종료되지만, tmux는 내가 명시적으로 종료 커맨드를 날리지 않는 한, 백그라운드에서 무한히 실행중인 상태라는 점이 다르죠.
tmux를 다루기 위해 가장 많이 사용할 키워드들은 다음과 같습니다.
# 실행중인 tmux session 리스트 확인
tmux ls
# 가장 최근에 실행한 tmux session에 접속
tmux a
# 특정 tmux session에 접속
tmux a -t SESSION_NAME
# 특정 tmux session을 종료
tmux kill-session-t SESSION_NAME
2번에서 작성한 쉘스크립트를 실행시킨 다음 tmux a 커맨드를 날리면,
아래처럼 하단에 초록색 바가 보이고, 내가 실행한 프로그램의 로그가 보입니다.
여기서부턴 Ctrl + C로 프로그램을 종료하는 등, 기존 터미널과 동일한 기능을 가집니다. 여기서 전략 로그를 print하면서 실시간으로 내 전략의 상황을 확인하는 용도로 사용하시면 됩니다.
tmux에 접속한 상태에서 주로 사용하는 커맨드는 다음과 같습니다.
중요한건, tmux에 접속한 상태에서는 Ctrl+B를 누른 후 다음 커맨드를 입력해야 tmux기능을 사용할 수 있습니다. 아래 예시로 살펴보겠습니다.
# tmux 프로그램 나가기(프로그램 종료X. 백그라운드에 띄워둠)
Ctrl+B -> D
# 실행중인 전체 tmux 프로그램 열람
Ctrl+B -> S
# 터미널 스크롤
Ctrl+B -> [
Ctrl+B 입력 후 D를 입력하면, tmux 프로그램을 다시 백그라운드로 돌려보냅니다.
Ctrl+B 입력 후 S를 입력하면, 아래와 같이 현재 내가 실행중인 tmux session 리스트가 뜹니다.
화살표와 엔터를 통해 조작 가능합니다.
korfutures_strategy에는 14개의 windows가 달려있는 것을 확인할 수 있는데요, 화살표 오른쪽 버튼을 누르면 14개의 sub-session을 확장해 볼 수도 있습니다.
Ctrl+B -> [ 를 누르면, tmux 터미널 내부에서 마우스 스크롤이 가능합니다.
아래 이미지 오른쪽 위와 같이, 노란색 박스가 뜨면 스크롤 기능이 활성화된 상태구요, ESC 키를 누르면 스크롤 기능을 종료합니다.
tmux 조작법을 익혔으면, 이제 최종 프로그램을 구현해봅시다.
최종 프로그램 구현
앞서 구현한 세 개의 프로세스를 합쳐 하나의 프로세스로 만들어줍니다.
다음 순서로 구현한다면 가장 편리할 것 같습니다.
1. 제공해드린 템플릿을 활용해, 내 전략을 실행시킬 쉘 스크립트를 작성해줍니다.
2. crontab에 원하는 실행시간을 입력하고, 이어서 /usr/bin/bash 내쉘스크립트.sh 를 입력해줍니다.
3. crontab에 등록한 실행시간이 됐다면, 쉘 스크립트가 돌아가면서 tmux가 실행되었습니다. tmux a를 통해 tmux에 접속하고, 내 전략이 제대로 돌아가는지 모니터링합니다.
이렇게만 하면 자동화 프로세스는 완벽히 마무리되었습니다.
고생하셨습니다!
마무리
Crontab + Shell Script + Tmux를 활용해 주기적으로 전략을 재실행해주는 프로세스를 작성해 보았습니다.
꽤나 복잡해 보이지만, 앞서 설명드린 세 가지 마일스톤을 달성하기 위해선 이 구조보다 더 잘 만들기 힘들 것 같습니다.
처음엔 복잡하지만, 세 가지 기능을 잘 활용하는 방법만 익혀둔다면, 앞으로 자동실행을 위해 더 만들 기능은 없을 정도로 완벽한 틀이 될 겁니다.
궁금한 점이 있으시면 댓글로 물어봐주시고,
그럼 모두 성투하세요!
'퀀트 분석 > 트레이딩 시스템 개발' 카테고리의 다른 글
파이썬 주식 트레이딩 시스템 (2) - 일별 주가 데이터 조회 (1) | 2024.02.04 |
---|---|
파이썬 주식 트레이딩 시스템 (1) - API 발급 (0) | 2023.12.09 |
댓글