Home » labnote-20160606

labnote-20160606

알고리즘 트레이딩에 대한 책을 읽어보았다.
http://www.hanbit.co.kr/store/books/look.php?p_code=E2817314825
단시간에 상당히 잘 쓴 편이다.

머신러닝에 대하여 짧은 지식이지만 연휴기간에 짬을 좀 내어서 책에 있는 것을 따라 해 봤는데
쉽게 따라하기 어려운 점이 있었다. Full Source Code 가 같이 있지 않아서 대충 감을 잡기만 하고 새로 구현해야 한다.

랩노트를 작성하면서 진행했는데, 에버노트로 편집했다.
하지만 에버노트에서 워드프레스로 옮기자니 편집이 다 깨져서 그냥 링크만 옮길 생각이다.
앞으로도 워드 프레스는 글만 써야 하지 않을까? 싶은 생각이 든다. 게을러서 이미지나 코드를 넣으려니까 너무 귀찮다.

대강 작업한 기록만 적기로 한다.

Objective & Scope

  • 목표
    • 알고리즘 트레이딩 시스템 구현 따라해보기
  • 범위
    • 주식에 한정되어 있으며, 라이브 트레이딩은 구현하지 않는다.

Workflow

1. Scrapping Data

  • 주식 종목 코드(Symbol)을 구하는 것이 우선이다.
    • KRX 에서 조회를 하여 구할 수 있다. 물론 EXCEL 로 다운로드 받을 수 있는데 Scrapy, BeautifulSoup 를 이용하여 웹에서 긁어서 수집도 가능하다. 하지만 Naver, Daum 에서 제공하지도 않고 파일 다운로드는 자동화가 되지 않기 때문에 매번 수 작업을 해야 하는 귀찮은 과정이 필요하다.
    • KRX 사이트에서 크롤링 해봤는데, 1차적으로 막혀 있었다. 이를 우회하기 위해 약간의 추가 작업을 했는데, evernote 에 소스코드가 있다.
  • 종목 과거 가격 가져오기
    • 책에 보면 pandas 의 data_reader를 이용하면 특정 기간동안의 종목의 종가 및 거래량을 조회할 수 있는데, 한국 주식 전부를 조회할 수 없다는 사실을 알게 되었다. 삼성 같은 큰 회사 몇 개를 제외하고는 다 실패가 떨어지기 때문에 책에 있는 대로 진행할 수 없었다.
    • 그래서 Google Finance 사이트에 들어가면 왼쪽 구석에 역사적 주가 자료를 조회 할 수 있는 메뉴가 있는데, 그것으로 과거 주가 데이터를 수집할 수 있었다. 물론 이것도 evernote 에 소스코드가 있는데, 추후에 올리겠다. 이것도 앞서 Crawling 하는 것과 유사하게 웹 페이지 HTML을 파싱하여 테이블의 가격을 가져오는 방식이다.

2. Data Storage (DB 이용한 데이터 입출력 시스템 구현)

  • 앞서 확보한 데이터를 구조화 된 형식으로 DB에 저장하는 것이 필요하다.
    • 종목 코드와 회사 정보에 대하여는 DB에 굳이 저장할 필요가 없을 것 같아서 구글 엑셀 시트로 대체하였다.
    • 파일: https://docs.google.com/spreadsheets/d/16nVO8gsE7OF6xhwtHFn94Ijj-4APBe6XumiSf6eF2yI/pub?gid=0&single=true&output=csv
    • 시계열 데이터는 주로 MongoDB를 사용한다고 하여 이를 활용하였고, Arctic 3rd party 라이브러리를 이용하여 시계열 데이터를 최적화 시켰다.
    • 리턴 값으로 Pandas DataFrame 으로 결과 값이 떨어지도록 하였다.

