트레이딩

[전략] 보다 업그레이드된 ETF 변동성 돌파 전략

성민석 2021. 10. 16. 02:13

안녕하세요 성민석입니다.

이전에 키움증권API를 활용해서 ETF 변동성 돌파 전략 시스템을 소개해드렸습니다. 오늘은 해당 포스팅 이후 저의 시스템의 바뀐 부분을 소개하고자 합니다. 이제 대략 한달 정도 지났는데 그동안 정말 많은 부분이 바뀌었습니다. 본문에서 하나하나 살펴보도록 하겠습니다.

 

2021.09.28 - [트레이딩/시스템 소개] - 현재 운영중인 자동매매 시스템 소개합니다.

 

현재 운영중인 자동매매 시스템 소개합니다.

안녕하세요 첫글이네요. 저는 현재 파이썬을 활용한 키움증권 API를 통해서 자동매매 프로그램을 운영하고 있습니다. 이전에 대신증권 API를 사용하다가 자료가 부족하여 결국 키움증권 API로 넘

minsuk-sung.tistory.com

 


시드 변경

짧지 않은 시간동안 나름대로 제 전략을 백테스팅을 했습니다. 하지만 여전히 시스템 트레이딩을 처음 해보는 저에게는 시스템 성능에 대한 약간의(?) 의심이 있었습니다. 처음에 제 계좌의 예수금은 단돈 50만원이었습니다. 놀랍게도 한달이 지난 지금은 500만원입니다. 물론 어느 순간 이렇게 예수금이 늘어난 건 아닙니다. 한달동안 만족스러운 퍼포먼스로 인한 믿음과 이로 인한 욕심의 결과입니다. 처음에는 50만원에서 150만원으로 그리고 150만원에서 250만원으로 마지막으로 250만원에서 500만원으로 올라갔습니다. 항상 시드를 키울 때마다 지금까지의 만족스러운 퍼포먼스에 대한 신뢰와 여전히 마음 한구석 속 자리잡은 불신로 번뇌했습니다. 1차 목표 시드는 1000만원까지 증액하는 것입니다. 하지만 항상 명심하고 조심해야하는 건 언제나 강한 확신인 것 같습니다. 누군가가 그랬습니다.

 

일반적으로 트레이딩을 하다가 망하는 이유는
불투명한 미래에 대한 불안감이 들때보다 근거 없는 강한 확신이 드는 순간입니다.

 

종목별 유동적인 K값 설정

ETF 변동성 돌파 전략에서 가장 머리가 아팠던 부분은 적절한 K값 설정입니다. 이전 세팅에서는 K값을 너무 크게 작게 설정하면 불필요한 노이즈에 매매가 되어버립니다. 하지만 더욱 큰 문제는 K값을 크게 설정할 때였습니다. 이 경우 목표가가 너무 높게 설정되어 있는 바람에 해당 종목이 상승 후 장마감쯤 약간 하락하게 되면 고점에서 물려버리는 사태가 발생하게 되었습니다. 정말 스트레스를 많이 받았는데 일단 현재는 간단하게 1) 5일 이격도를 활용하고 2) 기본값을 0.5에서 0.3으로 대폭 낮췄습니다. 데이 트레이딩 특성상 그 날의 움직임을 통해서 대응해야합니다. 그렇기 때문에 최근에 과도하게 상승한 종목, 즉 이격도가 클 경우에 대해서는 0.4까지 상향하고 이격도가 작은 경우에 대해서는 0.2까지 낮췄습니다. 또한  ETF 특성상 변동폭이 심하지 않기 때문에 0.5라는 값은 다소 큰 값이라고 생각되었습니다. 이렇게 설정하므로써 초기 진입을 조금 더 유리하게 잡을 수 있었습니다. 물론 계속해서 합리적인 K값 설정은 고민해봐야할 것 같습니다.

 

