참고사항 시스템 트레이딩 관련 블로그들은 개인 경험을 바탕으로 작성되었습니다. 각자 자신만의 투자방식과 매매전략을 만들어 가시기 바랍니다.

개요

시스템 트레이딩을 위한 준비하는 방법과 구축시 고려사항에 대해서 정리해 보려고합니다. 매매로직이나 알고리즘에 대한 내용은 포함되어 있지 않습니다.

시스템 트레이딩의 시작

시스템 트레이딩은 프로그래밍을 통해 자동 매매가 이루어지는 방식을 의미합니다. 데이터를 수집하고 매매 로직을 작성하여 검증한 후에 실제 거래를 할 수 있습니다. 처음에는 투자에 대한 지식이 부족해 제가 직접 매직처럼 작동하는 매매 로직을 만들 수 있을 것이라고 착각했습니다. 그러나 테스트와 실전 거래를 통해 매직 같은 로직보다는 손실을 잘 관리하고, MDD(Maximum DrawDown, 최대 손실폭, 고통 지수)을 낮춰야 한다는 것을 절실하게 깨달았습니다.

  • 시스템 트레이딩의 특징
    • 장점 : 사람의 개입이 없이 로직을 기반으로 자동 매매가 이루어집니다. 결과가 어떻든 다른 일을 하면서도 알아서 매매가 진행되므로 하루 종일 HTS를 지켜볼 필요가 없습니다.
    • 단점 : 매매 로직의 검증은 과거 데이터를 기반으로 이루어지기 때문에 미래의 성과를 보장할 수 없습니다. 그렇기 때문에 매매를 시작함과 동시에 지금까지 경험하지 못한 최악의 결과가 있을수도 있습니다. 앞서 언급한대로 확률에 기반하여 매매를 진행해야 합니다.

시스템 트레이딩의 장단점은 대체로 널리 알려진 내용입니다. 다만 여기서 강조하고 싶은 점은 “최악의 결과”는 누구에게나 발생할 수 있다는 점입니다. 얼마나 훌륭한 로직이라 할지라도 미래의 시장 환경은 예측할 수 없습니다. (매직 같은 로직은 존재하지 않습니다.) 이러한 기본적인 내용을 이해하는데 많은 시간이 걸렸습니다.

저의 경험과 고민을 정리해보았습니다. 제가 설명하고자 하는 트레이딩 방식은 WebSocket이나 Streaming 기반의 실시간 고밀도 트레이딩이 아니라, 특정 시간에 제가 만든 로직으로 반복적으로 실행되는 데이 트레이딩이거나 스윙 트레이딩 방식입니다.

백테스트를 위한 데이터 수집방안

시스템 트레이딩을 시작하려면 가장 먼저 해야 할 일은 데이터 수집입니다.(당장!, Right Now) 데이터기반으로 로직을 설계하고 백테스트을 통해서 로직을 검증할수 있기 때문입니다.

각 종목에서 어떤 데이터를 수집할지 결정해야 합니다. 먼저 봉 데이터(Candle)가 필요합니다. 각 시점의 시가(Open), 고가(High), 저가(Low), 종가(Close)와 거래량이 포함되어 있기 때문입니다. 이를 연결하면 자동으로 종가 기준의 그래프를 그릴 수 있으며, 이전 종가와의 차이를 계산하여 등락률을 알 수 있습니다. 그리고 나서 나머지 추가적으로 필요한 데이터도 수집해야 합니다.

사실, 지금! 데이터를 수집하는 순간이 이미 늦었을 수도 있습니다. 오늘 종목에 대한 과거 데이터는 수집할 수 있겠지만, 이미 상장 폐지된 종목에 대한 데이터는 얻을 수 없기 때문입니다. (거래소에서 제공하지 않습니다. 그래서 종목데이터를 돈을 주고 사는거겠죠) 그래도 오늘의 데이터가 내일의 데이터보다 낫기 때문에 데이터 수집을 시작하는 것이 매우 중요합니다.

  • 거래 시 필요한 데이터들
    • 종목 데이터 : 종목에 대한 목록이 필요합니다. 어떤 종목을 매매할것인지 필터의 기준이 됩니다.
    • 봉 데이터: 과거 데이터에서 현재까지의 정보를 가져와서 Price와 관련된 의미 있는 변수들을 만들 수 있습니다.
    • 거래 이력 데이터: 특정 시점마다 프로그램이 반복해서 시작되기 때문에 이전 거래 이력을 확인하고 봉 데이터와 비교하면 현재의 손익과 손실을 계산할 수 있습니다.
    • 위험종목 정보 데이터: 거래유의 종목이라면 일단 거르는것이 마음이 편하지 않을까 싶습니다.

