본문 바로가기
Coin Market Review/자동매매알고리즘탐구

돈키언채널돌파전략(1일)을 통한 비트코인 자동매매!!(with Python)

by 일등박사 2022. 1. 16.
728x90

 

리처드 돈키언이 트레이딩 기법에 사용하여 명명된
‘돈키언 채널 돌파’의 기본 논리는
특정 기간 동안 가격이 최고가를 경신할 때 매수,
특정 기간 동안 가격이 최저가를 경신할 때 매도
하는것이다


오늘의 주제는!

월스트리트의 트래이딩 기법

돈키언 채널돌파를 적용하여 운영했을떄의

결과를 시뮬레이션해보자 입니다!!

 

0. Target Data

  - 투자금액 : $1,000 (가정)

  - Asset : Binance의 비트코인 선물거래

  - Duration : 2019-12-23 ~ 2022-01-15 (일간, 757개 Data Set)

    (참고 : 2022.01.15 -Binance의 코인 현물&선물 과거 가격 데이터 수집하기 (Feat. python)

 

Binance의 코인 현물&선물 과거 가격 데이터 수집하기 (Feat. python)

안녕하세요!! Binance의 코인 과거 가격 데이터를 기반으로 코인 자동 거래봇을 만들며 사용중인데요!! Binance 공식 API를 활용한 과거 가격 Data 수집 코드를 공유하고자합니다!!^^ (공식사이트에서

drfirst.tistory.com

 

 

1. 결론!

 

 

  BTC 장기투자 돈키언
수익률 469.6% 694.1%
승률 - 46.2%
거래횟수 - 26회
소유기간 100% 59.8%
CAGR 77.2% 97.7%
MDD 38.5% 24.7%

녹색이 매수 노랑이 매도

2. Python Code

 - 데이터 수집

from datetime import datetime
import pandas as pd
import requests
import time
import pickle
import numpy as np

coin = 'BTC'

start_time_ori = int (datetime(2019,1,1).timestamp()*1000)
target_time =  int (datetime(2022,1,15).timestamp()*1000)

interval = "1d"

start_time = start_time_ori
df = pd.DataFrame()
while True:
    us_xrp_price = requests.get("https://fapi.binance.com/fapi/v1/markPriceKlines",
                     params={'symbol':coin + 'USDT', 'interval' : interval , 'startTime' :start_time, 'limit':1500 } )
    df_imsi = pd.DataFrame(us_xrp_price.json())
    df_imsi.columns = ['open_timestamp','OPEN','HIGH','LOW','CLOSE','ignore','close_timestamp','quote_asset_volume','number_of_trades','taker_buy_base_asset_volume','taker_buy_quote_asset_volume','ignore']
    df_imsi['datetime'] = df_imsi['open_timestamp'].apply(lambda x: datetime.fromtimestamp(x/1000))
    df = df.append(df_imsi)
    start_time = us_xrp_price.json()[-1][0] + 5*60*1000
    start_time
    if start_time > target_time:
        break
df_target = df.sort_values('datetime').reset_index(drop=True)
df_target = df_target[['datetime',  'OPEN','HIGH','LOW','CLOSE',
       'quote_asset_volume', 'number_of_trades',
       'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore','open_timestamp','close_timestamp', 
       ]]
#datetime 은 한국시간기준!!
df_target

 - signal 시작 및 끝 고르기

df = df_target[['datetime','OPEN','CLOSE','HIGH','LOW']]
df['OPEN'] = df['OPEN'].astype(float)
df['CLOSE'] = df['CLOSE'].astype(float)
df['HIGH'] = df['HIGH'].astype(float)
df['LOW'] = df['LOW'].astype(float)
df['signal'] = 0
for i in range(len(df)):
    if df.loc[i-9:i,'HIGH'].max() == df.loc[i,'HIGH']:
        df.loc[i,'signal'] = 1
df['end'] = 0
for i in range(len(df)):
    if df.loc[i-9:i,'LOW'].min() == df.loc[i,'LOW']:
        df.loc[i,'end'] = 1
df['MY_ASSET'] = df['OPEN'] *(1000 / df.loc[0,'OPEN'])

df.loc[:10,['signal','end']] = 0

df['signal_real'] = 0
df['dolpa'] = 0
chance_num = 1
for i in range(len(df)):
    if (df.loc[i,'signal_real'] == chance_num) & (df.loc[i,'end'] == 1):
        df.loc[i+1:,'signal_real'] = 0  
        chance_num +=1
    
    elif (df.loc[i,'signal'] == 1) & (df.loc[i,'signal_real'] == 0):
        df.loc[i:,'signal_real'] = chance_num
        df.loc[i,'dolpa'] = df.loc[i-9:i-1,'HIGH'].max()
df

- 돈키언 실행 구간 DF 구하기

chance_num_l    = []
long_price_l  = []
short_price_l = []
tiempo_l        = []
long_date_l = []
short_date_l = []
for k in range(df.signal_real.max()):
    k += 1
    df_target = df[df['signal_real'] == k].reset_index(drop=True)
    buying_price = df_target.loc[0,'dolpa_long']
    selling_price = df_target.loc[len(df_target) -2,'LOW']
    tiempo = len(df_target)
    chance_num_l   .append(k )
    long_price_l .append(buying_price )
    short_price_l.append(selling_price)
    tiempo_l     .append(tiempo     )
    long_date_l.append(df_target.loc[0,'dolpa_long_date'])
    short_date_l.append(df_target.loc[len(df_target)-1,'dolpa_short_date'])
    
df_result = pd.DataFrame()
df_result['chance_num'] = chance_num_l   
df_result['long_price'] = long_price_l 
df_result['short_price'] = short_price_l
df_result['long_date'] = long_date_l 
df_result['short_date'] = short_date_l
df_result['tiempo'] = tiempo_l       
df_result['earn'] = df_result['short_price'] - df_result['long_price'] 
df_result['earn_binary'] = df_result['earn'] .apply(lambda x: 1 if x>0 else 0)
print("승률 : ", round(df_result['earn_binary'].sum() * 100 / len(df_result),2)) 
df_result['ASSET_desde'] = 1000
df_result['ASSET_antes'] =  0
for j in range(len(df_result)):
    df_result.loc[j,'ASSET_antes'] = df_result.loc[j,'ASSET_desde'] / df_result.loc[j,'long_price'] * df_result.loc[j,'short_price'] 
    df_result.loc[j+1,'ASSET_desde'] = df_result.loc[j,'ASSET_antes']
    
df_result

- 결과 DataFrame

 

 

3. 해석

돈키언!! 재미있는걸!! 앞으도 계속 탐구해봅시다!!

 

728x90

댓글