간단한 이격도 예시 (출처: https://utopia-forex.com/ko/step5-06/)

 

지극히 직관적인 수익보존 방법

위 방법으로 초기 진입은 유리하게 할 수 있지만 K값이 낮을 경우 노이즈에 대응하기 힘듭니다. 목표가가 너무 낮게 형성되어 있기 때문에 조금의 노이즈로 매수 시그널이 발생하게 되고 이로 인해서 물려버리는 경우가 발생합니다. 이러한 이유 때문에 너무나 지극히 당연하지만 현재가가 목표가 기준 -0.5% 이하일시 가차없이 매도하게끔 설정해뒀습니다. 이렇게 함으로써 노이즈로 인해서 매수한 종목이 고점에서 물리는 경우를 조금 완화할 수 있게 대응할 수 있었습니다. 전문적으로 이러한 방법을 스탑 로스(Stop Loss)라고 부릅니다. 추가적으로 이 방법의 좋은 점 중 하나는 MTS에서 뇌동매매하여 매수하려고 해도 제 시스템이 조건에 맞지 않으면 바로 강제 매도해버리게 됩니다. 아래 예시는 제가 10월 14일(목) 시스템 테스트를 위해서 직접 MTS에서 1주 매수 주문 넣은 KODEX 200선물인버스2X입니다. 이 경우 목표가로부터 한참 가격 차이가 나기 때문에 1초도 보유하지 않고 바로 알아서 매도 주문이 들어가는 것을 확인할 수 있습니다. 이렇게 단순한 개념이 제 계좌를 파랗게 멍들지 않게 만들어주는 장치라고 생각합니다. 물론 나중에는 트레일링 스탑(Trailing stop)과 같은 장치도 추가해보고 싶습니다.

 

스탑 로스(Stop Loss)의 개념과 10월 14일(목) 로그 중 일부

 

이전과 달라진 동적인 주문과 변경된 주문 유형

제가 멀티 스레드나 멀티 프로세싱을 잘 모르다보니 아무래도 메인 프로그램이 돌아가면서 시간 체크하는게 생각보다 너무 어려웠습니다. PtQT에서 QTimer를 사용하면 될텐데 GUI를 별로 선호하지 않아서 threading으로 해결하려고 했습니다. 어찌저찌 해서 겨우 병렬로 시간을 체크하는 방법을 배웠습니다. 타이머가 가장 절실했던 이유는 특정 시간에 따른 장중 매도 주문입니다. 기존 시스템은 익일 시장가 매도만 할 수 있었습니다. 하지만 이렇게 되면 오늘과 내일 사이 어떤 일이 발생할지 모르는 오버나잇 리스크로 인해서 수익을 보존할 수 없습니다. 이를 위해선 장 마감전 15시쯤에 매도를 해야합니다. 이보다 늦어질 경우 동시호가에 걸리게 되어 체결이 안될 수 있습니다. 

 

timer = threading.Timer(1.0, self._GetCurrentTime)

 

기존 익일 시장가 매도에서 현재는 장중 15시 최유리지정가 매도로 바뀌었습니다. 사실 ETF 특성에 따라서 주문 유형도 바꾸었습니다. 유동성이 상대적으로 적은 ETF 종목의 경우 시장가로 주문을 넣게 되면 현재가보다 훨씬 불리한 가격에 주문이 들어갈 수 있기 때문입니다. 그래서 호가를 기준으로 주문을 넣을 수 있는 최유리지정가 주문으로 바꾸었습니다. 현재는 제 시드가 그렇게 크지 않아서 크게 문제가 되지 않지만 대량 주문이 이뤄지는 경우를 대비하여 이후에는 IOC나 FOK도 응용해볼 예정입니다.

 

KOA StudioSA에서 제공하는 주문유형

 

앞으로 해야할 일

현재 제 컴퓨터는 매매컴과 수집컴 그리고 개발컴으로 나뉘어있습니다. 현재 수집컴에서 데이터 수집이 이뤄지진 않고 있지만 (세팅만 해둔 상태입니다) 앞으로 수집컴에서 체결데이터와 호가데이터를 수집할 예정입니다. 이렇게 수집한 데이터는 제 NAS에 저장될 계획입니다. 이러한 데이터는 이후 보다 정밀한 백테스팅을 위해 사용될 겁니다. 아래 영상은 매매컴(좌)과 수집컴(우)에서 동시에 매매와 데이터 수집을 예시로 기록해둔 영상입니다.

 

매매컴(좌)와 수집컴(우)

 

추가적으로 안전한 주문을 위해서 정확한 예수금 계산해야합니다. 현재는 예수금의 95%만 운용하고 있습니다. 시스템 트레이딩에서 가장 중요하고 민감한 부분이 아무래도 주문 파트인만큼 민감하게 반응해줘야합니다. 키움API 특성상 실시간으로 예수금을 알려주진 않아서 실시간으로 주문 체결시마다 대략적인 예수금을 계산합니다. 이 부분도 스레드를 활용하여 5분마다 혹은 30분마다 TR요청을 통해서 정확한 예수금을 가져오게끔 수정할 계획입니다.

 

마지막으로 궁극적인 목표 중 하나인데 바로 딥러닝이나 머신러닝 모델을 통해 매매하는 것입니다. 이를 위해서는 zeromq를 통해서 소켓 통신을 활용한 메세지큐를 통해 서로 다른 프로세스끼리 통신할 수 있습니다. 이렇게 하는 이유는 32비트 환경에서만 동작하는 키움API와 64비트 환경에서만 동작하는 TensorFlow나 PyTorch 프레임워크가 서로 같은 프로세스에서 동작할 수 없기 때문이죠. 

 


마지막으로 같이 트레이딩하는 분들과 소통하고 싶습니다.

언제든지 트레이딩이나 인공지능과 관련된 내용을 함께 공유하고 토론하고 싶으시다면 아래의 오픈 카카오톡 링크로 연락주세요.
https://open.kakao.com/me/minsuksung

 

성민석님의 오픈프로필

안암에서 인공지능을 연구하고 있습니다

open.kakao.com

 

728x90
반응형