가상화폐 투자마법 공식 발췌 (전체코드는 아래 파일에 있습니다)

투자전략 : 슈퍼상승장(3,5,10,20일 이평) + 변동성 조절
투자전략 4(이동평균 + 현금비중 80% 이상) 전략에서 5일이동평균 뿐만 아니라 3,5,10,20일 이동평균보다 높을 경우 매수하는 슈퍼상승장 전략이다.
# 트레이딩 전략 4 : 이동평균 + 현금 비중 80% 이상
가상화폐 투자마법 공식 발췌 (전체코드는 아래 파일에 있습니다) 투자전략 : 이동평균 + 현금 비중 80% 이상 투자전략 3(가상화폐 분산투자 + 현금비중 90%)와 거의 유사한 전략이나, 이동평균
tenmillionquant.tistory.com
투자대상 : 아무 가상화폐나 몇 개 선택
투자기간 : 2014.01 ~ 2022.03
거래비용 : 0.2% 적용
투자전략
- 선택한 가상화폐의 3,5,10,20일 이동평균을 1일 1회 체크
- 현재 가격이 이 4개 이동평균보다 높으면 매수 또는 보유
- 현재 가격이 이동평균보다 낮으면 매도 또는 투자 보류
- 자금 관리 : 가상화폐별 투입 금액은 (타깃 변동성 / 특정 화폐의 변동성 / 가상 화폐 수)
- 변동성 : 최근 5일간의 1일 변동성의 평균
변동성 계산은 아래와 같이 계산하면 된다.
1일 변동성 : (전일 고가 - 전일 저가) / 시가 x 100 (백분율)
변동성 : 최근 5일간의 1일 변동성의 평균
현금 비중을 무식하게 80%로 고정하는 것이 아니라 변동성을 보고 적절히 조절해보자. 예를 들어, 변동성을 2%에 맞추고 싶다고 하자. 관심있는 가상화폐 5개 중에서 2개의 가격이 3,5,10,20일 이평선보다 높다고 가정해보자.
그리고 비트코인의 변동성은 8%, 이더리움은 12%라고 하자. 그러면, 비트코인에 총자산의 2 / 8 = 25%, 이더리움에 2 / 12 = 16.66%에 맞춘다. 그리고, 가상화폐가 5종이니 이를 각각 5로 나누어 25 / 5 = 5%, 이더리움에 16.66 / 5 = 3.33%에 투자하는 것이다.
또 다른 특징은 해당 전략은 트레이딩 전략 4보다 확실한 상승장에 투자한다.
해당 전략을 구현해보자.
#필요한 데이터를 불러온다
import pybithumb
import pandas as pd
import numpy as np
저번처럼 일단 비트코인 하나로만 가지고 해보자.
btc_df = pybithumb.get_ohlcv('BTC')
btc_df
비트코인의 변동성을 먼저 구해보자. 전일 고가와 전일 저가의 차이를 시가로 나누면 변동성이 구해진다. 여기서 시가는 00:00시 시작가이다.
# 변동성 구하기 = (전일 고가 - 전일 저가) / 시가 x 100(백분율)
btc_df['high_shifted'] = btc_df['high'].shift(1)
btc_df['low_shifted'] = btc_df['low'].shift(1)
btc_df['vol'] = ((btc_df['high_shifted'] - btc_df['low_shifted']) / btc_df['open']) * 100
3,5,10,20일의 이평선을 구해보자.
# 3,5,10,20일 이동평균선 구하기
btc_df['ma_3'] = btc_df['close'].rolling(window=3).mean()
btc_df['ma_5'] = btc_df['close'].rolling(window=5).mean()
btc_df['ma_10'] = btc_df['close'].rolling(window=10).mean()
btc_df['ma_20'] = btc_df['close'].rolling(window=20).mean()
# 이평선이 없는 날짜는 삭제한다
btc_df.dropna(inplace=True)
이제 백테스팅을 해보자. 타겟 변동성은 2%이다. btc가격이 3,5,10,20일 이평선보다 커지면 매수한다. 그때, 타깃변동성 / 특정 화폐의 변동성으로 투자하려는 퍼센트를 계산하고 유의할점이 계산한 값이 1보다 크면 모든 금액으로 비트코인을 매수한다.
total_capital = 0 # 전체 투자금액
vol_invested = 0 # 변동성 계산하고 투자하려는 퍼센트
cash = 100000000 # 현금, 처음 시드머니 1억
fee = 0.002 # 수수료 0.2%
btc_invested = 0 # 가상화폐에 투자된 금액
target_vol = 2 # 타겟변동성
btc_close_price_list = []
total_capital_list = []
for i in range(len(btc_df)):
yesterday_btc_close = btc_df.iloc[i-1]['close']
btc_close = btc_df.iloc[i]['close']
# 비트코인 변동만큼 투자금액에 반영한다
btc_invested *= (btc_close / yesterday_btc_close)
# 총금액은 현금과 비트코인 투자한 금액
total_capital = cash + btc_invested
# 만약 btc 가격이 3,5,10,20일이평선보다 커지면 매수한다
if (btc_df.iloc[i]['close'] >= btc_df.iloc[i]['ma_3']) and (btc_df.iloc[i]['close'] >= btc_df.iloc[i]['ma_5']) and (btc_df.iloc[i]['close'] >= btc_df.iloc[i]['ma_10']) and (btc_df.iloc[i]['close'] >= btc_df.iloc[i]['ma_20']) and (btc_invested == 0):
# 만약 타깃변동성 / 특정 화폐의 변동성이 1보다 크면 1로 세팅한다
vol_invested = (target_vol / btc_df.iloc[i]['vol'])
if vol_invested >= 1:
vol_invested = 1
# 현금은 변동성 계산후 남은 만큼 남긴다 : 타깃 변동성 / 특정 화폐의 변동성 / 가상화폐 수(=1, 비트코인)
cash = total_capital * (1 - vol_invested)
# 비트코인에는 변동성만큼 투자한다(수수료비용은 차감한다)
btc_invested = total_capital * (vol_invested) * (1 - fee)
total_capital = cash + btc_invested # 전체 투자금액은 현금에 비트코인에 투자된 금액이다
print('buy',cash, btc_invested, total_capital, vol_invested)
# 만약 btc 가격이 3,5,10,20일이평선 중 하나라도 작아지면 매도한다
elif ((btc_df.iloc[i]['close'] < btc_df.iloc[i]['ma_3']) or (btc_df.iloc[i]['close'] < btc_df.iloc[i]['ma_5']) or (btc_df.iloc[i]['close'] < btc_df.iloc[i]['ma_10']) or (btc_df.iloc[i]['close'] < btc_df.iloc[i]['ma_20'])) and (btc_invested != 0):
# 비트코인을 매도한다 (매도할때 수수료 차감한다)
btc_invested = btc_invested * (1 - fee)
total_capital = cash + btc_invested # 전체 투자금액은 현금에 비트코인에 투자된 금액이다
cash = total_capital #전체 투자금액은 현금으로 보유한다
# 비트코인 투자금액을 0으로 만든다
btc_invested = 0
print('sell',cash, btc_invested, total_capital, vol_invested)
btc_close_price_list.append(btc_close)
total_capital_list.append(total_capital)
print(btc_close, total_capital)
이제 수익률을 계산해보자. 수익률은 누적으로 169배이다! Buy&Hold가 약 70배인걸 감안하면, outperform하였다고 볼 수 있다!
ror_df = pd.DataFrame({"btc_close" : btc_close_price_list, "total_capital" : total_capital_list}, index = btc_df.index)
ror_df['ror'] = ror_df['total_capital'].pct_change() + 1
ror_df['cum_ror'] = ror_df['ror'].cumprod()
ror_df

