2. 해외선물/2-2. 해외선물 알고리즘 연구

(해외선물 자동매매 알고리즘) (1) 매매 알고리즘 개념 설명

봄이오네 2023. 11. 6. 08:10
반응형

 

목 차
1. 들어가며
2. 사전설명
   1) 자동매매 필요성
   2) 50:50 동전 딜레마
   3) 진입/청산에 따른 수익/손실은 엑셀로 계산
3. 알고리즘 만들기의 가정(假定)
   1) 대표월물은 20만주 이상 거래되는 종목 (나스닥 기준)
   2) 1분전의 데이터를 확인하고 "현재"의 시장가로 진입
   3) 승률은 70%이상
   4) 출현빈도는 20개 이상
   5) 연달아 나오는 시간은 1개로 취급
   6) 60분 이내 최고가 수익실현 및 최저가에서 손절실현
   7) 수익가 및 손절가 설정 필요성
   8) 익절/손절의 계산
4. 마치며

 

1. 들어가며

예전에 해외선물에서 수익을 내는 유형(https://springcoming.tistory.com/225)을 설명한 적이 있다. 주식의 신(神), 투자고수, 알고리즘 돌리는 평범인 등이 3가지 유형에 해당한다. 알고리즘으로 타인의 행위를 예측하여 수익을 내고자하는 생각은 신의 영역을 침범한 것이 아닐까? 살짝 걱정이 되지만, 일단 도전해 보기로 생각했다.
 
해외선물 매매를 하는 이유는 레버리지를 이용해 수익을 얻을 수 있기 때문이다. 반대로 손실이 날수도 있는걸 알면서도 쉽게 손을 놓지 못하는 이유는 "추세와 방향"만 잘 알게되면 수익이라는 "희망"을 품으며 진입을 하게된다. 필자도 수익을 목표로 진입/청산을 수없이 했지만, 쌓이는 손실 누적금에 수동매매(손절금)의 한계를 느끼고 자동매매에 관심을 가지게 되었다.
 
해외선물에서 알고리즘이 존재할까? 이 글은 해외선물에서 절대필살의 "알고리즘"을 알려주지 않는다. 100% 승률의 알고리즘은 알지 못한다. 이 글은 필자가 생각하고 있는 알고리즘 만들기의 접근법에 대한 내용이다. 사실 필자도 "알고리즘"을 계속 찾고 있다. 100% 승률의 접근방법은 생각하지도 않고 있다. 승률 80%만 나와도 정말 행복할 것 같다.
 
여기 글 카테고리(2-2. 해외선물 알고리즘 연구)에서는 알고리즘 관련해 "파이썬" 코드를 작성하기보다는 1분봉을 기준으로 엑셀에서 어떻게 알고리즘을 만들고, 시스템에 적용할지 고민하는 글이다.
 
※ 절대필살의 알고리즘을 찾는다면, 필자는 답을 주지 못한다. 뒤로가기를 누르시고, 인터넷에서 검색하시길 권한다.
※ 또한, 필자는 해외선물 투자를 권유하지 않았다. 투자에 대한 모든 책임은 본인에게 귀속된다.
 
작년(2022년)에는 비트코인 관련하여 "알고리즘 연구"에 관한 글을 적었다. 물론, 그때 공부했던 비트코인 패턴으로 수익이 발생하지는 않았다. 그때는 비트코인에 신경쓰느라 해외선물 알고리즘을 고민할 여력이 없었다. 생각 정리하면서 알고리즘 만들기에 접근하는 글을 기재해 보려고 한다.
 
 ※ 비트코인 알고리즘 공부 : https://springcoming.tistory.com/100
 


2. 사전설명

1) 자동매매 필요성

해외선물 매매를 하다보면, 진입할 때 겁이날 때가 있다. 가격이 급격히 변하거나, 매매에 대한 확신 및 자신감(confidence)이 없을때는 진입을 자제해야 하는데, 사람마음이 어디 그렇게 쉽게 자제가 되겠는가? 기어코 진입을 하게되면서 손실은 눈덩이처럼 커지고, 손절을 못한채 밤잠을 설치게 되는 경우가 허다하다.
 
