Ch.5 실행 시스템
이 시점에서 좋은 전략을 백테스트하고(예시 3.6의 페어 트레이딩 전략 같은 것), 브로커리지를 선택하고(예: Interactive Brokers), 좋은 운영 환경을 갖췄을 것이다(처음에는 컴퓨터, 고속 인터넷 연결, 실시간 뉴스피드면 충분하다). 이제 주문을 생성해서 브로커리지로 전송하는 **자동화 거래 시스템(ATS)**을 구현한 후 전략을 실행할 준비가 거의 됐다. 이 챕터는 그러한 ATS를 구축하는 방법과 거래 비용을 최소화하고 백테스트 기대 성과와의 괴리를 줄이는 방법에 관한 것이다.
자동화 거래 시스템이 할 수 있는 것
자동화 거래 시스템은 브로커리지나 다른 데이터 벤더로부터 최신 시장 데이터를 가져오고, 트레이딩 알고리즘을 실행해서 주문을 생성하고, 그 주문을 브로커리지 계좌로 전송해서 체결시킨다. 이 모든 단계가 완전 자동화되어 컴퓨터에 설치된 하나의 데스크탑 애플리케이션으로 구현되는 경우도 있다. 그렇지 않으면 이 과정의 일부만 자동화되어 전체 절차를 완료하기 위한 몇 가지 수동 작업이 필요한 경우도 있다.
완전 자동화 시스템은 인적 오류와 지연을 최소화한다는 장점이 있다. 특정 고빈도 시스템의 경우 완전 자동화 시스템이 필수적이다—어떠한 인적 개입도 성과를 심각하게 저해할 만큼의 지연을 일으키기 때문이다. 그러나 완전 자동화 시스템은 구축하기 복잡하고 비용이 많이 들며, Java, C#, C++ 같은 고성능 프로그래밍 언어에 능숙한 전문 프로그래머가 필요한 경우가 많다.
저빈도 퀀트 트레이딩 전략에는 반자동화 대안이 있다. Excel이나 MATLAB 같은 친숙하고 사용하기 쉬운 소프트웨어로 주문 목록을 생성한 다음, 브로커리지가 제공하는 바스켓 트레이더나 스프레드 트레이더 같은 내장 도구를 이용해서 주문을 제출하는 것이다. 브로커리지가 Excel에 DDE(Dynamic Data Exchange) 링크를 제공한다면, Excel 스프레드시트에 매크로를 작성해서 버튼 하나로 브로커리지에 주문을 제출할 수도 있다.
반자동화든 완전 자동화든, 가격 데이터 외의 입력 데이터가 필요한 경우도 있다. 예를 들어 어닝 추정치나 배당 데이터는 실시간 데이터 스트림의 일부로 제공되지 않는 경우가 많다. 이런 비가격 데이터는 많은 웹사이트에서 무료로 이용할 수 있지만, 보통 HTML 형식으로 제공되어 바로 사용하기 어렵다. 따라서 자동화 시스템은 이런 웹 페이지를 가져와서 파싱하고 트레이딩 전략이 활용할 수 있는 표 형식으로 재구성할 수 있어야 한다. 이런 웹 페이지 가져오기 및 파싱 프로그램은 MATLAB(3장 예시 3.1 참조)이나 Perl 같은 스크립팅 언어로 쉽게 구현할 수 있다.
반자동화 트레이딩 시스템 구축
반자동화 트레이딩 시스템(그림 5.1 참조)에서는 사용자가 보통 Excel이나 MATLAB 같은 친숙하고 사용하기 쉬운 소프트웨어로 주문 목록을 생성한다. 주문 목록을 생성하는 프로그램은 백테스트 프로그램과 동일한 경우가 많다—결국 백테스트한 것과 같은 퀀트 전략을 구현하는 것이기 때문이다. 물론 최신 데이터를 반영하도록 입력 데이터 파일을 업데이트하는 것을 잊어서는 안 된다. 이는 보통 적절한 데이터를 웹사이트에서 직접 가져올 수 있는 MATLAB 프로그램이나, HQuote처럼 대량의 역사적 가격 데이터를 다운로드할 수 있는 별도 프로그램으로 처리한다.
데이터 업데이트 단계는 필요한 최신 데이터가 전일 종가일 때는 쉽지만, 최신 장중 가격일 때는 상당히 어렵다. 장중 가격이 필요하다면 데이터 벤더나 브로커리지가 Excel 입력 파일을 자동으로 업데이트하는 DDE 링크를 제공해야 한다. 진지한 트레이더를 지원하는 대부분의 브로커리지는 이런 DDE 링크를 제공한다. Interactive Brokers, Genesis Securities, Goldman Sachs의 REDIPlus가 그 예다. 많은 프로프라이어터리 트레이딩 회사들이 이 브로커리지들 중 하나를 체결 목적으로 사용하므로, 이 브로커리지들의 실시간 데이터와 주문 입력 기술에도 접근할 수 있다.
그림 5.1 — 반자동화 트레이딩 시스템
역사적 데이터 파일
↓
MATLAB
↓
주문 파일
↓
브로커리지 바스켓 트레이더
↓
브로커리지 계좌
DDE 링크는 Excel 스프레드시트의 셀에 삽입되어 적절한 데이터를 자동으로 불러오는 수식이다. 브로커리지마다 표현식이 다르지만 일반적으로 다음과 같은 형태다:
=accountid|LAST!IBM
여기서 LAST는 최신 가격을 요청한다는 의미이고, IBM은 해당 종목이다.
주문을 생성하려면 Excel 매크로(스프레드시트에 연결된 Visual Basic 프로그램)나 MATLAB 프로그램을 실행해서 스프레드시트의 정보와 가격을 스캔하고, 트레이딩 알고리즘을 실행하고, 각 줄이 (종목, 방향, 수량) 세 가지 정보로 구성된 주문 파일에 결과를 기록한다. 예를 들면:
("IBM", "BUY", "100")
이 한 줄이 주문 파일에 들어가는 형태다. 브로커리지에 따라 주문 유형(당일 주문(Day)인지 취소 전까지 유효(Good Till Cancel)인지 등)과 같은 추가 정보가 필요하기도 하며, 이 보조 정보도 주문 파일의 각 줄에 기록한다.
주문 목록이 담긴 텍스트 파일을 생성한 후에는 이 주문 파일을 브로커리지의 바스켓 트레이더나 스프레드 트레이더에 업로드해서 제출한다.
- 바스켓 트레이더: 여러 종목의 다수 주문을 업로드하고 한 번의 키 입력으로 브로커리지에 일괄 제출할 수 있는 애플리케이션.
- 스프레드 트레이더: 여러 쌍의 주식이나 다른 증권의 종목을 지정하고, 각 페어에 대한 주문이 진입되어야 할 조건을 설정할 수 있는 애플리케이션. 스프레드 트레이더는 실시간 가격을 모니터링하면서 거래 시간 내내 이 조건들이 충족되는지 확인한다.
브로커리지의 DDE 링크로 주문 제출도 가능하다면, Excel 매크로를 실행해서 주문 파일을 훑으며 버튼 하나로 계좌에 모든 주문을 제출할 수도 있다.
저자가 사용하는 두 브로커리지인 Interactive Brokers와 REDIPlus는 실행 플랫폼의 일부로 바스켓 트레이더, 스프레드 트레이더, 데이터 업데이트와 주문 제출을 위한 DDE 링크를 모두 제공한다. (Interactive Brokers의 스프레드 트레이더는 선물 캘린더 스프레드에만 사용할 수 있다. 주식 스프레드는 “Generic Combo”를 통해 한 번에 한 페어씩 지정할 수 있지만, 주문 진입 조건의 지속적인 모니터링은 선물과 주식 모두 작동한다.)
저자의 실전 워크플로우:
IB 바스켓 트레이더를 이용한 바스켓 트레이딩: 매일 시장이 열리기 전 MATLAB 프로그램을 실행해서 시장 데이터를 가져오고, 트레이딩 알고리즘을 실행하고, 1,000줄이 넘을 수 있는(1,000개 이상 종목에 해당하는) 주문 목록을 주문 파일에 기록한다. 그런 다음 트레이딩 화면에서 바스켓 트레이더를 띄워 바스켓 트레이더로 주문 파일을 업로드하고, 한 번의 키 입력으로 계좌에 모두 제출한다. 일부 주문은 시가에 체결되고, 나머지는 나중에 체결되거나 전혀 체결되지 않을 수 있다. 시장이 닫히기 전에 버튼 하나로 체결되지 않은 주문을 모두 취소한다. 마지막으로 기존 포지션을 모두 청산하고 싶으면 바스켓 트레이더의 다른 버튼을 눌러 적절한 청산 주문을 생성한다.
REDIPlus 스프레드 트레이더를 이용한 페어 트레이딩: 예시 3.6과 같은 페어 트레이딩 전략에는 REDIPlus 스프레드 트레이더를 사용한다. 종가뿐만 아니라 하루 중 어느 시점에서나 주문을 진입시킬 수 있기 때문이다. 시장이 열리기 전 MATLAB으로 시장 데이터를 가져와서 페어 트레이딩 알고리즘을 실행하고, 유니버스의 모든 페어에 대한 지정가를 기록한다. (지정가는 개별 주식이 아닌 스프레드에 대한 한계이므로, 일반 지정 주문으로는 처리할 수 없다.) 그런 다음 이미 지정한 페어들이 모두 포함된 스프레드 트레이더로 이동해서 MATLAB 출력값을 기반으로 지정가를 수동으로 조정한다. (실제로 이 단계도 자동화할 수 있다—모든 스프레드 주문 정보를 MATLAB이 Excel 파일에 기록하고 스프레드 트레이더에 업로드하면 된다.) 버튼을 누르면 거래일 내내 자동으로 가격을 모니터링하고 주문을 진입시킨다.
REDIPlus DDE 링크를 이용한 바스켓 트레이딩: 또 다른 바스켓 트레이딩 전략에는 REDIPlus의 DDE 링크를 활용한다. MATLAB으로 각 Excel 셀에 해당 행의 특정 종목 데이터를 자동으로 업데이트하는 적절한 DDE 링크 수식을 생성한다. 시장이 열리면 스프레드시트에 연결된 매크로를 실행해서 각 종목을 스캔하고 REDIPlus 계좌에 제출한다.
일반적으로 반자동화 시스템은 하루에 몇 번만 이 단계를 실행해서 한 번 또는 몇 번의 주문 물결을 생성하면 될 때 적합하다. 브로커리지 API가 Excel Visual Basic 매크로에서 사용할 주문 제출 함수를 제공하더라도, 최신 데이터를 수집하고 연속적으로 주문 물결을 생성하기 위해 이 프로그램을 자주 실행해야 한다면 속도가 너무 느리다. 이 경우에는 완전 자동화 트레이딩 시스템을 구축해야 한다.
완전 자동화 트레이딩 시스템 구축
완전 자동화 트레이딩 시스템(그림 5.2 참조)은 거래일 내내 최신 가격을 지속적으로 스캔하면서 트레이딩 알고리즘을 반복적으로 실행하고 새로운 주문 물결을 계속 생성할 수 있다. API를 통한 브로커리지 계좌로의 주문 제출이 자동으로 이루어지므로, 바스켓 트레이더나 스프레드 트레이더에 거래를 업로드하거나 Excel 스프레드시트에서 매크로를 수동으로 실행할 필요가 없다. 아침에 “시작” 버튼을 누르고, 하루가 끝날 때 “종료” 버튼을 누르면, 프로그램이 모든 거래를 알아서 처리한다.
그림 5.2 — 완전 자동화 트레이딩 시스템
실시간 데이터 피드
↓
자체 데스크탑 C++ 프로그램
↓
브로커리지 데스크탑 API
↓
브로커리지 계좌
완전 자동화 시스템을 구현하려면 브로커리지가 데이터 수신과 주문 제출을 위한 API를 제공해야 한다. 브로커리지는 보통 Visual Basic, Java, C#, C++ 같은 인기 있는 프로그래밍 언어용 API를 제공하므로, 완전 자동화 시스템도 이 언어들 중 하나로 작성해야 한다. 유감스럽게도 저자가 아는 한 MATLAB용 API를 제공하는 브로커리지는 없다. 따라서 MATLAB은 자동화 거래 시스템의 주문 전송 부분을 구축하는 데 사용할 수 없다.
이론적으로 Excel 스프레드시트와 연결된 매크로로 완전 자동화 시스템을 구성할 수도 있다. DDE 링크를 사용해서 셀을 업데이트하고 적절한 주문을 하루 종일 지속적으로 제출하는 루프를 매크로에 생성하면 된다. 그러나 DDE 링크를 통한 데이터 업데이트가 느리고, 브로커리지에서 한 번에 업데이트할 수 있는 종목 수도 제한되어 있다. (이전 거래 월에 상당한 수수료를 발생시키지 않는 한, Interactive Brokers는 기본적으로 100개 종목만 업데이트할 수 있다.) 마찬가지로 DDE 링크를 통한 주문 제출도 느리다. 따라서 장중 실시간 시장 데이터 변화에 반응하는 트레이딩 전략에는 스프레드시트를 이용한 이 방식이 적합하지 않다.
백테스팅과 주문 제출 플랫폼을 함께 제공하는 TradeStation 같은 브로커리지도 있다. 이런 플랫폼에서 백테스트했다면 실제 주문을 계좌에 제출하도록 설정하는 것이 간단하다. 백테스팅이나 자동 실행을 위해 자체 소프트웨어를 작성할 필요가 없다. 그러나 3장에서 언급했듯이, 이런 전용 플랫폼의 단점은 MATLAB이나 Java 같은 범용 프로그래밍 언어만큼 전략 구성에 유연하지 않다는 것이다. 예를 들어 주성분 분석 기반의 수학적으로 복잡한 전략(예시 7.4 같은 것)을 추구한다면 TradeStation에서 백테스트하기가 꽤 어려울 것이다. Alphacet의 Discovery 같은 더 고급 통합 트레이딩 플랫폼은 백테스트하고 구현할 수 있는 알고리즘의 종류가 훨씬 다양하지만, 일반적인 독립 트레이더가 감당하기에는 비용이 너무 클 수 있다.
프로그래밍 컨설턴트 고용
ATS를 구축하는 것은 일반적으로 전략을 백테스트하는 것보다 더 전문적인 프로그래밍 기술이 필요하다. 체결 속도가 핵심인 고빈도 전략의 경우 특히 그렇다. 실행 시스템을 직접 구현하는 대신 프로그래밍 컨설턴트를 고용하면 훨씬 수고를 덜 수 있다.
프로그래밍 컨설턴트 고용이 반드시 비쌀 필요는 없다. 숙련된 프로그래머의 시간당 요금은 50100달러 수준이다. 때로는 프로젝트 전체에 대해 고정 비용으로 협상할 수 있으며, 독립 트레이더를 위한 대부분의 프로젝트는 1,0005,000달러로 완료할 수 있다.
컨설턴트를 찾는 방법:
- API를 제공하는 브로커리지에 계좌가 있다면, 해당 브로커리지가 API 경험이 있는 프로그래머를 소개해줄 수 있다. (Interactive Brokers는 프로그래밍 컨설턴트들이 서비스를 제공할 수 있는 전용 웹 페이지가 있다.)
- elitetrader.com에서 검색하거나 요청 글을 올릴 수 있다.
- craigslist.org에서 수백, 수천 명의 프리랜서 프로그래머를 찾을 수 있다. 다만 craigslist 프리랜서 프로그래머의 품질은 고르지 않다—특히 금융 시장과 트레이딩 기술에 대한 심층적인 지식이 부족한 경우가 많은데, 이는 자동화 거래 시스템을 성공적으로 구현하는 데 중요할 수 있다.
전략 기밀 유지 문제: 컨설턴트를 고용할 때 우려되는 것은 전략의 기밀을 어떻게 지킬 것인가이다. NDA(비밀유지 계약서)를 서명하게 할 수 있다(많은 법률 문서 웹사이트에서 무료로 다운로드 가능). 그러나 프로그램 구현 후 프로그래머가 실제로 개인 계좌에서 전략을 실행하고 있는지 확인하는 것은 사실상 불가능하다. 이 우려를 해소하는 몇 가지 방법이 있다:
-
대부분의 전략은 이미 알려져 있다: 자신만의 독창적인 창작물이라고 생각하는 전략의 대부분은 경험 많은 트레이더들에게 이미 꽤 잘 알려져 있다. 원하든 원하지 않든, 다른 사람들도 이미 매우 유사한 전략을 거래하면서 수익에 영향을 미치고 있다. 기관 자금 운용사를 위해 일하는 것이 아닌 한, 트레이더 한두 명을 추가한다고 해서 시장 충격이 크게 증가하지는 않는다.
-
용량이 큰 전략: 선물 트레이딩 전략처럼 시장 용량이 큰 전략을 거래한다면, 불량 프로그래머 컨설턴트로 인한 추가적인 시장 충격은 최소화된다.
-
정보 분리: 자동화 트레이딩 전략의 서로 다른 부분을 구축하기 위해 다른 프로그래머를 고용해서 정보와 구현을 분리(compartmentalize)할 수 있다. 흔히 한 프로그래머가 시스템 전체를 이해하지 못하도록 각 부분을 독립적으로 구현할 수 있다.
다음 챕터에서는 자금과 리스크 관리로 넘어가 켈리 공식을 포함한 최적 자본 배분과 레버리지에 대해 다룬다.