2021 암호화폐 TAQ 검토 & 10배 증가의 가장 간단한 놓친 전략

저자:니나바다스, 창작: 2022-04-07 11:36:32, 업데이트: 2022-04-13 09:25:23

2021 암호화폐 TAQ 검토 & 10배 증가의 가장 간단한 놓친 전략

2021년 결론과 미래 전략.ipynb

2021년은 끝나고 있고, DEFI에서 GAMEFI에 이르기까지 핫스팟이 하나씩 등장하고 있으며, 전체 시장은 여전히 황소 시장입니다. 지금 되돌아보면 2021년에 얼마나 많은 돈을 벌었습니까? 어떤 기회를 놓쳤습니까? 성공적인 투자가 있습니까? 최근, 나는 지난 해의 역사 시장 코트를 끌어내어 예상치 못한 간단한 수익 전략을 발견했습니다. 하지만 그것은 다화폐 지수입니다.

플랫폼에 나열된 통화 기호는 너무 많으며, 많은 것이 알려지지 않을 운명이며 거래에서 철수 할 수도 있습니다. 여기서 우리는 바이낸스 페퍼추얼 스에 나열 된 통화 기호를 선택합니다. 그들은 일반적으로 테스트되었으며 상대적으로 안전한 주류 통화로 인정됩니다. 간단한 스크린 후에 일부 인덱스 통화가 제거되었으며 134 개의 통화가 마침내 살아남았습니다.

[1]: 수입 요청 출입일, 출입일, 출입일 수입 시간 다를 PD로 가져오세요 numpy를 np로 가져오세요 matplotlib.pyplot를 plt로 가져와 % matplotlib 인라인

[144]에서: ##현재 거래 쌍 정보 = 요청.받음"https://fapi.binance.com/fapi/v1/exchangeInfo’) symbols = [s[symbol] for s in Info.json() [symbols]]

