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)
모든 코인에 대하여 백테스팅을 하고 리스트에 저장하였다.
'파이썬' 카테고리의 다른 글
[Django Project][community 만들기 - 프로젝트, 앱 ,모델 생성] (0) | 2021.12.12 |
---|---|
[Django Project][community 만들기 - 가상환경 설정하기] (0) | 2021.12.12 |
[파이썬][보조지표 envelope를 이용한 코스피 200종목 분석] (0) | 2021.09.18 |
[파이썬][보조지표 MACD를 활용한 코스피 200 종목 분석] (0) | 2021.09.18 |
파이썬- 여러개 입력받기 (0) | 2020.10.10 |