또한 매매를 많이 할수록 일정 패턴이 눈에 보이고, 눈에 익은 패턴에 진입을 해서 손실이 발생할 수도 있다. 이와 같이, 손절라인도 지키지 못하는 등 아무런 대책없이 진입을 했다가 손실이 발생하는 경우가 상당히 많이 발생한다. 
 
만약 내가 미리 패턴을 정의해두고, 그 패턴의 수익이 날 승률을 계산하여 승률이 높은 알고리즘 위주로, 파이썬 코드를 작성해 두면 어떨까? 생각만 해도 정말 설레는 일이 될 것이다. (물론, 패턴을 발견하는 것도 어렵고, 수익내는 것도 어려운건 사실이다ㅎㅎ)
 

2) 50:50 동전 딜레마

예전에 50:50 동전 딜레마(https://springcoming.tistory.com/201)에 대해 설명한 적이 있다. 행위가 반복될수록 승/패 확률은 50%로 수렴한다는 내용이다. 해외선물은 서머타임 기준, 당일 07시~익일 06시까지 하루 23시간 거래가 이루어진다. 인터넷이 된다면 전 세계 어느 곳에서나 제약없이 거래에 임할 수 있다. 데스크탑 혹은 노트북, 모바일 등 다양한 수단으로 매매를 할 수 있는 것이다.
 
나중에 엑셀로 알고리즘을 설정하고 승률을 계산해보면 많이 출현하는 패턴일수록 승률이 45%~55% 사이에서 기록하고 있다는 사실을 알게 된다. 알고리즘 만드는 것을 포기해야 하나... 정말 진지하게 생각하게 되는 절망적인 내용이다. 승률이 45%~55% 사이에 있다는 것은 "수익이 날 확률이 50%" 밖에 안된다는 것이다. 어느정도 손절은 생각해야 하겠지만, 이런 홀/짝 게임을 해야 하는 것일까? 필자는 승률이 45%~55% 사이에 있으면 그 알고리즘은 사용을 안하고 있다. 나중에 설명하겠지만, 승률은 최소 70%이상의 알고리즘을 적용하고 있다.
 
다만, 여기서 고민되는건... 승률이 70%라고 하더라도, 언젠가는 50%로 수렴하지 않겠는가? 그럼... 어떻게 하라는 소리인가? 패턴의 승률은 2주 혹은 4주마다, 승률을 계산해주고, 승률이 떨어진 알고리즘은 과감히 정리할 필요가 있다.
 

3) 진입/청산에 따른 수익/손실은 엑셀로 계산

long 기준, 낮은 가격에서 진입하여 높은 가격에서 청산하면 수익이 나는 매매구조이다. 여기서 사용자들이 고민해야 될 것은 어느정도가 낮은 가격이냐는 것이다. "떨어질 만큼 떨어졌다. 진입!"으로 생각하고 진입했는데, 폭락이 나오거나 횡보하는 경우가 많이 발생한다. 필자를 포함한 해외선물을 매매하는 사람들이 매매에 회의를 느끼는 대목은 거의 비슷할 것이다.
 
주식의 명언처럼 "떨어지는 칼날"을 잡고싶지는 않지만, 급락할 때 long으로 진입하고 싶어서 손이 근질근질하는건 어쩔 수 없는 것 같다.
 
진입 지점을 일정하게 설정(시장가)하고, 진입후 수익/손실을 계산해보면 어떨까? 자동매매시 반드시 선행하여야 하는 작업은 코드를 짤 때, 이 코드의 승률을 예상해보는 것이다. 엑셀로 수익/손실의 확률을 계산하는 방법은 향후 설명하겠다.
 


3) 알고리즘 만들기의 가정(假定)

해외선물 알고리즘을 설명하게 위해서는 몇 가지를 가정을 해야한다. 주로 진입에 대한 가정이다.
 

1) 대표월물은 20만주 이상 거래되는 종목 (나스닥 기준)

해외선물은 주식과 다른점이 있다. 해외선물은 만기가 있다. 만기에 따라 거래량이 많은 종목(=대표월물)이 달라진다. 대표월물 거래에 대한 본인만의 기준이 필요하다.
 
나스닥을 예를 들어보자. 나스닥의 경우 3개월마다 만기가 다가온다. 만기는 3월, 6월, 9월, 12월이다. 12월 15일 매매한다고 생각한다면 23년12월물(NQZ23)과 24년3월물(NQH24) 중 어느 종목을 거래할 것인가?
 