그렇다면 데이터를 어디서 수집할까요? 개인 입장에서는 데이터를 제공하는 거래소가 유일합니다. 거래소마다 제공되는 데이터는 조금씩 다르지만 대부분 봉 데이터를 구할 수 있습니다.

  • 증권 거래소: 주로 DLL 라이브러리로 제공됩니다. 그렇기 때문에 C++이나 Python을 사용하여 윈도우 환경에서 개발합니다. 한국투자증권은 REST API도 제공합니다.
  • 가산 자산 거래소: 주로 REST API로만 제공됩니다. 그렇기 때문에 개발 언어와 플랫폼에 독립적으로 개발할수 있습니다.

어떤 데이터를 수집할지, 어떤 방법으로 데이터를 수집할지, 어떤 개발 언어와 운영 체제 환경에서 작업할지 결정해야 합니다. 고밀도 트레이딩을 하지 않는다면 REST API를 이용한 개발이 더 나은 선택입니다. 저는 자바 언어로 REST API를 활용하여 개발 중입니다.

백테스트(Simulation) 및 실전 거래 방안

백테스트를 시작하기 전에 앞서 말한 데이터가 준비되어 있어야 합니다. 그리고 백테스트를 어느 기준 일자와 시간에 진행할지 먼저 정해야 합니다. 1일에 1회인지, 아니면 1일에 6회를 할 것인지에 따라 데이터 수집 기준을 설정할 수 있습니다. 그런 다음에 최대한 많은 기간의 데이터를 수집하는 것이 좋습니다.

  • 증권거래소는 IMF 시대 이전의 데이터부터 수집할 수 있습니다. (IMF, IT 버블, 금융위기, 911사태 시기의 데이터도 포함됩니다)
  • 가장자산거래소는 상대적으로 최근까지만 데이터를 제공합니다. 업비트는 2017년부터 데이터를 제공하며 가장 많은 기간을 커버합니다. (FTX 사태, 금리 인상 등)

백테스트 방법은 과거부터 차례대로 데이터를 읽어오며, 데이터를 읽을 때마다 매매 로직을 호출하여 매매 이력을 내부적으로 관리합니다. 그리고 최종 결과는 매매 이력을 기반으로 매매 결과를 리포팅합니다. 매매 로직을 만들 때 주의해야 할 점은 실전 거래에서도 사용 가능한 변수들인지, 또한 동일하게 계산 가능한 변수들인지를 확인하여 사용하는 것입니다.

백테스트를 진행하다 보면 특정 기간 동안 시뮬레이션 거래를 수행하게 됩니다. 따라서 이전 거래에서 발생한 정보를 참조하여 계산된 값들을 만들 수 있지만, 실전 거래 환경에서는 그런 값들을 만들지 못한다면 백테스트에서 사용한 매매 로직을 실전 거래에서 사용할 수 없게 됩니다. 그래서 처음부터 매매 로직에 사용되는 변수들은 백테스트와 실전 거래에서 동일하게 동작하도록 고려하면서 만드는 것이 중요합니다.

  • 백테스트
    • 데이터가 계속 주입되면서 다양한 변수가 만들어질 수 있습니다.
    • 그러나 이러한 데이터들이 실전 거래에서 사용 가능한 값인지, 계산 가능한 값인지 확인이 필요합니다.
  • 실전 거래
    • 프로그램이 실행되면서 매매 로직에서 사용되는 변수들의 값을 계산할 수 있어야 합니다.
    • 다시 프로그램이 실행되어도 동일한 결과를 얻을 수 있도록 개발합니다. 즉, Stateless를 지향합니다.

실전 거래를 하다보면 백테스트 결과와 차이가 나는 경우가 많습니다. 동일한 매매 로직을 동일하게 동작시키기는 매우 어렵습니다. 예상치 못한 버그나 API 변경 등이 발생할 수 있습니다. 그러므로 항상 실전 거래를 할 때는 만든 로직이 백테스트 결과와 동일한지 확인해야 합니다. 프로그래밍은 완벽하지 않기 때문에 확인은 필수적입니다. 또한, 내가 만든 로직에 대한 믿음은 백테스트 결과와 실전 거래한 결과의 차이에서 옵니다.

