Ulasan TAQ Cryptocurrency 2021 & Strategi Simpel yang Hilang dari Peningkatan 10 Kali

Penulis:Ninabadass, Dibuat: 2022-04-07 11:36:32, Diperbarui: 2022-04-13 09:25:23

Ulasan TAQ Cryptocurrency 2021 & Strategi Simpel yang Hilang dari Peningkatan 10 Kali

Kesimpulan dan Strategi Masa Depan 2021

2021 akan berakhir, dan titik panas dari DEFI ke GAMEFI muncul satu demi satu, dan pasar secara keseluruhan masih berada di pasar bull. Melihat ke belakang sekarang, berapa banyak yang Anda hasilkan pada tahun 2021? Peluang apa yang hilang? Apakah ada investasi yang sukses? Baru-baru ini, saya menarik kutipan pasar sejarah tahun lalu dan menemukan strategi profitering yang tidak terduga sederhana, tetapi ini adalah indeks multi-mata uang.

Ada terlalu banyak simbol mata uang yang terdaftar di platform, dan banyak yang ditakdirkan untuk tidak diketahui dan bahkan mungkin ditarik dari perdagangan. Di sini kami memilih simbol mata uang yang telah terdaftar di Binance Perpetual Swap. Mereka umumnya telah diuji dan diakui sebagai mata uang utama, yang relatif aman. Setelah skrining sederhana, beberapa mata uang indeks dihapus, dan 134 mata uang akhirnya bertahan.

Dalam [1]: permintaan impor dari tanggal/waktu tanggal impor,tanggal/waktu waktu impor mengimpor panda sebagai pd import numpy sebagai np mengimpor matplotlib.pyplot sebagai plt % matplotlib inline

Di [144]: ##pasangan perdagangan saat ini Info = permintaan.get"https://fapi.binance.com/fapi/v1/exchangeInfo’) simbol = [s[symbol] untuk s di Info.json()[symbols]]

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

Di [155]: print(len(simbol_f))

Pasar di Tahun Lalu

Kemudian, kita mendapatkan harga penutupan harian mereka di tahun lalu, dan kita perhatikan bahwa beberapa simbol mata uang hanya di pasar untuk jangka waktu yang singkat, sehingga data membutuhkan pemrosesan unitization.

Hasil indeks akhir adalah sekitar 12 kali lipat, yaitu, jika Anda membeli 134 simbol mata uang ini rata-rata pada tanggal 1 Januari 2021, keuntungan akhir dari tidak melakukan apa-apa adalah 12 kali lipat, dan diperkirakan bahwa lebih dari 90% orang tidak lebih baik dari indeks rata-rata. Di antara mereka, simbol mata uang dengan penurunan terbesar: ICP turun 93%, DODO turun 85%, dan LINA turun 75%. Peningkatan hampir seratus kali lipat: SOL, FTM, LUNA, MATIC, SAND, AXS. Di antara mereka, AXS telah meningkat 168 kali lipat dan adalah kuda hitam terbesar. Median meningkat 3 kali lipat.

Ini adalah rasio keuntungan yang putus asa. Saya telah bekerja keras dan mencoba semua jenis strategi, dan saya tidak menghasilkan keuntungan sebanyak tahun ketika saya tidak melakukan upaya tambahan. Namun, harus dicatat bahwa beberapa kenaikan rasio terlalu besar, dan jelas menyimpang dari indeks. Jika simbol mata uang ini tidak dipilih pada awal tahun, keuntungan akan dekat dengan median, yang jauh lebih kurang menonjol.

Di [157]: #fungsi untuk mendapatkan K-line dalam periode apapun def GetKlines ((simbol=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} sementara start_time < end_time: mid_time = min(start_time+1000*int(period[:-1])interval_map[periode[-1], akhir_waktu) url = https://+base+.binance.com/+base+/+v+/klines?simbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000%(simbol,periode,start_time,mid_time) res = request.get (url) res_list = res.json() if type ((res_list) == list dan len ((res_list) > 0: start_time = res_list[-1][0] Klines += res_list elif type ((res_list) == daftar: start_time = start_time+1000int(periode[:-1])*intervel_map[periode[-1]] lainnya: istirahat

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

