현재 개발 중인 시스템 트레이딩 프레임워크에 대하여 정리합니다.

 

본인이 원하는 프로그램을 작성하는 방법은 다양합니다. 프로그램은 결국 if then else의 조합인데요. 이를 좀 더 쉽게 개발할 수 있는 방법이 state transition diagram을 그린 후 이를 바탕으로 개발하는 것입니다.

 

매매 과정을 단순화 시켜보면 아래와 같습니다.

1. 매매 대상을 지켜보다가

2. 진입조건이 맞으면 진입

3. 진입되었는지 확인(거래가 성사되었는지 확인)

4. 진입 상태에서는 익절과 손절 여부를 계속 모니터링하다가 조건에 맞는 거래

 

이외에도 동호가 처리라던가, 시초가 높은 친구들 제외, 진입 가능 시간 초과한 친구들 처리 등등 다양한 조건이 존재합니다. 이런 조건들을 분석해서 정리한 "매매 상태 흐름도"는 아래와 같습니다.

 

 

11번 진입 감시 상태 이전에 매매할 대상을 정하는 부분은 별도로 표기하지 않았습니다.

 

각 매매 상태가 변할 때 마다 자신의 상태를 저장합니다. 이렇게 상태별로 정리가 되어 있으면 매매가 끝난 후 어떤 종목이 매매 대상이었으며, 어떤 종목이 어떻게 마무리가 되었는지 검토가 가능합니다.

16, 19번은 추가매매를 할지 말지를 판단하는 상태로 아직 개발은 진행하지 않았습니다. 예를들어 특정 종목 손절 후 다시 복수하고 싶으면 19번 상태에서 11번 상태로 변경하면 다시진입대기 상태가 될 수 있습니다. 또한 이런 과정을 몇 번 반복할 지 등에 대한 부분을 코딩할 수 있습니다.

 

 

 

 

반응형

설정

트랙백

댓글

자동 매매를 하게 되면 사지 말아야 할 주식이 있습니다. 예를들어 관리종목이라든가 본인이 싫어하는 종목 등등이 있겠죠. 혹시라도 매매할 대상으로 이런 종목이 선정이 되면 무시하는 부분을 추가하여야 합니다. 추가로 거래량이 별로 없는 종목들도 빼야합니다. 그래서 자동 매매를 할 때는 개인적으로 빼야할 종목 기록한 파일을 하나 더 사용을 합니다.

 

네이버 주식에서 관리종목, 거래중지 종목을 검색할 수 있습니다.

 

 

우선 관리종목과 거래정지 종목은 아래 링크로 검색할 수 있습니다.

위 두 링크에서 검색이 되는 종목을 뽑아보겠습니다.

 

  주어진 url에서 BeautifulSoup을 이용하여 html 구조를 얻는다.

 

  html 구조에 \tr로 시작하는 부분을 검색한 후

       \th 부분에 있는 title 이름을 얻는다.

 

  html 구조에 \td에 있는 주식 정보를 얻는다.
       정보 중 종목명을 찾은 후 이에 해당하는 code를 찾아서 list에 보관

 

  파일에 결과를 json 형태와 csv 형태로 저장한다. 

 

 

전체 소스코드는 아래 깃허브에 있습니다.

https://github.com/multizone-quant/system-trading/blob/master/get_warning_stock_list

반응형

설정

트랙백

댓글

command line 형태로 프로그램을 개발하다보면 사용자가 입력을 하여야 다음으로 넘어가게 됩니다. 대부분의 경우에는 이렇게 개발하면 됩니다. 그런데 경우에 따라 일정기간 사용자 입력이 없으면 다음으로 넘어가야하는 경우도 있습니다. 예를들어 자동으로 trading하는 프로그램의 경우에 사용자 입력이 없으면 trading할 대상이 있는지 확인하는 부분으로 넘어가는 기능이 필요합니다.

파이썬에서 제공하는 기본 입력함수는 input() 입니다. 아래와 같이 사용하는데, 사용자가 입력하고 enter를 칠때 까지 멈춰있습니다.

 

사용자가 입력할 때 까지 계속 기다리는 input()

 

