3
konzentrieren Sie sich auf
1444
Anhänger

Perpetual-Balance-Strategie für den Kauf am Tiefpunkt eines Bärenmarktes

Erstellt in: 2022-06-02 10:00:04, aktualisiert am: 2024-12-02 21:36:36
comments   7
hits   5879

Perpetual-Balance-Strategie für den Kauf am Tiefpunkt eines Bärenmarktes

In der Vergangenheit hat FMZ offiziell eine Perpetual-Grid-Strategie veröffentlicht, die bei den Benutzern sehr beliebt war, und der Echtzeithandel von TRX hat im vergangenen Jahr bei kontrollierbaren Risiken große Gewinne eingebracht. Die Strategie eines einheitlichen nachhaltigen Stromnetzes ist jedoch auch mit einigen Problemen verbunden:

  1. Es müssen Parameter wie Anfangspreis, Rasterabstand, Rasterwert, Long- und Short-Modus usw. festgelegt werden. Die Einstellungen sind ziemlich kompliziert, wirken sich stärker auf die Rendite aus und sind für Anfänger schwierig festzulegen.
  2. Das Leerverkaufsrisiko der Perpetual Grid-Strategie ist sehr hoch, während das Long-Selling-Risiko relativ gering ist. Selbst wenn der Grid-Wert sehr klein angesetzt wird, sind die Auswirkungen auf den Leerverkaufs-Liquidationspreis nicht signifikant.
  3. Um das Risiko von Leerverkäufen zu vermeiden, kann sich das Raster unbefristeter Verträge dafür entscheiden, nur Long-Positionen einzugehen, was derzeit in Ordnung zu sein scheint. Es besteht jedoch das Problem, dass der aktuelle Preis den Anfangspreis übersteigt, was zu einer leeren Position führt und der Anfangspreis zurückgesetzt werden muss.

Zu den Grundsätzen der Balance-Strategie und ihrem Vergleich mit der Grid-Strategie habe ich bereits einen Artikel verfasst, auf den auch heute noch verwiesen werden kann: https://www.fmz.com/digest-topic/5930. Die ausgewogene Strategie hält immer eine Position mit einem festen Wertverhältnis oder Wert. Sie verkauft einen Teil, wenn der Kurs steigt, und kauft einen Teil, wenn der Kurs fällt. Sie lässt sich leicht einrichten und ausführen. Selbst wenn der Kurs der Währung stark ansteigt, besteht kein Risiko, etwas zu verpassen. Das Problem bei der Spot-Balancing-Strategie besteht darin, dass die Kapitalauslastung gering ist und es keine einfache Möglichkeit gibt, eine Hebelwirkung zu erzielen. Der unbefristete Vertrag kann das Problem lösen. Wenn das Gesamtkapital 1.000 beträgt, können Sie einen Festbetrag von 2.000 halten, der das ursprüngliche Kapital übersteigt und die Mittelauslastung verbessert. Es gibt auch einen Parameter zum Anpassen des Verhältnisses, der steuert, um wie viel Positionen erhöht oder verringert werden, wenn der Preis steigt oder fällt. Wenn er beispielsweise auf 0,01 eingestellt ist, bedeutet dies, dass Positionen einmal reduziert werden, wenn der Preis um 1 % steigt. und bei einem Kursrückgang von 1% die Positionen einmalig aufzustocken.

Für Anfänger ist die Balance-Strategie sehr zu empfehlen. Sie ist einfach zu handhaben und erfordert lediglich die Festlegung eines Parameters für die Haltequote oder den Haltewert. Sie können sie ausführen, ohne sich über steigende Preise Gedanken machen zu müssen. Wer über eine gewisse Erfahrung verfügt, kann die Netzstrategie wählen, die Ober- und Untergrenzen der Schwankungen und die Mittel für jedes Netz festlegen, die Kapitalnutzung verbessern und maximale Renditen anstreben.

Um das Backtesting mehrerer Handelspaare zu erleichtern, zeigt dieses Dokument den vollständigen Backtesting-Prozess und Benutzer können verschiedene Parameter und Handelspaare zum Vergleich anpassen. (Die Version ist Python3 und zum Herunterladen des Marktes ist ein Agent erforderlich. Benutzer können Anancoda3 selbst herunterladen oder über das Collab von Google ausführen.)

import requests
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import requests, zipfile, io
%matplotlib inline
## 当前交易对
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
symbols = [s['symbol'] for s in Info.json()['symbols']]
symbols = list(set(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in symbols]))-
                 set(['1000SHIBUSDT','1000XECUSDT','BTCDOMUSDT','DEFIUSDT','BTCSTUSDT'])) + ['SHIBUSDT','XECUSDT']
