규도자 개발 블로그

실패로부터 배우다 - 6. 퀀트 (주식 선현물차익거래 편) 본문

시행착오/실패로부터 배우다

실패로부터 배우다 - 6. 퀀트 (주식 선현물차익거래 편)

규도자 (gyudoza) 2021. 7. 7. 21:21

이번년도 초부터 시작했고 얼마 전에 실패로 귀결된 따끈따근한 프로젝트다. 그때 당시 취업준비를 하던 도중에 증권사에 다니는 줄 알고 있던 친구에게 연락이 와서 밥을 한끼 하게 됐는데 만나보니 얼마 전까지 프랍트레이더로 있다가 퇴사하고 쉬고 있다고 했다. 마침 둘 다 쉬고 있고 나도 옛날부터 주식투자는 계속 했기 때문에 어느정도 기본지식은 갖추고 있었고 평소에도 주식관련 얘기를 조금씩 나눴기 때문에 그냥 집에서 쉬느니 진지하게 프로젝트를 하나 해보자고 해서 시작하게 된 게 이 프로젝트이다. 일단은 그 친구가 애초에 그쪽 업계에 있었던 데다가 실력도 인정받아 우리의 모델이 수익을 창출할 수 있다는 사실망 증명된다면 투자금을 끌어오는 건 문제가 되지 않는다고 했다. 하지만 결국 알파가 나오는 모델이 없었기 때문에 접었다. 그래서 지금까지 썼던 전략들이 무엇이며 왜 실패했는지 써나갈 예정이다. 혹시라도 퀀트나 알고리즘 매매 프로그램을 만들고 있는 사람이라면 이 전략들은 피하길 바란다.

 

 

이번에 설명할 전략은 주식선물과 주식현물간의 스프레드를 이용한 매매이다. 컨셉을 이해하기 위해선 선물의 작동원리와 주식선물이라는 상품이 무엇인지 아는 것부터 필요하다. 이걸 읽는 사람이라면 선물이라는 상품의 작동원리 정도는 알고 있을 것 같으니 주식선물이 무엇인가에 대해서부터 설명하는 게 좋을 것 같다.

 

한국 주식시장에는 주식선물이라는 게 있다. 단어에서 뜻을 유추할 수 있듯이 주식선물이란 일반선물처럼 코스피, 코스닥 등 지수로 하는 게 아니라 개별 주식으로 하는 것이다. 상품은 매월 두번째주 목요일이 결제일이다. 선물은 결제일마다 상품의 코드가 다르므로 그것을 자동으로 만들어주는 알고리즘이 필요한데 이 과정에서 만들게 된 게 이 포스트이다. 주식선물도 다른 선물옵션 상품들과 마찬가지로 매도계약을 먼저 보유할 수 있는데 이 전략의 이름이 "주식선현물 차액거래"인 것 만큼 이 선현물의 가격을 들고 와서 유리한 포지션이 포착되면 포지션을 잡는 것이다.

 그렇다면 이 유리한 포지션이란 것이 무엇이냐. 간단하다. 바로 주식선물의 매수1호가가 주식현물의 매도1호가보다 비싼 타이밍이 존재하는데 그 순간들을 포착해서 선물매도, 현물매수하는 것이다. 이렇게 포지션을 잡으면 무슨 장점이 존재하느냐. 주가가 오르면 현물가격이 오르고 선물가격이 내린다. 주가가 내리면 현물가격이 내리고 선물가격이 오른다. 그러니까 이렇게 포지션을 잡으면 주가의 오르내림에 상관 없이 포지션을 잡았을 당시 차액만큼 이득을 가져갈 수 있다.

 예를 들어보자. 어떤 한 주식이 꾸준히 1000원이라는 가격을 유지하고 있는데 누군가 물량을 털다가 순간적으로 비대칭적인 매수매도구도가 만들어져서 선물매수1호가가 1100원, 현물매도1호가가 1000원이라는 가격이 형성됐다. 이순간 포지션을 잡았다고 가정해보자. 만약 선현물의 가격이 900원이 되면 선물에선 200원 이득, 현물에선 100원 손해기 때문에 결국 100원이라는 알파가 창출된다. 반대로 주식의 가격이 1200원이 되면 선물에서는 100원 손해, 현물에서는 200원 이득이기 때문에 결국 100원이라는 알파가 창출된다. 그러니까 시장의 오르내림과는 상관 없이 선물과 현물이 각 상황에 대한 헷지수단이 되기 때문에 처음 잡았던 선현물 금액의 차액(100원)만큼의 수익을 가져갈 수 있는 것이다.

 