제가 필요한 것은 일정 시간동안 입력이 없으면 자동으로 default 입력 값으로 이 줄을 실행하는 것입니다. 열심히 구굴링을 해보니, 역시나 좋은 예제 코드가 있더군요.

 

방법은 msvcrt.kbhit() 라고 하는 keyboard 입력 여부를 확인할 수 있는 함수를 이용하는 것입니다. 동작방식은 간단합니다. 무한정 loop를 돌면서 keyboard 입력이 있었다면 한 글자 읽어옵니다. 이걸 반복하다가 enter키가 들어오면 모아서 돌려줍니다. 만약 keyboard 입력이 없었다면 기다리는 시간이 지났는지 확인하여 만약 대기 시간이 지났으면 default 값을 돌려줍니다.

이러한 일을 수행하는 코드를 만들기 위해서는 아래 함수를 사용하여야 합니다.

 

msvcrt.kbhit() : 키보드가 눌리어졌는지 확인

msvcrt.getche() : 눌리어진 한 문자 받아오기

 

일정 시간 동안 입력이 없으면 자동으로 default 값을 돌려주는 input 함수는 아래 github에 있습니다.

 

https://github.com/multizone-quant/system-trading/blob/master/get_default_input_after_limited_waiting_time

반응형

설정

트랙백

댓글

거래소가 열리는 날은 공휴일과 특별한 일자를 제외한 주중입니다. 자동 매매 로직 중 어제 정보를 활용하는 경우가 있습니다. 이때 어제 값을 받을 수 있는 함수가 있으면 편리할 것 같습니다.

 

그래서 거래소 관점에서의 어제를 구하는 파이썬 함수를 만들었습니다.

 

어제 일자를 구하는 방법은 다음과 같습니다.

 

현재 시각의 time_t 값을 구합니다. time_t값으로 현지 시각을 구합니다.

이때 현지 시각은 아래 구조를 가집니다. 여기에서 관심이 있는 값은 tm_wday 입니다. 월요일이 0으로 시작해서 일요일은 6의 값을 갖습니다.

우리가 구하고 싶은 어제는 86400초(하루)  값을 뺀 후 다시 아래 구조 값을 받으면 됩니다. 만약 월요일(tm_wday 값이 0)인 경우에는 토/일을 빼야하기  86400*3초(사흘) 값을 빼면 됩니다.

 

0

tm_year

(for example, 1993)

1

tm_mon

range [1, 12]

2

tm_mday

range [1, 31]

3

tm_hour

range [0, 23]

4

tm_min

range [0, 59]

5

tm_sec

range [0, 61]; see (2) in strftime() description

6

tm_wday

range [0, 6], Monday is 0

7

tm_yday

range [1, 366]

8

tm_isdst

0, 1 or -1; see below

N/A

tm_zone

abbreviation of timezone name

N/A

tm_gmtoff

offset east of UTC in seconds

이렇게 얻은 값에서 년,월,일로 원하는 형태를 만들어서 돌려주면 됩니다.

 

주식 시장 관점에서 어제를 구하는 함수는 아래 github에 있습니다. 추가로 해야할 일은 주식 시장이 열리지 않는 공휴일과 몇몇 특별한 날도 제외하는 부분을 추가하는 것입니다.

 

 

https://github.com/multizone-quant/system-trading/blob/master/get_yesterday

 

multizone-quant/system-trading

logics for system trading. Contribute to multizone-quant/system-trading development by creating an account on GitHub.

github.com

 

 

반응형

설정

트랙백

댓글

공시정보는 Dart에서 확인이 가능합니다.

 

https://dart.fss.or.kr/

 

전자공시시스템 - 대한민국 기업정보의 창, DART

 

dart.fss.or.kr

 

기업에 대한 다양한 정보가 올라오기 때문에 이를 활용하여 투자에 이용하는 경우가 많습니다. 특히 대주주 변동이 공시에 뜨면 주가가 급변하는 경우가 많습니다. 대주주 지분 증가, 신규 대주주 지분 취득 등의 공시가 나오면 자동으로 매수를 하는 전략을 사용할 수 있습니다. 

 

