삶의 공유

[파이썬] 비트코인 자동매매 전략 Study(가격, 거래량 기반 전략)-전략수립 본문

Data Scientist/Python

[파이썬] 비트코인 자동매매 전략 Study(가격, 거래량 기반 전략)-전략수립

dkrehd 2022. 4. 17. 16:49
728x90
반응형

안녕하세요 ~ 

 

이번 시간에도 앞에서 다룬 비트코인 자동매매 전략 Study 편을 이어서 진행해보겠습니다.

 

먼저 앞에서 다룬 데이터를 불러와보겠습니다. 이 데이터로 수익률의 히스토그램 그래프와 수익률과 거래량과의 관계를 산점도를 이용해서 알아보았는데요! 이전 내용이 헷갈리시다면 하기 링크로 확인 하고 오시면 되실 것 같습니다.

 

https://wg-cy.tistory.com/148 

 

[파이썬] 비트코인 자동매매 전략 Study(가격, 거래량 기반 전략)-1

안녕하세요~ 최근에 파이썬 자동매매 Study를 시작했는데, 그 공부 기록을 하나씩 남겨보려고 합니다. 이번에 포스팅할 전략은 가격, 거래량 기반 롱 온리 전략 입니다. Data 준비 먼저 필요한 라이

wg-cy.tistory.com

 

 

 

데이터를 수익률과 거래량에 따라 정렬 및 10개의 동일한 크기로 나누기

이렇게 하는 이유는 어느 그룹에서 가장 많은 수익률이 나는지를 확인하고 그 그룹에 매수 신호를 적용하기 위함으로 보시면 되실 것 같습니다.

 

코드는 다음 과 같이 간단한 코드로 나눌 수 있습니다.

pd.qcut(data.returns, q=10)

이렇게 하면 아래와 같이 수익률 구간 별로 10개의 그룹으로 나뉘어진 것을 보실 수 있습니다 (Categories 부분입니다)

 

이렇게 나뉘어진 그룹을 라벨화 해서 별도 컬럼으로 붙여 넣어 보겠습니다.

# 10개로 나눠진 그룹을 라벨화 하기
data["ret_cat"] = pd.qcut(data.returns, q=10, labels=[-5,-4,-3,-2,-1,1,2,3,4,5])

그럼 아래와 같이 각각의 데이터들의 위에 구분 지은 카테고리에 따라서 나뉘어지게 된것을 볼 수 있습니다.

각각 그룹에 속하는 개수들을 확인 해 보겠습니다.

 

# 각 그룹에 속하는 개수
data.ret_cat.value_counts()

 

잘 나위어진 것을 볼 수 있습니다.

 

그럼 이번에는 거래량에 대해서도 동일하게 적용해보겠습니다.

# 거래량 변화에도 같은 방식 적용
data["vol_cat"] = pd.qcut(data.vol_ch, q=10, labels=[-5,-4,-3,-2,-1,1,2,3,4,5])

 

 

수익률과 거래량의 카테고리별 속한 데이터들을 Matrix형태로 만들어 분포도 확인 하기

이렇게 하는 이유는 수익률과 거래량의 구간별의 관계를 시각화 하여 해당 구간에 매수 신호를 만들어 전략을 짜고 그 전략이 잘 먹히는지 시뮬레이션 하기 위함입니다.

 

코드는 다음과 같습니다.

matrix = pd.crosstab(data.vol_cat, data.ret_cat)
matrix # 각안의 개수는 그룹에 속하는 개수

 

이 데이터를 seaborn함수를 이용하여 시각화 함으로써 좀 더 직관적으로 판단 할 수 있도록 해보겠습니다.

 

import seaborn as sns

plt.figure(figsize=(12, 8))
sns.set(font_scale=1)
sns.heatmap(matrix, cmap="RdYlBu_r", annot = True, robust = True, fmt=".0f")
plt.show()

 

해당 데이터를 보면 어떤 정보를 얻을 수 있으신거 같으신가요 ? 

 

거래량이 많을때 수익률의 변화도 많다는 정보를 시각화를 통해 보다 직관적으로 볼 수 있다는것을 아실 수 있으실 것입니다 

 

자 여기서 좀 더 나아가서 카테고리별 수익률의 중간값에 대해서 추가로 확인해보겠습니다. 위의 데이터에 수익률의 관계를 추가로 확인하기 위함입니다.

 

matrix = pd.crosstab(data.vol_cat.shift(), data.ret_cat.shift(), values=data.returns, aggfunc=np.mean)
matrix

 

자 이것을 다시 시각화 해보겠습니다.

plt.figure(figsize=(12, 8))
sns.set(font_scale=1)
sns.heatmap(matrix, cmap="RdYlBu", annot = True, robust = True, fmt=".5f")
plt.show()

 

 

여기서 확인 할 수 있는 정보는 다음과 같습니다

1. 수익률이 -5 카테고리 구간이고, 거래량도 -5 카테고리 구간에서 가장 큰 수익률을 가져온다는 것을 볼 수 있습니다. (가격 상승 신호)

2. 수익률 5 카테구리 구간이고 거래량이 -5 카테고리 구간에서 가장 큰 손실율을 가져 온다는 것을 볼 수 있습니다 (가격 하락 신호)

자 다 됐습니다 위의 2가지가 매수, 매도 신호 전략을 코드로 구현해보겠습니다.

 

매매 전략 수립

 

이 전략은 Long Only Price/Volume Trading Strategy라고도 하는데, 극단적으로 높은 수익률과, 거래량 변화를 매수 시그널로 사용 하는 것 입니다.

 

자 이제 거래 포지션에 대한 컬럼을 설정 합니다.

# 거래 포지션
data["position"] = 1
data

 

 

이제 조건을 설정합니다

 - 수익률이 상위 10% 이면서 거래량도 하위 10%인 신호로 매도 신호로 잡겠습니다.

return_thresh = np.percentile(data.returns.dropna(), 90) # 90번째 백분위수
                                                         # 10% 수익률이 return_thresh 값 보다 크다는 것을 의미
cond1 = data.returns >= return_thresh

volume_thresh = np.percentile(data.vol_ch.dropna(), 10) #10번쨰 분위수
                                                        # 하위 10% 거래량 변화가 volume_thresh값 보다 크다는 것을 의미
cond2 = data.vol_ch < volume_thresh

 

각각 조건들을 통해서 둘다 "cond1" & "cond2" 조건이 모두 true 일 경우 position의 0을 넣어 매도 시그널을 넣겠습니다. 그럼 나머지 1은 매수 신호라고 봐도 되겠지요 !

data.loc[cond1 & cond2, "position"] = 0
data.position.value_counts()

 

자 이것을 그래프화 해보겠습니다.

data.loc[:,"position"].plot(figsize=(12,8))
plt.show()

 

 

이렇게 해서 데이터 분석을 기반으로 매매 전략을 짜보았습니다. 다음 포스팅에서는 해당 전략을 기반으로 백테스팅을 해보는 시간을 가져보겠습니다.

 

읽어주셔서 감사합니다.

반응형