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

아래 전략에서 오전 수익이 오후보다 높다는 것을 볼 수 있었다.
# 트레이딩 전략 2 : 오버나잇(Overnight) 매수
가상화폐 투자마법 공식 발췌 (전체코드는 아래 파일에 있습니다) 오버나잇(오전매도) 전략(00시 매수, 12시 매도) 2017년 1월 1일부터 12월 31일까지 비트코인에 투자했다면 1,457%이다. 그런데 만약,
tenmillionquant.tistory.com
이 전략의 효력을 극대화 하는 방법이 있는데, 전날 오후 수익이 0 이상일 때만 오전 투자를 하는 방법이다.
투자대상 : 비트코인(BTC)
투자기간 : 2013.05 ~ 2022.03
거래비용 : 0.1% 적용
투자전략
- 오전 0시에 가상화폐의 전일 오후(12~24시) 수익률과 거래량 체크
- 매수 : 전일 오후 수익률 > 0, 전일 오후 거래량 > 오전 거래량
- 자금 관리 : 가상화폐별 투입 금액은 (타깃 변동성 / 특정 화폐의 전일 오후 변동성) / 투자 대상 화폐 수
- 매도 : 정오
이제 코드를 구현해보자
#필요한 데이터를 불러온다
import pybithumb
import pandas as pd
import numpy as np
비트코인 데이터를 현재시점까지 가져온다. 데이터를 가져올때, 자정 12시, 오전 12시의 종가를 알아야 되므로, 시간별 가격정보를 가져오는 get_candlestick 함수를 사용한다
btc_df = pybithumb.get_candlestick("BTC", chart_intervals="12h")
변동성을 구해보자. 변동성 구하기 = (전일 오후 고가 - 전일 오후 저가) / 전일 오후 시가 x 100(백분율)
# 변동성 구하기 = (전일 고가 - 전일 저가) / 전일 시가 x 100(백분율)
btc_df['high_shifted'] = btc_df['high'].shift(1)
btc_df['low_shifted'] = btc_df['low'].shift(1)
btc_df['open_shifted'] = btc_df['open'].shift(1)
btc_df['vol'] = ((btc_df['high_shifted'] - btc_df['low_shifted']) / btc_df['open_shifted']) * 100
btc_df.dropna(inplace=True)
자정에 사서 정오 점심시간이 시작되면 파는 전략
즉 2015년 4월 6일 00:00시에 사서, 2015년 4월 6일 12:00에 파는 전략이다
대신, 조건이 전일 오후 수익률 > 0, 전일 오후 거래량 > 오전 거래량
total_capital = 0 # 전체 투자금액
vol_invested = 0 # 변동성 계산하고 투자하려는 퍼센트
cash = 100000000 # 현금, 처음 시드머니 1억
fee = 0.001 # 수수료 0.1%
buy = None # 사는지 확인용
total_capital = 0 # 전체 투자금액
btc_invested = 0 # 가상화폐에 투자된 금액
target_vol = 2 # 타겟변동성
total_capital_list = [] # 전체 투자금액 리스트
btc_close_price_list = [] # 비트코인 가격 리스트
buy_price = 0 # 매수가격
sell_price = 0 # 매도가격
for i in range(len(btc_df)):
# 총금액은 현금과 비트코인 투자한 금액
total_capital = cash + btc_invested
# 12시에 산다
if btc_df.index[i].hour == 0:
# 전일 오후 수익률 > 0, 전일 오후 거래량 > 오전 거래량인지 확인한다
if ((btc_df.iloc[i]['open'] / btc_df.iloc[i-1]['open']) > 0) and (btc_df.iloc[i-1]['volume'] > btc_df.iloc[i]['volume']):
# 만약 타깃변동성 / 특정 화폐의 변동성이 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)
buy_price = btc_df.iloc[i]['open']
buy = True
# 12시면 판다
elif (btc_df.index[i].hour == 12) and (buy == True):
sell_price = btc_df.iloc[i]['open']
# 비트코인 변동만큼 투자금액에 반영한다
btc_invested *= (sell_price / buy_price)
# 총금액은 현금과 비트코인 투자한 금액
total_capital = cash + btc_invested
# 비트코인을 매도한다 (매도할때 수수료 차감한다)
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)
buy = False
btc_close_price_list.append(btc_df.iloc[i]['close'])
total_capital_list.append(total_capital)
print(btc_df.iloc[i]['close'], total_capital, '\n')
수익률을 확인해보면, 누적 60%밖에 오르지 않았다. 너무 이상하다. 뭔가 프로그래밍을 잘 못한거같다. 왜냐하면, 책에선 복리로 80.6%라고 했는데..난 누적 60%가 나왔다. 어디서 잘못된건지 모르겟다.
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

수익률 그래프를 그려보면 아래와 같다.
import matplotlib.pyplot as plt
plt.plot(ror_df['cum_ror'])

'가상화폐 퀀트 전략' 카테고리의 다른 글
| 트레이딩 전략 9 : 다자 가상화폐 + 상승장 + 변동성 돌파 (1) | 2022.04.11 |
|---|---|
| 트레이딩 전략 8 : 다자 가상화폐 + 변동성 돌파 (1) | 2022.04.07 |
| 트레이딩 전략 6 : 듀얼 모멘텀 + 현금 비중 최소 90% (0) | 2022.04.05 |
| # 트레이딩 전략 5 : 슈퍼상승장 + 변동성 조절 (1) | 2022.04.04 |
| # 트레이딩 전략 4 : 이동평균 + 현금 비중 80% 이상 (0) | 2022.04.04 |
댓글