একটি স্থায়ী ভারসাম্য কৌশল হ্রাস বাজারের জন্য উপযুক্ত

লেখক:লিডিয়া, সৃষ্টিঃ ২০২২-০৮-১৬ ০৯ঃ২২ঃ১৪, আপডেটঃ ২০২৩-০৯-১৯ ২১ঃ৪২ঃ১২

img

অতীতে, এফএমজেড আনুষ্ঠানিকভাবে একটি চিরস্থায়ী গ্রিড কৌশল প্রকাশ করেছিল, যা ব্যবহারকারীদের মধ্যে জনপ্রিয় ছিল, এবং প্রকৃত বটগুলিতে TRX ট্রেড করা দর্শকরা গত বছরে নিয়ন্ত্রণযোগ্য ঝুঁকি নিয়ে প্রচুর লাভ অর্জন করেছে। তবে চিরস্থায়ী গ্রিড কৌশলটির কিছু সমস্যাও রয়েছেঃ

  1. প্রাথমিক মূল্য, গ্রিড স্পেসিং, গ্রিড মান, দীর্ঘ-স্বল্প মোড ইত্যাদির মতো পরামিতিগুলি সেট করা প্রয়োজন। সেটিংসগুলি জটিল এবং মুনাফায় ব্যাপক প্রভাব ফেলে, যা শিক্ষানবিশদের জন্য সেট করা কঠিন করে তোলে।
  2. চিরস্থায়ী গ্রিড কৌশলটি শর্ট বিক্রয়ের উচ্চ ঝুঁকি রয়েছে, যখন দীর্ঘ বিক্রয়ের ঝুঁকি তুলনামূলকভাবে কম। এমনকি যদি গ্রিডের মানটি একটি ছোট মান হিসাবে সেট করা হয় তবে এটি শর্ট বিক্রয়ের দামের উপর খুব বেশি প্রভাব ফেলবে না।
  3. শাশ্বত চুক্তি গ্রিডটি শর্ট হওয়ার ঝুঁকি এড়াতে কেবল দীর্ঘ যেতে বেছে নিতে পারে, এটি এখন পর্যন্ত ঠিক আছে বলে মনে হচ্ছে। তবে এটি বর্তমান দামের প্রাথমিক মূল্যের চেয়ে বেশি সমস্যাটির মুখোমুখি হতে হবে, যার ফলে একটি শর্ট পজিশন হয় এবং প্রাথমিক মূল্য পুনরায় সেট করা দরকার।

আমি আগে একটি নিবন্ধ লিখেছিলাম ভারসাম্য কৌশল নীতি এবং গ্রিড কৌশল সঙ্গে তুলনা সম্পর্কে, এবং আপনি এখনও এটি এখন পড়ুন করতে পারেনঃhttps://www.fmz.com/digest-topic/9294. ব্যালেন্স কৌশল সর্বদা একটি স্থির মান অনুপাত বা মান সহ অবস্থানগুলি ধরে রাখে, যখন এটি বৃদ্ধি পায় তখন কিছু বিক্রি করে এবং যখন এটি কমে যায় তখন ক্রয় করে। এটি সহজ সেটিংস দিয়ে চালানো যেতে পারে। এমনকি যদি মুদ্রার দাম অনেক বেড়ে যায় তবে শর্ট হওয়ার ঝুঁকি নেই। স্পট ব্যালেন্স কৌশলটির সমস্যা হ'ল মূলধন ব্যবহার কম, এবং লিভারেজ বাড়ানোর কোনও সহজ উপায় নেই। এবং চিরস্থায়ী চুক্তি সমস্যাটি সমাধান করতে পারে। যদি মোট মূলধন 1000 হয় তবে 2000 স্থিরভাবে রাখা যেতে পারে, যা মূল মূলধন ছাড়িয়ে যায় এবং মূলধন ব্যবহারকে উন্নত করে। আরেকটি পরামিতি হ'ল সমন্বয় অনুপাত, যা অবস্থানটি কত পরিমাণে স্যাকল করতে বা ডাম্প করতে পারে তা নিয়ন্ত্রণ করে। যদি এটি 0.01 এ সেট করা হয় তবে এর অর্থ হল যে অবস্থানটি 1% বৃদ্ধির জন্য একবার ডাম্প করা হয় এবং 1% হ্রাসের জন্য একবার স্কেল করা হয়।

