카테고리 보관물: 시스템 트레이딩

계획된 트레이딩 전략

사람들은 미체결 주문이 발생하는 경우 대기하거나 매수/매도 단가를 조정해서 주문을 변경한다. 이와 같은 일을 트레이딩 시스템을 개발할 때에도 고려해서 개발해야 한다. 고가에 매수하거나 저가에 매도하는 경우 슬리피지가 발생할 수 있는 영역이기 때문에, 신중하게 결정하고 개발해야 한다.

너무도 당연한 얘기 아니겠나 싶지만, 성향상 이런 부분들에 대한 디테일을 챙기기 어려운 분들은 꼭 챙겨주셔야 한다.

즉, 매매에 있어서 모든 전략은 계획되어 있어야 하고, 계획한 대로 처리할 수 있어야 한다. 계획한대로 되지 않았을 경우에 대한 예외처리까지 말이다.

하지만 대다수의 투자자들은 그런 상황에 대한 준비까지 하지도 않는다. 그렇기 때문에 그와 같은 상황을 마주하게 되면 감정적으로 결정하는 경우가 많다. 물론 경험치에 따른 훌륭한 직관으로 대응할 수 있다면 그렇게 하면 된다. 하지만 트레이딩 시스템으로 구축한다면 모든 판단은 계산 가능해야 하고 분명해야 한다. 애매하게 대충 처리하는 일은 있을 수 없다.

마음 편한 투자

대다수의 투자자들은 주가를 예측하고 싶어한다. 100%의 확률로 내가 사면 오르고, 팔면 내리는 경우를 맞추고 싶어한다. 딱 잘라서 말하건데, 그런 건 없다. 1% 씩 매일 꾸준히 수익을 내면 한 달 누적수익은 20%. 1% 안에는 다양한 이야기들이 담겨있다. 단일 종목으로 1% 매일 수익이라고 생각하면 곤란하다. 그게 그렇게 쉬운 일이라면 주식시장에 뛰어든 사람들은 모두 벌었어야 했다. 하지만 95%의 사람들이 잃는 게 현실이다.

즉, 수익을 볼 확률이 높은 자리에서 대응의 의사결정을 할 뿐이다. 손실을 보기도 하지만 장기적으로 수익을 보는 구조를 만들어 투자해야 한다. 승패는 병가지상사라는 말이 있다. 손익은 시장에서 늘상 있는 일이다. 손익비를 높여서 안정적인 수익 모델을 만드는 것이 트레이더가 해야 할 일이다.

실패가 두렵고, 손실 보는 일을 절대로 하고 싶지 않다면 투자나 트레이딩을 하지 않으면 된다. 무엇보다 마음이 편한 게 우선이다. 자기의 결과 맞지 않은 길을 굳이 갈 필요가 없다.

매매로직 재사용

빠른 배포가 중요하다는 포스팅에서 이야기 한 방법은 사실 안정적이지 않다. 더 좋은 방법은 백테스트할 때 활용한 매매 시스템의 로직을 트레이딩 시스템에서 동일하게 활용하는 방법이다. 1호 시스템을 만들고 나서, 앞으로 2호 이후의 시스템들을 만들 생각을 하니 매번 모든 코드를 작성해야 하는 것은 비효율적이라는 생각이 들었다. 매매로직을 모듈화해서 백테스트와 트레이딩 시스템에 모두 동일하게 활용할 수 있게 한다면, 백테스트에서 실전 매매 시스템 개발까지의 기간을 최소화 할 수 있을 것이라는 생각이 들었고, 이 작업에 이제 곧 착수할 예정이다.

백테스트의 성능을 저하시키지 않으면서, 트레이딩 시스템에 어떻게 장착할 수 있을지에 대한 설계가 필요하다. 특히 키움의 QEventLoop 사용방식은 코드의 복잡도를 증가시키기 때문에 ES7의 async, await 처럼 비동기를 동기식으로 사용할 수 있는 방법을 찾아보려고 한다.

그리고 앞으로는 TDD를 사용하여 시스템을 개발하려고 한다. 과거의 경험을 비추어봐도 TDD로 개발할 때 생산성이 가장 좋았고, 오류가 적었다. 1호 시스템을 개발하면서 매매로직 테스트하는 부분만 TDD를 활용하긴 했는데, case에 대한 정리가 부족한 탓에 오류 상황들이 발생했다. 그럼에도 테스트코드가 있어서 빠르게 문제를 발견하고 해결할 수 있었다.

