Revisión del TAQ de criptomonedas 2021 y estrategia perdida más simple de aumento de 10 veces

El autor:No lo sé., Creado: 2022-04-07 11:36:32, Actualizado: 2022-04-13 09:25:23

Revisión del TAQ de criptomonedas 2021 y estrategia perdida más simple de aumento de 10 veces

Conclusión y futura estrategia para 2021.ipynb

2021 está llegando a su fin, y los puntos calientes de DEFI a GAMEFI están surgiendo uno tras otro, y el mercado general todavía está en un mercado alcista. Mirando hacia atrás ahora, ¿cuánto has ganado en 2021? ¿Qué oportunidad te perdiste? ¿Hay alguna inversión exitosa? Recientemente, extraje las cotizaciones del mercado histórico del año pasado y encontré una estrategia de lucro inesperadamente simple, pero es un índice multidivisa.

Hay demasiados símbolos de divisas listados en las plataformas, y muchos están destinados a ser desconocidos e incluso pueden retirarse del comercio. Aquí elegimos los símbolos de divisas que han sido listados en Binance Perpetual Swap. Generalmente han sido probados y son reconocidos como monedas convencionales, que son relativamente seguras. Después de una simple detección, algunas monedas del índice fueron eliminadas y 134 monedas finalmente sobrevivieron.

En [1]: solicitudes de importación desde la fecha-hora-fecha de importación,fecha-hora tiempo de importación Importar pandas como pd importar numpy como np Importar matplotlib.pyplot como plt % de matplotlib en línea

En [144]: ##pares de negociación actuales Información = solicitudes.obtención"https://fapi.binance.com/fapi/v1/exchangeInfo’) símbolos = [s[symbol] para s en Info.json() [symbols]]