이를 위하여 Dart에서 공시 정보를 실시간으로 읽어오는 파이썬 프로그램을 만들어 보겠습니다.

 

웹크롤링을 이용하여 공시 정보를 받아올 수 있지만, Dart에서 제공하는 Open API를 이용하는 것이 좋을 것 같습니다.

 

Dart Open API를 이용하기 위해서는 회원 가입을 한 후 인증키를 신청하여 받은 후 사용이 가능합니다.

 

 

인증키를 받은 후 특정기업의 대주주 지분 변경 사항을 받아올 수 있는 파이썬 코드입니다.

 

우선 이를 위한 url을 확인해보겠습니다. 개발 가이드를 클릭한 후 왼쪽에 있는 정보 중 원하는 것을 선택하면 제공하는 정보 목록이 나옵니다. 이 중 원하는 API가 있는 경우에 오른쪽에 있는 바로가기를 누르면 url 예제가 나옵니다.

 

 

예를들어 지난 주 지분변경 정보를 위한 url은 다음과 같습니다.

 

opendart.fss.or.kr/api/list.json?crtfc_key=4b57e83413f2c5dc3e40db6747f524f6e75209a0&pblntf_ty=D&&bgn_de=20200518&end_de=20200522&corp_cls=Y&page_no=1&page_count=10 

이러한 정보를 바탕으로 지분 변경 공시 사항을 확인할 수 있는 파이썬 코드는 다음과 같습니다.

 

사용법은 다음과 같습니다.

~~~

res = find_major_holder_change_all('D', '20200518', '20200522')  # type, begin, end
print('')

~~~

 

지분 변경 공시 중 주가에 영향을 미칠만한 사항이 있는 경우에 매수 혹은 매도 주문이 가능할 것 같습니다. 매수한 후 언제 팔지에 대한 전략도 만들어야겠지요?

 

파이썬 소스코드는 아래 github에 있습니다.

 

https://github.com/multizone-quant/system-trading/blob/master/share_holder_info_DART.py

반응형

설정

트랙백

댓글

지난 번에 올린 상승 종목에 이어 전략을 적용하려면 증시에 상장된 모든 종목의 일봉 정보도 필요합니다. 이 정보 역시 naver에서 가져올 수 있습니다.

 

아래 그림에서 보듯이 네이버에서 가져올 수 있는 정보가 다양합니다만, 한 시점에 6항목을 고를 수 있습니다. default로 설정되어 있는 값은 본인이 원하는 값과 틀린 경우에는 필요한 정보를 선택을 하여야 합니다.

 

이렇게 웹 페이지에서 원하는 항목을 선택하기 위해서는 webdriver를 설치하여 페이지를 그려야합니다. 브라우저에 따라 webdriver가 있는데 아래는 chrom driver를 사용한 예입니다. chrom driver를 인터넷에서 찾아서 down받은 후 저장된 위치를 지정하여 사용하면 됩니다.

 

크롬웹드라이버에서 웹 페이지를 읽은 후 원하는 항목을 선택하는 방식을 이용하면 됩니다. 우선 원하는 url을 지정하여 화면에 뜨는 상태를 확인합니다. 

 

우리가 필요한 것은 오늘 일봉 정보가 필요합니다. 즉 시가/고가/저가가 필요합니다. 이를 위하여 필요한 항목을 찾아서  click() 함수를 호출하고, 불필요한 항목을 찾아서 click()함수를 호출하면 원하는 항목으로 변경이 가능합니다. 

 


    driver = webdriver.Chrome("C:\\my\\chromedriver.exe")
    url = https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1'
    driver.get(url)

    driver.find_element_by_xpath(".//*[contains(text(), '고가')]").click()
    driver.find_element_by_id("option7").click()  # 시가
    driver.find_element_by_xpath(".//*[contains(text(), '저가')]").click()
    driver.find_element_by_xpath(".//*[contains(text(), '외국인비율')]").click()  # 삭제
    driver.find_element_by_xpath(".//*[contains(text(), '상장주식수')]").click()  # 삭제
    driver.find_element_by_xpath(".//*[contains(text(), 'ROE')]").click()  # 삭제

    driver.find_element_by_css_selector('[alt="적용하기"]').click()