print(symbols)
['FLMUSDT', 'ICPUSDT', 'CHZUSDT', 'APEUSDT', 'DARUSDT', 'TLMUSDT', 'ETHUSDT', 'STMXUSDT', 'ENJUSDT', 'LINKUSDT', 'OGNUSDT', 'RSRUSDT', 'QTUMUSDT', 'UNIUSDT', 'BNBUSDT', 'XLMUSDT', 'ATOMUSDT', 'LPTUSDT', 'UNFIUSDT', 'DASHUSDT', 'BTCUSDT', 'NEOUSDT', 'AAVEUSDT', 'DUSKUSDT', 'XRPUSDT', 'IOTXUSDT', 'CVCUSDT', 'SANDUSDT', 'XTZUSDT', 'IOTAUSDT', 'BELUSDT', 'MANAUSDT', 'IOSTUSDT', 'IMXUSDT', 'THETAUSDT', 'SCUSDT', 'DOGEUSDT', 'CELOUSDT', 'BNXUSDT', 'SNXUSDT', 'ZRXUSDT', 'HBARUSDT', 'DOTUSDT', 'ANKRUSDT', 'CELRUSDT', 'BAKEUSDT', 'GALUSDT', 'ICXUSDT', 'LRCUSDT', 'AVAXUSDT', 'C98USDT', 'MTLUSDT', 'FTTUSDT', 'MASKUSDT', 'RLCUSDT', 'MATICUSDT', 'COMPUSDT', 'BLZUSDT', 'CRVUSDT', 'ZECUSDT', 'RUNEUSDT', 'LITUSDT', 'ONEUSDT', 'ADAUSDT', 'NKNUSDT', 'LTCUSDT', 'ATAUSDT', 'GALAUSDT', 'BALUSDT', 'ROSEUSDT', 'EOSUSDT', 'YFIUSDT', 'SKLUSDT', 'BANDUSDT', 'ALGOUSDT', 'NEARUSDT', 'AXSUSDT', 'KSMUSDT', 'AUDIOUSDT', 'SRMUSDT', 'HNTUSDT', 'MKRUSDT', 'KLAYUSDT', 'FLOWUSDT', 'STORJUSDT', 'BCHUSDT', 'DYDXUSDT', 'ARUSDT', 'GMTUSDT', 'CHRUSDT', 'API3USDT', 'VETUSDT', 'KAVAUSDT', 'WAVESUSDT', 'EGLDUSDT', 'SFPUSDT', 'RENUSDT', 'SUSHIUSDT', 'SOLUSDT', 'RVNUSDT', 'ONTUSDT', 'BTSUSDT', 'ZILUSDT', 'GTCUSDT', 'ZENUSDT', 'ALICEUSDT', 'ETCUSDT', 'TRXUSDT', 'TOMOUSDT', 'FILUSDT', 'ARPAUSDT', 'CTKUSDT', 'BATUSDT', 'SXPUSDT', '1INCHUSDT', 'HOTUSDT', 'WOOUSDT', 'LINAUSDT', 'REEFUSDT', 'GRTUSDT', 'RAYUSDT', 'COTIUSDT', 'XMRUSDT', 'PEOPLEUSDT', 'OCEANUSDT', 'JASMYUSDT', 'TRBUSDT', 'ANTUSDT', 'XEMUSDT', 'DGBUSDT', 'ENSUSDT', 'OMGUSDT', 'ALPHAUSDT', 'FTMUSDT', 'DENTUSDT', 'KNCUSDT', 'CTSIUSDT', 'SHIBUSDT', 'XECUSDT']
#获取任意周期K线的函数
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 + 8*60*60*1000
    end_time =  min(int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000,time.time()*1000)
    intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000}
    while start_time < end_time:
        mid_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
        url = 'https://'+base+'.binance.com/'+base+'/'+v+'/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000'%(symbol,period,start_time,mid_time)
        #print(url)
        res = requests.get(url)
        res_list = res.json()
        if type(res_list) == list and len(res_list) > 0:
            start_time = res_list[-1][0]+int(period[:-1])*intervel_map[period[-1]]
            Klines += res_list
        if type(res_list) == list and len(res_list) == 0:
            start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
        if mid_time >= end_time:
            break

    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')
    return df

Indem wir die Schlusskurse aller Handelspaare von 2021 bis heute herunterladen, können wir die Veränderungen im Gesamtmarktindex beobachten: 2021 bis 2022 ist zweifellos ein Bullenmarkt, und der Index ist an einem Punkt 14 Mal gestiegen. Man kann sagen, dass Es gibt überall Gold. Der Wert einiger Münzen hat sich verhundertfacht. Im Jahr 2022 begann jedoch ein Bärenmarkt, der ein halbes Jahr anhielt. Der Index brach zeitweise um 80 % ein und Dutzende von Münzen verloren mehr als 90 %. Solche starken Anstiege und Rückgänge spiegeln die enormen Risiken von Netzstrategien wider.

Der aktuelle Index liegt bei rund 3, was immer noch einer Steigerung von 200 % gegenüber Anfang 2021 entspricht. In Anbetracht der Entwicklung des Marktes dürfte es sich derzeit um einen relativen Tiefpunkt handeln.

Der Höchstkurs der Währung hat sich im Vergleich zum Jahresbeginn mehr als verzehnfacht:

