주식 현재가를 가져오기 위해선 장이 시작하는 순간부터 장이 끝날 때까지 프로그램을 실행시킨 상태로 컴퓨터를 계속 켜놓고 있어야 한다. 만약 일이있어서 컴퓨터를 사용하지 못하는 경우, 혹은 프로그램을 실행시키지 못한 경우 그날 해당 알람봇은 제기능을 하지 못하고 만다. 따라서 로컬 컴퓨터가 아닌 24시간 켜져있는 외부의 컴퓨터에 가상머신을 띄워 해당 프로그램이 돌아가도록 설정하려고 한다.

 

1. 가상머신 인스턴스 생성하기

가상머신을 위한 클라우드 서비스는 AWS의 EC2를 이용했다. AWS는 학생이라고 무료 지원해주진 않기 때문에 (일부 크래딧을 제공해주긴 한다.) 큰 비용을 감당할 수가 없어 프리티어 서비스(t2.micro)로 시작했다. 가상머신에 설치할 운영체제는 현재 사용하고 있고 가장 익숙한 윈도우 환경에서 시작했다. 키페어 및 인스턴스를 생성하는 과정은 아래의 링크를 참고했다.

 

[AWS] EC2 키 페어 생성하고, 인스턴스 생성하는 방법

키 페어 생성 AWS에서 가상 서버에 접근하려면 개인키(private key)와 공개키(public key)로 구성된 키 페어(key pair)가 필요하다. 공개키는 AWS에 업로드되어 가상 가상 서버에 삽이되고, 개인키는 자신이

deftkang.tistory.com

인스턴스 생성 결과

인스턴스를 생성하고 나서 EC2 콘솔로 넘어오면 우상단측에 연결 버튼이 있다. 연결하고자 하는 인스턴스를 선택하고 연결 버튼을 누르면 2가지 방식으로 연결할 수 있다는 가이드가 나오는데, RDP 클라이언트로 이동한다. 원격 데스크톱 파일을 다운로드 받고 실행시키 위해선 암호를 입력해야 하는데, 이때 하단의 암호 가져오기란에서 앞서 생성한 키페어를 이용해 암호를 가져와 해독한 뒤 copy and paste 하면 된다.

 

원격 데스크탑에 연결한 뒤, 우리가 만든 파이썬 파일이 잘 동작할 수 있도록 만들어 주었다. python과 pip를 설치한 뒤, 파이썬 파일을 만들기 위한 idle과 환경변수를 설정하고 파이썬 파일이 잘 동작할 수 있도록 사용한 모듈들을 설치해주었다. 현재까지 작성한 파이썬 파일을 추가하고 관심종목을 가져오기 위한 text 파일과 휴장일을 구분하기 위한 excel 파일도 만들어주었다.

 


2. 윈도우 작업스케줄러를 이용해 자동화하기

윈도우 작업 스케줄러 프로그램을 이용해 매일 오전 9시에 프로그램이 돌아가도록 설정할 수 있다.

이름과 설명 란에 해당 작업에 대한 간단한 설명을 적은 뒤, 가장 높은 수준의 권한으로 실행을 체크해준다.

트리거로 넘어오면, 해당 작업을 언제 방문할 것인지 설정해준다. 새로 만들기를 클릭하면 작업에 대한 예약을 걸어놓을 수 있다.

동작으로 넘어오면, 어떤 프로그램을 실행시킬지 설정할 수 있다. 새로 만들기를 클릭한 이후 프로그램/스크립트에는 실행시킬 파이썬 파일의 이름을 적고(이때, 확장자명까지 다 적어주어야 한다.) 시작 위치(옵션)에 파이썬 파일이 있는 경로 명을 적어주면 된다. 파일의 경로는 파일의 속성을 통해 볼 수 있다. 여기까지 설정한 후 확인 버튼을 누르면 새로운 작업이 생성되며, 매일 아침 9시에 프로그램이 시작되게 된다.

 


3. main 함수 구성하기 - 주말과 평일 & 휴장일 구분하기