이렇게 설정을 하면 아래와 같이 원하는 항목만 선택이 가능합니다.

 

 

코스피와 코스닥 정보를 얻을 수 있는 url은 다음과 같습니다.

한 화면에 보이는 종목의 수는 최대 50개이므로 페이지를 계속 변경해가면서 정보를 크롤링해야합니다.

url에 페이지 정보를 추가할 수 있습니다. page 번호를 증가시키면서 검색을 계속하면 됩니다.

https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1&page=2

이러한 정보를 바탕으로 코스피, 코스닥 전 종목 일봉을 받아오는 크롤링 프로그램을 만들어보겠습니다.

우선 코스피, 코스닥 기본 url을 지정을 합니다. 현재 네이버에서 검색이 가능한 코스피,코스닥 각각의 최대 page 수를 지정합니다. 이후에는 loop를 돌면서 page 수를 증가시키면서 해당 page의 시세 정보를 가져오는 get_stock_list()를 부릅니다.

 

 

아래 함수는 특정 url에 있는 주식 시세 정보를 뽑아내는 함수입니다. (자세한 사항은 github 코드 참고)

 

~~~

def get_stock_list(url, cnt) :

~~~

 

네이버에서는 최대 6개까지 검색할 항목을 지정할 수 있는데요. 꼭 필요한 정보만 설정을 했습니다. 만약 다른 정보가 추가로 필요하다면 설정을 바꾼 후 한번 더 호출하면 될 것 같습니다.

해당 페이지에서 주식 시세를 뽑는 방법은 이전 글에서 설명한 상승종목 뽑는 방식과 동일합니다. 다만 첫 컬럼에 있는 no 값이 1부터 시작하는 것이 아니라 페이지 별로 50씩 증가하는 값을 입력을 받아서 사용하는 부분만 차이가 납니다.

 

이렇게 뽑혀진 주식 시세는 별도 파일에 저장하여 향후에 다시 사용합니다. 저장하는 방법은 json 형태로 해도 되고, cvs 형태로 할 수도 있습니다.

 

 

소스코드는 git hub에 올려 놓았습니다. 

github.com/multizone-quant/system-trading/blob/master/day-bong-list-soup.py

 

multizone-quant/system-trading

logics for system trading. Contribute to multizone-quant/system-trading development by creating an account on GitHub.

github.com

 

 

반응형

설정

트랙백

댓글

시스템 트레이딩을 위하여 필요한 정보를 모아보도록 하겠습니다.

이번에 개발할 로직은 코스닥에서 상승 추세 종목 찾아서 매매하기입니다.

 

이를 위하여 오늘 상승한 종목을 구해야합니다.

이베스트 xing api에서는 전 종목 일봉 데이터를 얻을 수는 있지만 시간이 많이 걸린다고 합니다.

 

네이버에 있는 주식 관련 정보 중 상승종목을 보여주는 페이지가 있습니다. 제가 필요한 정보가 바로 이겁니다.

 

화면에 보여주는 정보는 최대 7개를 설정할 수 있습니다. 제가 설정한 정보는 거래량,시가,고가,저가,시가총액,per,poe 입니다. 이를 바탕으로 코딩을 했습니다. 혹시라도 다른 정보가 필요하다면 필요한 항목을 선택하시고, 아래 title_list의 내용도 함께 변경하시기 바랍니다.

 

~~~

    title_list = ['no', 'name', 'close', 'diff', 'per', 'qty', 'open', 'high', 'low', 'sichong', 'per', 'pbr']

~~~

 

이제 이 정보를 크롤링을 해서 파일에 저장한 후 사용을 하면 되겠죠. 오랜만에 크롤링을 해 봅니다.

특정 페이지를 크롤링을 하기 위해서는 크롬에서 개발자모드로 들어가서 해당 페이지의 html 구조를 파악해야 합니다. 다행히 이 페이지는 table 형태로 구성이 되어 있어서 크롤링하는데 문제가 없습니다.