‘MKRUSDT’: 10.294, ‘CRVUSDT’: 10.513, ‘STORJUSDT’: 10.674, ‘SKLUSDT’: 11.009, ‘CVCUSDT’: 11.026, ‘SRMUSDT’: 11.031, ‘QTUMUSDT’: 12.066, ‘ALPHAUSDT’: 12.103, ‘ZENUSDT’: 12.631, ‘VETUSDT’: 13.296, ‘ROSEUSDT’: 13.429, ‘FTTUSDT’: 13.705, ‘IOSTUSDT’: 13.786, ‘COTIUSDT’: 13.958, ‘NEARUSDT’: 14.855, ‘HBARUSDT’: 15.312, ‘RLCUSDT’: 15.432, ‘SCUSDT’: 15.6, ‘GALAUSDT’: 15.722, ‘RUNEUSDT’: 15.795, ‘ADAUSDT’: 16.94, ‘MTLUSDT’: 17.18, ‘BNBUSDT’: 17.899, ‘RVNUSDT’: 18.169, ‘EGLDUSDT’: 18.879, ‘LRCUSDT’: 19.499, ‘ANKRUSDT’: 21.398, ‘ETCUSDT’: 23.51, ‘DUSKUSDT’: 23.55, ‘AUDIOUSDT’: 25.306, ‘OGNUSDT’: 25.524, ‘GMTUSDT’: 28.83, ‘ENJUSDT’: 33.073, ‘STMXUSDT’: 33.18, ‘IOTXUSDT’: 35.866, ‘AVAXUSDT’: 36.946, ‘CHZUSDT’: 37.128, ‘CELRUSDT’: 37.273, ‘HNTUSDT’: 38.779, ‘CTSIUSDT’: 41.108, ‘HOTUSDT’: 46.466, ‘CHRUSDT’: 61.091, ‘MANAUSDT’: 62.143, ‘NKNUSDT’: 70.636, ‘ONEUSDT’: 84.132, ‘DENTUSDT’: 99.973, ‘DOGEUSDT’: 121.447, ‘SOLUSDT’: 140.296, ‘MATICUSDT’: 161.846, ‘FTMUSDT’: 192.507, ‘SANDUSDT’: 203.219, ‘AXSUSDT’: 270.41

Der aktuelle Retracement beträgt mehr als 80 % des Höchstpunkts:

ICPUSDT’: 0.022, ‘FILUSDT’: 0.043, ‘BAKEUSDT’: 0.046, ‘TLMUSDT’: 0.05, ‘LITUSDT’: 0.053, ‘LINAUSDT’: 0.054, ‘JASMYUSDT’: 0.056, ‘ALPHAUSDT’: 0.062, ‘RAYUSDT’: 0.062, ‘GRTUSDT’: 0.067, ‘DENTUSDT’: 0.068, ‘RSRUSDT’: 0.068, ‘XEMUSDT’: 0.068, ‘UNFIUSDT’: 0.072, ‘DYDXUSDT’: 0.074, ‘SUSHIUSDT’: 0.074, ‘OGNUSDT’: 0.074, ‘COMPUSDT’: 0.074, ‘NKNUSDT’: 0.078, ‘SKLUSDT’: 0.08, ‘DGBUSDT’: 0.081, ‘RLCUSDT’: 0.085, ‘REEFUSDT’: 0.086, ‘BANDUSDT’: 0.086, ‘HOTUSDT’: 0.092, ‘SRMUSDT’: 0.092, ‘RENUSDT’: 0.092, ‘BTSUSDT’: 0.093, ‘THETAUSDT’: 0.094, ‘FLMUSDT’: 0.094, ‘EOSUSDT’: 0.095, ‘TRBUSDT’: 0.095, ‘SXPUSDT’: 0.095, ‘ATAUSDT’: 0.096, ‘NEOUSDT’: 0.096, ‘FLOWUSDT’: 0.097, ‘YFIUSDT’: 0.101, ‘BALUSDT’: 0.106, ‘MASKUSDT’: 0.106, ‘ONTUSDT’: 0.108, ‘CELRUSDT’: 0.108, ‘AUDIOUSDT’: 0.108, ‘SCUSDT’: 0.11, ‘GALAUSDT’: 0.113, ‘GTCUSDT’: 0.117, ‘CTSIUSDT’: 0.117, ‘STMXUSDT’: 0.118, ‘DARUSDT’: 0.118, ‘ALICEUSDT’: 0.119, ‘SNXUSDT’: 0.124, ‘FTMUSDT’: 0.126, ‘BCHUSDT’: 0.127, ‘SFPUSDT’: 0.127, ‘ROSEUSDT’: 0.128, ‘DOGEUSDT’: 0.128, ‘RVNUSDT’: 0.129, ‘OCEANUSDT’: 0.129, ‘VETUSDT’: 0.13, ‘KSMUSDT’: 0.131, ‘ICXUSDT’: 0.131, ‘UNIUSDT’: 0.131, ‘ONEUSDT’: 0.131, ‘1INCHUSDT’: 0.134, ‘IOTAUSDT’: 0.139, ‘C98USDT’: 0.139, ‘WAVESUSDT’: 0.14, ‘DUSKUSDT’: 0.141, ‘LINKUSDT’: 0.143, ‘DASHUSDT’: 0.143, ‘OMGUSDT’: 0.143, ‘PEOPLEUSDT’: 0.143, ‘AXSUSDT’: 0.15, ‘ENJUSDT’: 0.15, ‘QTUMUSDT’: 0.152, ‘SHIBUSDT’: 0.154, ‘ZENUSDT’: 0.154, ‘BLZUSDT’: 0.154, ‘ANTUSDT’: 0.155, ‘XECUSDT’: 0.155, ‘CHZUSDT’: 0.158, ‘RUNEUSDT’: 0.163, ‘ENSUSDT’: 0.165, ‘LRCUSDT’: 0.167, ‘CHRUSDT’: 0.168, ‘IOTXUSDT’: 0.174, ‘TOMOUSDT’: 0.176, ‘ALGOUSDT’: 0.177, ‘EGLDUSDT’: 0.177, ‘ARUSDT’: 0.178, ‘LTCUSDT’: 0.178, ‘HNTUSDT’: 0.18, ‘LPTUSDT’: 0.181, ‘SOLUSDT’: 0.183, ‘ARPAUSDT’: 0.184, ‘BELUSDT’: 0.184, ‘ETCUSDT’: 0.186, ‘ZRXUSDT’: 0.187, ‘AAVEUSDT’: 0.187, ‘CVCUSDT’: 0.188, ‘STORJUSDT’: 0.189, ‘COTIUSDT’: 0.19, ‘CELOUSDT’: 0.191, ‘SANDUSDT’: 0.191, ‘ADAUSDT’: 0.192, ‘HBARUSDT’: 0.194, ‘DOTUSDT’: 0.195, ‘XLMUSDT’: 0.195

