Coding Is My Life

코딩은 인생

파이썬

[파이썬][보조지표 envelope로 업비트 코인 분석]

산기대 컴공 2021. 10. 13. 15:54
728x90

Envelope란?

n일의 이동평균선에 +m%,-m%를 뜻한다.

 

분석내용

envelope선을 기준으로 envelope 하향선을 돌파시 매수, 매수를 할시에는 3분할로 분할 매수를 하였다.

손절은 평단가의 5%로 잡고 손절하였고 익절은 envelope 상향선 돌파 또는 평단가의 5%에 도달시 익절을 하였다.

분석에 사용된 차트는 업비트 모든 종목을 대상으로 하였고 1시간 차트를 사용하였다. 기간은 1000시간으로 대략 41일동안에 트레이딩을 백테스팅하였다.

 

분석 결과

아래 보이는 결과가 수익률이다. 보다시피 손해를 본 코인이 단 하나도 없었다. 하지만 근 한달간은 코인시장이 상승장이라는 것을 감안하면 어느정도 이해가 된다. 그래도 모든 종목이 수익을 본 것은 그래도 나쁘지 않은 전략이라고 생각한다. 이 매매전략을 더 업그레이드해서 실전 매매로 해봐도 좋을 것 같다는 생각을 했다. 

22.36 % 20.64 % 11.81 % 25.98 % 6.9 % 10.99 % 12.13 % 86.31 % 27.04 % 73.26 % 21.8 % 23.82 % 49.61 % 59.15 % 17.86 % 31.49 % 80.0 % 32.22 % 42.09 % 26.16 % 14.51 % 22.64 % 57.14 % 32.42 % 123.52 % 22.8 % 21.18 % 28.7 % 11.62 % 30.47 % 27.69 % 34.21 % 46.65 % 1.76 % 19.71 % 29.53 % 80.35 % 50.92 % 65.01 % 43.31 % 56.15 % 60.3 % 28.81 % 22.87 % 51.58 % 36.74 % 20.37 % 22.89 % 133.75 % 13.15 % 16.84 % 42.98 % 40.83 % 22.03 % 17.23 % 34.51 % 134.8 % 57.72 % 16.89 % 44.28 % 14.46 % 72.45 % 19.14 % 28.44 % 169.49 % 45.48 % 42.45 % 21.83 % 40.73 % 57.96 % 70.18 % 26.06 % 44.98 % 37.54 % 72.34 % 73.36 % 26.12 % 15.42 % 33.76 % 8.32 % 30.45 % 51.29 % 31.15 % 101.24 % 48.84 % 40.22 % 21.11 % 24.11 % 37.8 % 39.7 % 88.29 % 77.15 % 24.56 % 16.11 % 5.19 % 28.15 % 34.55 % 31.6 % 24.93 % 85.47 % 44.47 % 53.45 %

 

코드

import pyupbit
import pandas as pd
import matplotlib.pyplot as plt

필요한 라이브러리를 불러왔다.

def draw_graph(list1,list_buy,list_sell,data):
  fig = plt.figure(figsize = (20,5))
  for i in range(len(list1)):
    fig = plt.plot(list1[i])
  for i in range(len(list_buy)):
    fig = plt.axvspan(list_buy[i][0],list_buy[i][0],color = 'blue',alpha = 0.1)
  for i in range(len(list_sell)):
    fig = plt.axvspan(list_sell[i][0],list_sell[i][0],color = 'red',alpha = 0.1)
  fig = plt.legend()
  fig = plt.show()
  fig2 = plt.figure(figsize = (20,2))
  fig2 = plt.plot(data['volume'])

매수,매도 타이밍을 보기 위해서 그래프를 그리는 함수를 만들었다.

def set_envelop(data,gap):
  ma20 = data['close'].rolling(window = 20).mean()
  idx = ma20.index
  en_high,en_low =  [],[]
  for i in range(len(ma20)):
    en_high.append(ma20[i]+((ma20[i]*gap)/100))
    en_low.append(ma20[i]-((ma20[i]*gap)/100))
  en_high = pd.Series(en_high,index = idx)
  en_low = pd.Series(en_low,index  = idx)
  return en_high,en_low

data에 코인 차트데이터를 주고 gap에는 몇%의 envelope를 설정할 지 설정해주면 된다.

# 벡테스팅 함수
def buy(price,cash,finance,Average_price,div_count):
  div_count = div_count + 1
  buy_cash = cash/3
  Average_price = ((Average_price*finance)+(price*buy_cash/price))/(finance+buy_cash/price)
  finance = finance+buy_cash/price
  cash = cash-buy_cash
  return cash,finance,Average_price,div_count
def sell(price,cash,finance,Average_price,div_count):
  cash = finance*price+cash
  finance = 0
  Average_price = 0
  div_count = 0
  return cash,finance,Average_price,div_count
def backtesting(data):
  start_cash = 10000000
  cash,finance,Average_price = start_cash,0,0
  div_count = 0
  list_buy,list_sell = [],[]
  en_high,en_low = set_envelop(data,3)
  for i in range(1,len(data)):
    if div_count < 3:
      if data['close'][i-1]>en_low[i-1] and data['close'][i]<=en_low[i]:
        cash,finance,Average_price,div_count = buy(en_low[i],cash,finance,Average_price,div_count)
        line = []
        line.append(data.index[i])
        line.append(i)
        list_buy.append(line)
    else:
      if data['close'][i-1]<en_high[i-1] and data['close'][i]>=en_high[i]:
        cash,finance,Average_price,div_count = sell(en_high[i],cash,finance,Average_price,div_count)
        line  = []
        line.append(data.index[i])
        line.append(i)
        list_sell.append(line)
      elif data['close'][i]+Average_price*5/100>=Average_price:
        cash,finance,Average_price,div_count = sell(en_high[i],cash,finance,Average_price,div_count)
        line  = []
        line.append(data.index[i])
        line.append(i)
        list_sell.append(line)
      elif data['close'][i]+Average_price*5/100<=Average_price:
        cash,finance,Average_price,div_count = sell(en_high[i],cash,finance,Average_price,div_count)
        line  = []
        line.append(data.index[i])
        line.append(i)
        list_sell.append(line)
  """
  list1 = []
  list1.append(en_high)
  list1.append(en_low)
  list1.append(data['close'])
  draw_graph(list1,list_buy,list_sell,data)
  """
  print('백테스팅 총 수익률:',round(((cash-start_cash+(finance*data['close'][len(data)-1]))/start_cash)*100,2),'%')
  return round(((cash-start_cash+(finance*data['close'][len(data)-1]))/start_cash)*100,2)

벡테스팅을 하는 함수이다. 매매전략을 추가 할 수도 있다.

result = []
for i in range(len(code_name)):
  line = []
  name = code_name[i]
  data = pyupbit.get_ohlcv(name,interval="minute60",count = 1000)
  backtesting_result = backtesting(data)
  line.append(name)
  line.append(backtesting_result)
  result.append(line)

모든 코인에 대하여 백테스팅을 하고 리스트에 저장하였다.

728x90