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

개요

시스템 트레이딩에서 매매수행 방식과 매매로직 구현방안에 대해서 같이 설명합니다. 단순히 매매관련된 고려사항에 대해서 정리하기 때문에, 자신에게 맞는 기법들을 만들어야합니다.

매매는 언제할것인가?

처음부터 매매를 언제 할것인가라는 내용을 물어보기에는 너무 고려해야될것이 많습니다. 그중에 언제라는 그 시점을 시스템트레이딩 관점에서 알아보려고 합니다.
매매시점이라고 하면 매매간격을 의미합니다. 각 종목마다 매매시점을 틀리므로 프로그래밍이 실행되는 간격을 의미하는것이 더 적절한 것 같습니다.

  • 매매시점예시
    • 초 단위로 매매하는 고밀도 매매
    • 5분봉, 1시간, 4시간 기준 매매
    • 1일, 1주, 2주 기준 매매
    • 한 달, 분기, 반기 기준 매매

자신의 매매 스타일에 따라 결정하거나, 구현한 로직을 사용하여 백테스트를 진행하여 수익률이 가장 좋은 시간대를 선택할 수 있습니다. 매매 빈도가 높아질수록 수수료 비용과 백테스트 결과의 승률과 손익 비율이 중요해집니다. 고밀도 매매의 경우 데이터 양이 많아져서 (틱 데이터도 수집), 시간과 비용이 많이 소요되며 유지 관리하기도 어려울 수 있습니다. 모든 경우를 고려하기보다는 목표를 정하고 데이터를 수집하고 백테스트를 기준으로 삼는 것이 좋습니다.

저는 최소 5분, 1시간, 4시간, 1일 기준 데이터를 수집하고 실제 백테스트 시에는 4시간봉으로만 백테스트를 수행하고 있습니다. (프로그래밍을 통해 내가 원하는 봉의 데이터를 직접 만들 수 있습니다.) 가능하면 많은 데이터를 저장하는 것이 좋지만 불필요한 데이터는 저장할 필요가 없습니다. 아직 불확실한 부분이 많기 때문입니다.

만약 모든 종목에 대해 4시간봉 데이터를 가지고 있다면, 하루에 6번의 매매 시도를 할 수 있습니다.

  • 백테스트는 4시간봉으로 로직을 테스트합니다.
  • 실전 거래에서는 4시간봉 데이터로 로직이 수행되어야 하므로 정해진 시간에 동작하도록 스케줄링을 해야 합니다. (예: 9시, 13시, 17시, 21시, 1시, 5시)

※ 가상 거래소의 경우 24시간 매매가 가능합니다.

매매수행은 어떻게 할것인가?

종목을 매매한다는 것은 매수와 매도를 한다는 의미겠죠. 매매할때 거래소가 제공하는 매매기능을 사용하여 다양한 매매 전략을 세울수 있습니다.

매매기능

먼저 매매 기능에 대해 알아보겠습니다. 거래소에서는 매수와 매도를 위한 시장가나 지정가와 같은 다양한 매매 방식을 제공하며, 시스템 트레이딩에서 이러한 방식들을 활용할 수 있습니다. (대부분의 거래소에서 API로 지원됩니다.)

시스템 트레이딩 시 고려해야 할 사항은 다음과 같습니다

  • 시장가 매매(매수/매도)
    • 시장가 주문은 주문을 실행하는 즉시 거래가 체결됩니다. 다음 거래가 시작되면 이전 주문은 이미 모두 완료되었으므로 현재 거래 요청에 대한 확인이 필요하지 않습니다.
    • 프로그램에서 주문 관리 부분이 간단해집니다. 그러나 호가가 촘촘하지 않은 상황에서는 슬리피지(거래 가격 불일치)가 발생할 수 있으며, 이로 인해 백테스트 결과와 차이가 발생할 수 있습니다.
  • 지정가 매매(매수/매도)
    • 지정가 거래는 주문을 요청했을 때 즉시 체결되지 않을 수 있습니다. 다음 거래가 시작되면 이전 거래 정보를 확인해야 하며 아직 체결되지 않은 주문에 대한 처리 방법을 결정해야 합니다. 이러한 미체결 주문들은 백테스트에서 검증하기 어려울 수 있습니다.

저는 시장가 매매를 사용하여 주문을 관리합니다. 이렇게 하면 백테스트가 쉽고 실전 거래에서도 주문 관리가 편리하다고 생각합니다. 그러나 고빈도 거래 환경에서는 시장가보다는 지정가가 더 적합할 것으로 생각됩니다. 거래가 빈번하면 슬리피지로 인한 손실이 더 커질 수 있기 때문입니다.

앞서 언급한 매매 간격과 연계하여 고려해 볼 수 있습니다. 시장가 매매 시 거래 간격이 길어질수록 거래 빈도가 줄어들어 슬리피지의 영향도 감소할 것입니다.