নতুনদের জন্য, ভারসাম্য কৌশল অত্যন্ত সুপারিশ করা হয়। অপারেশনটি সহজ, কেবল হোল্ডিং অনুপাত বা অবস্থানের মানের একটি পরামিতি সেট করুন, এবং আপনি ধ্রুবক মূল্য বৃদ্ধির বিষয়ে চিন্তা না করেই এটি নির্বিঘ্নে চালাতে পারেন। নির্দিষ্ট অভিজ্ঞতা সহ যারা গ্রিড কৌশল চয়ন করতে পারেন, এবং গ্রিড প্রতি ওঠানামা এবং তহবিলের উপরের এবং নীচের সীমা নির্ধারণ করতে পারেন, যাতে তহবিলের ব্যবহার উন্নত করা যায় এবং সর্বাধিক মুনাফা অর্জন করা যায়।

আরো ট্রেডিং জোড়ার ব্যাকটেস্টিং সহজ করার জন্য, এই নথিটি সম্পূর্ণ ব্যাকটেস্টিং প্রক্রিয়া দেখায়, এবং ব্যবহারকারীরা তুলনা করার জন্য বিভিন্ন পরামিতি এবং ট্রেডিং জোড়া সামঞ্জস্য করতে পারেন। (সংস্করণটি পাইথন 3 এবং একটি এজেন্টের উদ্ধৃতি ডাউনলোড করার প্রয়োজন। ব্যবহারকারীরা নিজেরাই আনানকোডা 3 ডাউনলোড করতে পারেন বা এটি গুগলের কোলাবের মাধ্যমে চালাতে পারেন)

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

২০২১ থেকে বর্তমান পর্যন্ত সমস্ত ট্রেডিং জোড়ার বন্ধের দাম ডাউনলোড করে, আমরা সামগ্রিক বাজার সূচকের পরিবর্তনগুলি পর্যবেক্ষণ করতে পারিঃ ২০২১ থেকে ২০২২ অবধি নিঃসন্দেহে একটি ষাঁড়ের বাজার, এবং সূচকটি একবার ১৪ গুণ বেড়েছে। বলা যেতে পারে যে সোনার সর্বত্র রয়েছে এবং অনেক মুদ্রা শত শত গুণ বেড়েছে। তবে ২০২২ সালে, অর্ধ বছর ধরে চলমান ভালুকের বাজার শুরু হয়েছে, সূচকটি ৮০% কমেছে এবং কয়েক ডজন মুদ্রা ৯০% এরও বেশি প্রত্যাহার করেছে। এই জাতীয় পাম্প-এন্ড-ডাম্প গ্রিড কৌশলগুলির বিশাল ঝুঁকি প্রতিফলিত করে। সূচকটি বর্তমানে প্রায় ৩-এ রয়েছে, যা ২০২১ সালের শুরুর তুলনায় এখনও ২০০% বৃদ্ধি এবং বাজারের বিকাশ বিবেচনা করে এটি এই মুহুর্তে একটি আপেক্ষিক নীচে থাকা উচিত।

যে মুদ্রাগুলির সর্বোচ্চ মূল্য বছরের শুরু থেকে দশগুণেরও বেশি বেড়েছেঃ

০১ঃ১০৪, ০১ঃ১০৪, ০১ঃ১০৪, ০১ঃ১০৪, ০১ঃ১০৫, ০১ঃ১০৫, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ১০, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ৩, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০১ঃ২, ০২, ০২ঃ২, ০

সর্বাধিক পয়েন্ট থেকে 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);

png

#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 থেকে বর্তমান পর্যন্ত 5 মিনিটের K-লাইন থেকে ডেটা নির্বাচন করা হয়, প্রাথমিক মূলধন 1000, সমন্বয় অনুপাত 0.01, অবস্থান মান 2000 এবং হ্যান্ডলিং ফি 0.0002।