Di [164]: df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d),columns=symbols_s) untuk i dalam rentang ((len ((simbol_f)): #print ((simbol_s] simbol_s = simbol_f[i] df_s = GetKlines ((simbol=simbol_s,start=2021-1-1,end=2021-12-28,period=1d,base=api,v=v3) df_all_s[simbol_s] = df_s[~df_s.index.duplicated(keep=first)].close

Di [165]: df_all_s.tail() #struktur data Keluar[165]:

Di [174]: df_all = df_all_s.fillna(metode=bfill) #isi data df_norm = df_all/df_all.iloc[0] #unitization df_norm.mean ((axis=1).plot ((figsize=(12,4), grid=True); #grafik keuntungan indeks akhir Keluar[174]:img

Di [175]: #peningkatan median df_norm.median ((axis=1).plot ((figsize=(12,4), grid=True); Keluar[175]:img

Di [168]: #bangkit dan jatuh menyortir print ((df_norm.iloc[-1].round ((2).sort_values().to_dict())

Di [317]: # maksimum penarikan dari harga saat ini dibandingkan dengan harga tertinggi di tahun lalu print ((((1-df_norm.iloc[-1]/df_norm.max()).round ((2).sort_values().to_dict())

Di [177]: df_all_f = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d),kolom=simbol_s) untuk i dalam rentang ((len ((simbol_f)): #print ((simbol_s] simbol_f = simbol_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

Di [208]: # tidak termasuk simbol baru df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((metode=bfill) df = df/df.iloc[0] df.mean ((axis=1).plot ((figsize=(12,4), grid=True); Keluar[208]:img

Di [212]: #dibandingkan dengan BTC (df.mean(axis=1)/df.BTCUSDT).plot ((figsize=(12,4), grid=True); Keluar[212]:img

Di [213]: # gunakan mesin backtest lama kelas Pertukaran:

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)

Di [418]: # Untuk backtest yang lebih akurat, merangkak 1-jam k-line df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1h),kolom=symbols_s) untuk i dalam rentang ((len ((simbol_f)): #print ((simbol_s] simbol_s = simbol_f[i] df_s = GetKlines ((simbol=simbol_s,start=2021-1-1,end=2021-12-28,period=1h,base=api,v=v3) df_all_s[simbol_s] = df_s[~df_s.index.duplicated(keep=first)].close

Dalam [419]: df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((metode=bfill) df = df/df.iloc[0] df.mean ((axis=1).plot ((figsize=(12,4), grid=True); Keluar[419]:img

Kinerja Strategi yang Seimbang

Backtest memilih semua simbol mata uang yang tercantum pada kontrak Binance Perpetual pada tanggal 1 Januari 2021. Periode K-line adalah 1h, dan parameternya adalah mulai membeli ketika jumlah posisi kurang dari 5% dari rata-rata dan mulai menjual ketika lebih dari 5%. Ketika backtest adalah semua simbol mata uang, keuntungan strategi akhir adalah 7,7 kali lipat. Sangat lebih buruk daripada keuntungan rata-rata 13 kali lipat. Itu juga dalam ekspektasi saya. Lagi pula, simbol mata uang yang meningkat seratus kali terlalu khusus, dan strategi seimbang akan menjualnya semua.

Jika backtest memilih untuk menghapus 10 simbol mata uang dengan kenaikan tertinggi, dan hanya memeriksa simbol mata uang yang relatif biasa, keuntungan akhir adalah 4,8 kali, jauh melebihi kinerja rata-rata 3,4 kali.

Jika hanya 3 simbol mata uang dengan kenaikan tertinggi yang diputar, keuntungan akhir adalah 373 kali, jauh melebihi kinerja rata-rata 160 kali.

Di [494]: # backtest semua simbol simbol = daftar ((df.iloc[-1].sort_values() [:].index) e = Exchange ((simbol, biaya=0,001, initial_balance=10000) res_list = [] avg_pct = 1/len (simbol) untuk baris di df[simbol].iterrows(): harga = baris[1] total = e.account[USDT][total] e.Meningkatkan harga) untuk simbol dalam simbol: pct = e.account[simbol][value]/total jika pct < 0,95*avg_pct: e.Beli (simbol,harga (simbol),avg_pct-pct)Total/harga[simbol]) jika pct > 1,05Avg_pct: e.Menjual ((simbol,harga[simbol],(pct-avg_pct) *total/harga[simbol]) res_list.append (([e.account[simbol][value] untuk simbol dalam simbol] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, kolom=simbol+[total],index = df.index)

Di [495]: e.account[USDT] Keluar[495]:

Di [496]: # backtest kinerja semua simbol (res.total/10000).plot(figsize=(12,4), grid = Benar); df[simbol].mean ((axis=1).plot ((figsize=(12,4), grid=True); Keluar[496]:img

Di [498]: #mengurangi simbol dengan peningkatan besar simbol = daftar ((df.iloc[-1].sort_values() [:-10].index) e = Exchange ((simbol, biaya=0,001, initial_balance=10000) res_list = [] avg_pct = 1/len (simbol) untuk baris di df[simbol].iterrows(): harga = baris[1] total = e.account[USDT][total] e.Meningkatkan harga) untuk simbol dalam simbol: pct = e.account[simbol][value]/total jika pct < 0,95*avg_pct: e.Beli (simbol,harga (simbol),avg_pct-pct)Total/harga[simbol]) jika pct > 1,05Avg_pct: e.Menjual ((simbol,harga[simbol],(pct-avg_pct) *total/harga[simbol]) res_list.append (([e.account[simbol][value] untuk simbol dalam simbol] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, kolom=simbol+[total],index = df.index)

Di [501]: e.account[USDT] Keluar [1]:

Dalam [499]: (res.total/10000).plot(figsize=(12,4), grid = Benar); df[simbol].mean ((axis=1).plot ((figsize=(12,4), grid=True); Keluar [499]:img

Di [503]: #hanya menguji simbol dengan peningkatan tertinggi simbol = daftar ((df.iloc[-1].sort_values()[-3:].index) e = Exchange ((simbol, biaya=0,001, initial_balance=10000) res_list = [] avg_pct = 1/len (simbol) untuk baris di df[simbol].iterrows(): harga = baris[1] total = e.account[USDT][total] e.Meningkatkan harga) untuk simbol dalam simbol: pct = e.account[simbol][value]/total jika pct < 0,95*avg_pct: e.Beli (simbol,harga (simbol),avg_pct-pct)Total/harga[simbol]) jika pct > 1,05Avg_pct: e.Menjual ((simbol,harga[simbol],(pct-avg_pct) *total/harga[simbol]) res_list.append (([e.account[simbol][value] untuk simbol dalam simbol] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, kolom=simbol+[total],index = df.index)

Di [504]: e.account[USDT] Keluar[504]:

Di [505]: (res.total/10000).plot(figsize=(12,4), grid = Benar); df[simbol].mean ((axis=1).plot ((figsize=(12,4), grid=True); Keluar[505]:img

Kesimpulan

Secara umum, 2021 adalah pasar bull besar untuk mata uang tiruan dan tahun yang sepi bagi BTC. Nilai pasar BTC telah turun dari 70% pada awal tahun menjadi 40% sekarang, yang sudah menjadi level terendah dalam sejarah. Oleh karena itu, rata-rata keuntungan membeli simbol mata uang tiruan dan menahannya pada tahun lalu jauh lebih tinggi daripada memegang BTC. Menantikan 2022, jika Anda berpikir bahwa masih ada beberapa ratus kali mata uang yang lahir di pasar saat ini di masa depan, Anda dapat dengan berani mendiversifikasi simbol mata uang yang Anda pegang dan menunggu dengan sabar. Jika Anda sangat optimis tentang beberapa simbol mata uang atau pasar rata-rata, Anda dapat menggunakan strategi rotasi untuk mendapatkan keuntungan berlebih tanpa berpikir. Jika Anda setuju bahwa hal-hal akan berkembang ke arah yang berlawanan ketika mereka menjadi ekstrem, Anda dapat memancing dasar BTC untuk keuntungan dan keamanan yang lebih baik.


Lebih banyak