#下载所有交易对的收盘价
start_date = '2021-1-1'
end_date = '2022-05-30'
period = '1d'
df_all = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=symbols)
for i in range(len(symbols)):
    #print(symbols[i])
    symbol = symbols[i]
    df_s = GetKlines(symbol=symbol,start=start_date,end=end_date,period=period,base='api',v='v3')
    df_all[symbol] = df_s[~df_s.index.duplicated(keep='first')].close
#指数变化
df_norm = df_all/df_all.fillna(method='bfill').iloc[0] #归一化
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);

png

#比年初的最高涨幅
max_up = df_all.max()/df_all.fillna(method='bfill').iloc[0]
print(max_up.map(lambda x:round(x,3)).sort_values().to_dict())
{'JASMYUSDT': 1.0, 'ICPUSDT': 1.0, 'LINAUSDT': 1.0, 'WOOUSDT': 1.0, 'GALUSDT': 1.0, 'PEOPLEUSDT': 1.0, 'XECUSDT': 1.026, 'ENSUSDT': 1.032, 'TLMUSDT': 1.039, 'IMXUSDT': 1.099, 'FLOWUSDT': 1.155, 'ATAUSDT': 1.216, 'DARUSDT': 1.261, 'ALICEUSDT': 1.312, 'BNXUSDT': 1.522, 'API3USDT': 1.732, 'GTCUSDT': 1.833, 'KLAYUSDT': 1.891, 'BAKEUSDT': 1.892, 'DYDXUSDT': 2.062, 'SHIBUSDT': 2.281, 'BTCUSDT': 2.302, 'MASKUSDT': 2.396, 'SFPUSDT': 2.74, 'LPTUSDT': 2.75, 'APEUSDT': 2.783, 'ARUSDT': 2.928, 'CELOUSDT': 2.951, 'ZILUSDT': 2.999, 'LTCUSDT': 3.072, 'SNXUSDT': 3.266, 'XEMUSDT': 3.555, 'XMRUSDT': 3.564, 'YFIUSDT': 3.794, 'BANDUSDT': 3.812, 'RAYUSDT': 3.924, 'REEFUSDT': 4.184, 'ANTUSDT': 4.205, 'XTZUSDT': 4.339, 'CTKUSDT': 4.352, 'LITUSDT': 4.38, 'RSRUSDT': 4.407, 'LINKUSDT': 4.412, 'BCHUSDT': 4.527, 'DASHUSDT': 5.037, 'BALUSDT': 5.172, 'OCEANUSDT': 5.277, 'EOSUSDT': 5.503, 'RENUSDT': 5.538, 'XLMUSDT': 5.563, 'TOMOUSDT': 5.567, 'ZECUSDT': 5.654, 'COMPUSDT': 5.87, 'DGBUSDT': 5.948, 'ALGOUSDT': 5.981, 'ONTUSDT': 5.997, 'BELUSDT': 6.101, 'TRXUSDT': 6.116, 'ZRXUSDT': 6.135, 'GRTUSDT': 6.45, '1INCHUSDT': 6.479, 'DOTUSDT': 6.502, 'ETHUSDT': 6.596, 'KAVAUSDT': 6.687, 'ICXUSDT': 6.74, 'SUSHIUSDT': 6.848, 'AAVEUSDT': 6.931, 'BTSUSDT': 6.961, 'KNCUSDT': 6.966, 'C98USDT': 7.091, 'THETAUSDT': 7.222, 'ATOMUSDT': 7.553, 'OMGUSDT': 7.556, 'SXPUSDT': 7.681, 'UNFIUSDT': 7.696, 'XRPUSDT': 7.726, 'TRBUSDT': 8.241, 'BLZUSDT': 8.434, 'NEOUSDT': 8.491, 'FLMUSDT': 8.506, 'KSMUSDT': 8.571, 'FILUSDT': 8.591, 'IOTAUSDT': 8.616, 'BATUSDT': 8.647, 'ARPAUSDT': 9.055, 'UNIUSDT': 9.104, 'WAVESUSDT': 9.106, 'MKRUSDT': 10.294, 'CRVUSDT': 10.513, 'STORJUSDT': 10.674, 'SKLUSDT': 11.009, 'CVCUSDT': 11.026, 'SRMUSDT': 11.031, 'QTUMUSDT': 12.066, 'ALPHAUSDT': 12.103, 'ZENUSDT': 12.631, 'VETUSDT': 13.296, 'ROSEUSDT': 13.429, 'FTTUSDT': 13.705, 'IOSTUSDT': 13.786, 'COTIUSDT': 13.958, 'NEARUSDT': 14.855, 'HBARUSDT': 15.312, 'RLCUSDT': 15.432, 'SCUSDT': 15.6, 'GALAUSDT': 15.722, 'RUNEUSDT': 15.795, 'ADAUSDT': 16.94, 'MTLUSDT': 17.18, 'BNBUSDT': 17.899, 'RVNUSDT': 18.169, 'EGLDUSDT': 18.879, 'LRCUSDT': 19.499, 'ANKRUSDT': 21.398, 'ETCUSDT': 23.51, 'DUSKUSDT': 23.55, 'AUDIOUSDT': 25.306, 'OGNUSDT': 25.524, 'GMTUSDT': 28.83, 'ENJUSDT': 33.073, 'STMXUSDT': 33.18, 'IOTXUSDT': 35.866, 'AVAXUSDT': 36.946, 'CHZUSDT': 37.128, 'CELRUSDT': 37.273, 'HNTUSDT': 38.779, 'CTSIUSDT': 41.108, 'HOTUSDT': 46.466, 'CHRUSDT': 61.091, 'MANAUSDT': 62.143, 'NKNUSDT': 70.636, 'ONEUSDT': 84.132, 'DENTUSDT': 99.973, 'DOGEUSDT': 121.447, 'SOLUSDT': 140.296, 'MATICUSDT': 161.846, 'FTMUSDT': 192.507, 'SANDUSDT': 203.219, 'AXSUSDT': 270.41}
#当前最大回测
draw_down = df_all.iloc[-1]/df_all.max()
print(draw_down.map(lambda x:round(x,3)).sort_values().to_dict())
{'ICPUSDT': 0.022, 'FILUSDT': 0.043, 'BAKEUSDT': 0.046, 'TLMUSDT': 0.05, 'LITUSDT': 0.053, 'LINAUSDT': 0.054, 'JASMYUSDT': 0.056, 'ALPHAUSDT': 0.062, 'RAYUSDT': 0.062, 'GRTUSDT': 0.067, 'DENTUSDT': 0.068, 'RSRUSDT': 0.068, 'XEMUSDT': 0.068, 'UNFIUSDT': 0.072, 'DYDXUSDT': 0.074, 'SUSHIUSDT': 0.074, 'OGNUSDT': 0.074, 'COMPUSDT': 0.074, 'NKNUSDT': 0.078, 'SKLUSDT': 0.08, 'DGBUSDT': 0.081, 'RLCUSDT': 0.085, 'REEFUSDT': 0.086, 'BANDUSDT': 0.086, 'HOTUSDT': 0.092, 'SRMUSDT': 0.092, 'RENUSDT': 0.092, 'BTSUSDT': 0.093, 'THETAUSDT': 0.094, 'FLMUSDT': 0.094, 'EOSUSDT': 0.095, 'TRBUSDT': 0.095, 'SXPUSDT': 0.095, 'ATAUSDT': 0.096, 'NEOUSDT': 0.096, 'FLOWUSDT': 0.097, 'YFIUSDT': 0.101, 'BALUSDT': 0.106, 'MASKUSDT': 0.106, 'ONTUSDT': 0.108, 'CELRUSDT': 0.108, 'AUDIOUSDT': 0.108, 'SCUSDT': 0.11, 'GALAUSDT': 0.113, 'GTCUSDT': 0.117, 'CTSIUSDT': 0.117, 'STMXUSDT': 0.118, 'DARUSDT': 0.118, 'ALICEUSDT': 0.119, 'SNXUSDT': 0.124, 'FTMUSDT': 0.126, 'BCHUSDT': 0.127, 'SFPUSDT': 0.127, 'ROSEUSDT': 0.128, 'DOGEUSDT': 0.128, 'RVNUSDT': 0.129, 'OCEANUSDT': 0.129, 'VETUSDT': 0.13, 'KSMUSDT': 0.131, 'ICXUSDT': 0.131, 'UNIUSDT': 0.131, 'ONEUSDT': 0.131, '1INCHUSDT': 0.134, 'IOTAUSDT': 0.139, 'C98USDT': 0.139, 'WAVESUSDT': 0.14, 'DUSKUSDT': 0.141, 'LINKUSDT': 0.143, 'DASHUSDT': 0.143, 'OMGUSDT': 0.143, 'PEOPLEUSDT': 0.143, 'AXSUSDT': 0.15, 'ENJUSDT': 0.15, 'QTUMUSDT': 0.152, 'SHIBUSDT': 0.154, 'ZENUSDT': 0.154, 'BLZUSDT': 0.154, 'ANTUSDT': 0.155, 'XECUSDT': 0.155, 'CHZUSDT': 0.158, 'RUNEUSDT': 0.163, 'ENSUSDT': 0.165, 'LRCUSDT': 0.167, 'CHRUSDT': 0.168, 'IOTXUSDT': 0.174, 'TOMOUSDT': 0.176, 'ALGOUSDT': 0.177, 'EGLDUSDT': 0.177, 'ARUSDT': 0.178, 'LTCUSDT': 0.178, 'HNTUSDT': 0.18, 'LPTUSDT': 0.181, 'SOLUSDT': 0.183, 'ARPAUSDT': 0.184, 'BELUSDT': 0.184, 'ETCUSDT': 0.186, 'ZRXUSDT': 0.187, 'AAVEUSDT': 0.187, 'CVCUSDT': 0.188, 'STORJUSDT': 0.189, 'COTIUSDT': 0.19, 'CELOUSDT': 0.191, 'SANDUSDT': 0.191, 'ADAUSDT': 0.192, 'HBARUSDT': 0.194, 'DOTUSDT': 0.195, 'XLMUSDT': 0.195, 'AVAXUSDT': 0.206, 'ANKRUSDT': 0.207, 'MTLUSDT': 0.208, 'MANAUSDT': 0.209, 'CRVUSDT': 0.213, 'API3USDT': 0.221, 'IOSTUSDT': 0.227, 'XRPUSDT': 0.228, 'BATUSDT': 0.228, 'MKRUSDT': 0.229, 'MATICUSDT': 0.229, 'CTKUSDT': 0.233, 'ZILUSDT': 0.233, 'WOOUSDT': 0.234, 'ATOMUSDT': 0.237, 'KLAYUSDT': 0.239, 'XTZUSDT': 0.245, 'IMXUSDT': 0.278, 'NEARUSDT': 0.285, 'GALUSDT': 0.299, 'APEUSDT': 0.305, 'ZECUSDT': 0.309, 'KAVAUSDT': 0.31, 'GMTUSDT': 0.327, 'FTTUSDT': 0.366, 'KNCUSDT': 0.401, 'ETHUSDT': 0.416, 'XMRUSDT': 0.422, 'BTCUSDT': 0.47, 'BNBUSDT': 0.476, 'TRXUSDT': 0.507, 'BNXUSDT': 0.64}

