본문 바로가기
가상화폐 퀀트 전략

트레이딩 전략 7 : 오전 천국, 오후 지옥

by TenMillionQuant 2022. 4. 6.

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

 

아래 전략에서 오전 수익이 오후보다 높다는 것을 볼 수 있었다.

 

 

# 트레이딩 전략 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'])

 

 

 

 

 

 

 

댓글