자, 첫번째 전략에 대한 이론은 완벽하다. 하지만 무참하고 처참하게 실패했다. 지금부터 그 이유를 나열해보려 한다.

 

 

 

첫번째. 세금과 수수료 문제.

뻔한 얘기다. 위의 예에서 볼 수 있다시피 이 전략은 호가단위의 1틱, 2틱을 먹는 거래이다. 특히 치명적인 건 증권거래세였는데 선물은 주식이 아니라서 제하더라도 주식의 증권거래세는 0.25%로 만만치 않은 수치이다. 거기에 보통 현물의 매매수수료는 0.015%, 선물의 매매수수료는 0.006%이다. 하지만 이건 전부 "매매수수료"이기 때문에 살 때와 팔 때 모두 수수료를 제공한다. 그러니까 만약에 이 전략에서 진입과 청산이 이뤄진다고 하면 수수료는 이렇게 계산할 수 있다.

 

0.25 + 0.015 + 0.006 = 0.271

 

한번의 진입과 청산에 약 0.27%의 고정비용이 발생한다. 누군가는 위에서 전략을 설명하면서 말했던 1000원짜리 주식의 예에 대입해보면 1000원의 0.27%라고 해봤자 2.7원인데 딴건 100원이니까 상관 없지 않느냐고 할 수 있을 것이다. 하지만 주식거래를 한 번이라도 해본 사람은 있겠지만 거래가격의 최소단위는 주식가격에 따라 변한다. 예전 삼성전자가 액면분할을 하기 전에 최소거가격단위가 500원이었던 것처럼 저 천원짜리 주식의 최소단위는 5원일 것이다. 그리고 애초에 100원이면 주식가격으로 예를 들었던 1000원의 10%에 해당하는 큰 금액이다. 거래단위가 호가창 한칸에 가격이 10%씩 차이나는 매물은 없다. 그러니까 위의 예를 현실버전으로 수정해보자면 선물매도계약을 1005원에, 현물을 1000원에 사서 5원의 엣지를 갖는 것이다. 하지만 고정비용이 2.7원.

 그래도 매매를 손으로 하는 게 아니라 컴퓨터만 켜놓으면 되는데 이런 거래가 있을 때마다 조금씩이라도 계속 벌면 이득 아닌가? 아니다. 그 이유는 차차 나온다.

 

 

두번째. 속도 문제.

