자동매매로 돌리는 코인이 몇 주째 연달아 깨지면서 변화를 주어야겠다고 생각했다. 주식이고 가상화폐고 연초부터 하락을 시게 맞는 터라 그런 것 일 수도 있겠지만 하락을 가만히 맞기엔 좀 억울하다. 파이썬 공부도 좀 할 겸 시가, 종가, 고가, 저가(줄여서 시종고저)를 결정하는 시간(base)를 변경해보고 싶었다.
내가 알고 싶은 부분은 시간(base) 기준을 설정에 따라 시종고저가 어떻게 달라질까에 대한 것이다. 같은 코인을 동일 기간 동안 돌릴 때 base에 따라 수익률과 MDD가 달라지는 효과에 대해 파헤쳐보았다.
pyupbit 라이브러리의 기본값 시간(base)은 오전 9시이다. 오전 9시를 기준으로 두고 시종고저를 불러온다. 프로그램은 전날 오전 9시~당일 오전 9시까지의 업비트 데이터를 확인하고 시종고저를 정한다. 이것은 변동성 돌파 전략에서 사용하는 타겟값, 레인지, k, noise 값을 정하는 변수이기 때문에 수익률과 MDD에도 영향을 준다. 가격을 결정하는 기본 Frame인샘이다.
자동화 프로그램에 사용된 변동성 돌파 전략은 다음날 정해둔 시간(base)에 매수한 코인 전량을 매도하도록 되어 있다. 피도 눈물도 없다. 비트코인 시장은 24시간 운영되기 때문에 시간별 변동성도 제각각이다. 수익률과 MDD도 매수 매도 시간이 몇 시이냐에 따라 수익률이 천차만별이다. 몇 시(base)를 기준으로 하는 것이 최적의 결과를 불러올지 확인할 예정이다.
백테스팅은 업비트 데이터 베이스를 근거로 하였으며 코인은 폴리곤(MATIC)이다. 기간은 21.01.31~22.01.28(362일) 사이로 진행하였다. 백테스트 기간이 그리 길지 않지만 그럭저럭 참고하기엔 나쁘지 않다고 생각한다. 전략은 변동성 돌파 전략을 사용하였다. 해당 코인 시가가 5일 평균선보다 높고 타겟값에 도달하면 매수를 하는 전략이다. 매수가 되면 다음날 정해진 시간에 전량 매도한다.
이번 백테스팅의 목적은 성과가 가장 좋은 시간(base)를 찾는 것이었다. 이를 찾기 위해 4가지 기준점을 두고 측정했다.
1. HPR(%) - 누적 수익률로서 테스트 기간 동안의 총수익률을 보여준다.
2. MDD(%) - 테스트 기간 동안 깨질 수 있는 최대 손실률을 보여준다.
3. 승률% - 돌파 신호를 받고 알고리즘이 진입했을 때 결과가 이겼는지 졌는지에 대한 승률이다.
4. 진입 횟수 - 테스트 기간 동안 돌파 신호를 받고 알고리즘이 매수를 진행한 총횟수이다.
4개 항목 중 가중치를 가장 크게 둔 것은 HPR과 MDD이다. HPR은 높을수록 좋고 MDD는 낮을수록 좋다. 그다음은 승률이다. 투자에서는 60% 승률을 기록하여도 좋은 투자자라고 말한다. HPR과 MDD를 만족한다면 좀 더 높은 승률을 거둔 시간을 눈여겨보았다.
결론부터 얘기하면 base 기준을 새벽 7시로 잡는 것이 가장 좋은 성과를 얻었다. 120.40% 수익률과 6.04%의 손실률 보여주었다. 승률은 49%로 반을 조금 못 미치는 성과 보여주었다. 변동선 돌파 전략의 핵심은 적게 깨지고 많이 먹는 전략이다. 상승장에서 크게 먹었기 때문에 승률은 낮더라도 높은 HPR을 기록할 수 있다.
4가지 항목마다 가장 성과가 좋은 1등 2등 항목엔 빨간색으로 표시를 하였다. 반대로 가장 성과가 안 좋은 1등 2등 항목엔 파란색으로 표시를 하였다. 수익률은 최대 127.43%(오전 7시)까지 확인되었으며 최악의 MDD는 46.61%(새벽 1시)로 확인되었다. 가장 높은 승률은 62%(오전 8시)로 확인되었으며 최약의 승률은 31%(새벽 1시)로 확인되었다. 진입 횟수는 낮으면 낮을수록 좋다. 자주 들어 갈수록 거래 수수료(fee)가 증가하기 때문에 적은 진입 횟수를 선호한다.
눈여겨보아야 할 점은 같은 코인과 같은 기간임에도 불구하고 base 기준을 몇 시로 잡느냐에 따라 수익률과 MDD가 천차만별이라는 것이다. 전반적으로 최악의 시간(base)은 새벽 1시이다. 23시를 변동성 돌파 전략의 기준으로 두었을 때 수익률은 약 57.41%가 까였으며 최대 낙폭은 -46.61%까지 떨어진다. 승률도 31%로 현저히 떨어진다.
아래는 위의 표를 그래프로 표현한 내용이다. HPR과 승률은 높을수록 좋고, MDD는 낮을수록 좋다.
추가적으로 데이터를 검증하기 위해 머신러닝을 활용하여 코인 가격의 추이를 그려 보았다. 구글 드라이브에서 파이썬을 가상으로 돌릴 수 있는 코랩에서 페이스북 프로펫 라이브러리를 사용했다. 프로펫은 한 시간 단위로 코인 추세를 보고 미래 가격을 예측해준다. 자세한 내용은 유튜버 조코딩의 암호화폐 자동매매 편을 참고하면 될 것 같다.
빨간색 테두리로 표시한 데일리 표는 테스트 기간 동안의 시간별 가격을 보여준다. 그래프에 따르면 7~8시쯤이 가장 높은 가격을 형성하고 있고 오후 5시쯤이 가장 낮은 가격을 형성하고 있다. 그렇다면 심플하게 오후 5시에 무조건 매수하고 다음날 오전 8시에 매도하는 전략도 가능할 것 같다.
그래프는 직접 백테스팅을 돌린 비트코인 시간(base)별 수익률 그래프와 패턴이 닮아있다. 우리나라 시간으로 오전 7~8시쯤 비트코인 가격이 가장 높은 평균을 보여준다. 가격이 가장 높은 시간에 매도를 하는 것이 효과적일 것 같다.
마치며..
결론은 base를 새벽 7시로 설정하는 것으로 최적의 수익률과 MDD를 관리할 수 있다. 그리고 base 기준에 따라 수익률이 천차만별이다. 이번 백테스팅은 폴리곤(MATIC)으로만 테스트한 결과라 다른 코인에도 동일하게 새벽 7시가 적용될지는 미지수이다. 백테스트 기간도 3개월가량으로 짧은 기간이라 더 정확한 테스트를 위해선 과거 3~4년 치의 데이터를 검증해봐야 될 것 같다. 그럼에도 불구하고 base를 잡는 시간에 대해서는 얼추 참고가 되었다. 오전 7시를 base로 설정하고 직접 테스트를 해보아야겠다. 현실 결과는 어떨지 궁금하다.
2022년 02월 05일 테스트 내용 추가 부분
글 포스팅 이후 프로그램 base를 7시로 바꾸었다. 예상대로 base를 바꾸자 매수 타겟값의 Frame이 바뀌었다. 2월 4일 솔라나를 기준으로 base를 비교하면 다음과 같다.
base를 7시로 설정했을 때 2월 4일 돌파 가격은 130,200원으로 나왔다. 그리고 2월 4일 오후 19:00에 매수를 진행했다. 이번엔 base를 9시로 설정한 가격을 보자.
base를 9시로 설정했을 때 2월 4일 돌파 가격은 131,850원으로 계산되었다. 그리고 2월 5일에 돌파하여 새벽 00:18에 매수를 진행했다.
하루동안 상승장으로 인해 두 가지 케이스 모두 수익을 얻었었다. 일단 base 7시가 좀 더 수익을 보았다. 앞으로 여러 케이스들을 겪어봐야 수익률이 가장 좋은 base 시간을 알 수 있겠지만 궁금증은 해결되었다.
base 시간이 돌파 가격과 매수 시간에 영향을 준다.기준을 몇 시로 설정하느냐에 따라 매수 가격의 Frame이 변하므로 돌파 가격이 바뀐다. 돌파 가격에 따라 매수 시간이 달라질 수 있고, 이는 결국 수익률과 MDD에 영향을 미친다. 적절한 base 시간을 찾고 활용하는 것이 자동매매에 상당한 변수로 작용한다.
p.s 파이썬 새로 배운 부분
pyupbit 라이브러리는 시간(base)를 바꿔주는 기능을 지원한다. get_daily_ohlcv_from_base 함수에 base를 입력해서 바꿀 수 있는데, 아쉬운 점은 count를 입력할 수 없어서 백테스트 데이터를 10개밖에 확인이 안 된다. 구글링을 검색하면서 방법을 찾다가 아래 링크 답변에서 답을 찾았다.