[154]: symbols_f = list(set(filter(lambda x: x[-4:] == USDT, [s.split(_) [0] set (([1000SHIBUSDT,1000XECUSDT,BTCDOMUSDT,DEFIUSDT,BTCSTUSDT])) + [SHIBUSDT,XECUSDT] print ((symbols_f)

[155]에서: print(len(symbols_f))

지난 해 시장

그 다음, 우리는 지난 1년간의 일일 폐쇄 가격을 얻습니다. 그리고 우리는 일부 통화 기호가 짧은 기간 동안만 시장에 존재했다는 것을 알아차립니다. 그래서 데이터는 유니티제이션 처리가 필요합니다. 데이터를 유니티제이션함으로써 지수를 계산할 수 있습니다.

최종 지표 수익은 약 12배, 즉 2021년 1월 1일 평균적으로 이 134개의 통화 기호를 구매하면 아무것도 하지 않는 최종 수익은 12배이며, 90% 이상의 사람들이 평균 지표를 능가하지 않는다고 추정된다. 그 중 가장 큰 하락을 보이는 통화 기호는: ICP가 93%, DODO가 85%, LINA가 75% 감소했다. 거의 100배의 증가: SOL, FTM, LUNA, MATIC, SAND, AXS. 그 중 AXS가 168배 증가하여 가장 큰 암흑마이다. 중간값은 3배 증가했다. 지표가 주로 공공 체인 및 게임으로 인해 움직인다고 말할 수 있다. 생존 편견을 방지하기 위해, 해당 기간 동안 새로 상장된 통화 기호를 제외하면 11배에 가까운 수익을 달성했다. 그것은 단순히 BTC의 7배에 가까운 이익이다.

이것은 절실한 이익 비율입니다. 나는 열심히 일했고 모든 종류의 전략을 시도했고, 추가 노력을 기울이지 않은 한 해만큼 많은 이익을 얻지 못했습니다. 그러나, 비율의 몇 가지 증가가 너무 커지고 지표에서 분명히 벗어나 있음을 유의해야합니다. 이 통화 기호가 년 초에 선택되지 않으면 이익은 미디안에 가깝게 될 것입니다. 이는 훨씬 덜 눈에 띄습니다.

[157]에서: #함수는 어떤 기간에서도 K선을 얻을 수 있습니다 def GetKlines ((symbol=BTCUSDT,start=2020-8-10,end=2021-8-10,period=1h,base=fapi,v = v1): 스 = [] start_time = int(time.mktime(datetime.strptime(start, %Y-%m-%d).시간중수()))1000 + 860601000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).시간중수()))1000 + 860601000 intervel_map = {m:601000,h:60601000,d:2460601000 while start_time < end_time: 시작 시간 < 종료 시간 mid_time = min(start_time+1000*int(period[:-1])intervel_map[period[-1],end_time) url = https://+base+.binance.com/+base+/+v+/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000%(symbol,period,start_time,mid_time) res = request.get (URL) res_list = res.json() if type ((res_list) == list 그리고 len ((res_list) > 0: start_time = res_list[-1][0] Klines += res_list elif type ((res_list) == 목록: 시작_시간 = 시작_시간+1000int(period[:-1]) *intervel_map[period[-1]] 다른 것: 휴식

df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')
df.index = pd.to_datetime(df.time,unit='ms')
profit df

[164]에서: df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d), columns=symbols_s) i의 범위에서 ((len ((symbols_f)): #print ((symbols_s[i]) symbol_s = symbols_f[i] df_s = GetKlines ((symbol=symbol_s,start=2021-1-1,end=2021-12-28,period=1d,base=api,v=v3) df_all_s[symbol_s] = df_s[~df_s.index.duplicated(keep=first) ]close

[165]에서: df_all_s.tail (() # 데이터 구조 외출 [1]:

[174]에서: df_all = df_all_s.fillna ((method=bfill) # 채용 데이터 df_norm = df_all/df_all.iloc[0] #unitization df_norm.mean ((축=1).plot ((figsize=(12,4),grid=True); # 최종 인덱스 이익 차트 외출 [1]:img

[175]에서: #중간 증가 df_norm.median ((축=1).plot ((figsize=(12,4),grid=True); 외출 [1]:img

[168]에서: #올림과 낙하 분류 print ((df_norm.iloc[-1].round ((2).sort_values().to_dict())

[317]에서: #최대 인출 현재 가격과 비교해 지난 해 최고 가격 print ((((1-df_norm.iloc[-1]/df_norm.max()) 라운드 (((2).sort_values (().to_dict (())

[177]에서: df_all_f = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d), columns=symbols_s) i의 범위에서 ((len ((symbols_f)): #print ((symbols_s[i]) symbol_f = symbols_f[i] df_f = GetKlines ((기호=기호_f,start=2021-1-1,end=2021-12-28,period=1d,base=fapi,v=v1) df_all_f[symbol_f] = df_f[~df_f.index.duplicated(keep=first) ]close

[208]에서: 새로운 기호는 포함되지 않습니다 df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((방법=bfill) df = df/df.iloc[0] df.mean ((축=1).plot ((figsize=(12,4),grid=True); 외출 [1]:img

[212]에서: #BTC에 비해 (df.mean(axis=1)/df.BTCUSDT).plot ((figsize=(12,4),grid=True); 외출 [1]:img

[213]에서: # 오래된 백테스트 엔진을 사용하세요 클래스 교환:

def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
    self.initial_balance = initial_balance #initial asset  
    self.fee = fee
    self.trade_symbols = trade_symbols
    self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0}}
    for symbol in trade_symbols:
        self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0}
        
def Trade(self, symbol, direction, price, amount):
    
    cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
    open_amount = amount - cover_amount
    self.account['USDT']['realised_profit'] -= price*amount*self.fee #deduct service fee
    self.account['USDT']['fee'] += price*amount*self.fee
    self.account[symbol]['fee'] += price*amount*self.fee

    if cover_amount > 0: #close first 
        self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #profit
        self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
        
        self.account[symbol]['amount'] -= -direction*cover_amount
        self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
        
    if open_amount > 0:
        total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
        total_amount = direction*self.account[symbol]['amount']+open_amount
        
        self.account[symbol]['hold_price'] = total_cost/total_amount
        self.account[symbol]['amount'] += direction*open_amount
                

def Buy(self, symbol, price, amount):
    self.Trade(symbol, 1, price, amount)
    
def Sell(self, symbol, price, amount):
    self.Trade(symbol, -1, price, amount)
    
def Update(self, close_price): #update asset
    self.account['USDT']['unrealised_profit'] = 0
    for symbol in self.trade_symbols:
        self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
        self.account[symbol]['price'] = close_price[symbol]
        self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol]
        self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit']
    self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)

[418]에서: #더 정확한 백테스트를 위해, 1시간의 K-라인 크롤 df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1h), columns=symbols_s) i의 범위에서 ((len ((symbols_f)): #print ((symbols_s[i]) symbol_s = symbols_f[i] df_s = GetKlines ((symbol=symbol_s,start=2021-1-1,end=2021-12-28,period=1h,base=api,v=v3) df_all_s[symbol_s] = df_s[~df_s.index.duplicated(keep=first) ]close

[419]에서: df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((방법=bfill) df = df/df.iloc[0] df.mean ((축=1).plot ((figsize=(12,4),grid=True); 아웃[419]:img

균형 잡힌 전략 성과

백테스트는 2021년 1월 1일에 바이낸스 페퍼추얼 계약에 나열된 모든 통화 기호를 선택했습니다. K-라인 기간은 1h이며, 매개 변수는 포지션 금액이 평균의 5% 미만일 때 구매를 시작하고 5% 이상일 때 판매를 시작한다는 것입니다. 백테스트가 모든 통화 기호를 대상으로 할 때 최종 전략 이익은 7.7배입니다. 평균 이익 13배보다 상당히 나빠집니다. 또한 그것은 제 기대입니다. 결국, 백 배 증가한 통화 기호는 너무 특별하며 균형 잡힌 전략은 모든 것을 판매 할 것입니다.

만약 백테스트가 가장 높은 증가를 가진 10개의 통화 기호를 제거하고 상대적으로 평균적인 통화 기호만을 조사하기로 결정한다면 최종 이익은 평균 3.4배를 훨씬 뛰어넘는 4.8배입니다.

가장 높은 증가율을 가진 3개의 통화 기호만 회전하면 최종 이익은 373배이며, 평균 160배의 성능을 훨씬 초과합니다. 선택된 회전된 통화 기호의 추세와 증가율이 일관성있는 경향이있는 경우 회전 결과는 회전하지 않은 것보다 훨씬 낫다는 것을 보여줍니다.

[494]에서: # 모든 기호의 뒷검사 기호 = list ((df.iloc[-1].sort_values (() [:].index) e = 교환 (기호, 수수료=0.001, 초기_금액=10000) res_list = [] avg_pct = 1/len (기호) df[기호].iterrows의 행에 대해: 가격 = 행 [1] 전체 = e계산[USDT][] e.평가를 업데이트합니다. 기호 속의 기호의 경우: pct = e.account[symbol][value]/총 만약 pct < 0.95*avg_pct: e.Buy (구매) 기호,Price (가격) 기호,avg_pct-pct총/가격[표자]) pct > 1.05 이면avg_pct: e.판매 (표상, 가격 (표상), 평균 (표상) *총/가격 (표상) res_list.append (([e.account[symbol][value] for symbol in symbols] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total],index = df.index)

[495]에서: e.계산[USDT] 아웃[495]:

[496]에서: 모든 기호의 #backtest 성능 (res.total/10000).plot ((figsize=(12,4), 그리드 = True) df[기호].mean ((축=1).plot ((figsize=(12,4),grid=True); 외출[496]:img

[498]에서: 큰 증가로 기호를 줄여 기호 = list ((df.iloc[-1].sort_values (() [:-10].index) e = 교환 (기호, 수수료=0.001, 초기_금액=10000) res_list = [] avg_pct = 1/len (기호) df[기호].iterrows의 행에 대해: 가격 = 행 [1] 전체 = e.account[USDT][total] e.평가를 업데이트합니다. 기호 속의 기호의 경우: pct = e.account[symbol][value]/total 만약 pct < 0.95*avg_pct: e.Buy (구매) 기호,가격[기호]총/가격[표자]) pct > 1.05 이면avg_pct: e.판매 (표상, 가격 (표상), 평균 (표상) *총/가격 (표상) res_list.append (([e.account[symbol][value] for symbol in symbols] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total],index = df.index)

[501]에서: e.계산[USDT] 외출 [1]:

[499]에서: (res.total/10000).plot ((figsize=(12,4), 그리드 = True) df[기호].mean ((축=1).plot ((figsize=(12,4),grid=True); 외면 [499]:img

[503]에서: 가장 높은 증가를 가진 기호만 테스트하세요 기호 = list(df.iloc[-1].sort_values()[-3:].index) e = 교환 (기호, 수수료=0.001, 초기_금액=10000) res_list = [] avg_pct = 1/len (기호) df[기호].iterrows의 행에 대해: 가격 = 행 [1] 전체 = e계산[USDT][] e.평가를 업데이트합니다. 기호 속의 기호의 경우: pct = e.account[symbol][value]/총 만약 pct < 0.95*avg_pct: e.Buy (구매) 기호,Price (가격) 기호,avg_pct-pct총/가격[표자]) pct > 1.05 이면avg_pct: e.판매 (표상, 가격 (표상), 평균 (표상) *총/가격 (표상) res_list.append (([e.account[symbol][value] for symbol in symbols] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total],index = df.index)

[504]에서: e.계산[USDT] 외출 [1]:

[505]에서: (res.total/10000).plot ((figsize=(12,4), 그리드 = True) df[기호].mean ((축=1).plot ((figsize=(12,4),grid=True); 외출[505]:img

결론

일반적으로 2021년은 복제 화폐에 대한 큰 황소 시장이자 BTC에 대한 황폐한 해였다. BTC의 시장 가치는 올해 초의 70%에서 현재 40%로 하락했으며, 이는 이미 역사상 가장 낮은 수준이다. 따라서 지난 해에 복제 화폐 기호를 구입하고 보유한 평균 이익은 BTC를 보유한 것보다 훨씬 높았다. 2022년을 앞두고 현재 시장에서 아직 수백 배의 화폐가 탄생할 것이라고 생각한다면, 당신이 보유한 화폐 기호를 대담하게 다양화하고 인내심을 가지고 기다릴 수 있다. 당신이 몇 개의 화폐 기호 또는 평균 시장에 대해 특히 낙관적이라면, 당신은 생각없이 과도한 이익을 얻기 위해 회전 전략을 사용할 수 있다. 상황이 극단적으로 변할 때 BTC가 반대 방향으로 발전할 것이라고 동의하면, 당신은 더 나은 이익과 안전을 위해 바닥을 낚을 수 있다.


더 많은