Zunächst verwenden wir den einfachsten Code, um einen Abwärtstrend zu simulieren und die Liquidationspreise verschiedener Positionswerte anzuzeigen. Da die Strategie immer Long-Positionen hält, besteht kein Anstiegsrisiko. Das Anfangskapital beträgt 1000, der Währungskurs 1 und das Anpassungsverhältnis 0,01. Die Ergebnisse sind wie folgt. Es ist ersichtlich, dass das Risiko einer Liquidierung von Long-Positionen nicht gering ist. Mit einem Hebel von 1,5 kann es einem Rückgang von 50 % standhalten. Angesichts der derzeitigen relativen Tiefstsituation ist dies ein akzeptables Risiko.

Positionswert Langer Liquidationspreis
300 0.035
500 0.133
800 0.285
1000 0.362
1500 0.51
2000 0.599
3000 0.711
5000 0.81
10000 0.904
for Hold_value in [300,500,800,1000,1500,2000,3000,5000,10000]:
    amount = Hold_value/1
    hold_price = 1
    margin = 1000
    Pct = 0.01
    i = 0
    while margin > 0:
        i += 1
        if i>500:
            break
        buy_price = (1-Pct)*Hold_value/amount
        buy_amount = Hold_value*Pct/buy_price
        hold_price = (amount * hold_price + buy_amount * buy_price) / (buy_amount + amount)
        amount += buy_amount
        margin = 1000 + amount * (buy_price - hold_price)
    print(Hold_value, round(buy_price,3))