TRX এর প্রাথমিক মূল্য ছিল 0.02676U, এবং এই সময়ের মধ্যে সর্বোচ্চ মূল্য 0.18U পৌঁছেছে। এটি বর্তমানে প্রায় 0.08U, এবং ওঠানামা খুব হিংস্র। আপনি যদি শুরুতে দীর্ঘ-স্বল্প গ্রিড কৌশল চালান তবে শর্ট-বিক্রয়ের ফলাফল থেকে পালানো কঠিন। ভারসাম্য কৌশলগুলি কম সমস্যা।

ব্যাকটেস্টের চূড়ান্ত রিটার্ন 4524U, যা TRX এর রিটার্নের 0.18 এর খুব কাছাকাছি। লিভারেজটি শুরু থেকে 2 গুণেরও কম এবং শেষ পর্যন্ত 0.4 এরও কম, এবং তরলীকরণের সম্ভাবনাও কমছে এবং কমছেr, যার সময় অবস্থানের মান বাড়ানোর সুযোগ থাকতে পারে। তবে 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);

png

#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);

png

#Actual leverage of occupancy
(res_trx.value/(res_trx.profit+1000)).plot(figsize=(15,6),grid=True);

png

আসুন আবার 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);

png

#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);

png

যাইহোক, গ্রিড কৌশলটির কর্মক্ষমতা ব্যাকটেস্ট করা হয়েছে, গ্রিড স্পেসিং 0.01 এবং গ্রিড মান 10। বৃদ্ধির প্রায় 10 গুণের ক্ষেত্রে, ওয়েভস এবং টিআরএক্স উভয়ই বিশাল ড্রডাউন অভিজ্ঞতা অর্জন করেছে। তাদের মধ্যে, ওয়েভস 5000 ইউ প্রত্যাহার করেছে এবং টিআরএক্সও 3000 ইউ ছাড়িয়েছে। যদি প্রাথমিক মূলধন ছোট হয় তবে অবস্থানগুলি প্রায় তরল হয়ে যাবে।

#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);

png

#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);

png

সংক্ষিপ্তসার

এই সময়, ব্যাকটেস্ট বিশ্লেষণটি 5 মিনিটের কে-লাইন ব্যবহার করেছে, মাঝখানে ওঠানামা সম্পূর্ণরূপে সিমুলেট করা হয়নি, তাই প্রকৃত লাভ কিছুটা বেশি হওয়া উচিত। সামগ্রিকভাবে, ভারসাম্য কৌশলটি তুলনামূলকভাবে কম ঝুঁকি বহন করে, আকাশে উড়ার ভয় পায় না এবং পরামিতিগুলি সামঞ্জস্য করার দরকার নেই, এটি ব্যবহার করা তুলনামূলকভাবে সহজ এবং শিক্ষানবিস ব্যবহারকারীদের জন্য উপযুক্ত। গ্রিড কৌশলটি প্রাথমিক মূল্য নির্ধারণের জন্য খুব সংবেদনশীল এবং বাজারের কিছু বিচার প্রয়োজন। দীর্ঘমেয়াদে, শর্ট যাওয়ার ঝুঁকি বেশি। বর্তমান রাউন্ডের ভালুকের বাজারটি কিছু সময়ের জন্য নীচে স্থিতিশীল হয়েছে, অনেক মুদ্রা বর্তমানে তাদের উচ্চতা থেকে 90% এরও বেশি হ্রাস পেয়েছে, যদি আপনি কিছু মুদ্রার বিষয়ে আশাবাদী হন তবে এটি বাজারে প্রবেশের জন্য একটি ভাল সময়, আপনি নীচে কিনতে একটি ভারসাম্য কৌশল খুলতে চাইতে পারেন, কিছুটা লিভারেজ যুক্ত করুন এবং দামের অস্থিরতা এবং বৃদ্ধি থেকে মুনাফা অর্জন করুন।

বাইনারেন্সের হাজার লিগ ব্যাটেল চিরস্থায়ী ভারসাম্য কৌশলটিতে বিনামূল্যে অ্যাক্সেস প্রদান করবে, এবং সবাই এটি অভিজ্ঞতা নিতে স্বাগত জানায়।


সম্পর্কিত

আরো