2021 Kryptowährungs-TAQ-Überprüfung & Einfachste verpasste Strategie der 10-fachen Erhöhung

Schriftsteller:- Ich bin ein Idiot., Erstellt: 2022-04-07 11:36:32, Aktualisiert: 2022-04-13 09:25:23

2021 Kryptowährungs-TAQ-Überprüfung & Einfachste verpasste Strategie der 10-fachen Erhöhung

Schlussfolgerung 2021 und künftige Strategie.ipynb

2021 geht zu Ende, und Hotspots von DEFI bis GAMEFI entstehen nacheinander, und der Gesamtmarkt befindet sich immer noch in einem Bullenmarkt. Rückblickend, wie viel haben Sie 2021 verdient? Welche Gelegenheit haben Sie verpasst? Gibt es erfolgreiche Investitionen? Vor kurzem zog ich die historischen Marktkurse des vergangenen Jahres und fand eine unerwartet einfache Profit-Strategie, aber es ist ein Multi-Währungsindex.

Es gibt zu viele Währungssymbole, die auf Plattformen gelistet sind, und viele sind dazu bestimmt, unbekannt zu sein und können sogar aus dem Handel genommen werden. Hier wählen wir die Währungssymbole aus, die auf Binance Perpetual Swap gelistet wurden. Sie wurden im Allgemeinen getestet und als Mainstream-Währungen anerkannt, die relativ sicher sind. Nach einem einfachen Screening wurden einige Indexwährungen entfernt und 134 Währungen überlebten schließlich.

In [1]: Einfuhranträge ab Datum/Zeit Datum der Einfuhr,Datum/Zeit Einfuhrzeit Import von Pandas als PD Import von Numpy als np Import von matplotlib.pyplot als plt % Matplotlib inline

In [144]: ##aktuelles Handelspaar Info = Anfragen.get"https://fapi.binance.com/fapi/v1/exchangeInfo’) Symbole = [s[symbol] für s in Info.json() [symbols]]