매매전략

이제 매매 전략에 대해 알아보겠습니다. 거래소에서 제공하는 기본적인 매수와 매도 이외에도, 효율적인 매매를 위해 추가적인 전략을 사용할 수 있습니다. 예를 들어 매수 시에는 추세 추종 전략을 적용하거나, 매도 시에는 손실을 최소화하기 위해 분할 매도를 고려할 수 있습니다.

  • 매수전략
    • 일반적인 매수는 특정 금액이나 수량 기준으로 종목을 매수하는 것입니다.
    • 추가 매수는 이미 매수한 후에 다시 매수하는 것을 의미합니다.
  • 매도전략
    • 매도는 보유 중인 수량을 일괄 매도와 분할 매도로 나눌 수 있습니다.
    • 일괄 매도는 보유 중인 모든 수량을 한 번에 매도하는 것을 의미하며, 분할 매도는 일부를 몇 차례에 걸쳐 매도하는 방법입니다.
    • 분할 매도 중에 갑자기 상승할 경우 추가 매수와 연계하여 실행할 수 있습니다

시스템 트레이딩에서는 매매 전략을 프로그램으로 구현할지 여부는 매매 로직과도 관련이 있기 때문에 함께 고려해야 합니다. 초기 시스템을 구축할 때는 먼저 시장가 매매 등의 기본 매매 기능을 활용하여 전반적인 동작을 확인한 후, 다양한 매매 전략을 추가하는 것이 좋습니다.

매매로직과 매매전략

내공이 이미 상당히 뛰어나다면, 고려하고 있는 매매 로직을 프로그램으로 개발하면 됩니다. 그러나 대다수는 막연한 기대심으로 접근할 것으로 생각됩니다. 그래서 나에게 맞는 매매 로직을 직접 찾아야 합니다. 시스템트레이딩에서 내가 로직의 결과를 직접 확인하고 보완하는 이러한 선순환적인 방법이 매력적으로 느껴졌습니다.

매매 전략에 따라 매매 로직도 함께 만들어져야 합니다.

  • 매수 : 매수 로직, 추가 매수 로직
  • 매도 : 일괄 매도 로직, 분할 매도 로직

여기서 언급하는 로직이라 함은 단순히 변수를 활용하여 매매를 진행할지 여부를 결정하는 규칙을 의미합니다. 간단한 인터페이스 예시는 다음과 같습니다. 이 인터페이스는 시스템 전역 변수와 개별 종목 변수를 활용하고, Boolean 값을 반환하는 간단한 메소드입니다.

public interface ISignal {
	public boolean signal(GroupVars gvalues, LocalVars lvalues);
}

예를 들어, 이동평균선이 계산된 변수 값이 종목 변수에 저장되어 있다면 매수 또는 매도 시에 활용할 수 있습니다.

여러 가지 로직이 개발되면 이를 프로그램적으로 매매 수행이 가능하도록 구현해야 합니다.

  • 매매 수행 흐름 예시
    • 매수 -> 일괄매도
    • 매수 -> 추가매수 -> 일괄매도
    • 매수 -> 추가매수 -> 분할매도
    • 매수 -> 추가매수 -> 분할매도 -> 추가매수 -> 일괄매도
    • 매수 -> 추가매수 -> 분할매도 -> 추가매수 -> 분할매도

여기에 더해 고민해볼 사항으로는 추가 매수와 매도 간의 우선 순위를 지정하는 것입니다. 매도 로직은 특정 수익률 기준으로, 추가 매수 로직은 가격 추이를 기반으로 작동한다면, 추가 매수와 매도 간 충돌이 발생할 수 있습니다.

매매 수행 로직을 어떤 방식으로 구현할지는 각자의 몫입니다. 시장은 항상 예측대로 움직이지 않기 때문에 다양한 경우를 고려하여 매매 전략을 구현할 수 있지만, 의도적으로 변수를 최소화하고 심플한 매매 로직으로 구현할 수도 있습니다. (간결함이 강력할 수도 있습니다.)

저는 아래 두 가지 경우만 사용하고 있습니다. (매수 -> 일괄 매도), (매수 -> 추가 매수 -> 일괄 매도)

마무리

실제 매매 로직을 구현하려면 알아야 할 것들이 많습니다. 현재는 매매 수행을 위한 기본적인 내용을 설명하고 있습니다. 시스템 트레이딩을 처음 준비할 때는 매우 추상적으로 느껴질 수 있지만, 시간이 해결해 주는 부분도 있습니다.

빠르게 결과를 얻을 것을 기대하기보다는 다른 사람들과 다른 시작점을 가지고 직접 프로그래밍하고 고민하는 시간을 소중히 생각하고 즐기시기를 바랍니다.

댓글남기기