300 0.035
500 0.133
800 0.285
1000 0.362
1500 0.51
2000 0.599
3000 0.711
5000 0.81
10000 0.904
#还是用原来的回测引擎
class Exchange:
    
    def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
        self.initial_balance = initial_balance #初始的资产
        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 #扣除手续费
        self.account['USDT']['fee'] += price*amount*self.fee
        self.account[symbol]['fee'] += price*amount*self.fee

        if cover_amount > 0: #先平仓
            self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #利润
            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): #对资产进行更新
        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)

Zunächst führen wir einen Backtest der Leistung der TRX-Balance-Strategie durch. Der maximale Drawdown von TRX in dieser Bärenmarktrunde ist relativ gering, sodass er bestimmte Besonderheiten aufweist. Die ausgewählten Daten sind die 5-Minuten-K-Linie von 2021 bis heute mit einem Anfangskapital von 1000, einem Anpassungsverhältnis von 0,01, einem Haltewert von 2000 und einer Bearbeitungsgebühr von 0,0002.

Der Anfangspreis von TRX betrug 0,02676 U und der Höchstpreis während des Zeitraums erreichte 0,18 U. Derzeit liegt er bei etwa 0,08 U und weist sehr starke Schwankungen auf. Wenn Sie von Anfang an die Long-Short-Grid-Strategie verfolgen, kommt es am Ende zwangsläufig zu einer Liquidation Ihrer Short-Position. Eine ausgewogene Strategie ist kein großes Problem.

