अतीत में, एफएमजेड ने आधिकारिक तौर पर एक शाश्वत ग्रिड रणनीति जारी की, जो उपयोगकर्ताओं के बीच लोकप्रिय थी, और वास्तविक बॉट्स में TRX का व्यापार करने वाले दर्शकों ने पिछले वर्ष नियंत्रित जोखिमों के साथ बहुत लाभ कमाया है। हालांकि, शाश्वत ग्रिड रणनीति में कुछ समस्याएं भी हैंः
मैंने पहले संतुलन रणनीति के सिद्धांत और ग्रिड रणनीति के साथ तुलना पर एक लेख लिखा था, और आप अभी भी इसका संदर्भ ले सकते हैंःhttps://www.fmz.com/digest-topic/9294. संतुलन रणनीति हमेशा एक निश्चित मूल्य अनुपात या मूल्य के साथ पदों को रखती है, जब यह बढ़ता है तो कुछ बेचती है, और जब यह गिरता है तो खरीदती है। इसे सरल सेटिंग्स के साथ चलाया जा सकता है। भले ही मुद्रा मूल्य बहुत बढ़ जाए, तो शॉर्ट होने का कोई खतरा नहीं है। स्पॉट बैलेंस रणनीति के साथ समस्या यह है कि पूंजी उपयोग कम है, और लाभप्रदता बढ़ाने का कोई आसान तरीका नहीं है। और स्थायी अनुबंध समस्या को हल कर सकते हैं। यदि कुल पूंजी 1000 है, तो 2000 को निश्चित रूप से रखा जा सकता है, जो मूल पूंजी से अधिक है और पूंजी उपयोग में सुधार करता है। एक और पैरामीटर समायोजन अनुपात है, जो स्थिति में कितना सैकल या डंप करता है। यदि इसे 0.01 पर सेट किया जाता है, तो इसका मतलब है कि स्थिति 1% वृद्धि के लिए एक बार डंप की जाती है और 1% कमी के लिए एक बार स्केल की जाती है।
शुरुआती लोगों के लिए, संतुलन रणनीति की अत्यधिक अनुशंसा की जाती है। ऑपरेशन सरल है, बस होल्डिंग अनुपात या स्थिति मूल्य का एक पैरामीटर सेट करें, और आप इसे निरंतर मूल्य वृद्धि के बारे में चिंता किए बिना दिमाग से चला सकते हैं। कुछ अनुभव वाले लोग ग्रिड रणनीति चुन सकते हैं, और ग्रिड के लिए उतार-चढ़ाव और धन की ऊपरी और निचली सीमाओं का फैसला कर सकते हैं, ताकि धन का उपयोग बेहतर हो सके और अधिकतम लाभ प्राप्त हो सके।
अधिक व्यापारिक जोड़े के बैकटेस्टिंग को सुविधाजनक बनाने के लिए, यह दस्तावेज़ पूर्ण बैकटेस्टिंग प्रक्रिया दिखाएगा, और उपयोगकर्ता तुलना के लिए विभिन्न मापदंडों और व्यापारिक जोड़े को समायोजित कर सकते हैं। (संस्करण पायथन 3 है, और एक एजेंट को उद्धरण डाउनलोड करने की आवश्यकता है। उपयोगकर्ता स्वयं अनानकोडा 3 डाउनलोड कर सकते हैं या इसे Google के सहकार्य के माध्यम से चला सकते हैं)
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
## Current trading pairs
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']
#Get the function of the K-line of any period
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
2021 से वर्तमान तक सभी ट्रेडिंग जोड़े की समापन कीमतों को डाउनलोड करके, हम समग्र बाजार सूचकांक में परिवर्तनों का निरीक्षण कर सकते हैंः 2021 से 2022 तक निस्संदेह एक बैल बाजार है, और सूचकांक एक बार 14 गुना बढ़ गया था। यह कहा जा सकता है कि सोना हर जगह है, और कई मुद्राएं सैकड़ों बार बढ़ी हैं। हालांकि, 2022 में, भालू बाजार शुरू हो गया है जो आधे साल तक चला है, जिसमें सूचकांक 80% गिर गया है, और दर्जनों मुद्राएं 90% से अधिक वापस ले ली गई हैं। इस तरह का पंप-एंड-डंप ग्रिड रणनीतियों के भारी जोखिम को दर्शाता है। सूचकांक वर्तमान में लगभग 3 पर है, जो अभी भी 2021 की शुरुआत की तुलना में 200% की वृद्धि है, और बाजार के विकास को ध्यान में रखते हुए, यह फिलहाल एक सापेक्ष निचला स्तर होना चाहिए।
जिन मुद्राओं का उच्चतम मूल्य वर्ष की शुरुआत के बाद से 10 गुना से अधिक बढ़ गया हैः
उच्चतम बिंदु से 80% से अधिक वर्तमान ड्रॉडाउन वाली मुद्राएंः
#Download closing prices for all trading pairs
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
#Index changes
df_norm = df_all/df_all.fillna(method='bfill').iloc[0] #Normalization
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);
#The highest increase over the beginning of the year
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}
#Current maximum backtest
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}
सबसे पहले, हम सबसे सरल कोड का उपयोग करने के लिए स्थिति का अनुकरण करने के लिए सभी तरह से नीचे गिरना, और विभिन्न स्थिति मूल्यों के परिसमापन मूल्य को देखना। चूंकि रणनीति हमेशा एक लंबी स्थिति रखती है, इसलिए ऊपर जाने में कोई जोखिम नहीं है। प्रारंभिक पूंजी 1000 है, मुद्रा मूल्य 1 है, और समायोजन अनुपात 0.01 है। परिणाम इस प्रकार हैं। यह देखा जा सकता है कि लंबे परिसमापन का जोखिम कम नहीं है। 1.5 गुना लाभप्रदता के साथ, यह 50% की गिरावट का सामना कर सकता है। वर्तमान सापेक्ष निचले स्तर की स्थिति को देखते हुए, यह एक स्वीकार्य जोखिम है।
पदों का मूल्य | लंबी स्थिति की कीमत |
---|---|
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
#Still using the original backtesting engine
class Exchange:
def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
self.initial_balance = initial_balance #Initial assets
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 the handling fees
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #Close the position first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #Profits
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 of assets
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)
सबसे पहले, हम TRX बैलेंस रणनीति के प्रदर्शन का बैकटेस्ट करते हैं। भालू बाजार के इस दौर में TRX का अधिकतम रिट्रेसमेंट अपेक्षाकृत छोटा है, इसलिए इसकी एक निश्चित विशिष्टता है। डेटा 2021 से वर्तमान तक 5min K-लाइन से चुना गया है, 1000 की प्रारंभिक पूंजी के साथ, समायोजन अनुपात 0.01, स्थिति मूल्य 2000 है, और हैंडलिंग शुल्क 0.0002 है।
TRX की प्रारंभिक कीमत 0.02676U थी, और इस अवधि के दौरान उच्चतम मूल्य 0.18U तक पहुंच गया। यह वर्तमान में 0.08U के आसपास है, और उतार-चढ़ाव बहुत हिंसक हैं। यदि आप शुरुआत में लंबी-छोटी ग्रिड रणनीति चलाते हैं, तो शॉर्ट-सेलिंग के परिणाम से बचना मुश्किल है। संतुलन रणनीतियां कम समस्याग्रस्त हैं।
बैकटेस्ट का अंतिम रिटर्न 4524U है, जो TRX के रिटर्न के 0.18 के बहुत करीब है। लीवरेज शुरुआत से 2 गुना से कम है और अंत में 0.4 से कम है, और परिसमापन की संभावना भी कम और कम हो रही है, जिसके दौरान स्थिति के मूल्य को बढ़ाने का अवसर हो सकता है। लेकिन 2000U से नीचे हमेशा एक ही आय है। यह संतुलन रणनीति के नुकसान में से एक भी है।
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);
#TRX balance strategy backtest
hold_value = 2000
pct = 0.01
e = Exchange([symbol], fee=0.0002, initial_balance=1000)
init_price = df_trx.iloc[0].open
res_list = [] #For storing intermediate results
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
#Profit
res_trx.profit.plot(figsize=(15,6),grid=True);
#Actual leverage of occupancy
(res_trx.value/(res_trx.profit+1000)).plot(figsize=(15,6),grid=True);
चलिए फिर से WAVES का बैकटेस्ट करते हैं। यह मुद्रा काफी खास है। यह शुरुआत में 6U से 60U तक बढ़ी, और अंत में वर्तमान 8U पर वापस गिर गई। अंतिम लाभ 4945 है, मुद्रा को अपरिवर्तित रखने के लाभ से बहुत अधिक।
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);
#TWAVES balanced strategy backtest
hold_value = 2000
pct = 0.01
e = Exchange([symbol], fee=0.0002, initial_balance=1000)
init_price = df_waves.iloc[0].open
res_list = [] #For storing intermediate results
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);
वैसे, ग्रिड रणनीति के प्रदर्शन का बैकटेस्ट किया गया है, ग्रिड स्पेसिंग 0.01 है, और ग्रिड मान 10 है। लगभग 10 गुना वृद्धि के मामले में, वेव्स और टीआरएक्स दोनों ने भारी ड्रॉडाउन का अनुभव किया है। उनमें से, वेव्स ने 5000U वापस ले लिया है, और टीआरएक्स ने भी 3000U को पार कर लिया है। यदि प्रारंभिक पूंजी छोटी है, तो पदों को लगभग समाप्त कर दिया जाएगा।
#Grid strategy
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 storing intermediate results
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']) #The buy order price, since it is a pending order transaction, is also the final matching price=
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);
#Grid strategy
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 storing intermediate results
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);
इस बार, बैकटेस्ट विश्लेषण ने 5 मिनट के-लाइन का उपयोग किया, बीच में उतार-चढ़ाव पूरी तरह से अनुकरण नहीं किया गया है, इसलिए वास्तविक लाभ थोड़ा अधिक होना चाहिए। कुल मिलाकर, संतुलन रणनीति अपेक्षाकृत कम जोखिम लेती है, आसमान छूने से डरती नहीं है, और मापदंडों को समायोजित करने की कोई आवश्यकता नहीं है, यह अपेक्षाकृत आसान है और नौसिखिया उपयोगकर्ताओं के लिए उपयुक्त है। ग्रिड रणनीति प्रारंभिक मूल्य निर्धारण के लिए बहुत संवेदनशील है और बाजार के कुछ निर्णय की आवश्यकता है। लंबे समय में, शॉर्ट जाने का जोखिम अधिक है। वर्तमान दौर का भालू बाजार कुछ समय के लिए नीचे स्थिर रहा है, कई मुद्राएं वर्तमान में अपने उच्च स्तर से 90% से अधिक नीचे हैं, यदि आप कुछ मुद्राओं के बारे में आशावादी हैं, तो यह बाजार में प्रवेश करने का एक अच्छा समय है, आप नीचे खरीदने के लिए संतुलन रणनीति खोलना चाह सकते हैं, थोड़ा लाभ जोड़ सकते हैं और मूल्य अस्थिरता और वृद्धि से लाभ प्राप्त कर सकते हैं।
Binance Thousand League Battle अनंत संतुलन रणनीति के लिए मुफ्त पहुंच प्रदान करेगा, और हर किसी का इसका अनुभव करने के लिए स्वागत है।