2021 Cryptocurrency TAQ Review & Chiến lược bỏ lỡ đơn giản nhất tăng 10 lần

Tác giả:Ninabadass, Tạo: 2022-04-07 11:36:32, Cập nhật: 2022-04-13 09:25:23

2021 Cryptocurrency TAQ Review & Chiến lược bỏ lỡ đơn giản nhất tăng 10 lần

Kết luận năm 2021 và Chiến lược tương lai.ipynb

Năm 2021 sắp kết thúc, và các điểm nóng từ DEFI đến GAMEFI đang xuất hiện một sau một, và thị trường nói chung vẫn đang ở trong thị trường tăng trưởng. Nhìn lại bây giờ, bạn đã kiếm được bao nhiêu trong năm 2021? Cơ hội nào đã bỏ lỡ? Có bất kỳ khoản đầu tư thành công nào không? Gần đây, tôi đã rút các báo giá thị trường lịch sử của năm ngoái và tìm thấy một chiến lược kiếm lợi đơn giản bất ngờ, nhưng đó là chỉ số đa tiền tệ.

Có quá nhiều biểu tượng tiền tệ được liệt kê trên các nền tảng, và nhiều người bị định mệnh là không được biết đến và thậm chí có thể bị rút khỏi giao dịch. Ở đây chúng tôi chọn các biểu tượng tiền tệ đã được liệt kê trên Binance Perpetual Swap. Chúng đã được kiểm tra và được công nhận là các loại tiền tệ chính thống, tương đối an toàn. Sau một lần sàng lọc đơn giản, một số loại tiền tệ chỉ số đã được loại bỏ và 134 loại tiền tệ cuối cùng đã tồn tại.

Trong [1]: Yêu cầu nhập khẩu Từ ngày/thời điểm ngày nhập khẩu,thời điểm nhập khẩu Thời gian nhập khẩu nhập panda như pd nhập khẩu numpy như np nhập matplotlib.pyplot như plt % matplotlib inline

Trong [144]: ##cặp giao dịch hiện tại Thông tin = yêu cầu.đưa ra"https://fapi.binance.com/fapi/v1/exchangeInfo’) ký hiệu = [s[symbol] cho s trong Info.json() [symbols]]