Die endgültige Rendite des Backtests beträgt 4524U, was sehr nahe an der Rendite von TRX bei 0,18 liegt. Der Hebel ist zu Beginn niedriger als 2-mal und am Ende niedriger als 0,4. Die Möglichkeit einer Liquidation wird immer geringer. Während In diesem Zeitraum kann der Wert der Beteiligungen gesteigert werden. Chance. Die Einkünfte unter 2000 Euro bleiben jedoch unverändert. Dies ist auch einer der Nachteile der ausgewogenen Strategie.

symbol = 'TRXUSDT'
df_trx = GetKlines(symbol=symbol,start='2021-1-1',end='2022-5-30',period='5m')
df_trx.close.plot(figsize=(15,6),grid=True);

png

#TRX平衡策略回测
hold_value = 2000
pct = 0.01
e = Exchange([symbol], fee=0.0002, initial_balance=1000)
init_price =  df_trx.iloc[0].open
res_list = [] #用于储存中间结果
e.Buy(symbol,init_price,hold_value/init_price)
e.Update({symbol:init_price})
for row in df_trx.itertuples():
    buy_price = (1-pct)*hold_value/e.account[symbol]['amount']
    sell_price = (1+pct)*hold_value/e.account[symbol]['amount']
    
    while row.low < buy_price:
        e.Buy(symbol,buy_price,pct*hold_value/buy_price)
        e.Update({symbol:row.close})
        buy_price = (1-pct)*hold_value/e.account[symbol]['amount']
        sell_price = (1+pct)*hold_value/e.account[symbol]['amount']
    while row.high > sell_price:
        e.Sell(symbol,sell_price,pct*hold_value/sell_price)
        e.Update({symbol:row.close})
        buy_price = (1-pct)*hold_value/e.account[symbol]['amount']
        sell_price = (1+pct)*hold_value/e.account[symbol]['amount']
    if int(row.time)%(60*60*1000) == 0:
        e.Update({symbol:row.close})
        res_list.append([row.time, row.close, e.account[symbol]['amount'],e.account[symbol]['amount']*row.close, e.account['USDT']['total']-e.initial_balance])