만약 2023년 12월 15일 매매한다고 가정 했을 때, 23년12월물 거래를 하는 사람들은 NQZ23 거래를 할 것이고, 만기시기에 마음편히 거래하고 싶은 사람들은 NQH24를 거래할 것이다. 이건 사용자마다 다르다.
 
대개 어떤 월물을 거래할지 고민할 때는 이렇게 거래량이 많은 "대표월물"이 바뀔 때이다. 다시 한번 말하지만, 대표월물이 바뀔 때 본인만의 기준을 가지고 대표월물 거래를 해야 한다.
 

2) 1분전의 데이터를 확인하고 "현재"의 시장가로 진입

필자는 완성되지 않는 데이터에는 관심이 없다. 완성된 봉을 기준으로 알고리즘을 만들 예정이다. 현재봉은 언제 변화를 일으킬지 모른다. 하늘을 뚫을 듯 상승해서 long진입했는데, 거짓말처럼 윗꼬리를 만들며 하락하는 경우도 있다. 그래서 가장 최근에 완성된 1분전의 데이터 + 그 이전(2분전, 3분전, 120분전 등)의 데이터를 활용하여 알고리즘 코드를 작성한다.
 
진입은 현재봉의 시장가로 진입한다. "지정가"로 진입도 생각해보았지만, 거래가 안 되었을때 취소를 해줘야 하는등 번거롭다는 생각이 들었다. 시장가로 진입하면 1틱 손해를 보긴하지만, 100% 진입이 되는 확실성은 가질 수 있는 장점이 있다.
 
어떻게 진입(시장가 or 지정가)할지는 사용자 투자성향에 따라 다르다. 한번 정도는 고민해보아도 좋을 것 같다.
 

3) 승률은 70%이상

"승률"이라는 단어가 조금 낯설게 느껴지긴 한데, 이보다 좋은 단어가 생각이 안 나서 "승률"이라는 단어를 사용한다. 필자가 사용하고 있는 승률은 "진입시 수익이 날 확률"을 의미한다.
 
지옥의 45%~55% 승률을 확인하게 되었을 때의 좌절감은 정말 극복하기 힘들다. 70%가 될 때까지 변수를 계속 조정해주는 작업이 생각보다 지루하긴 하다. 인내심을 가지고 승률 70%이상의 알고리즘을 찾아보자.
 

4) 출현빈도는 20개 이상

승률이 100%를 달성하였다고 하자. 그런데, 3달에 한번 출현한 알고리즘을 코드로 짤 것인가? 주말을 제외하고 한달 영업일을 20일로 잡으면 세달이면 60일이다. 60일 동안 한번 출현한 패턴을 알고리즘이라고 할 수 있을까? 어쩌다 한번 발생한 것이고, 어쩌다 한번 발생한 수익은 아닐까? 필자는 알고리즘은 최소 20개 이상은 출현해야 한다고 생각한다. 물론 10번 출현해도 상관없다. 수익만 발생하면 되니깐!
 
3달(60 영업일) 중 20번 출현이면, 3일에 한번씩은 출현한다. 더 출현빈도를 높이고 싶은데, 그렇게 하면 "승률"이 떨어진다. 그 지옥의 45%~55%의 승률에 갇히게 되는 것이다. 20번 이상에 해당하면 코드를 작성하는 것도 좋아보인다. 
 
승률과 출현빈도는 분명 반비례(inversely proportional) 관계이다. 나중에 엑셀을 돌리다보면, 45%~55%의 지옥의 승률을 확인할 때 어찌나 속상한지... 그 기분을 알게 될 것이다.
 

5) 연달아 나오는 시간은 1개로 취급

연달아 나오는 시간의 알고리즘은 1개로 취급한다는 것은 무슨 말인가? rsi 보조지표를 예로 들어보자. 차트를 잘 보면, rsi가 몇 분 동안은 유사하다는 것을 알 수 있다. 거래량이 동반된 급격한 변화에서는 rsi가 변하겠지만, 거래량이 별로 없을 때 rsi는 일정하다.
 
