지난글, 2020/03/01 - [Python/Cryptocurrency] - Python으로 Larry Williams의 변동성 돌파 전략 백테스팅 - 2 / 비트코인 / 가상화폐 자동매매에서는 변동성 돌파 전략을 비트코인 마켓에 적용시켜보았을 때의 백테스팅 결과를 담았습니다.
여기서 몇몇 문제점이 있었는데 가장 큰 문제는 기초 데이터가 정확하지 못했습니다.
코인은 주식과 다르게 24/7로 돌아가는 마켓임에도 거래량이 없고 시가/종가/고가/저가의 변동이 없는 날들도 있어서 전략 자체를 객관적으로 평가하기 어려웠습니다.
그럼에도 2편까지 썼던 이유는 백테스팅 과정 자체를 담는데 의의를 두었기 때문이었는데 이번 편에서는 원천 데이터를 바꿨습니다.
특정 사이트에서 엑셀로 받지 않고 pybithumb 패키지를 사용하여 가격 정보를 받아온 뒤
변동성 돌파 전략을 다시 구현하고 전략의 성과를 높일 수 있는 방법들에 대해 살펴 보겠습니다.
먼저 가격 정보를 받아오겠습니다.
import pybithumb
import pandas as pd
import numpy as np
# 비트코인 BTC
df_BTC = pybithumb.get_ohlcv("BTC")
df_BTC에는 2013년부터 수행시점까지의 비트코인 일봉 가격 데이터가 있습니다.
변동성 돌파 전략에서 사용할 Range, 이 Range에 K를 곱한 값에 당일 시가를 더한 Target Prcie 등을 계산해보겠습니다.
import pybithumb
import pandas as pd
import numpy as np
# 비트코인 BTC
df_BTC = pybithumb.get_ohlcv("BTC")
# 전일 range 고가 - 저가 계산
df_BTC['range'] = df_BTC['high'] - df_BTC['low']
# 종가 변화율
df_BTC['change'] = (df_BTC['close'] - df_BTC['close'].shift(1)) / df_BTC['close'] * 100 # 전일 종가 대비 현재 종가
# 매수 진입가격, 당일 시가 + Range * K
df_BTC['target_price_fix_k'] = df_BTC['open'] + df_BTC['range'].shift(1) * 0.5
이 부분은 기존에 target_price로 나타냈던 컬럼으로 당일 시가 + range * K (0.5)입니다.
현재 가격이 target_price_fix_k를 넘어야 매수 시그널이 들어왔다고 판단합니다.
이름을 target_price_fix_k로 지은 이유는 고정된 k(0.5)를 사용한 target_price라는 의미입니다.
df_BTC['target_price_fix_k'] = df_BTC['open'] + df_BTC['range'].shift(1) * 0.5
나머지 코드는 이전 편과 비슷하고 추후 전체를 첨부하겠습니다.
다음은 2013년부터 2020-03-09까지의 변동성 돌파 전략의 결과입니다.
데이트레이딩이지만 지정가를 사용해 슬리피지는 없다고 가정하고 수수료율은 0.0139%를 사용했습니다.
이외 특이사항으로는 항상 가진 현금의 50%을 사용해 투자했습니다.
2013년 12월 27일부터 2020년 3월 9일까지 2176일 중 총 876번 매매해 467번 승리했습니다.
승률은 53%이고 손익비는 1.316입니다.
100만원으로 시작해 현재 170만원입니다.
가장 많이 벌었을 때는 250만원까지 올라갔으나 원금을 까먹고 75만원까지 떨어진 날도 있었습니다.(2014-09-24)
눈여겨볼 부분은 MDD가 33%나 됩니다.
단순 Buy and hold 전략보다 초라한 성적표입니다. (2013년 12월 27일 비트코인 종가는 70만원 대)
이 성적을 좀 더 높여줄 방법을 하나씩 살펴 보겠습니다.
먼저 변동성 조절입니다.
위 방법은 비트코인의 변동성을 고려하지 않고 항상 고정적으로 가진 현금의 50%를 투자해왔습니다,
그렇게 시장상황과 상관없이 고정적으로 투입하는 방법이 아니라
코인의 변동성 [(전고 - 전저) / 종가]을 계산해 현금 투입 비율을 조절하는 방식을 사용해보겠습니다.
그럼 이런 방식을 왜 쓰고 뭐가 좋냐고 물으신다면
MDD를 줄이기 위함이라고 간단히 요약해드리고
상세한 이유는 위대한 systrader79님의 카페에서 변동성 조절 전략1을 검색해서 이어지는 시리즈를 읽어 보시길 추천합니다.
https://cafe.naver.com/invest79
계속해서 변동성 조절을 해보겠습니다.
변동성 조절에 필요한 값은 전일 변동성, 목표 변동성입니다.
전일 변동성 계산은 [(전고 - 전저) / 현재가]입니다.
여기서 우리가 가진 캔들이 실시간 가격을 반영할 수는 없어서 종가를 현재가로 가정하고 계산하겠습니다.
코드로 나타내보겠습니다.
# 변동성 계산에 사용할 Volatility
df_BTC['volatility'] = df_BTC['range'].shift(1) / df_BTC['close']
이렇게 구한 df_BTC['volatility']를 사용해 목표 변동성을 나눈 값만큼만 투입하면 됩니다.
목표 변동성은 우리가 어느 정도의 변동성을 염두하냐인데 저는 1.5%로 설정하겠습니다.
매수하는 부분에서 기존에는 self.cash * 0.5 로 표현했던 투입 금액 부분을 변동성 조절을 사용해 수정하겠습니다.
먼저 기존 코드입니다.
self.position = {'created_at': idx,'volume': round(self.cash * 0.5 / target_price, 7),'bid_price': target_price}
다음은 변동성 조절을 사용한 수정 코드입니다.
# 목표 변동성
target_volatility = 0.015
# 전일 변동성이 목표한 변동성 보다 낮은 경우 => 25% 투자하도록 고정
apply_volatility = round(target_volatility / volatility, 3) if target_volatility < volatility else 0.25
self.position = {'created_at': idx,
'volume': round(self.cash * apply_volatility / target_price, 7),
'bid_price': target_price}
다음은 이렇게 변동성을 조절하여 투자한 결과입니다.
전략 자체를 수정한 것은 아니므로 승리횟수, 승률, 손익비는 변동이 없습니다.
다만 MDD가 33%에서 24%로 줄었고 더 많은 돈을 벌었습니다.
(왜 그럴까요? systrader79님의 글을 정독하시길 추천드립니다.)
아무튼 보통 사람들은 현재 가진 예탁금을 전부 투자하기 십상이라
현금 50%만 투자하겠다는 것도 쉬운 일이 아닌데 그럼에도 투자 결과가 생각보다 좋지 않았습니다.
여기서 전일 변동성을 일일이 계산하여 투입 비율을 조절한 결과, 전략 자체를 바꾸지 않았는데 더 좋은 투자 성과를 얻을 수 있었음을 알 수 있습니다.
이렇게 전략을 보조할 수 있는 수단들 중에 다른 방법으로는
target price를 구하는 과정에 사용한 K를 0.5로 고정적으로 두지 않고 전일 noise를 계산해 적용하는 방법이 있습니다.
다음 포스팅에서는 이 과정을 담아보겠습니다.
같이 보시면 좋을 글
2021/02/10 - [파이썬/주식 자동매매] - 주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.
댓글