변동성 돌파 전략을 보조할 수 있는 방법에 대해 알아보겠습니다.
당일 매수 조건인 현재가 > 목표가에서 목표가를 구할 때 (당일시가 + Range * K) K를 0.5로 고정시켜왔습니다.
물론 이렇게 해도 괜찮은 성과를 보이기는 했으니 시장 상황과 상관 없이 항상 고정적인 값을 사용한다는 것이 뭔가 아쉽다고 생각하실 수도 있습니다.
이번 포스팅에서는 K를 0.5로 고정적으로 두지 않고 noise ratio라는 값 사용한 백테스팅 결과를 살펴보겠습니다.
먼저 noise ratio란 캔들에서 잡음이 끼어있는 정도를 의미합니다.
캔들이 모여 추세를 나타내지만 그전에 캔들 하나만 놓고 보면 그 안에서도 추세를 살펴볼 수 있습니다.
예를 들어 실제 캔들의 몸통은 얼마 되지 않는데 긴 윗꼬리 혹은 아래꼬리를 달고 있다면 가격을 올리려는 힘과 내리려는 힘 중 어느 한쪽이 유력한 추세를 이루고 있다고 보기 어려울 것입니다.
아래 2020-03-09 비트코인골드(BTG) 15분봉 차트를 살펴 보면 결국 상승하기는 했으나
가격을 내리려는 매수 세력(?)과 올리려는 매도 세력(?) 간의 다툼으로 긴 꼬리가 발생했고 어느 한쪽이 크게 우세한 상황이 아니었기에 상승은 오래 가지 못하고 횡보합니다.
변동성 돌파 전략은 이 잡음 정도가 적을수록 잘 먹힙니다.
잡음이 클수록 추세가 언젠가 반전될 확률이 높기 때문입니다.
이런 의미를 갖고 있는 noise를 변동성 돌파 전략에 목표가 계산에 적용해보겠습니다.
무슨 말이냐면
그전까지 목표가 = 당일시가 + Range * K로 계산했었는데
이제부턴 목표가 = 당일시가 + Range * noise로 계산하겠습니다.
전일 noise가 크다면 잡음 정도가 컸기 때문에 높은 목표가에 도달해야 추세를 이룬다고 판단하고
noise가 낮다면 비교적 안정적인 추세를 이루고 있다고 판단하여 목표가가 그리 높지 않아도 매수할 것입니다.
먼저 noise 계산식은 1- abs(시가-종가) / (고가-저가)이고 이를 코드로 나타내보겠습니다.
# noise 계산 , noise = 1 - abs(시가 - 종가) / (고가-저가)
df_BTC['noise'] = 1 - abs(df_BTC['open'] - df_BTC['close']) / (df_BTC['high'] - df_BTC['low'])
또 여기서 단순히
목표가 = 당일시가 + Range * noise로 계산 하지 않고 noise의 20일 평균을 낸 값을 사용한
목표가 = 당일시가 + Range * noise의 20일 평균으로 계산하기 위해 다음 코드를 추가하였습니다.
df_BTC['noise_ma20'] = df_BTC['noise'].rolling(window=20, min_periods=1).mean()
여기서 window=20으로 설정하면 20일치의 평균을 구하므로 시작일부터 19일까지는 20일치 데이터가 없어서 아무 값도 계산해내지 못합니다. 이런 문제로 적절한 매수 타이밍을 포착하지 못할 수 있으므로 min_periods=1을 넣어 꼭 20일치가 없어도 평균 낼 수 있도록 하였습니다.
다음은 목표가 계산입니다.
이전글에서는 목표가를 아래처럼 계산했습니다.
# 매수 진입가격, 당일 시가 + Range * K
df_BTC['target_price_fix_k'] = df_BTC['open'] + df_BTC['range'].shift(1) * 0.5
이제는 다음처럼 계산합니다.
# 매수 진입가격, 당일 시가 + Range * K
df_BTC['target_price_noise'] = df_BTC['open'] + df_BTC['range'].shift(1) * df_BTC['noise_ma20']
이렇게 목표가를 바꾼 결과를 백테스팅해보겠습니다.
기존에 고정 k를 사용했을 때의 결과입니다. 지난번 포스팅에 첨부한 결과와 다를 것이 없습니다.
이제 noise를 사용한 결과입니다.
모든 것이 좋아졌습니다.
거래수는 줄었는데 승률/손익비/현재 잔액 모두 늘었습니다. 이와중에 MDD는 안 늘었습니다. 더 줄어들었습니다.
왜 이런 결과가 나왔는지 궁금했습니다.
K=0.5를 사용할 때와 noise를 사용할 때는 뭐가 다를까요?
먼저 noise를 사용한 목표가와 K를 사용했을 때 목표가를 비교해보겠습니다.
# 매수 진입가격, 당일 시가 + Range * K
df_BTC['target_price_noise'] = df_BTC['open'] + df_BTC['range'].shift(1) * df_BTC['noise_ma20']
df_BTC['target_price_fix_k'] = df_BTC['open'] + df_BTC['range'].shift(1) * 0.5
df_BTC['is_noise_larger'] = np.where(df_BTC['target_price_noise'] > df_BTC['target_price_fix_k'], 1, 0)
np.where을 통해 noise를 이용한 목표가가 더 높으면 1이고 아니면 0으로 나타냈습니다.
그 결과, 백테스팅을 시작한 2013-12-27부터 현재까지 2176일 중 noise를 사용한 목표가가 K를 이용했을 때보다 더 높은 날이 1964일이나 됩니다.
실제로 거래가 일어난 762일 중에서 663일이 noise를 이용한 목표가가 K를 이용한 목표가 보다 높았습니다.
기존 K를 사용했을 때보다 더 비싸게 주고 사는 날이 663일이나 있었는데도 더 잘 이기고 더 많이 버는 현상이 나타났습니다.
하지만 꼭 비싸게 주고 사서 결과가 좋았다기 보다, 사지 말아야할 날 사지 않아서 손해를 줄인 효과도 있습니다.
이렇게 noise를 사용한 목표가 계산은 잡음 정도를 고려하여 잡음이 컸다면 추세가 반전되기 쉬울 것이라 생각하고 더 높은 가격에 도달했을 때 매수함으로써 보다 확실한 기회를 노리는 효과를 얻을 수 있었습니다.
같이 읽어보면 좋은 글
2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.
2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄
'파이썬 > 가상화폐' 카테고리의 다른 글
Python으로 비트코인 승률 67% 전략, 역추세 전략 , RSI(2) 백테스팅 구현 - 2 (7) | 2020.05.20 |
---|---|
Python으로 비트코인 승률 67% 전략, 역추세 전략 , RSI(2) 백테스팅 구현 - 1 (1) | 2020.05.17 |
Python으로 Larry Williams의 변동성 돌파 전략 백테스팅 - 3 / 비트코인 / 가상화폐 자동매매 / 변동성 조절 / pybithumb / 빗썸 (3) | 2020.03.09 |
Python으로 코인간 상관관계 계산 Pearson Coefficient of Correlation / 비트코인 (0) | 2020.03.05 |
Python으로 Larry Williams의 변동성 돌파 전략 백테스팅 - 2 / 비트코인 / 가상화폐 자동매매 (3) | 2020.03.01 |
댓글