이제 MDD를 계산해보자. MDD는 아래 페이지를 참조하자. MDD는 -16.7%이다.
월스트리트 퀀트 투자의 법칙. 퀀트의 필수요소. 백테스팅
월스트리트의 퀀트 투자의 법칙 발췌 전통 펀드매니저와 퀀트매니저를 구분하는 한 가지 특징을 꼽으라면 단연 백테스팅이다. 백테스팅은 퀀트 전략이 과거에 어떤 성과를 냈는지 보는 과정
tenmillionquant.tistory.com
# 전 고점(HWM : High Water Mark)
ror_df['highwatermark'] = ror_df['cum_ror'].cummax()
ror_df['drawdown'] = (ror_df['cum_ror'] / ror_df['highwatermark']) - 1
# mdd를 구한다
ror_df['max_drawdown'] = ror_df['drawdown'].cummin()
print(ror_df['max_drawdown'].min())
-0.1674095957826156
수익률을 그래프로 그려보면 다음과 같다.
import matplotlib.pyplot as plt
plt.plot(ror_df['cum_ror'])

'가상화폐 퀀트 전략' 카테고리의 다른 글
| 트레이딩 전략 7 : 오전 천국, 오후 지옥 (0) | 2022.04.06 |
|---|---|
| 트레이딩 전략 6 : 듀얼 모멘텀 + 현금 비중 최소 90% (0) | 2022.04.05 |
| # 트레이딩 전략 4 : 이동평균 + 현금 비중 80% 이상 (0) | 2022.04.04 |
| # 트레이딩 전략 3 : 가상화폐 분산투자 + 현금 비중 90% (0) | 2022.03.29 |
| # 트레이딩 전략 2 : 오버나잇(Overnight) 매수 (0) | 2022.03.24 |
댓글