본문 바로가기
파이썬/가상화폐

Python으로 Larry Williams의 변동성 돌파 전략 백테스팅 - 1 / 비트코인 / 가상화폐 자동매매

by 행복론자 2020. 3. 1.

이번 포스팅은 래리 윌리엄스(Larry Williams)의 변동성 돌파 전략을 백테스팅 하는 과정을 담아보겠습니다.

전략을 사용할 마켓은 가상화폐(비트코인)입니다. 

 

먼저 변동성 돌파 전략에 대해 알아보겠습니다.

강환국님 유튜브 - 53. 역대 최강의 트레이더의 가장 위대한 전략 - 변동성 돌파전략

 

이 전략에 대해서 알아보는 제일 좋은 방법은 강환국님의 유튜브를 보는 것이라고 생각합니다만

간단히 설명드리자면

코인의 현재가격이 오늘 시가 + Range * K의 합보다 크면 매수하고 다음날 시가에 매도하는 전략입니다. 

여기서 Range는 전일 고가 - 전일 저가이며 K는 0.5를 사용하는 것이 좋다고 하시지만 

고정적으로 K를 0.5로 설정하는 것이 아니라 마켓 상황에 따라 달리 두는 것이 더 유연한 방법 같습니다.

 

그럼 언제 매수하는지 예를 들어 확인해보겠습니다. 

2020-03-01 리플의 현재가/시가가 각각 280원, 270원이고

2020-02-29 고가/저가가 275, 270이라고 하면 

 

 

 

그 다음 매도타이밍은 2020-03-02 시가입니다.

코인시장은 주식과 다르게 24시간 매매가 가능하므로 시가의 기준시각이 정해져있는 것은 아니니 원하는 시간을 마음대로 정해보겠습니다. 저는 오전 9시를 기준시간으로 설정하겠습니다.

 

이 전략의 배경은 단기 모멘텀입니다. 

오늘 가격이 어제 종가보다 일정 부분 이상 올랐을 때만 매수하므로

가격이 상승하고 있을 때 올라타는 모멘텀 전략에 기초합니다. 

하지만 오늘의 상승추세가 오랫동안 지속된다고 보는게 아니라 단기적인 추세로 보고 다음날 시가에 매도합니다.

 

그럼 이런 단순한 전략이 과연 통하기는 통하는지 살펴보겠습니다. 

이 과정에서 백테스팅 방법으로는 zipline, backtrader와 같은 패키지를 사용하지 않고 간단히 구현한 클래스를 사용하겠습니다.

 

 

1.준비

비트코인의 일봉/한시간봉 데이터를 얻어옵니다.

https://www.cryptodatadownload.com/data/bithumb/

 

위 링크의 들어가셔서 Daily, Hourly 데이터를 받아옵니다. 

 

 

일봉/한시간봉 두 개를 사용하는 이유는 일봉만을 가지고는 진입시점을 정확히 알 수 없기 때문입니다.

사실 진입시점이 크게 중요하지는 않아서 일봉만 사용해도 되지만 

손절/익절 조건을 추가하려면 최소 한시간 단위의 가격이 필요하다고 생각해서 두 개를 준비했습니다. 

 

이렇게 다운 받은 엑셀 파일을 IDE 폴더 밑에 둡니다.

물론 절대 경로를 사용하셔서 csv를 읽을거라면 그러지 않아도 됩니다. 

 

다음은 일봉 데이터 가공입니다.

먼저 엑셀을 다운 받고 열어보면 있는 첫행을 삭제하시길 바랍니다. 

 

 

import pybithumb
import numpy as np
import pandas as pd
import datetime
from dateutil.parser import parse

K = 0.5

############# daily data #############
df_daily = pd.read_csv('Bithumb_BTCKRW_d.csv', index_col=0)  # index_col = 0 excel 행번호 제외 시킴

# 날짜 오름차순 정렬
df_daily = df_daily.sort_index()

# 전일 Range 고가 - 저가 계산 
df_daily['Range'] = df_daily['High'] - df_daily['Low']

# 종가 변화율 - 전략을 구현하는데 굳이 필요하지는 않습니다. 
df_daily['Change'] = (df_daily['Close'] - df_daily['Close'].shift(1)) / df_daily['Close'] * 100  # 전일 종가 대비 현재 종가

# 매수 진입가격, 당일 시가 + Range * K 
df_daily['Target_Price'] = df_daily['Open'] + df_daily['Range'].shift(1) * K

df_daily.to_excel('df_daily.xlsx')
############# daily data ends #############

 

 

이렇게 일봉 데이터를 정리했습니다.

현재가가 L열에 있는 Target_Price를 넘어야 매수합니다.

 

 

다음은 한시간봉 데이터 가공입니다.

마찬가지로 첫행을 삭제하시길 바랍니다. 

 

 

############# hourly data  #############
df_hourly = pd.read_csv('Bithumb_BTCKRW_1h.csv', index_col=0)  # index_col = 0 excel 행번호 제외 시킴

df_hourly = df_hourly[df_hourly['Volume BTC'] > 0]

# 엑샐내 -AM, -PM 그대로 두면 정렬 안되므로 -제외시켜줌 
df_hourly.index = df_hourly.index.map(lambda x: x.replace("-AM", "AM").replace("-PM", "PM"))

# ex) 2020-01-01 09AM > 2020-01-01 09:00:00으로 변환 
df_hourly.index = pd.to_datetime(df_hourly.index).strftime('%Y-%m-%d %H:%M:%S')

# 시간 오름차순으로 정렬 
df_hourly = df_hourly.sort_index()
############# hourly data ends#############

 

 

여기서 아래 코드는 거래량이 0인지 확인하는 용도입니다.

코인시장은 24시간 돌아가므로 주식처럼 주말에 거래량이 0으로 나오지 않습니다.

그럼에도 거래량이 0인지 확인하는 이유는 엑셀을 자세히 보면 거래량이 비어있는 잘못된 구간이 있습니다.

df_hourly = df_hourly[df_hourly['Volume BTC'] > 0]

 

 

이 날들은 데이터가 비정상적이기에 제외시켰습니다.

이렇게 제외시킨 날이 매수 시그널이 들어와 매수할 수 있는 타이밍인데도 제외되어 체크하지 못할 수 있기 때문에

완벽히 정확한 백테스팅이라 할 수는 없습니다. 대략의 대략적인 정도입니다.

 

 

 

 

데이터 준비는 여기서 마치고 

다음 포스팅에서는 이렇게 준비한 데이터를 가지고 백테스팅을 수행해보겠습니다.


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

2020/03/01 - [파이썬/가상화폐] - Python으로 Larry Williams의 변동성 돌파 전략 백테스팅 - 2 / 비트코인 / 가상화폐 자동매매

2020/03/09 - [파이썬/가상화폐] - Python으로 Larry Williams의 변동성 돌파 전략 백테스팅 - 3 / 비트코인 / 가상화폐 자동매매 / 변동성 조절 / pybithumb / 빗썸

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글