rsi를 이용하여 알고리즘을 만들어서 승률을 엑셀로 계산하다보면, "빈도수 100개, 승률 95%"가 나올 때가 있다. "대박이구나~~~"라고 생각하고 코드를 짜려고 하는데, 시간이 다닥다닥 붙어있는 것을 확인할 수 있다. ㅠㅠ 시간이 이렇게 붙어있을 때는 "다닥다닥 붙어있는 시간"은 빈도수 1개로 취급해야 한다.
 
엑셀로 알고리즘을 돌려보고 결과값을 코드로 작성하려고 할때, 반드시 "시간"을 보는 습관을 들이자. 승률/빈도수 등에 왜곡이 발생했음에도 불구하고 코드를 작성해서 시스템을 돌리면, 나중에는 수익을 장담해줄 수 없다.
 

6) 60분 이내 최고가 수익실현 및 최저가에서 손절실현

시장의 상황과 평가손익에 따라 다르겠지만, 진입후 몇 분 정도 보유하는지? 어려운 문제이다. 종목 보유시간을 일괄적으로 정할 수 있을까? 청산하자니 (더 올라갈거 같아서) 수익이 더 날것 같고, 시장은 호재 뉴스만 나오고 있을 때, 어떤 결정이 합리적일까? 언제 호재/악재 뉴스가 나올지 모른다.
 
필자의 경우 지금은 종목 보유시간을 60분으로 생각하고 있다. 그래서 모든 알고리즘은 60분 보유를 기준으로 수익/손실을 정하고 있다. 근데 최근 60분은 너무 긴것 같아서, 20분으로 줄여볼까도 고민하고 있다. 조금더 엑셀을 돌려봐야겠다.
 
보유시간을 몇 분으로 가져갈지, 이건 정말 중요한 결정사항이다. 사용자 본인이 만들고 싶은 시스템을 구상할 때 반드시 고민해보자. 왜냐하면, 몇분을 보유하느냐에 따라 "엑셀로 알고리즘을 돌릴 때 수익/손실"을 설정할 것이기 때문이다.
 

7) 수익가 및 손절가 설정 필요성

수익/손절 가격을 정해야 한다. 평가손익으로 정하는 방법도 있지만, 필자의 경험상 수익/손실 가격으로 정하는 것이 편하긴 했다. 필자의 경우, 계속 수정하면서 돌리고는 있는데, 장시작 전(0700~2230)에는 10p, 장 개장 후(2230~0500)에는 30p로 수익/손절가를 설정하였다.
 
이또한, 사용자가 결정해야 하는 중요한 사항이다. 가끔씩 수익가를 살짝 찍고 하방으로 가는 경우도 있다. ㅠㅠ 정말 신중히 잘 설정하자.
 

8) 익절/손절의 계산

엑셀 계산을 할 때, 아래와 같이 long/short 의 익절/손절의 계산법은 달라진다.

  • long 기준, 수익(60분내 최고가 - 진입), 손실(진입 - 60분내 최저가)
  • short 기준, 수익(진입 - 60분내 최저가), 손실(60분내 최고가 - 진입)

 
승/패은 어떻게 계산하는가? 여기서 고민을 많이했다. 
long 기준, 수익 > 손실이면 승리(롱수익)이며, 수익 < 손실이면 패배(숏수익)으로 엑셀에서 표기한다.
short을 설명하면 수익 > 손실이면 숏수익, 수익 < 수익 < 손실이면 롱수익으로 표기한다.
 


4. 마치며

엑셀로 승률을 계산하기에 앞서, 향후 전개될 글들에 적용될 가정사항을 설명하였다. 나중에 설명하겠지만, 제약사항이 생각보다 많다. 그렇더라도, 이글을 읽는 사람들이 "나도 알고리즘을 만들어야겠다"고 생각하고 막상 엑셀을 켜면, 뭐부터 해야할지 막막한 경우가 있다. 필자가 말한 내용외에도 본인만의 제약사항을 만들어서 알고리즘을 만드는 즐거움을 느껴보자.
 
한가지 걱정되는건 필자가 설명한다고 해도, 수익이 100% 난다는 보장은 없다. 지나치게 큰 기대는 가지지 않으셨으면 좋겠다. 다음 글부터 알고리즘 만드는 원리 및 과정에 대해 천천히 알아보자.
 
 

반응형