쨌든 Do not Repeat Yourself(DRY 원칙)를 시스템 구축에도 활용해서 시스템 제작의 생산성을 높여야겠다.

트레이딩 시스템도 역시 빠른 배포가 필요하다!

시스템을 제작하고 이번 주에 시스템을 구동했다.

개발을 하면서 늘 느끼는 것은 ‘빠른 출시’는 언제나 항상 옳다는 것이다. 서버에 배포가 되고나면 문제해결에 보다 집중하게 된다.

작성한 코드에서 문제가 발생하면 안되기 때문에, 빠르게 버그를 잡아내고 문제를 해결해야 한다. 심지어 트레이딩 시스템은 현물로 거래하는 구조이기 때문에, 자칫 잘못하면 금전적 손실을 떠안을 수도 있다.

트레이딩 시스템 구축시 반드시 해야 하는 것은, 1차적인 테스트는 절대적으로 모의투자 기능을 적극적으로 활용해야 한다. 사실 모의투자와 실전투자의 차이는 키움의 경우 모의투자에서 제공되지 않는 API가 있는 정도고, 그 외에는 모두 동일하다. 단지 계좌번호가 다를 뿐이다.

본인이 만든 시스템에서 매수/매도 신호를 제때 일으키고 정해진 룰에 따라 주문을 하는지 확인하는 과정은 필수적이다. 이 과정을 굳이 실전계좌를 사용해서 현물을 잃어가면서 할 필요는 없다.

적정한 테스트 기간이 필요할 것이고, 안정적으로 테스트가 된 후에 실전계좌로 변경해서 수익화 해 가면 될 것이다.

시가 또는 종가 매매

시가나 종가는 매우 쉬운 개념이지만, 호가창에서 일어나는 상황들을 생각하면 그렇게 단순하지만은 않다. 이번엔 트레이딩 시스템 구축시 가격과 관련하여 발생할 수 있는 현실적인 문제를 짚어보도록 하겠다.

과거 데이터 상에 있는 시가나 종가로 매매하는 전략을 세운 경우, 호가창의 현실을 간과하는 경우가 많다. 고려해야 할 두 가지 사항이 있다.

첫째는, 호가가 순식간에 밀려서 움직여 버리는 경우다. 백테스트할 때에는 시가에 구입하겠다고 했는데, 실제 호가창에 호가가 아주 얇게 깔려 있어서 절대로 해당 가격에 원하는 수량을 구입할 수 없다면, 해당 백테스트 내용의 신뢰도가 떨어지게 되고, 실제로 원하는 수준으로 매매가 되기 어렵다.

말그대로 만약 시가가 그냥 딱 한 명이 한 번 살 수 있는 기회만 주고, 5호가 정도가 순식간에 올라가 버리고 두 번 다시 해당 가격에서 살 기회를 주지 않는다면, 백테스트처럼 매매할 수는 없는 것이다. 그래서 이런 상황들이 발생할 것을 대비해서 슬리피지를 고려해야 한다.

둘째는, 시가가 매수호가에 걸려있느냐, 매도호가에 걸려있느냐에 대한 문제이다. 위의 첫째 상황에 대한 좀 더 상세한 상황이다. 최우선 매수호가에서 출발해서 바로 현재가가 상승해 버리면 원하는 가격에 매수할 수 없다. 역으로 최우선 매도호가에서 출발해서 바로 현재가가 하락해 버리면 원하는 가격에 매도할 수 없다. 따라서 아주 공격적으로 슬리피지를 잡는다면 최소한 한 호가 정도는 슬리피지로 잡아야 한다.

단순하게 나는 양봉 시가에 살거야 내지는 팔거야 라는 생각을 한다면, 정말 내가 그 가격에 살 수 있는 상황일지 고려해야 한다.

수급이 풍부해서 사고 파는 데 큰 문제가 없다면 슬리피지는 줄어들고 수익은 상승할 것이다. 반대로 수급이 풍부하지 않은 종목은 슬리피지를 심각하게 고려하지 않으면 절대 수익을 낼 수 없을 것이다.

수수료와 증권거래세

수수료와 증권거래세는 결코 무시할 수 없다. 그깟 0.015% 정도의 수수료. 수수료보다는 좀 더 내지만 0.25%의 증권거래세 정도라고 대충 생각할 수도 있다.

