본문 바로가기

backup

HFT 거래를 위한 프로그래밍 기술들

요즘 학교에서나 하던 C++을 다시 보느라 엄청나게 고생을 하고 있네요.  C#을 하다가 C++을 하니 이건 뭐 문법이나 사용법 좀 다른 것은 둘째 치고, 정말 편리하게 쓰던 IDE에서 제공하던 기능들이 거의 다 먹통이니 이거는 원시시대로 돌아간 느낌입니다. 가장 아쉬운 것중 하나는 리팩토링 기능들... 요즘은 납기 맞춰서 제대로 보고하면서 개발해야될 일이 없으니 익스트림 프로그래밍 스타일로 빠르게 개발을 하였는데, C++은 조선시대 수공업을 해야되네요 ㅠ.ㅜ 코드도 C#에 비해서 난잡하고. ㅋ

 

HFT를 하기 위한 프로그래밍을 하기 위해서는 C#이 느리다는 논쟁이 많지만, 결코 단순 연산에서 C#이 C++에 비해서 느리지 않습니다. 오히려 특정 구문에서는 더 빠르기도 하지요. C#으로 HFT프로그래밍을 할 경우 가장 큰 단점은 가비지 컬렉터입니다. 이전에 본 article에서 나왔는데, 다시 찾으려니 못 찾겠네요. C#은 메모리 관리를 위해서 비정기적으로 가비지 컬렉터가 움직이는데 작게 걸리때도 있지만, 때에 따라서 몇초씩 잡아먹습니다. 대부분의 경우 문제없지만, 중요한 시점에서 그러한 일이 벌어진다면, HFT거래를 하는데 있어서 치명적일 수도 있습니다.

 

그래서 HFT를 위한 프로그래밍을 할때는 C#에서 가비지 컬렉터를 끄고 프로그래밍을 해야 합니다. 대신 메모리가 지속적으로 증가하는 경향이 발생을 하게 되므로, 이를 늘리지 않는 프로그래밍이 HFT를 위한 C#프로그래밍이 핵심입니다.

나머지들에 대해서는 C#으로 개발을 하여도 크게 불만적인 부분은 없습니다. 그리고 라이브러리 성능들도 탄탄한 편인데, 오픈소스로 갈 경우 또 그 자체 라이브러리를 최적화시켜야 합니다. 어차피 라이브러리 쓸 것이라는 점에서 C#과 C++은 차이가 없을 것입니다.

 

HFT를 위한 최고의 조합은 그래도 리눅스에서 하는 C++입니다. 아주 미세한 부분까지 전부 HFT에 맞게 최적화할 수 있기 때문입니다. 그러나 오픈 소스의 가장 큰 단점은 너무 많은 라이브러리나 세팅할 것이 있다는 것입니다. 가장 최적의 솔루션을 찾고, 그걸 세팅하고, 그것만 하는데에도 엄청난 시간이 걸립니다. C#에서 몇 번 클릭으로 가장 최적의 조합이 맞춰지지만 프로그래밍만 잘하면 될게 아니라, 어떤 조합이 좋은지 그걸 알고 설치하는 것도 전문가가 있어야 합니다.

 

아무리 그래도 SIMD하고 FIX 디코딩을 어떻게 더 빠르게할지가 고민이 아니였다면 C++은 안했을 텐데, 그걸 개선하기 위한 관심이 생기다 보니 완전 생고생하고 있습니다. 요즘 정말 책 몇 십권 쌓아놓고, C++ 기술들 연구하는데 요즘 가장 관심 두고 있는 기술들이 boost, qt, ace 인데, 이것들이 HFT에서 얼마나 쓰이는지 궁금해서 검색을 좀 해봤더니 어떤 HFT업체에서 올라온 기술자 스펙이네요.

 

 

 

stl은 가장 기본중 하나니까 ㅋ (며칠 전까지 stl에 대해서는 알지도 관심도 없었지만 ㅋ) 그렇고, 요즘 관심가지는 기술들이 딱 HFT 프로그래머 요구 조건이네요. ㅋㅋ

 

며칠 ACE 붙잡고 고생을 했는데, 지금 봐서는 BOOST를 할 것이면 굳이 ACE를 하지는 않아도 될 듯 한데요. ACE에서 배울 것은 미들웨어 프레임워크에 대한 개념 정도? 쓰는 법도 너무 복잡하고, 성능까지는 테스트를 안해봤지만, 너무 무거워서 HFT에 적합한지는 모르습니다. 대부분 빠르다고 합니다. 그러나 HFT는 그냥 빨라서는 되지 않습니다.

 

많은 브로커들이 자기들은 빠르다고 광고합니다. 하지만 그 사람들은 빠른게 어떤의미인지 모릅니다. 300ms이 넘어가는 경우도 다반사입니다. 뭐 사람이 인지할 정도의 차이는 아닙니다. 하지만, HFT에서는 안됩니다. ACE로 구축을 해서 테스트를 해볼까 했는데, 그냥 테스트 해보고 버리기에는 진입 장벽이 너무 높네요. 레퍼런스도 부족하고, ACE때문에 며칠 생고생하다가, 전체적인 그림은 대략적으로 눈에 들어오기 시작을 하긴 하는데, 완전 익숙해지려면 시간이 너무 오래 걸릴 것 같습니다.

 

일단 BOOST를 파려고 합니다. 오래 전에 본 걸로는 BOOST에는 네트워크카드를 직접 제어할 수 있는 옵션들이 포함이 되어 있다는 것을 본적이 있긴 한데, 그냥 순수한 native C++이 빠를지 BOOST가 빠를지는 모르겠지만, 어쨌든 투자해볼 가치는 있다고 생각이 드네요. 근데 SIMD를 위해서 인텔 C++ 쓰려고 하니 또 세팅이 잘 안되어서 반나절 생고생 ㅠ.ㅜ

C++의 길은 멀고도 험하군요.

 

HFT를 기술로 우선은 SIMD + 네트워크카드에서 데이터 받는 부분까지 최적화를 생각을 하고 있네요.

최종으로 생각하는 모델은 FIX처리는 FPGA에서 끝내고, 로직은 SOC에서 처리를 하는 것이고, 세계 시세 데이타를 빅테이블에 저장을 하고, GPGPU로 슈퍼컴 구축해서 데이타 마이닝하고 시뮬레이션 해보는 것인데, 언제나 구축을 할지는 모르겠네요. ㅋ