In [154]: symbols_f = list(set(filter(lambda x: x[-4:] == USDT, [s.split(_) [0] für s in Symbolen]))- Die in Anhang I der Verordnung (EU) Nr. 1071/2013 aufgeführten Daten werden von den zuständigen Behörden des Mitgliedstaats, in dem der Antragsteller ansässig ist, übermittelt. Ausdruck (symbols)

In [155]: Print ((Len))

Markt im vergangenen Jahr

Dann erhalten wir ihre täglichen Schlusskurse im vergangenen Jahr, und wir bemerken, dass einige Währungssymbole nur für eine kurze Zeit auf dem Markt waren, so dass die Daten eine Einheitlichkeitsverarbeitung benötigen.

Der endgültige Indexgewinn beträgt etwa das 12-fache, das heißt, wenn Sie diese 134 Währungssymbole im Durchschnitt am 1. Januar 2021 kaufen, beträgt der endgültige Gewinn, wenn Sie nichts tun, das 12-fache, und es wird geschätzt, dass mehr als 90% der Menschen den Durchschnittsindex nicht übertreffen. Unter ihnen waren die Währungssymbole mit dem größten Rückgang: ICP fiel um 93%, DODO fiel um 85% und LINA fiel um 75%. Der Anstieg von fast hundertmal: SOL, FTM, LUNA, MATIC, SAND, AXS. Unter ihnen ist AXS um das 168-fache gestiegen und ist das größte dunkle Pferd. Der Median stieg um das 3-fache. Man kann sagen, dass der Index hauptsächlich von den öffentlichen Ketten und Spielen getrieben wird. Um Überlebensverzerrungen zu vermeiden, ohne die neu gelisteten Währungssymbole zu berücksichtigen, erzielte er im Laufe des Zeitraums auch einen Gewinn von fast 11-fachen. Es ist einfach das 7-fache

Dies ist eine verzweifelte Gewinnquote. Ich habe hart gearbeitet und alle möglichen Strategien ausprobiert, und ich habe nicht so viel Gewinn gemacht wie ein Jahr, in dem ich keine zusätzlichen Anstrengungen unternommen habe. Allerdings sollte beachtet werden, dass mehrere der Verhältnissteigerungen zu groß sind und offensichtlich vom Index abweichen. Wenn diese Währungssymbole nicht zu Beginn des Jahres ausgewählt werden, wird der Gewinn nahe dem Median liegen, der viel weniger prominent ist.

In [157]: # Funktion, um die K-Linie in jeder Periode zu erhalten def GetKlines ((Symbol=BTCUSDT,start=2020-8-10,end=2021-8-10,Periode=1h,Basis=fapi,v = v1): Kline = [] Start_zeit = int(zeit.mktime(datetime.strptime(start, %Y-%m-%d).Mehrfachzeit()))1000 + 860601 000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).Mehrfachzeit)))1000 + 860601 000 Interval_map = {m:601000,h:60601000,d:2460601 000 während Start_zeit < End_zeit: Mittelzeit = min(Startzeit+1000*Int(Periode[:-1])Interval_map[Zeitraum[-1], Endzeit] 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() wenn type ((res_list) == list und len ((res_list) > 0: Startzeit = Res_list[-1][0] Klines += Res_list E-Mail-Adresse: http://www.e-mail.eu/ Startzeit = Startzeit+1000In diesem Fall wird die Anzahl der Daten in der Datenbank angepasst, die für die Datenbank verwendet werden. andere: Unterbrechung

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

In [164]: df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d),spalten=symbols_s) für i im Bereich ((len ((Symbols_f)): #print ((Symbols_s[i]) Symbol_s = Symbole_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

In [165]: df_all_s.tail() #Datenstruktur Ausgeschaltet[1]:

In [174]: df_all = df_all_s.fillna(methode=bfill) #Daten ausfüllen df_norm = df_all/df_all.iloc[0] #Unitization df_norm.mean ((Achse=1).plot ((figsize=(12,4),Gitter=True); #Grafik des endgültigen Indexgewinns Ausgeschaltet[1]:img

In [175]: #mediane Zunahme df_norm.median ((Achse=1).Plot ((Figgröße=(12,4),Gitter=True); Ausgeschaltet[1]:img

In [168]: #Aufstieg und Abstieg sortieren print ((df_norm.iloc[-1].round ((2).sort_values (().to_dict())

In [317]: #maximaler Rückzug des aktuellen Preises im Vergleich zum höchsten Preis des letzten Jahres print ((((1-df_norm.iloc[-1]/df_norm.max()).rund(2).sort_values().to_dict())

In [177]: df_all_f = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d),spalten=symbols_s) für i im Bereich ((len ((Symbols_f)): #print ((Symbols_s[i]) Symbol_f = Symbole_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

In [208]: # keine neuen Symbole enthalten df = df_all_s[df_all_s.Spalten[~df_all_f.iloc[0].isnull() ] df = df.fillna ((Methode=bfill) df = df/df.iloc[0] df.mean ((Achse=1).plot ((figsize=(12,4),Gitter=True); Ausgeschaltet[1]:img

In [212]: #verglichen mit BTC (df.mean(Achse=1)/df.BTCUSDT).Graph ((figsize=(12,4),Gitter=True); Ausgeschaltet[1]:img

In [213]: # Verwenden Sie die alte Backtest-Engine Klasse Austausch:

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)

In [418]: #für einen genaueren Backtest, crawlen Sie die 1-Stunden-K-Linie df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1h),spalten=symbols_s) für i im Bereich ((len ((Symbols_f)): #print ((Symbols_s[i]) Symbol_s = Symbole_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

In [419]: df = df_all_s[df_all_s.Spalten[~df_all_f.iloc[0].ist null()]] df = df.fillna ((Methode=bfill) df = df/df.iloc[0] df.mean ((Achse=1).plot ((figsize=(12,4), Gitter=True); Aus [419]:img

Ausgeglichene Strategieleistung

Der Backtest wählte alle auf den Binance Perpetual-Kontrakten aufgeführten Währungssymbole am 1. Januar 2021 aus. Die K-Linienperiode beträgt 1h, und der Parameter ist, dass man mit dem Kauf beginnt, wenn die Positionssumme weniger als 5% des Durchschnitts beträgt, und mit dem Verkauf beginnt, wenn sie über 5% liegt. Wenn der Backtest mit allen Währungssymbolen durchgeführt wird, beträgt der endgültige Strategiegewinn 7,7 Mal. Wesentlich schlechter als der durchschnittliche Gewinn von 13 Mal. Das liegt auch in meiner Erwartung. Schließlich sind diese Währungssymbole, die um einhundertmal gestiegen sind, zu speziell, und die ausgewogene Strategie wird sie alle verkaufen.

Wenn der Backtest die 10 Währungssymbole mit dem höchsten Anstieg entfernt und nur die relativ mittelmäßigen Währungssymbole untersucht, beträgt der endgültige Gewinn 4,8 Mal, was die durchschnittliche Leistung von 3,4 Mal weit übersteigt.

Wenn nur die 3 Währungssymbole mit dem höchsten Anstieg gedreht werden, beträgt der endgültige Gewinn 373-mal, was die durchschnittliche Leistung von 160-mal weit übersteigt.

In [494]: #Backtest aller Symbole Symbole = list ((df.iloc[-1].sort_values() [:].index) e = Wechselkurs (Symbole, Gebühr = 0,001, initial_balance = 10000) Res_list = [] Ausnahme für die Ausrüstung für die Verarbeitung von Daten für die Zeile in df[Symbole].iterrows(): Preise = Zeile [1] Gesamt = e.Konto[USDT][Gesamt] e.Aktualisierung der Preise für Symbole in Symbolen: pct = e.Konto[Symbol][Wert]/Gesamt wenn pct < 0,95*avg_pct: e.Kaufen (Symbol,Preise (Symbol))Gesamtbetrag/Preise[Symbol]) wenn pct > 1,05- Was ist das? e.Verkauf ((Symbol,Preise[Symbol],(pct-avg_pct) *Gesamt/Preise[Symbol]) Res_list.append (([e.account[symbol][value] für Symbol in Symbolen] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, Spalten=Symbole+[total],index = df.index)

In [495]: e.Konto[USDT] Ausgeschaltet[495]:

In [496]: #Backtest Leistung aller Symbole (res.total/10000).plot ((figsize=(12,4), Raster = True); df[Symbole].mean ((Achse=1).plot ((Figurgröße=(12,4),Gitter=True); Außen[496]:img

In [498]: Verringern Sie Symbole mit einer enormen Zunahme Symbole = list ((df.iloc[-1].sort_values() [:-10].index) e = Wechselkurs (Symbole, Gebühr = 0,001, initial_balance = 10000) Res_list = [] Ausnahme für die Ausrüstung für die Verarbeitung von Daten für die Zeile in df[Symbole].iterrows(): Preise = Zeile [1] Gesamt = e.Konto[USDT][Gesamt] e.Aktualisierung der Preise für Symbole in Symbolen: pct = e.Konto[Symbol][Wert]/Gesamt wenn pct < 0,95*avg_pct: e.Kaufen (Symbol,Preise (Symbol))Gesamtbetrag/Preise[Symbol]) wenn pct > 1,05- Was ist das? e.Verkauf ((Symbol,Preise[Symbol],(pct-avg_pct) *Gesamt/Preise[Symbol]) Res_list.append (([e.account[symbol][value] für Symbol in Symbolen] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, Spalten=Symbole+[total],index = df.index)

In [501]: e.Konto[USDT] Ausgeschaltet[1]:

In [499]: (res.total/10000).plot ((figsize=(12,4), Raster = True); df[Symbole].mean ((Achse=1).plot ((Figurgröße=(12,4),Gitter=True); Aus [499]:img

In [503]: #Testen Sie nur die Symbole mit dem höchsten Anstieg Symbole = list ((df.iloc[-1].sort_values()[-3:].index) e = Wechselkurs (Symbole, Gebühr = 0,001, initial_balance = 10000) Res_list = [] Ausnahme für die Ausrüstung für die Verarbeitung von Daten für die Zeile in df[Symbole].iterrows(): Preise = Zeile [1] Gesamt = e.Konto[USDT][Gesamt] e.Aktualisierung der Preise für Symbole in Symbolen: pct = e.Konto[Symbol][Wert]/Gesamt wenn pct < 0,95*avg_pct: e.Kaufen (Symbol,Preise (Symbol))Gesamtbetrag/Preise[Symbol]) wenn pct > 1,05- Was ist das? e.Verkauf ((Symbol,Preise[Symbol],(pct-avg_pct) *Gesamt/Preise[Symbol]) Res_list.append (([e.account[symbol][value] für Symbol in Symbolen] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, Spalten=Symbole+[total],index = df.index)

In [504]: e.Konto[USDT] Außen[504]:

In [505]: (res.total/10000).plot ((figsize=(12,4), Raster = True); df[Symbole].mean ((Achse=1).plot ((Figurgröße=(12,4),Gitter=True); Ausgeschaltet[505]:img

Schlussfolgerung

Im Allgemeinen war 2021 ein großer Bullenmarkt für Kopiewährungen und ein einsames Jahr für BTC. Der Marktwert von BTC ist von 70% zu Beginn des Jahres auf 40% gesunken, was bereits das niedrigste Niveau in der Geschichte ist. Daher war der durchschnittliche Gewinn durch den Kauf von Kopiewährungssymbolen und deren Halten im vergangenen Jahr viel höher als durch das Halten von BTC. Wenn Sie sich 2022 vorstellen, wenn Sie denken, dass es in Zukunft noch mehrere hundert Mal mehr Währungen auf dem aktuellen Markt gibt, können Sie die Währungssymbole, die Sie halten, mutig diversifizieren und geduldig warten. Wenn Sie besonders optimistisch über ein paar Währungssymbole oder den durchschnittlichen Markt sind, können Sie die Rotationsstrategie verwenden, um ohne nachzudenken überschüssige Gewinne zu erzielen. Wenn Sie zustimmen, dass sich die Dinge in die entgegengesetzte Richtung entwickeln, wenn sie extrem werden, können Sie BTC für bessere Gewinne und Sicherheit nach unten fischen.


Mehr