이건 예상치 못한 문제였다. 이 전략을 설계할 때 엑셀로 표를 작성해서 했는데 DDE를 통해 증권사 실시간 시세를 불러와서 진입찬스가 나올 때마다 파란 불이 들어오게 했었다. 장을 보면서 초록불이 들어왔다 나갔다 하는 게 눈으로도 보일정도이니 컴퓨터가 포착할 수 있게 하면 충분히 거래가 체결될 것으로 예상했었다. 하지만 실제로 테스트를 돌렸을 때 진입찬스가 10번 포착되면 제대로 거래가 체결된 건은 1건이 있을까 말까 했다. 무엇이 문제인고 하니 그냥 속도문제였다. 실제 증권거래소에서 돌아가고 있는 가격보다 DDE가 느려서 육안으로도 그 찬스를 포착할 수 있다고 하더라도 실제로 주문을 전송하면 그 가격대의 매물은 없기 마련이니 주문체결이 안 된다. 행여 아예 주문체결이 되지 않으면 다행이지만 선물이나 현물 둘 중 한 쪽만 체결되는 경우가 대부분이었다. 그래서 한쪽으로 델타가 열려버리는 것이다. 보통 이런 사태를 전문용어로 래그아웃(Lag out)이라고 한다. 수없이 발생하는 래그아웃으로 인해 이 알고리즘은 계속해서 선현물을 사고팔고 하면서 래그아웃이 나면 포지션 전부 청산하고, 다시 잡고 거래를 반복했으며 그동안 내 계좌는 갈갈갈 갈려나갔다. 전성기때는 수분에 몇 만원에 해당하는 수수료 + 불리한 가격 청산이 일어났다.

 주체가 어디인지는 모르겠지만 이 전략에서 말하는 찬스라는 시점을 DMA를 쓰는 다른 곳에서도 포착해 물량을 가져가고 있는 게 아닌가 한다. 물론 지금 이순간에도 말이다. 난 이 전략을 이베스트 API인 Xing으로 작성했었는데 DMA vs API라는 명백히 속도전에서 질 수밖에 없는 필드에서 싸웠다. 심지어는 DMA를 쓰기 위해선 큰 금액의 계약 + 법인이라는 제한조건이 있었기 때문에 DMA를 쓸 수도 없었다. 이것만으로 끝이었을까? 아니다. 실패한 다른 이유가 하나 더 있다.

 

 

세번째. 청산 문제.

위에서 1000원짜리 주식의 예로 1100원과 900원 어쩌구 저쩌구 하는 예를 봤을 것이다. 말 그대로 이건 싸게 사서(현물) 비싸게 팔 수 있는 권리(선물)를 캐치한 다음에 비싸게 팔고(현물) 싸게 사는(선물) 방법이다. 그러니까 결국 청산은 선물이 비교적 더 싸고 현물이 비교적 더 비쌀때 이뤄진다. 그냥 "유동성 차이에 의해 싸게 사서 비싸게 팔 수 있는 순간들을 포착해놨다가 기회가 오면 청산하는 것"이라고 이해하면 편하다.

 하지만 이 주식이라는 게 정말 신기하고 애매해서 주식이나 시기에 따라 어떤 종목은 수개월 동안 청산타이밍이 안 올 수도 있고, 어떤 종목은 하루에도 몇 번씩의 기회가 오기도 한다. 위에서 말했다. 개별주식선물은 매월 두번째 목요일이 결제일이라고. 그렇다면 청산타이밍이 한달동안 오지 않는다고 가정해보자. 한국의 주식선물상품은 현물인도인수상품이 아니기 때문에 결제일에 현물과 선물의 가격차이만큼의 손해나 이익을 본다. 그리고 그 선물게약은 없어진다. 그렇다. 청산을 하지 못하면 한쪽으로 델타가 열려버리는 것이다. 그렇다고 롤오버(선물을 그대로 다음달 계약으로 넘기는 행위)를 한다고 치면 수수료 + 불리한 가격에 계약을 가져가게될 확률이 높다. 왜 불리한 가격에 계약을 가져가게될 확률이 높느냐, 말 그대로 청산타이밍이 안왔다는 건 내게 유리한 가격이 안왔다는 반증이고 현물과 선물의 가격은 꽤나 괴리가 존재하고 있을 확률이 높다. 내가 실테스트 했을 때 그랬듯이. 

 

 

 

아무튼 이런 이유들로 인해 첫번째 전략이 실패했었다. 그냥 실패만 하면 다행이지 매매프로그램을 만드는 데에 걸린 시간, 롤오버가 발생할 때 까지 한 달 이상의 실테스트 기간, 그리고 이 과정을 위해서 사뒀던 주식을 처분하고 선물계좌에 돈을 넣었는데 그 주식이 올라가서 얻지 못한 이득, 그리고 실테스트 도중 실시간으로 갈려버린 선현물 계좌 등 타격이 이루 말할 수 없었다.

 

이래도 실패에서 얻는 게 있다고? 아, 있다. 스트레스와 나쁜 건강, 시간 낭비, 그리고 손해를 얻었다. 다음 실패는 페어트레이딩이라고 불리우는 전략이다.

 

Comments