En [154]: símbolos_f = lista(conjunto(filtro(lambda x: x[-4:] == USDT, [s.split(_) [0] para s en los símbolos]))- El valor de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de Impresión (simbolos)

En [155]: Imprimir (simbolos)

Mercado en el año pasado

Luego, obtenemos sus precios de cierre diarios en el último año, y nos damos cuenta de que algunos símbolos de divisas sólo estuvieron en el mercado durante un corto período de tiempo, por lo que los datos necesitan unidad de procesamiento.

El beneficio final del índice es de aproximadamente 12 veces, es decir, si compras estos 134 símbolos de moneda en promedio el 1 de enero de 2021, el beneficio final de no hacer nada es de 12 veces, y se estima que más del 90% de las personas no superan el índice promedio. Entre ellos, los símbolos de moneda con la mayor disminución: ICP cayó en 93%, DODO cayó en 85% y LINA cayó en 75%. El aumento de casi cien veces: SOL, FTM, LUNA, MATIC, SAND, AXS. Entre ellos, AXS ha aumentado 168 veces y es el mayor caballo oscuro. La mediana aumentó 3 veces. Se puede decir que el índice está impulsado principalmente por las cadenas públicas y los juegos.

Este es un índice de ganancias desesperado. He trabajado duro y probado todo tipo de estrategias, y no he obtenido tanto beneficio como un año en el que no hice ningún esfuerzo adicional. Sin embargo, debe tenerse en cuenta que varios de los aumentos de la relación son demasiado grandes, y obviamente se desvían del índice. Si estos símbolos de moneda no se seleccionan al comienzo del año, la ganancia estará cerca de la mediana, que es mucho menos prominente.

En [157]: #función para obtener K-línea en cualquier período def GetKlines ((símbolo=BTCUSDT,comenzar=2020-8-10,fin=2021-8-10,período=1h,base=fapi,v = v1): Las cuerdas = [] tiempo de inicio = int ((tiempo.mktiempo(tiempo de fecha.strptiempo(inicio, %Y-%m-%d).tiempo múltiple)))1000 + 860601000 personas final_tiempo = int(tiempo.mktiempo(datetime.strptiempo(fin, %Y-%m-%d).tiempo múltiple)))1000 + 860601000 personas Interval_map = {m:601000,h:60601000,d:246060El precio de venta mientras que el tiempo de inicio < tiempo de fin: tiempo medio = min(tiempo de inicio+1000*int(período[:-1])el número de unidades de carga de las unidades de carga de las unidades de carga de las unidades de carga de las unidades de carga de las unidades de carga. url = https://+base+.binance.com/+base+/+v+/klines?símbolo=%s&interval=%s&startTime=%s&endTime=%s&limit=1000%(símbolo,período,tiempo de inicio,tiempo medio) Res = peticiones.get (url) res_list = res.json() si el tipo ((res_list) == lista y el len ((res_list) > 0: tiempo de inicio = res_list[-1][0] Klines += res_list elf tipo ((res_list) == lista: tiempo de inicio = tiempo de inicio+1000int(período[:-1])*intervalo_mapa[período[-1]] en otros casos: el descanso

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

En [164]: df_all_s = pd.DataFrame ((index=pd.date_range)) start=2021-1-1, end=2021-12-28, freq=1d), columns=symbols_s para i en el rango ((len ((simbolos_f)): #print ((simbolos_s[i]) el valor de las emisiones de gases de efecto invernadero en el mercado de la Unión df_s = GetKlines ((símbolo=símbolo_s, inicio=2021-1-1, fin=2021-12-28, período=1d, base=api, v=v3) df_all_s[simbolo_s] = df_s[~df_s.index.duplicated(keep=first) ] cerrar

En el [165]: df_all_s.tail() #estructura de datos Fuera [1]:

En [174]: df_all = df_all_s.fillna ((método=bfill) # relleno de datos df_norm = df_all/df_all.iloc[0] #unitización df_norm.mean ((eje=1). gráfico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); #gráfico de las ganancias del índice final Fuera [1]:img

En el [175]: #aumento mediano df_norm.median ((eje=1). gráfico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); Fuera [1]:img

En [168]: #ascenso y caída clasificando Imprimir (df_norm.iloc[-1].redondo (df_norm.iloc).sort_values (df_norm.iloc) y ordenar (df_dict)

En [317]: #el retiro máximo del precio actual en comparación con el precio más alto del año pasado imprimir ((((1-df_norm.iloc[-1]/df_norm.max (()) redondo ((2).sort_values (().to_dict (())

En [177]: df_all_f = pd.DataFrame ((index=pd.date_range)) start=2021-1-1, end=2021-12-28, freq=1d), columns=symbols_s para i en el rango ((len ((simbolos_f)): #print ((simbolos_s[i]) el valor de las emisiones de gases de efecto invernadero df_f = GetKlines ((símbolo=símbolo_f, inicio=2021-1-1, final=2021-12-28, período=1d, base=fapi, v=v1) Df_all_f[simbolo_f] = df_f[~df_f.index.duplicado (se mantiene=first) ].cerrar

En el [208]: # no incluye nuevos símbolos df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].esnull()]] Df = df.fillna ((método=bfill) Df = df/df.iloc[0] df.mean ((eje=1).grafico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); Fuera[208]:img

En [212]: #comparado con BTC (df.mean(eje=1)/df.BTCUSDT). gráfico ((figsize=(12,4), cuadrícula=Verdadero); Fuera [1]:img

En [213]: # Usar el viejo motor de backtest clase Intercambio:

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)

En el [418]: # Para una prueba de retroceso más precisa, rastrea la línea k de 1 hora df_all_s = pd.DataFrame ((index=pd.date_range)) start=2021-1-1, end=2021-12-28, freq=1h), columns=symbols_s) para i en el rango ((len ((simbolos_f)): #print ((simbolos_s[i]) el valor de las emisiones de gases de efecto invernadero en el mercado de la Unión df_s = GetKlines ((símbolo=símbolo_s, inicio=2021-1-1, fin=2021-12-28, período=1h, base=api, v=v3) df_all_s[simbolo_s] = df_s[~df_s.index.duplicated(keep=first) ] cerrar

En el [419]: df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].esnull()]] Df = df.fillna ((método=bfill) Df = df/df.iloc[0] df.mean ((eje=1). gráfico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); Fuera[419]:img

Desempeño equilibrado de la estrategia

La prueba de retroceso seleccionó todos los símbolos de moneda que figuran en los contratos perpetuos de Binance el 1 de enero de 2021. El período de la línea K es de 1h, y el parámetro es que comienza a comprar cuando el monto de la posición es inferior al 5% del promedio y comienza a vender cuando supera el 5%. Cuando la prueba de retroceso es de todos los símbolos de moneda, el beneficio final de la estrategia es de 7.7 veces. Significativamente peor que el beneficio promedio de 13 veces. Eso también está en mi expectativa. Después de todo, esos símbolos de moneda que aumentaron cien veces son demasiado especiales, y la estrategia equilibrada los venderá a todos.

Si el backtest elige eliminar los 10 símbolos de divisas con el mayor aumento, y solo examina los símbolos de divisas relativamente mediocres, la ganancia final es de 4,8 veces, superando con creces el rendimiento promedio de 3,4 veces.

Si solo se giran los 3 símbolos de moneda con el aumento más alto, la ganancia final es de 373 veces, superando con creces el rendimiento promedio de 160 veces.

En el [494]: # backtest de todos los símbolos los símbolos = list(df.iloc[-1].sort_values() [:].index) e = intercambio ((símbolos, tarifa=0,001, saldo inicial=10000) Res_list = [] Avg_pct = 1/len (símbolos) para la fila en df[símbolos].iterrows(): precios = fila [1] En el caso de las entidades financieras, el importe total de las contribuciones de las entidades financieras a las cuentas de las entidades financieras es el mismo que el importe total de las contribuciones de las entidades financieras a las cuentas de las entidades financieras. e.Actualización de los precios para el símbolo en símbolos: pct = e.cuenta[símbolo][valor]/total si el pct es < 0,95*avg_pct: e.Comprar (símbolo,precios (símbolo))Total/precios[símbolo]) si el pct es > 1,05Avg_pct: e.Vender (símbolo,precios (símbolo)) *total (precios) res_list.append (([e.account[símbolo][valor] para símbolo en símbolos] + [e.account[USDT][total]]) res = pd.DataFrame ((datos=res_list, columnas=símbolos+[total],index = df.index)

En el [495]: Cuenta electrónica[USDT] Fuera[495]:

En el [496]: # backtest rendimiento de todos los símbolos (res.total/10000). gráfico (figsize=12,4), cuadrícula (true) df[símbolos].medio ((eje=1). gráfico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); Fuera[496]:img

En el [498]: #reducir símbolos con un enorme aumento los símbolos = list(df.iloc[-1].sort_values() [:-10].index) e = intercambio ((símbolos, tarifa=0,001, saldo inicial=10000) Res_list = [] Avg_pct = 1/len (símbolos) para la fila en df[símbolos].iterrows(): precios = fila [1] En el caso de las entidades financieras, el importe total de las contribuciones de las entidades financieras a las cuentas de las entidades financieras es el mismo que el importe total de las contribuciones de las entidades financieras a las cuentas de las entidades financieras. e.Actualización de los precios para el símbolo en símbolos: pct = e.cuenta[símbolo][valor]/total si el pct es < 0,95*avg_pct: e.Comprar (símbolo,precios (símbolo))Total/precios[símbolo]) si el pct es > 1,05Avg_pct: e.Vender (símbolo,precios (símbolo)) *total (precios) res_list.append (([e.account[símbolo][valor] para símbolo en símbolos] + [e.account[USDT][total]]) res = pd.DataFrame ((datos=res_list, columnas=símbolos+[total],index = df.index)

En el [501]: Cuenta electrónica[USDT] Fuera[501]:

En [499]: (res.total/10000). gráfico (figsize=12,4), cuadrícula (true) df[símbolos].medio ((eje=1). gráfico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); En el caso de las empresas de servicios de telecomunicaciones:img

En el [503]: Solo prueba los símbolos con el mayor aumento los símbolos = list(df.iloc[-1].sort_values()[-3:].index) e = intercambio ((símbolos, tarifa=0,001, saldo inicial=10000) Res_list = [] Avg_pct = 1/len (símbolos) para la fila en df[símbolos].iterrows(): precios = fila [1] En el caso de las entidades financieras, el importe total de las contribuciones de las entidades financieras a las cuentas de las entidades financieras es el mismo que el importe total de las contribuciones de las entidades financieras a las cuentas de las entidades financieras. e.Actualización de los precios para el símbolo en símbolos: pct = e.cuenta[símbolo][valor]/total si el pct es < 0,95*avg_pct: e.Comprar (símbolo,precios (símbolo))Total/precios[símbolo]) si el pct es > 1,05Avg_pct: e.Vender (símbolo,precios (símbolo)) *total (precios) res_list.append (([e.account[símbolo][valor] para símbolo en símbolos] + [e.account[USDT][total]]) res = pd.DataFrame ((datos=res_list, columnas=símbolos+[total],index = df.index)

En el [504]: Cuenta electrónica[USDT] Fuera[504]:

En el [505]: (res.total/10000). gráfico (figsize=12,4), cuadrícula (true) df[símbolos].medio ((eje=1). gráfico ((tamaño de imagen=(12,4), cuadrícula=Verdadero); Fuera[505]:img

Conclusión

En general, 2021 fue un gran mercado alcista para las monedas copiadas y un año desolador para BTC. El valor de mercado de BTC ha caído del 70% al comienzo del año al 40% ahora, que ya es el nivel más bajo de la historia. Por lo tanto, la ganancia promedio de comprar símbolos de moneda copiada y mantenerlos en el año pasado fue mucho mayor que la de mantener BTC. Mirando hacia adelante a 2022, si piensas que todavía hay varios cientos de veces de monedas nacidas en el mercado actual en el futuro, puedes diversificar audazmente los símbolos de moneda que tienes y esperar pacientemente. Si eres particularmente optimista sobre algunos símbolos de moneda o el mercado promedio, puedes usar la estrategia de rotación para obtener ganancias excesivas sin pensar. Si estás de acuerdo en que las cosas se desarrollarán en la dirección opuesta cuando se vuelvan extremas, puedes pescar en el fondo de BTC para obtener mejores ganancias y seguridad.


Más.