시스템 트레이딩을 운영하는 자세

2021년 1월, 코로나19 여파로 정신없는 시기였습니다. 정부가 경기 부양을 위해 많은 자금을 투입하는 때였습니다. 이때, 비트코인이 급등하고 있었고, 저 또한 투자를 해보고 큰 이익을 낼 수 있지 않을까 생각했습니다. 그래서 과거 데이터를 수집하고 로직을 만들어 백테스트를 진행했는데, 어느 정도 수익을 보는 것은 로직을 만들었습니다. 이후 2021년 6월, 실전 거래를 처음 시작했고 백테스트 결과와의 차이를 줄이기 위해 프로그램을 계속 수정했습니다.

그러나 2021년 11월 17일 이후로는 결과가 물거품이 되었습니다. (어느정도 이슈가 해결된 버전으로 최고점에 도달했을때즘에 투자원금을 높여서 실전 거래를 시작했습니다..)

제가 개발한 로직은 추세를 따라가는 것이었기(추세추종) 때문에 지속적인 하락과 반복되는 횡보로 손실만 발생했습니다. 또한, LUNA와 FTX의 사태로 인해 초기 계산했던 MDD를 깨져버렸습니다. (이때 MDD의 소중함을 알게 되었습니다. 최대고통지수의 이유가 있습니다. 하락의 끝을 모르는 그 공포감..을 느껴보지 못하면 말하기 힘듭니다.)

그럼에도 아직은 실패하지 않았다고 생각합니다. MDD를 줄일 수 있는 방법을 고민하고 보완할 수 있다고 생각하기 때문입니다. (MDD와 손익 사이에는 상호 연관성이 있어 개선하기는 매우 어렵긴합니다.).

시스템 트레이딩을 하면서 느낀 점은 다음과 같습니다:

  • 절대 손매매를 하지 마세요.
    • 시스템 트레이딩은 로직에 의해 매매가 처리되므로 로직이 잘못되었으면 수정을 통해 보완이 가능합니다.
    • 그러나 내가 만든 로직을 믿지 않고 손매매를 하게 된다면 그 순간에는 손절을 막을 수 있겠지만, 그 다음의 더 큰 악재에서는 더 큰 손실을 볼 수 있습니다.
  • 내가 만든 프로그램을 믿으세요.
    • 내가 만든 로직을 통해 얻은 백테스트 결과와 실전 거래가 동일하면서 최소한 내가 만든 프로그래밍을 신뢰할 수 있습니다.
    • 그 다음 시장 환경때문에 내가 예상하지 못한 손실이 발생되었다면 과거에도 동일한 사례가 있는지 분석하고 로직을 보완해 갈 수 있습니다.
  • 백테스트 결과를 이용하여 시장 진입 환경을 정하세요.
    • 실전 거래를 통해 시장에 진입할 때 백테스트한 결과를 기준으로 총 투자금액과 거래당 단가를 정합니다.
    • 백테스트 결과는 과거부터 현재까지 확률의 결과입니다. 따라서 시장 진입 시 초기된 투자금액으로 진입하는 것보다 결과의 연속성을 이용하는 것이 더 확률을 높이는 방법입니다.
    • 총 투자금액이 100만원으로 백테스트 했더니 오늘 결과가 -10% 손실로 보이고 있다면, 그럼 실전 거래시 내가 투자할 금액은 이미 -10% 손실된 금액이라고 가정하고 시장에 진입합니다.

마무리

투자는 지름길이 없는 것 같습니다. 각자의 노력에 비례하여 성과가 나오길 기대하지만, 돈 앞에서는 그런 노력만으로는 잘 되지 않는 것 같습니다. 더 뛰어난 투자자들이 많기 때문에, 그 중에서 제가 살아남기 위해 내가 가진 능력을 최대한 활용할 수 있도록 시스템 트레이딩 방법을 선택했습니다. 각자의 투자 방식이 다를 수 있겠지만, 정확한 수치를 기반으로 자신의 매매 로직을 설명할 수 있다면 시스템 트레이딩을 개발할 수 있습니다.

댓글남기기