res_trx = pd.DataFrame(data=res_list, columns=['time','price','amount','value','profit'])
res_trx.index = pd.to_datetime(res_trx.time,unit='ms')
print(pct,e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit'] ,round(e.account['USDT']['fee'],0))
0.01 4524.226998288555 91.0
#收益
res_trx.profit.plot(figsize=(15,6),grid=True);

png

#实际占用杠杆
(res_trx.value/(res_trx.profit+1000)).plot(figsize=(15,6),grid=True);

png

Lassen Sie uns einen Backtest von WAVES durchführen. Diese Münze ist etwas ganz Besonderes. Sie stieg von 6U zu Beginn auf einen Höchststand von 60U und fiel schließlich wieder auf das aktuelle Niveau von 8U. Der endgültige Gewinn beträgt 4945, was weitaus mehr ist als der Gewinn durch das Halten der Münzen.

symbol = 'WAVESUSDT'
df_waves = GetKlines(symbol=symbol,start='2021-1-1',end='2022-5-30',period='5m')
df_waves.close.plot(figsize=(15,6),grid=True);

png

#TWAVES平衡策略回测
hold_value = 2000
pct = 0.01
e = Exchange([symbol], fee=0.0002, initial_balance=1000)
init_price =  df_waves.iloc[0].open
res_list = [] #用于储存中间结果
e.Buy(symbol,init_price,hold_value/init_price)
e.Update({symbol:init_price})
for row in df_waves.itertuples():
    buy_price = (1-pct)*hold_value/e.account[symbol]['amount']
    sell_price = (1+pct)*hold_value/e.account[symbol]['amount']
    
    while row.low < buy_price:
        e.Buy(symbol,buy_price,pct*hold_value/buy_price)
        e.Update({symbol:row.close})
        buy_price = (1-pct)*hold_value/e.account[symbol]['amount']
        sell_price = (1+pct)*hold_value/e.account[symbol]['amount']
    while row.high > sell_price:
        e.Sell(symbol,sell_price,pct*hold_value/sell_price)
        e.Update({symbol:row.close})
        buy_price = (1-pct)*hold_value/e.account[symbol]['amount']
        sell_price = (1+pct)*hold_value/e.account[symbol]['amount']
    if int(row.time)%(60*60*1000) == 0:
        e.Update({symbol:row.close})
        res_list.append([row.time, row.close, e.account[symbol]['amount'],e.account[symbol]['amount']*row.close, e.account['USDT']['total']-e.initial_balance])
res_waves = pd.DataFrame(data=res_list, columns=['time','price','amount','value','profit'])
res_waves.index = pd.to_datetime(res_waves.time,unit='ms')
print(pct,e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit'] ,round(e.account['USDT']['fee'],0))
0.01 4945.149323437233 178.0
df_waves.profit.plot(figsize=(15,6),grid=True);

png

Lassen Sie uns übrigens die Leistung der Rasterstrategie einem Backtest unterziehen. Der Rasterabstand beträgt 0,01 und der Rasterwert 10. Mit einer fast zehnfachen Steigerung erlebten sowohl WAVES als auch TRX enorme Rückschläge, wobei WAVES um 5.000 U und TRX um mehr als 3.000 U zurückgingen. Wenn das Anfangskapital gering ist, wird die Position grundsätzlich liquidiert.

#网格策略
pct = 0.01
value = 10*pct/0.01
e = Exchange([symbol], fee=0.0002, initial_balance=1000)
init_price =  df_waves.iloc[0].open
res_list = [] #用于储存中间结果
for row in df_waves.itertuples():
    buy_price = (value / pct - value) / (value / (pct * init_price) + e.account[symbol]['amount']) 
    sell_price = (value / pct + value) / (value / (pct *init_price) + e.account[symbol]['amount'])

    while row.low < buy_price:
        e.Buy(symbol,buy_price,value/buy_price)
        e.Update({symbol:row.close})
        buy_price = (value / pct - value) / (value / (pct * init_price) + e.account[symbol]['amount']) #买单价格,由于是挂单成交,也是最终的撮合价格=
    while row.high > sell_price:
        e.Sell(symbol,sell_price,value/sell_price)
        e.Update({symbol:row.close})
        sell_price = (value / pct + value) / (value / (pct *init_price) + e.account[symbol]['amount'])
    if int(row.time)%(60*60*1000) == 0:
        e.Update({symbol:row.close})
        res_list.append([row.time, row.close, e.account[symbol]['amount'],e.account[symbol]['amount']*row.close, e.account['USDT']['total']-e.initial_balance])
res_waves_net = pd.DataFrame(data=res_list, columns=['time','price','amount','value','profit'])
res_waves_net.index = pd.to_datetime(res_waves_net.time,unit='ms')
print(pct,e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit'] ,round(e.account['USDT']['fee'],0))
0.01 1678.0516101975015 70.0
res_waves_net.profit.plot(figsize=(15,6),grid=True);

png

#网格策略
pct = 0.01
value = 10*pct/0.01
e = Exchange([symbol], fee=0.0002, initial_balance=1000)
init_price =  df_trx.iloc[0].open
res_list = [] #用于储存中间结果
for row in df_trx.itertuples():
    buy_price = (value / pct - value) / (value / (pct * init_price) + e.account[symbol]['amount']) 
    sell_price = (value / pct + value) / (value / (pct *init_price) + e.account[symbol]['amount'])

    while row.low < buy_price:
        e.Buy(symbol,buy_price,value/buy_price)
        e.Update({symbol:row.close})
        buy_price = (value / pct - value) / (value / (pct * init_price) + e.account[symbol]['amount']) 
    while row.high > sell_price:
        e.Sell(symbol,sell_price,value/sell_price)
        e.Update({symbol:row.close})
        sell_price = (value / pct + value) / (value / (pct *init_price) + e.account[symbol]['amount'])
    if int(row.time)%(60*60*1000) == 0:
        e.Update({symbol:row.close})
        res_list.append([row.time, row.close, e.account[symbol]['amount'],e.account[symbol]['amount']*row.close, e.account['USDT']['total']-e.initial_balance])
res_trx_net = pd.DataFrame(data=res_list, columns=['time','price','amount','value','profit'])
res_trx_net.index = pd.to_datetime(res_trx_net.time,unit='ms')
print(pct,e.account['USDT']['realised_profit']+e.account['USDT']['unrealised_profit'] ,round(e.account['USDT']['fee'],0))
0.01 -161.06952570521656 37.0
res_trx_net.profit.plot(figsize=(15,6),grid=True);

png

Zusammenfassen

Bei dieser Backtest-Analyse wurde eine 5-Minuten-K-Linie verwendet, und die Schwankungen in der Mitte wurden nicht vollständig simuliert, sodass die tatsächliche Rendite etwas höher sein sollte. Im Allgemeinen birgt die ausgewogene Strategie relativ geringe Risiken, hat keine Angst vor rasanten Kursanstiegen, erfordert keine Parameteranpassung, ist relativ bequem zu verwenden und eignet sich für unerfahrene Benutzer. Die Netzstrategie reagiert sehr empfindlich auf die Festlegung des Anfangspreises und erfordert ein gewisses Urteilsvermögen hinsichtlich der Marktbedingungen. Auf lange Sicht ist das Risiko von Leerverkäufen sehr hoch. Diese Bärenmarktrunde ist seit einiger Zeit stabil am Boden. Viele Münzen sind von ihren Höchstständen um mehr als 90 % gefallen. Wenn Sie hinsichtlich einiger Münzen optimistisch sind, ist dies ein guter Zeitpunkt, um in den Markt einzusteigen. Vielleicht möchten Sie Beginnen Sie mit einer ausgewogenen Kaufstrategie zum Tiefpunkt. Fügen Sie einen kleinen Hebel hinzu, um von Volatilität und Preisanstiegen zu profitieren. Dieser Binance Thousand Group War ermöglicht die kostenlose Nutzung der Perpetual Balance Strategy und jeder ist herzlich eingeladen, sie auszuprobieren.