오랜만에 사용하는 package라 구글링으로 사용법을 찾아보면서 코딩을 했습니다.
urllib로 해당 페이지 내용을 읽어오고, BeautifulSoup으로 html 문서 파싱을 하면 됩니다.

화면에 보이는 그대로 html 문서가 구성되어 있기 때문에 중간에 공백도 있고 줄도 있습니다. 이런 부분들은 제거하고 주식 정보만 뽑는 코드는 다음과 같습니다. 

 

첫 글짜가 숫자인 경우에 한하여 일련번호를 증가시키면서 해당하는 종목 정보를 저장합니다. 첫 글짜가 숫자가 아닌 경우에는 except가 발생합니다. 이런 경우에는 그냥 무시하시면 됩니다.

 

그리고 크롤링한 결과 날짜별로 이름을 붙여서 저장하는 것으로 마무리합니다.

장이 끝나면 이 프로그램 한번 돌려서 오늘 상승한 종목을 저장해 놓은 후 다음 날 장 시작하기전에 투자 검토 대상을 뽑은 후 조건을 만족하면 자동 매수를 하면 될 것 같습니다. 

 

해당 코드는 아래 github에 올려놓았습니다.

 

https://github.com/multizone-quant/system-trading/blob/master/ascending-stock-list.py

 

 

반응형

설정

트랙백

댓글

개발은 파이썬을 이용하도록 하겠습니다. 관련 예제가 블로그에 많이 있습니다. dev center에 있는 예제와 블로그들을 참고하였습니다.

개발 IDE로는 spyder나 Visual Studio Code 등 본인이 익숙한 것을 사용하면 됩니다.

전 기존에 visual studio를 사용하던 습관이 있어서 Visual Studio Code를 사용하기로 했습니다.

이베스트 xingApi와 통신을 위해서는 win32com을 사용합니다. 이를 위하여 win32com을 설치해야하는데요. 아나콘다32를 설치하면 일반적으로 함께 설치가 됩니다. 혹시라도 win32com을 찾을 수 없다고 나오면 아래와 같은 명령어로 설치하시면 됩니다.

pip install pywin32

우선 login 과정을 보도록 하겠습니다.

그 절차는 다음과 같습니다.

  1. 로그인에 관련된 정보를 입력한 후 xing api에게 login 명령어를 보냅니다.
  2. xingApi에서 답이 오기를 기다립니다.
  3. 등록한 callback 함수로 login 결과가 옵니다. login 성공 여부를 여기에서 확인합니다.

이베스트 주식 거래를 위한 class를 만들었습니다.

앞으로 선물거래 그리고 암호화폐 거래까지 포함하기 위하여 거래소 별로 class를 만들어 보도록 하겠습니다.

거래소별 base class인 Exchange를 기반으로 이베스트주식 거래 class입니다.

class XASessionEventHandler:  
    login_state = 0

def OnLogin(self, code, msg):  
    print('on login start')  
    if code == "0000":  
        print("login succ")  
        XASessionEventHandler.login\_state = 1  
    else:  
        print("login fail")  
def wait_for_event(code) :
    while XAQueryEventHandler.query_state == 0:
        pythoncom.PumpWaitingMessages()
    if XAQueryEventHandler.query_code != code :
        print('diff code : wish(',code,')', XAQueryEventHandler.query_code)
        return 0
    XAQueryEventHandler.query_state = 0
    XAQueryEventHandler.query_code = ''
    return 1
class EBestStock(Exchange):  
    def __init__(self):
        self.operation_begin = '085000'
        self.operation_end = '153000'

    def login(self, server, id, pwd, cer_pwd, acc, acc_pwd) :
        self.instXASession = win32com.client.DispatchWithEvents("XA_Session.XASession", XASessionEventHandler)
        self.id = id
        self.passwd = pwd
        self.cert_passwd = cer_pwd
        self.account_number = acc
        self.account_pwd = acc_pwd
        self.instXASession.ConnectServer(server, 20001)
        self.instXASession.Login(self.id, self.passwd, self.cert_passwd, 0, 0)
        while XASessionEventHandler.login_state == 0:
            pythoncom.PumpWaitingMessages()

        self.login = XASessionEventHandler.login_state
        return self.login        
