본문 바로가기
AutoBot

[업비트 자동매매 시즌2] D-Auto Trading No.4 (백테스팅 Step-2)

by zemba 2022. 5. 15.
반응형
SMALL

안녕하세요~ 이번 포스팅은 지난번에 백테스팅의 연장선이기 때문에 조금 빠르게 포스팅하려고 합니다. 사실 이어지는 내용이라서 빠르게 작성하고 싶은 마음도 있었기 때문에 이서 빠르게 포스팅을 해봅니다 ㅎㅎ 😀

지난 포스팅에 이어지는 내용이라 이전 포스팅을 참고해주시길 바랍니다. (https://zemba.tistory.com/55)

 

[업비트 자동매매 시즌2] D-Auto Trading No.3 (백테스팅 Step-1)

안녕하세요! Zemba입니다~ 한동안 새로운 회사에 입사하고 정신없이 시간을 보내다가 포스팅이 점점 느려지고 있습니다. 빨리 적응해서 포스팅이 밀리지 않도록 노력을 해봐야 하겠습니다. ㅎㅎ

zemba.tistory.com

계속해서 진행해보도록 하겠습니다 ㅎㅎ 아무튼 테스팅의 케이스를 늘려서 여러 가지로 테스트를 해보기로 마음먹고 DB구축까지 완료하였습니다. 그렇기 때문에 좀 더 빠르게 다양한 케이스들을 테스트할 수 있다고 생각하여 약간 무리할 정도로 케이스를 늘려 보았습니다.
그래서 어떠한 케이스를 테스트 해보았는지를 설명드리겠습니다.

  1. 기존 전략 ( 볼린저 전략까지 포함 )
  2. 하락 전략 없음
  3. 기존 전략에 하락 전략 변경 2

이렇게 3가지로 테스트를 해보았습니다. 그리고 하락에 승패율은 전부 고정하도록 하였습니다. 하락에서는 비교적 보수적으로 판단해야 할 것으로 느껴져서 1%만 수익을 보고 매도하도록 정하였습니다. 손절은 2%로 설정하였습니다. 그래서 최대한 익절의 비율을 높이려는 전략으로 하락 전략을 가져가도록 하였습니다.

자 그러면... 메인이 되는 상승구간 전략에서의 익절, 손절의 테스트를 어떻게 했는지를 공유드리겠습니다. 테스트 조건에 대한 데이터를 만들기 위해서 코드를 작성해보았습니다.

buy_once_amount_array = [10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000]
    year = 2021
    str_month = str_mon
    last_month = last_mon
    total_amount = 1000000
    max_up_win_rate = 35
    max_up_lose_rate = [-5, -10, -15, -20, -25, -30, -35]
    max_down_win_rate = down_win_rate
    max_down_lose_rate = down_lose_rate

    for once_amount in buy_once_amount_array:
        for up_lose_rate in max_up_lose_rate:
            for i in range(1, max_up_win_rate + 1):
            ......

대충 보시면 아시는 분들도 계시겠지만 우선 설명을 드리면 익절은 1%~35%까지 테스트를 돌릴 것이며 손절은 -5%, -10%, -15%, -20%, -25%, -30%, -35%의 구간을 손절로 잡고 테스트할 예정입니다. 그리고 한번 종목을 구매하는 기준도 만원부터 10만 원까지로 각각 테스트를 할 예정으로 다음과 같이 코드를 구현하였습니다. 결국 한번 구매할 금액 기준으로 1~35%의 익절 기준 * 손절 기준만큼의 테스트를 돌려보려고 작성하였습니다. 하지만 여기서 추가적으로 고려해야 하는 것은 분봉당 이 기준에 대해서도 테스트를 수행해야 합니다. 그렇게 까지 전체적으로 수행한다고 하면 엄청나게 많은 케이스가 테스트될 예정입니다. 그리고 위에서 언급한 3가지 전략에 대해서 이 모든 테스트를 수행하려고 합니다. 그래서 이 테스트를 수행해보았습니다.

정말 엄청 오래 걸렸습니다. 이 테스트를 수행하는 과정에서 Python의 DataFrame에 대한 성능적인 부분도 고려해야 한다는 것도 배우게 되었습니다. 저는 전까지 API데이터를 조회하는데 가장 시간이 오래 걸릴 것으로 예상하였지만 그렇지 않고 DataFrame의 데이터 건수가 많아지고 그 데이터를 가공하면서 원하는 위치에 해당하는 데이터를 검색해서 찾는 것이 엄청 오래 시간이 소요되는 것을 알게 되면서 테스팅 툴에 대한 변경 작업도 엄청 많이 시간을 투자하였습니다. 

아무튼 이내용은 그냥 제가 개발자로서 많은 삽질을 했다는 그런 썰이고 ㅋㅋ 관심 없으실 분들이 많기 때문에 넘어가고 이제는 결과를 공유드려 보겠습니다. 저는 이 결과를 보고 사실 좀 놀랬습니다. 의외의 결과가 나왔고 백테스트 툴을 잘못 만들었나라고 생각할 정도로 좀 의외의 결과를 보게 되었습니다.

1번 전략 승패%순위
2번 전략 승패%순위

우선 엑셀의 헤더쪽에 표시한 건 축약한 건데 ㅋㅋㅋ 한번 설명드리겠습니다.

  • period - 분봉주기
  • buy_once - 종목 1개 구매 시 사용금액
  • TUWC - 상승장 승리 카운트
  • TULC - 상승장 패배 카운트
  • TDWC - 하락장 승리 카운트
  • TDLC - 하락장 패배 카운트
  • TUWR - 상승장 익절%
  • TULR - 상승장 손절%
  • TDWR - 하락장 익절%
  • TDLR - 하락장 손절%
  • result - 1,000,000 만원 투입 시 승/패에 대한 최종 수익 결과
  • % - 수익률

혹시 보시면서 이상한 점을 느끼셨을까요? 수익률이 한 250% 이상 나오는 것은 확인했습니다. 그런데...... 익절% 가 생각지도 못한.... 전략 1,2번 둘 다 보면 거의 35%에 가까운 Max치 수준의 익절%를 보실 수 있었고 또한 손절% 도 30% 이상이 수익을 가장 많이 가져가는 모습을 볼 수 있었습니다. 그래서 4번 전략을 수행하기 전에 엄청난 궁금증이 생겨났습니다. ( 저만 그런 걸까요? ㅋㅋ 어떤 건지 한번 예상해보세요~) 그래서 그 궁금증을 4번 전략에 수행시켜 보았습니다. 결과는 아래 그림과 같습니다.

3번 전략 승패%순위

하락장의 비율을 조금 높였고 상승 전략의 익절 비율을 20~60%까지로 테스트해보았습니다. 대신에 손절은 30%로 고정시켜서 테스트했습니다. 역시나 예상대로........(예상한 거 맞나?ㅋ) 익절 비율을 높이면 높이는 대로 항상 그 Max치가 익절의 최고 수익률로 테스팅의 결과가 나왔습니다. 이쯤 되면 뭔가를 잘못한 건가 싶을 정도로 생각이 들 수 있지만 DB화한 데이터도 문제가 없었고... 전체 랜덤 하게 종목을 검색해서 매매를 했지만 같은 조건에서 동일하게 수행을 할 경우에 테스팅 결과도 동일하게 나타나는 것을 보니 테스팅 코드에 문제는 없어 보였습니다. 그래서 우선 종목 1개를 샘플로 찾아보았더니 흠... 이 테스팅의 결과가 맞을 수고 있겠구나라는 생각이 좀 들었습니다.

우선 업비트 기준으로 2021년도 XRP의 OHLCV데이터를 한번 들여다보았습니다. 10분 봉이였습니다.

2021-01-01 00:00:00시 기준으로 종가가 239원이었습니다. 그리고 2021-12-31 23:50:00시 기준 종가가 1025원입니다. 이 종목 1개로만 봐도 2021년도 종목 1개의 상승이 4~5배 정도인 것을 확인할 수 있었습니다. 물론 테스트가 특정일 기준으로 시작점을 잡고 종료일 기준까지 테스트를 했기 때문에 이러한 결과가 나올 수 있습니다. 지금 시점에서 다시 가격이 떨어지면 구간 대비 수익이 이 정도까지 발생하지 않을 수 있습니다. ( 참고 부탁드립니다 😁 ) 

근데 그러면 조금 똘끼가 생겼습니다. ㅋㅋㅋㅋ 어디까지 먹을 수 있나 보자 ㅋㅋㅋㅋㅋ라는 마음에 익절 %를 올려보았습니다. ㅋ무려 60~100%까지 익절률을 설정하였습니다. ㅋㅋ

1번전략 60~100% 익절 설정
2번전략 60~100% 익절 설정

역시나...... 무려 96%까지 먹을 수 있나 보네요... 근데 여기서 한 가지 확인해 봐야 할 것은 무조건 수익% 가 높다고 해서 좋은지를 한번 고민을 해보았습니다. 안전하게 하락 구간을 대응하지 않고 손절을 35%까지 잡고 무작정 기다리면 진짜 700% 수익이 날 수 있는 것인지? 아니면 짧게 하락장에서 익절을 누적해서 수익을 늘려나가면서 상승장의 손절을 줄이는 것이 맞는 방향인지.... 고민되었습니다. 마지막에 100%까지 설정을 했지만 1번 전략에서 94% 익절을 선택했을 때는 13번의 손절이 발생했습니다. 한 종목을 구매한 비용이 10만 원이기 때문에 100,000 * 0.35 * 13 = 455,000의 손실을 볼 수 있습니다. 그리고 또 한 가지 고려해야 하는 점은 하락장에서 발생한 승패의 비율이 중요합니다. 익절을 1%로 잡고 손절을 2%로 잡았기 때문에 익절의 카운트가 손절의 카운트보다 최소 2배 이상이 되어야 이익이 발생했다고 말할 수 있습니다. 이러한 결과에 다양성을 확인하고 나서 무조건 익절%를 올린다고 해서 좋은 건 아니라고 생각하였습니다. 앞서 말씀드린 부분도 있지만 특정 구간에서만 테스트를 수행한 것이기 때문에 오히려 현재일 기준의 코 인장 상황을 본다면 90%까지 익절을 잡았다면 지금 테스트한 내용보다 손절률이 훨씬 더 많이 발생했을 것이라고 예상합니다. 또한 %를 올린다고 해서 무조건 그만큼의 승률이 오르는 것도 아닙니다. 1번의 전략에 테스트한 60~100% 구간 결과와 3번 전략의 20~60%의 전략을 비교해 보자면 최종적으로 90% 이상 설정한 테스팅이 수익은 더 많이 가져갔지만 60%로 익절을 테스팅한 결과와 엄청 큰 차이는 아닌 것으로 보입니다. 오히려 장기적인 관점에서 볼 때 60%의 익절을 가져갔기 때문에 길게 2~3년으로 예측해보면 손절 카운트가 적은 60%의 익절 비율이 좀 더 안전하고 수익이 높을 가능성이 있습니다.

생각보다 복잡한 결과가 나와서 머리가 아픕니다....ㅎ 그래도 궁금했던 부분을 해소한 것 같아서 다행입니다. 이 환경을 바탕으로 더욱 다양한 테스트도 돌려 볼 수 있고 다른 전략을 테스트해볼 수도 있을 것 같습니다. 나중에 2020년도 데이터부터 테스트를 해보아도 괜찮을 것 같습니다. 우선 테스트 결과는 나왔고 익절, 손절의 기준만 잡으면 되니 이 부분은 좀 더 고민해봐야겠습니다. 사실 이 결과로만 봤을 때 그럼 그냥 자동화 같은 거 안 만들고 그냥 저점에 사서 그냥 쭉 가지고만 있으면 되는 거 아냐?라고 생각할 수 있습니다 ( 저도 그렇게 생각했었거든요 ㅋㅋ ) 근데 저는 자동으로 익절, 손절을 하는 것이 그냥 매수해서 보유하는 것보다는 이점이 있다고 생각합니다. 그 이유는 저만의 생각일 수 있지만 우선 멘털적인 부분에서 굉장히 강해야 하며 중간중간에 익절을 통해서 원금을 늘려가는 과정이 필요하다고 생각합니다. 그냥 가지고 있을 경우에는 현금화를 하지 못하기 때문에 만약 타이밍을 놓친다면 요즘과 같은 대폭락장에서 멘털이 회복되지 않을 수도 있을 것 같습니다. 그래서 저는 자동화 프로그램은 필요한 요소라고 판단하여 계속해서 진행하려고 합니다.

구구절절 이런저런 제 생각들을 공유드렸습니다. 뭐 부정하시는 분들도 계실 것 같고 동의하시는 분도 있겠지만 저는 저의 성장기에 대한 부분을 다루기 때문에 계속 진행해보려고 합니다. 실패든 성공이든 뭔가 배우는 게 있겠죠 ㅎㅎ.
다음 포스팅에서 익절, 손절의 비율의 기준을 정하고 이제 슬슬 신규 전략에 대해서 구현을 해야 할 것 같아 보이네요 ㅎㅎ
다음 포스팅에서 만나요~

더 나은 미래를 위하여!  시간이 돈이다! 

반응형
LIST

댓글