3. 알파모델 구현 (AlphaModel)

  • 아직은 이해도가 떨어지는 관계로 전부 이해하지는 못했지만 대강의 흐름은 이렇다.
  • 전통적으로 알고리즘 트레이딩은 어떤 가정이 필요한데, 주가는 랜덤워크 모형을 따르게 되는데, 즉 과거 주가 데이터가 현재 주가에 영향을 미치지 않는다는 것이다. 하지만 거시적 관점에서 주가는 추계적 흐름을 따른다고 하는 것이다. 즉 특정 범위의 가격대를 따라서 회귀하는 성향을 가진다는 특성이 존재하는 경우에 비로소 기계적으로 주식 매매를 프로그래밍 할 수 있는 토대가 된다.
  • 평균회귀모형이 바로 이러한 내용을 바탕으로 모델을 설계하게 된다.
    • 우선 가정을 만족하는 종목을 선정하게 된다. 통계 라이브러리를 활용하여 과거 주식 데이터를 이용하여 계산하여 검증한다.
    • 평균회귀 가정이 잘 맞는 순서대로 몇 개의 종목을 선정하고 “포트폴리오”에 편입 시킨다.
    • 어떤 기준에 따라 편입된 “포트폴리오”의 주식을 사고 팔지 정하는 것은 “트레이딩” 에서 전략을 세운다.
  • 한편 여기에 머신러닝을 추가하게 되는데, 이것이 어찌 보면 핵심이기도 하지만 중요도는 상대적으로 약할 수도 있다.
    • 머신러닝은 데이터를 많이 입력 받아 특정 패턴을 인식하여 결론을 도출 시키는 방식으로 볼 수 있는데, 여기서는 주가 예측으로서 상승, 혹은 하락에 대한 Classification 알고리즘을 사용하는 것으로 요약이 될 수 있다.
    • 앞서 ‘특정 패턴’ 을 Classfier 라고 이야기 한다. 알고리즘은 연역적 모델이 아니기 때문에 수 많은 알고리즘이 나와 있으며, Ensemble 이라 하여 많은 알고리즘을 이용하여 투표를 실시하여 다수결로 ‘상승’ 혹은 ‘하락’을 결정하는 방식으로 이해하면 된다.
    • 결론적으로는 매우 단순하게 구현을 하게 되지만 배경 이론이나 과정은 상당히 많은 내용을 함축하고 있기 때문에, 앞으로도 계속 공부해야 할 필요가 있다.
    • 실제로 scikit-learn 라이브러리로 logistic regression, SVM, Random Forest 등의 라이브러리를 이용하게 된다.
    • 한편 딥러닝이라는 말도 접하게 되는데, 아직까지는 주가 시계열 데이터에 이용하는 경우는 없다. 딥러닝이라는 게 분석 보다는 구현에 치중되어 있는 편인데, 알고리즘 트레이딩의 핵심 파트는 ‘분석’ 쪽에 치중되어 있기 때문이다. 하지만 점차 딥러닝도 앞으로 집단 지성 체제로 트레이딩이 활성화되면 이용될 수 있을 수도 있겠다.

4. 포트폴리오 (Portfolio)

  • 앞서 2가지 방식으로 종목을 선정하게 되면, 이를 ‘포트폴리오’ 에 담아서 관리하게 된다.
    • 포트폴리오에는 주식 종목, 가격, 주식 수(보유 수량), 계좌, 투자금액, 현금 등의 정보를 담게 된다.
    • 포트폴리오는 고정적인 것이 아닌 것이 핵심이다.
    • 특정 이벤트가 발생했을 때 (주기적으로 시뮬레이션을 돌린다. 주식 시장 개장 1시간 정도 전에) 매수 또는 매도 이벤트에 따라 실제 주식을 사거나 파는 과정이 이어지게 된다. (Trader)

5. 트레이딩 (Trader)

  • 흔히 주식을 사고 팔 때 “전략”을 세운다고 한다. 그것이 수작업으로 하는 게 아니라 기계가 하게 하는 것이 알고리즘 트레이딩인 것이다.
    • 평균회귀 모델은 요즘에도 많이 쓰기도 하지만 익히 잘 알고 있는 전략이기도 하다. 즉 이동평균의 움직임을 보고 매매 기준을 잡는 방식이다. 주식 책을 사면 차트 분석에 제일 먼저 나오는 내용이기도 하다.
    • 즉, 10일이동 평균선이 50일 이동평균선을 교차하게 될 때 상승 및 하락에 따라 매수, 매도 시점을 잡는 방식이다.
    • 본 시스템에서는 이와 유사하게 이동평균을 기준으로 전일 ‘종가’가 표준편차 범위를 벗어나게 되면 매매를 하는 기점으로 이벤트를 발생시키고 실제 매매를 실시한다.
  • 실제 구현하는 것은 Strategy 를 구현하는 것과 Trading 을 구현하는 것으로 나눌 수 있겠다.
    • Strategy 에서는 평균회귀(Mean Reversion Model) 또는 머신러닝(Machine Learning) 에 따라 매수, 매도 시점을 결정한다.
    • Trading 에서는 실제 HTS 트레이딩 시스템을 이용하여 매수 또는 매도 주문을 체결할 수 있도록 한다.

6. 백테스팅 (Backtester)

  • 모델을 이용하여 거래를 하는 것은 항상 위험(Risk)이 존재하며, 이는 총 수익률에 큰 영향을 끼친다.
    • 아무리 모델이 좋아도 Risk Hedging 을 잘못하면 큰 손실을 발생시켜 망할 수도 있다.
    • 결국 주기적으로 백테스팅을 실시하여 위험율, 수익율 등 평가 기준을 이용하여 검증하는 것이 필요하다.
    • 이를 위해 Quantopion 을 활용하기로 함
  • 이 부분에 대한 내용은 아직 시간이 모자라서 제대로 보지는 못했음