if __name__ == "__main__":
    print('\\nebest testing')

server = "hts.ebestsec.co.kr"  # or "demo.ebestsec.co.kr" 모의투자
id = "user id"
passwd = "user password"
cert_passwd = "공인인증서암호"
account_number = "계좌번호"
account_pwd = "계좌비밀번호"

ebest_st = EBestStock()
ret = ebest_st.login(server, id, passwd, cert_passwd, account_number, account_pwd)
if ret == 0 :
    print('fail to login')
    quit(0)

print('login ok')  

실행 결과입니다. 계정 정보를 정확하게 입력하였다면 login 성공할 것입니다.

 

 

반응형

설정

트랙백

댓글

주식 자동 매매를 위하여 여러 증권사 API를 알아보았습니다. 수수료와 개발 지원 사항을 검토해보고 이베스트의 xingAPI를 이용하기로 결정하였습니다. 다음은 xingAPI를 사용하기 위한 절차입니다.

 

1. xingAPI 다운받기

우선 이베스트 증권사에 계좌를 만들어야합니다. 비대면으로 계좌를 만들 수 있으니 계좌가 없으면 우선 계좌를 개설하세요.

 

이베스트 계좌가 있다면 우선 로그인을 하세요. 로그인 후 고객센터/API 항목을 클릭하세요.

 

xingAPI 패키지 중 PC를 선택하면 프로그램이 다운됩니다. 다운이 끝나면 해당 프로그램을 실행하세요.

 

2. 설치가 끝났으면 dev center를 실행합니다.

dev center 창이 뜨면 필요한 정보를 입력합니다. 접속서버는 demo/실서버 중 선택하세요.

3. api 매뉴얼 다운로드

api 사용하기 전에 관련 매뉴얼을 보면 많은 도움이 됩니다. dev center 매뉴 중 도움말에서 xingAPI 매뉴얼을 다운받을 수 있습니다.

 

4. Res 파일 다운로드

api를 사용하기 위해서는 Res 파일이 필요합니다. 아래 버튼을 이용하여 Res 파일을 모두 다운받으세요.

5. xingAPI를 사용하기 위해서는 32bit 시스템이 필요합니다. 요즘 PC는 대부분 64bit이므로 32bit 환경을 만들어주는 도구가 필요합니다. 이를 위하여 Anaconda 32비트를 설치합니다.

아래 위치에서 다운 받으시면 됩니다. 

https://www.anaconda.com/products/individual 

 

Individual Edition | Anaconda

🐍 Open Source Anaconda Individual Edition is the world’s most popular Python distribution platform with over 20 million users worldwide. You can trust in our long-term commitment to supporting the Anaconda open-source ecosystem, the platform of choice

www.anaconda.com

 

윈도우를 사용한다면 윈도우용 패키지를 다운받습니다. 이때 반드시 32비트를 선택합니다.

 

Anaconda 32비트를 설치하면 모든 준비가 완료됩니다.

 

반응형

설정

트랙백

댓글

upbit에서 거래가 되고 있는 암호화폐들의 시세를 얻을 수 있는 방법입니다.

 

아래 예는 upbit에서 거래 중인 EOS의 30분 데이터를 100개 가져오는 것입니다.

 

https://crix-api-endpoint.upbit.com/v1/crix/candles/minutes/30?code=CRIX.UPBIT.KRW-EOS&count=100

 

그 결과는 json 형태로 오는데요. FireFox에서 접속해보면 json형태를 시각적으로 잘 볼 수 있도록 보여줍니다.

 

 

 

분/일/주/월 데이터를 가져오는 방법입니다.

 

  • minutes/1   # 1분 데이터
  • minutes/30  # 30분 데이터
  • days # 일봉
  • weeks # 주봉
  • months # 월봉

 

파이썬과 같은 프로그래밍 언어를 안다면 더 쉽게 원하는 데이터를 뽑을 수 있겠죠. 다음 시간에는 파이썬으로 원하는 데이터를 추출하는 방법에 대하여 알아보겠습니다.

반응형

설정

트랙백

댓글