Type/to search
3
Follow
1507
Followers
Perpetual-Balance-Strategie für den Kauf am Tiefpunkt eines Bärenmarktes
Discussions
Created 2022-06-02 10:00:04  Updated 2024-12-02 21:36:36
 7
 6502

img

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.)

python
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
python
## 当前交易对 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']
python
#获取任意周期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

python
#下载所有交易对的收盘价 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
python
#指数变化 df_norm = df_all/df_all.fillna(method='bfill').iloc[0] #归一化 df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);

png

python
#比年初的最高涨幅 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}
python
#当前最大回测 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.

PositionswertLanger Liquidationspreis
3000.035
5000.133
8000.285
10000.362
15000.51
20000.599
30000.711
50000.81
100000.904
python
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
python
#还是用原来的回测引擎 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.

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

png

python
#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
python
#收益 res_trx.profit.plot(figsize=(15,6),grid=True);

png

python
#实际占用杠杆 (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.

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

png

python
#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
python
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.

python
#网格策略 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
python
res_waves_net.profit.plot(figsize=(15,6),grid=True);

png

python
#网格策略 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
python
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.

Related Recommendations
Comment
All comments (7)

    使用策略一定比持币不动更优吗?

    4 years ago

    每种策略都是在特定场景下有效,平衡策略是逆趋势策略,持币不动约等于不加仓不补仓杠杆为本金的顺趋势策略

    4 years ago

    怎么加入你们的千团大战?又如何使用你们的这个策略?

    4 years ago

    币安千团大战的策略在哪里呀?

    4 years ago

    美元加息缩表大背景下,加密货币市场还会处于熊市状态一段时间吧,这样的话最近半年内,像TRX、ETH这种是不是继续用网格收益率会高一些呢?

    4 years ago

    本文的缺点是没办法计算资费,长期持有的情况下,资费影响巨大!牛是资费通常为正,也就是说持有多仓会缴费,而且缴很多!而熊市反之。

    4 years ago

    牛逼

    4 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)