본문 바로가기

backup

HFT 시스템 만들기 FIX프로토콜

HFT 트레이딩을 하다보면 FIX프로토콜이라든 것을 들어보게 됩니다.

금융거래는 국제적으로 FIX가 거의 표준으로 사용이 되고 있는데, 해외사이트에서 관련 사이트 돌아다니시면 FIX라든지 FastFix라든지를 접하게 됩니다.

 

해외에서 거래를 하게되면, 큰 업체들은 기본적으로 FIX를 제공합니다. 꼭 HFT를 위해서가 아니라 금융상품을 거래하기 위한 표준규약이기 때문에 대부분 FIX를 제공하고, FIX를 이용해서 거래를 하게 되면 매우 빠르게 거래가 가능합니다.

 

FX마진거래를 하시는 분들은 MT4를 많이들 쓰시는데, 시스템을 업체서버와 같은 곳에서 네트웍 레이턴시 최소화시키고 거래해봐야 아무리 빨라봐야 200ms 이하로 절대로 못 내려갑니다. 내부를 알고나면 MT4가 간편하기는 하지만 브로커가 장난치기 정말 쉬운 시스템이라는 것을 알게 됩니다. 보통 업체에서 메타브릿지라고 해서 메타로 받은것을 다시 FIX로 컨버팅해서 프라임브로커하고 거래를 하게 됩니다. 물론 자체적으로 소화를 하는 B북 업체들도 있지만요.

 

FIX를 쓰면  업체마다 다르긴 하지만, 주문접수하고 2~3ms 에서 매칭을 완료해주기도 합니다. 제가 주로 노리는 것은 HFT를 이용한 차익거래인데, MT4로 삼각차익거래 같은 거 하실려면 이미 남들 주문 들어가서 청산 다 한 이후에나 주문이 접수됩니다.

 

국내에는 아직 FIX가 생소한데, 제대로 붙으려면 FIX에 대한 노하우는 기본적으로 있어야 합니다. 우리나라 거래소도, 체결속도 빨라지고, FIX가 도입이 되면 해외 HFT업체들이 더 들어올 가능성이 높습니다.

 

어쨌든 HFT 관련된 바닥에서 FIX 관련 기술들은 필수입니다.

금융거래 관련해서 외국에서는 활발하게 이야기되는데, 우리나라는 완전 감감무소식인 분야중 몇 가지 있는데, FIX 프로토콜도 그렇고, market impact, market microstructure 이런거는 거의 다뤄지지 않는 것 같습니다.

 

 

 

FIX프로토콜은 다음과 같은 문자열입니다.

8=FIX.4.39=61535=W34=190449=client.fxgrid.integral.com52=20101116-00:40:28.02456=quote.BrokerA57=BrokerALE55=USD/CHF262=USD/CHF-Provider-false1884230368460=4541=20101118268=6269=0270=1.189515=USD271=5000000276=A282=Provider299=14a6_BID290=1269=1270=1.189715=USD271=5000000276=A282=Provider299=14a6_OFFER290=1269=0270=1.189415=USD271=10000000276=A282=Provider299=14a6_BID1290=2269=1270=1.189815=USD271=10000000276=A282=Provider299=14a6_OFFER1290=2269=0270=1.189315=USD271=15000000276=A282=Provider299=14a6_BID2290=3269=1270=1.189915=USD271=15000000276=A282=Provider299=14a6_OFFER2290=310=159

 

위에서 거창하게 말은 했지만, 좀 보다보면 그렇게 어렵고 그런것은 아닌데, 빠르게 문자열에서 내가 원하는 정보를 취하는 것이 관건입니다. 일반적인 문자열 처리로 하다보면 HFT 속도 경쟁에서 밀리게 됩니다.

 

제일 관건 중 하나는 얼마나 짧은 반복안에 정보를 처리해내느냐입니다. 네트웍 카드에서 저 메세지를 socket으로 받았다면 이미 최소한 iteration을 한번 이상 한 것입니다. tcp/ip프로토콜에 대해서 아시면 무슨 의미인지 아실 것입니다.

 

일반적인 문자열 처리로 split해서 단위를 끊어서 하면 내부 알고리즘에 따라서 이미 또 한 두번 iteration이 진행이 됩니다.

그래서 읽는 그대로 한번에 원하는 정보를 다 받아내어야 합니다.

 

요며칠 고생해서 c++버전으로 FIX프로토콜 decoder 1차로 만들었는데, 위의 메세지를 처리하는 속도가 10~20 마이크로 초 정도 나오는 군요. SIMD도 적용하고 아직 개선해야 될 것이 많기는 하지만, 그것도 1번 반복안에 모든 처리가 끝난 것입니다.

 

 

위의 숫자는 나노초 단위입니다. 몇번 반복해서 처리하면서 시간을 재어보니 10~20마이크로 초 정도 나오는 군요

 

c++ fix프로토콜 1차 버전은 한번의 반복에서 모든 처리가 끝나도록 엄청난 switch문 노가다를 하였습니다.

 

 

 

태그 분기 하나, 하나를 모두 switch문으로 처리를 하는 노가다를 했네요. ㅋ HFT속도 경쟁을 위해서는 정말 필요한 값 말고는 쓰기는 최소화하고 읽기만 하여야 합니다. switch로 노가다를 한 것도 그래도 쓰기나 뒤로 되돌림없이 처리할 수 있는 방법이기 때문에 저렇게 한 것입니다.

 

 

 

 

위는 앞으로 쭉 한번에 읽으면서 문자열에서 double로 변환해주는 함수입니다. 문자열을 한번 읽는 것으로 double로 치환할 수 있는 로직이긴 합니다. 1차는 우선 이것으로 만들었고, 블로그에서 SIMD, SIMD 많이 떠들었는데, SIMD로 처리해서 성능을 높여야할 1번입니다.

 

일단 전체적인것 부터 다만들고, 한 부분씩 성능 업그레이드해나가야죠.

 

현재 HFT 속도 경쟁에서 그래도 싸우려고 하면 네트웍카드에서 수신해서 저 문자열을 decoding하고 매매전략하고 맞으면 매수 신호 보내서 네트웍카드로 나가는데까지 8마이크로초 이하로 내려가야합니다. 소프트웨어 뿐만 하드웨어까지 전부다 갖춰져야 가능하지만요.

앞으로 하나씩 업그레이드되는거 보여드리죠.

 

그래도 다행인 것은 HFT도 로직이 매우 다양해서 속도가 필요로 한게 다른데, latency 같은 경우 최고로 빨라야만 가능하지만, 그외에 로직들은 그래도 속도 여유가 좀 있는 편입니다. 지금 속도 개선하는 것은 HFT 거래할 때 거래가 늦어서 슬리피지가 나는 것을 줄이려는 목적으로 성능 개선을 진행을 하고 있는데, 궁극적으로는 우리도 1마이크로초 경쟁에서 이겨보고 싶네요.