가상환경에서 파이썬이 매일 오전 9시에 실행되도록 설정했으므로, 장이 열리는 날과 장이 열리지 않는 날을 구분하여 장이 열리지 않을 때는 프로그램이 바로 종료되도록 설정해야 한다. 즉, 휴장일을 지정해주어야 하는데, 앞서 "휴장일 구분하기" 포스트에서 주말이 아닌 공휴일 날짜를 구분하는 프로그램 파일을 만들었으므로 이번에는 현재 날짜가 토요일인지 일요일인지 구분하려고 한다. 이때, datetime의 weekday 메소드를 사용했다. weekday() 메소드를 이용하면 현재 날짜가 무슨 요일인지 0~6까지의 숫자로 출력하며, 0은 월요일을 나타내고 6은 일요일을 나타낸다.

from slack_sdk import WebClient
import datetime

day_of_the_week = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
slack = WebClient(token="토큰 입력")

def main():
    interest_stock_list = get_interest_code_list()
    cur_time = datetime.datetime.now()
    today = day_of_the_week[cur_time.weekday()]

    # 주말 제외
    if today == "토요일" or today == "일요일":
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + today + " 오늘은 휴장일입니다.")

 

이제 주말이 아닌 평일이지만 휴장일인 날들을 구분해주어야 한다. 앞서 우리는 휴장일을 구분하는 메소드를 korea_holiday.py 라는 파일에 작성했으므로 해당 모듈을 import하여 사용할 것이다.

from slack_sdk import WebClient
import korea_holiday
import datetime

day_of_the_week = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
slack = WebClient(token="토큰 입력")
koreaHoliday = korea_holiday.krx_holiday_data()


# main 함수
def main():
    interest_stock_list = get_interest_code_list()
    cur_time = datetime.datetime.now()
    today = day_of_the_week[cur_time.weekday()]

    # 주말 제외
    if today == "토요일" or today == "일요일":
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + today + " 오늘은 휴장일입니다.")

    # 공휴일 제외
    elif str(cur_time.date()) in koreaHoliday[0]:
        index = koreaHoliday[0].index(str(cur_time.date()))
        holiday_name = koreaHoliday[1][index]
        print("1")
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + holiday_name + " 오늘은 휴장일입니다.")

 

3. main 함수 구성하기 - 30분 간격으로 현재가 출력하기

이제 우리는 휴장일인 날과 장이 열리는 날을 완벽하게 구분할 수 있다. 다음은 장이 열리기 시작한 시간부터 30분 간격으로 현재가를 알림하는 코드를 작성해볼 것이다. 30분 간격을 계산하기 위해 datetime의 timedelta 메소드와 스크립트의 실행을 특정 시간까지 잠시 중단시키는 pause 라이브러리의 until 메소드를 사용했다.

from slack_sdk import WebClient
import requests
from bs4 import BeautifulSoup
import datetime
import pause
import korea_holiday


timedelta = datetime.timedelta(minutes=30)
day_of_the_week = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
slack = WebClient(token="토큰 입력")
koreaHoliday = korea_holiday.krx_holiday_data()


# main 함수
def main():
    interest_stock_list = get_interest_code_list()
    cur_time = datetime.datetime.now()
    today = day_of_the_week[cur_time.weekday()]

    # 주말 제외
    if today == "토요일" or today == "일요일":
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + today + " 오늘은 휴장일입니다.")

    # 공휴일 제외
    elif str(cur_time.date()) in koreaHoliday[0]:
        index = koreaHoliday[0].index(str(cur_time.date()))
        holiday_name = koreaHoliday[1][index]
        print("1")
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + holiday_name + " 오늘은 휴장일입니다.")

    # 그 외 시장 열림
    else:
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + " 장 시작")
        while True:
            slack_bot_get_current_price(interest_stock_list)
            cur_time += timedelta
            if cur_time.hour >= 16:
                break
            pause.until(cur_time)
        slack.chat_postMessage(channel="#current_stock_price", text=str(datetime.date.today()) + " 장 마감")
        slack_bot_today_stock_info(interest_stock_list)

열심히 일하고 있다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기