Trong [154]: symbols_f = list(set(filter(lambda x: x[-4:] == USDT, [s.split(_) [0] cho s trong các ký hiệu]))- set (([1000SHIBUSDT,1000XECUSDT,BTCDOMUSDT,DEFIUSDT,BTCSTUSDT])) + [SHIBUSDT,XECUSDT] print ((symbols_f)

Trong [155]: print ((len ((symbols_f))

Thị trường trong năm qua

Sau đó, chúng ta có được giá đóng cửa hàng ngày của họ trong năm qua, và chúng ta nhận thấy rằng một số biểu tượng tiền tệ chỉ có trên thị trường trong một khoảng thời gian ngắn, vì vậy dữ liệu cần xử lý đơn vị.

Lợi nhuận chỉ số cuối cùng là khoảng 12 lần, nghĩa là nếu bạn mua trung bình 134 biểu tượng tiền tệ này vào ngày 1 tháng 1 năm 2021, lợi nhuận cuối cùng của việc không làm gì là 12 lần, và ước tính rằng hơn 90% người không vượt qua chỉ số trung bình. Trong số đó, các biểu tượng tiền tệ giảm mạnh nhất: ICP giảm 93%, DODO giảm 85% và LINA giảm 75%. Sự gia tăng gần một trăm lần: SOL, FTM, LUNA, MATIC, SAND, AXS. Trong số đó, AXS đã tăng 168 lần và là con ngựa đen lớn nhất. Mức trung bình tăng 3 lần. Có thể nói rằng chỉ số chủ yếu được thúc đẩy bởi các chuỗi và trò chơi công cộng. Để ngăn chặn sự thiên vị sinh tồn, ngoại trừ các biểu tượng tiền tệ mới được liệt kê trong giai đoạn này, nó cũng đạt được lợi nhuận gần 11 lần. Nó đơn giản là giữ BTC 7 lần.

Đây là tỷ lệ lợi nhuận tuyệt vọng. Tôi đã làm việc chăm chỉ và thử tất cả các loại chiến lược, và tôi đã không kiếm được nhiều lợi nhuận như một năm khi tôi không nỗ lực thêm. Tuy nhiên, cần lưu ý rằng một số tỷ lệ tăng quá lớn và rõ ràng lệch khỏi chỉ số. Nếu các biểu tượng tiền tệ này không được chọn vào đầu năm, lợi nhuận sẽ gần trung bình, ít nổi bật hơn nhiều.

Trong [157]: # chức năng để có được đường K trong bất kỳ giai đoạn nào def GetKlines ((symbol=BTCUSDT,start=2020-8-10,end=2021-8-10,period=1h,base=fapi,v = v1): Klines = [] start_time = int(time.mktime(datetime.strptime(start, %Y-%m-%d).timetuple()))1000 + 860601000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).timetuple()))1000 + 860601000 intervel_map = {m:601000,h:60601000,d:2460601000 while start_time < end_time: trong khi start_time < end_time: mid_time = min(start_time+1000*int(period[:-1])intervel_map[thời gian[-1], thời gian kết thúc] 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 = requests.get ((url)) res_list = res.json() if type ((res_list) == list và len ((res_list) > 0: start_time = res_list[-1][0] Klines += res_list elif type ((res_list) == danh sách: start_time = start_time+1000int(thời gian[:-1])*intervel_map[thời gian[-1]] khác: ngưng

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

Trong [164]: df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d),columns=symbols_s) cho i trong phạm vi ((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

Trong [165]: df_all_s.tail() # cấu trúc dữ liệu Ra khỏi [1]:

Trong [174]: df_all = df_all_s.fillna ((method=bfill) #fill data df_norm = df_all/df_all.iloc[0] #unitization df_norm.mean ((axis=1).plot ((figsize=(12,4),grid=True); # biểu đồ lợi nhuận chỉ số cuối cùng Ra khỏi [1]:img

Trong [175]: #tăng trung bình df_norm.median ((axis=1).plot ((figsize=(12,4),grid=True); Ra khỏi [1]:img

Trong [168]: #hãy lên và giảm sắp xếp print ((df_norm.iloc[-1].round ((2).sort_values().to_dict())

Trong [317]: #tỷ lệ rút tiền tối đa của giá hiện tại so với giá cao nhất trong năm qua print ((((1-df_norm.iloc[-1]/df_norm.max()).round(2).sort_values().to_dict())

Trong [177]: df_all_f = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d),columns=symbols_s) cho i trong phạm vi ((len ((symbols_f)): #print ((symbols_s[i]) symbol_f = symbols_f[i] df_f = GetKlines ((symbol=symbol_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

Trong [208]: # không bao gồm các biểu tượng mới df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((phương pháp=bfill) df = df/df.iloc[0] df.mean ((axis=1).plot ((figsize=(12,4),grid=True); Ra khỏi[208]:img

Trong [212]: #so với BTC (df.mean(axis=1)/df.BTCUSDT).plot(figsize=(12,4),grid=True); Ra khỏi [1]:img

Trong [213]: # sử dụng công cụ backtest cũ lớp trao đổi:

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)

Trong [418]: # cho backtest chính xác hơn, thu thập dữ liệu 1-hour k-line df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1h),columns=symbols_s) cho i trong phạm vi ((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

Trong [419]: df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((phương pháp=bfill) df = df/df.iloc[0] df.mean ((axis=1).plot ((figsize=(12,4),grid=True); Ra khỏi[419]:img

Hiệu suất chiến lược cân bằng

Khi kiểm tra lại tất cả các biểu tượng tiền tệ, lợi nhuận chiến lược cuối cùng là 7,7 lần. Tệ hơn đáng kể so với lợi nhuận trung bình 13 lần. Đó cũng là mong đợi của tôi. Sau tất cả, những biểu tượng tiền tệ tăng một trăm lần quá đặc biệt, và chiến lược cân bằng sẽ bán tất cả chúng.

Nếu backtest chọn loại bỏ 10 biểu tượng tiền tệ tăng cao nhất, và chỉ kiểm tra các biểu tượng tiền tệ tương đối tầm thường, lợi nhuận cuối cùng là 4,8 lần, vượt xa hiệu suất trung bình 3,4 lần.

Nếu chỉ có 3 biểu tượng tiền tệ tăng cao nhất được xoay, lợi nhuận cuối cùng là 373 lần, vượt xa hiệu suất trung bình 160 lần.

Trong [494]: #Backtest của tất cả các biểu tượng ký hiệu = list(df.iloc[-1].sort_values()[:].index) e = Giao dịch (định hiệu, phí = 0,001, số dư ban đầu = 10000) res_list = [] avg_pct = 1/len (bản tượng) cho hàng trong df[thượng hiệu].iterrows(): giá = hàng [1] tổng số = e.account[USDT][total] e. Cập nhật giá đối với biểu tượng trong biểu tượng: pct = e.account[symbol][value]/total nếu pct < 0,95*avg_pct: e.Buy (symbol,prices (symbol),avg_pct-pct)Tổng số/giá [biểu tượng]) nếu pct > 1,05avg_pct: e.Bán (symbol,prices[symbol],(pct-avg_pct) *total/prices[symbol]) res_list.append (([e.account[symbol][value] cho biểu tượng trong biểu tượng] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total],index = df.index)

Trong [495]: e.account[USDT] Ra khỏi[495]:

Trong [496]: #backtest hiệu suất của tất cả các biểu tượng (res.total/10000).plot(figsize=(12,4), lưới = True); df[symbols].mean ((axis=1).plot ((figsize=(12,4),grid=True); Ra khỏi[496]:img

Trong [498]: # giảm các biểu tượng với sự gia tăng lớn ký hiệu = list ((df.iloc[-1].sort_values()[:-10].index) e = Giao dịch (định hiệu, phí = 0,001, số dư ban đầu = 10000) res_list = [] avg_pct = 1/len (bản tượng) cho hàng trong df[thượng hiệu].iterrows(): giá = hàng [1] tổng số = e.account[USDT][total] e. Cập nhật giá đối với biểu tượng trong biểu tượng: pct = e.account[symbol][value]/total nếu pct < 0,95*avg_pct: e.Buy (symbol,prices (symbol),avg_pct-pct)Tổng số/giá [biểu tượng]) nếu pct > 1,05avg_pct: e.Bán (symbol,prices[symbol],(pct-avg_pct) *total/prices[symbol]) res_list.append (([e.account[symbol][value] cho biểu tượng trong biểu tượng] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total],index = df.index)

Trong [501]: e.account[USDT] Ra khỏi[501]:

Trong [499]: (res.total/10000).plot(figsize=(12,4), lưới = True); df[symbols].mean ((axis=1).plot ((figsize=(12,4),grid=True); Ra khỏi [499]:img

Trong [503]: # Chỉ kiểm tra các biểu tượng với sự gia tăng cao nhất các ký hiệu = list(df.iloc[-1].sort_values()[-3:].index) e = Giao dịch (định hiệu, phí = 0,001, số dư ban đầu = 10000) res_list = [] avg_pct = 1/len (bản tượng) cho hàng trong df[thượng hiệu].iterrows(): giá = hàng [1] tổng số = e.account[USDT][total] e. Cập nhật giá đối với biểu tượng trong biểu tượng: pct = e.account[symbol][value]/total nếu pct < 0,95*avg_pct: e.Buy (symbol,prices (symbol),avg_pct-pct)Tổng số/giá [biểu tượng]) nếu pct > 1,05avg_pct: e.Bán (symbol,prices[symbol],(pct-avg_pct) *total/prices[symbol]) res_list.append (([e.account[symbol][value] cho biểu tượng trong biểu tượng] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total],index = df.index)

Trong [504]: e.account[USDT] Ra khỏi[504]:

Trong [505]: (res.total/10000).plot(figsize=(12,4), lưới = True); df[symbols].mean ((axis=1).plot ((figsize=(12,4),grid=True); Ngoài[505]:img

Kết luận

Nói chung, năm 2021 là một thị trường tăng lớn đối với đồng tiền sao chép và một năm hoang vu cho BTC. Giá trị thị trường của BTC đã giảm từ 70% vào đầu năm xuống còn 40% hiện nay, đây đã là mức thấp nhất trong lịch sử. Do đó, lợi nhuận trung bình của việc mua các biểu tượng tiền tệ sao chép và giữ chúng trong năm qua cao hơn nhiều so với việc giữ BTC. Nhìn về phía trước vào năm 2022, nếu bạn nghĩ rằng vẫn còn vài trăm lần các loại tiền tệ được sinh ra trong thị trường hiện tại trong tương lai, bạn có thể can đảm đa dạng hóa các biểu tượng tiền tệ bạn đang nắm giữ và kiên nhẫn chờ đợi. Nếu bạn đặc biệt lạc quan về một vài biểu tượng tiền tệ hoặc thị trường trung bình, bạn có thể sử dụng chiến lược xoay để có được lợi nhuận dư thừa mà không cần suy nghĩ. Nếu bạn đồng ý rằng mọi thứ sẽ phát triển theo hướng ngược lại khi chúng trở nên cực đoan, bạn có thể đánh đáy BTC để có lợi nhuận và an ninh tốt hơn.


Thêm nữa