하지만 거래횟수가 증가하고 거래대금이 커지다 보면 수익금보다 수수료와 세금이 더 많이 나가는 경우도 생길 수 있다. 물론 그런 전략은 좀 더 강화해서 수익을 극대화하는 쪽으로 조정할 필요가 있다고 생각한다.

증권사들은 서로 회원 뺐어오기(?) 경쟁을 열심히 한다. 그래서 당사 거래를 몇 개월 이상 하지 않으면 수수료 할인 혜택을 종종 주곤 한다. 그럴 때 잽싸게 수수료를 적게 내는 쪽으로 잘만 활용하면, 수수료를 적게 내면서도 거래를 할 수 있다.

필자는 증권사에서 제공하는 API를 사용해서 거래할 것이므로, 2개 증권사(크레온, 키움) 정도의 API 연동을 준비해 놓고, 이쪽 업체로 저쪽 업체로 계좌를 옮기며 사용해 보려 한다. 선물 API는 제공하는 곳이 더 많이 있으므로 추후에는 다양한 업체를 활용할 수도 있을 것 같다.

백테스트 결과 ETF 거래의 경우 거래당 0.015%의 수수료만 내지 않는다고 설정했을 때, 최종 백테스트 결과 수익에 상당한 차이가 발생했다.

백테스트시 좀 더 현실적인 결과 확인을 위해서 수수료와 세금을 감안할 필요가 있다.

증권거래소 휴장일, 시작시간, 종료시간

주식투자자들이 사람으로서 접근할 때는 그냥,
“어 맞아. 그래 그거 당연한 거 아니야? 그것도 모르나?”라고 할만한 이슈다.

하지만 시스템을 직접 제작하려면 반드시 챙겨야 하는 것.
그것은 바로 장 시작 시간과 장 종료 시간이다.

보통 주식시장은 9시에 열고, 오후 3시 30분에 닫는다.

하지만 새해 첫 날은 10시에 시작해서 오후 3시 30분에 끝나고,
수능일은 10시에 시작해서 오후 4시 30분에 끝난다.

2017년에는 지진 때문에 수능일자가 갑자기 변경된 적이 있다.
하지만 당초 수능 예정일에도 수능일 기준으로 장이 열리고 마감됐다.

그리고, 하나 더 휴장일이다. 국내 휴장일은 아래 증권거래소 링크에서 확인 가능하다.

https://marketdata.krx.co.kr/contents/MKD/01/0110/01100305/MKD01100305.jsp

휴장일은 사실 장 운영시간만큼 부담이 크지는 않지만,
시스템은 사람이 아니니 준비해 놓아야 한다.

시스템 트레이딩을 시작하면서…

과거에 단순히 투기적으로 주식시장에 접근했다가 박살났던 적이 있었다.

두 번 다시 그 길을 가지 않기 위해서 시스템 트레이딩을 하기로 결정했다. 결정한지는 벌써 몇 년이 지났다. 하지만 수 없이 다양한 모델들을 분석해보고 실망하고, 분석해보고 실망하고, 이 과정을 수 없이 반복하고 있다.

투자자의 95%가 돈을 잃는다는 주식시장. 반대로 5%는 수익을 내는 사람들이 있다.

시장에서 살아남기 위해서, 수익을 내는 5%에 들어가기 위해서 백테스트와 수많은 실전매매를 시스템으로 구성해 보기로 했다.

백테스트를 위해서 분봉, 일봉 데이터를 분석용 DB에 저장하였다.

2016년부터 다양한 분석들을 시도해 보고 있다.

분석과 관련된 이야기들 그리고 관련 코드나 공유할 만한 것들이 생각날 때, 조금씩 공유해 보려고 한다.

시스템 트레이딩을 고민하는 누군가에게 도움이 되면 좋겠다.

필자는 대신증권 Creon Plus API와 키움증권 OpenAPI+를 사용해서 개발하고 있다.

API와 관련된 이야기는 두 증권사에 대한 이야기가 될 확률이 높다.

아직 선물 쪽은 하지 않고 있는데, 선물매매를 하게 된다면 다른 증권사들을 활용하게 될 수도 있을 것 같다.

그리고 수 많은 실패 경험들을 공유할 수 있지 않을까 싶다.

일단, 오늘은 여기까지~*