بائننس فیوچر ملٹی کرنسی ہیجنگ حکمت عملی حصہ 4 پر تحقیق

مصنف:نیکی, تخلیق: 2020-05-14 15:18:56, تازہ کاری: 2023-11-04 19:51:33

img

بائننس فیوچر ملٹی کرنسی ہیجنگ حکمت عملی کا حالیہ جائزہ اور منٹ کی سطح پر K لائن بیک ٹیسٹ کے نتائج

بائننس کی کثیر کرنسی ہیجنگ حکمت عملی کے بارے میں تین تحقیقی رپورٹس شائع کی گئی ہیں ، یہاں چوتھا ہے۔ پہلے تین مضامین کا تعلق ، اگر آپ نے اسے نہیں پڑھا ہے تو آپ اسے دوبارہ پڑھنا چاہئے ، آپ حکمت عملی کے تشکیلاتی خیال ، مخصوص پیرامیٹرز کی ترتیب اور حکمت عملی کی منطق کو سمجھ سکتے ہیں۔

بائننس فیوچر ملٹی کرنسی ہیجنگ حکمت عملی پر تحقیق حصہ 1:https://www.fmz.com/digest-topic/5584

بائننس فیوچر ملٹی کرنسی ہیجنگ حکمت عملی پر تحقیق حصہ 2:https://www.fmz.com/digest-topic/5588

بائننس فیوچر ملٹی کرنسی ہیجنگ حکمت عملی پر تحقیق حصہ 3:https://www.fmz.com/digest-topic/5605

اس مضمون کا مقصد حالیہ ہفتے کی حقیقی مارکیٹ کی صورتحال کا جائزہ لینا ہے ، اور فوائد اور نقصانات کا خلاصہ کرنا ہے۔ پچھلے دو مہینوں کے بائننس فیوچر منٹ K لائن کے اعداد و شمار کو تلاش کرنے کے بعد ، اصل 1h K لائن بیک ٹسٹ کے نتائج کو اپ ڈیٹ کیا جاسکتا ہے ، جو کچھ پیرامیٹر کی ترتیبات کے معنی کو بہتر طور پر بیان کرسکتا ہے۔

# Libraries to import
import pandas as pd
import requests
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
symbols = ['BTC','ETH', 'BCH', 'XRP', 'EOS', 'LTC', 'TRX', 'ETC', 'LINK', 'XLM', 'ADA', 'XMR', 'DASH', 'ZEC', 'XTZ', 'BNB', 'ATOM', 'ONT', 'IOTA', 'BAT', 'VET', 'NEO', 'QTUM', 'IOST']

منٹ کی سطح کے K لائن ڈیٹا

21 فروری سے 15 اپریل دوپہر دو بجے تک کے اعداد و شمار ، مجموعی طور پر 77160 * 24 ، جس نے ہماری بیک ٹیسٹ کی رفتار کو بہت کم کردیا ، بیک ٹیسٹ انجن کافی موثر نہیں ہے ، آپ اسے خود بہتر بنا سکتے ہیں۔ مستقبل میں ، میں باقاعدگی سے تازہ ترین اعداد و شمار کو ٹریک کروں گا۔

price_usdt = pd.read_csv('https://www.fmz.com/upload/asset/2b1fa7ab641385067ad.csv',index_col = 0)
price_usdt.shape
(77160, 24)
price_usdt.index = pd.to_datetime(price_usdt.index,unit='ms')
price_usdt_norm = price_usdt/price_usdt.fillna(method='bfill').iloc[0,]
price_usdt_btc = price_usdt.divide(price_usdt['BTC'],axis=0)
price_usdt_btc_norm = price_usdt_btc/price_usdt_btc.fillna(method='bfill').iloc[0,]
class Exchange:
    
    def __init__(self, trade_symbols, leverage=20, commission=0.00005,  initial_balance=10000, log=False):
        self.initial_balance = initial_balance # Initial asset
        self.commission = commission
        self.leverage = leverage
        self.trade_symbols = trade_symbols
        self.date = ''
        self.log = log
        self.df = pd.DataFrame(columns=['margin','total','leverage','realised_profit','unrealised_profit'])
        self.account = {'USDT':{'realised_profit':0, 'margin':0, 'unrealised_profit':0, 'total':initial_balance, 'leverage':0, 'fee':0}}
        for symbol in trade_symbols:
            self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0, 'margin':0, 'unrealised_profit':0,'fee':0}
            
    def Trade(self, symbol, direction, price, amount, msg=''):
        if self.date and self.log:
            print('%-20s%-5s%-5s%-10.8s%-8.6s %s'%(str(self.date), symbol, 'buy' if direction == 1 else 'sell', price, amount, msg))
            
        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.commission # Minus handling fee
        self.account['USDT']['fee'] += price*amount*self.commission
        self.account[symbol]['fee'] += price*amount*self.commission
        
        if cover_amount > 0: # close position first
            self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  # profit
            self.account['USDT']['margin'] -= cover_amount*self.account[symbol]['hold_price']/self.leverage # Free margin
            
            self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
            self.account[symbol]['amount'] -= -direction*cover_amount
            self.account[symbol]['margin'] -=  cover_amount*self.account[symbol]['hold_price']/self.leverage
            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['USDT']['margin'] +=  open_amount*price/self.leverage            
            self.account[symbol]['hold_price'] = total_cost/total_amount
            self.account[symbol]['amount'] += direction*open_amount
            self.account[symbol]['margin'] +=  open_amount*price/self.leverage
            
        self.account[symbol]['unrealised_profit'] = (price - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
        self.account[symbol]['price'] = price
        self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*price
        
        return True
    
    def Buy(self, symbol, price, amount, msg=''):
        self.Trade(symbol, 1, price, amount, msg)
        
    def Sell(self, symbol, price, amount, msg=''):
        self.Trade(symbol, -1, price, amount, msg)
        
    def Update(self, date, close_price): # Update assets
        self.date = date
        self.close = close_price
        self.account['USDT']['unrealised_profit'] = 0
        for symbol in self.trade_symbols:
            if np.isnan(close_price[symbol]):
                continue
            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)
        self.account['USDT']['leverage'] = round(self.account['USDT']['margin']/self.account['USDT']['total'],4)*self.leverage
        self.df.loc[self.date] = [self.account['USDT']['margin'],self.account['USDT']['total'],self.account['USDT']['leverage'],self.account['USDT']['realised_profit'],self.account['USDT']['unrealised_profit']]

پچھلے ہفتے کا جائزہ

حکمت عملی کا کوڈ 10 اپریل کو وی چیٹ گروپ میں جاری کیا گیا تھا۔ شروع میں ، لوگوں کے ایک گروپ نے حکمت عملی 2 ((مختصر اوور رائز اور لانگ اوور فال) چلائی۔ پہلے تین دن میں ، واپسی بہت اچھی تھی ، اور ریٹریکشن بہت کم تھا۔ اگلے دنوں میں ، کچھ تاجر نے فائدہ اٹھانے میں اضافہ کیا ، کچھ نے اپنے فنڈز کی پوری رقم کو بھی کام کرنے کے لئے استعمال کیا ، اور ایک دن میں منافع 10 فیصد تک پہنچ گیا۔ حکمت عملی اسکوائر نے بہت ساری حقیقی مارکیٹ کی حکمت عملیوں کو بھی جاری کیا ، بہت سے لوگوں نے قدامت پسند تجویز کردہ پیرامیٹرز سے ناخوش ہونا شروع کیا ، اور لین دین کا حجم بڑھا دیا ہے۔ 13 اپریل کے بعد ، بی این بی کے آزاد رجحان کی وجہ سے ، منافع میں کمی اور سائیڈ ویو ہونا شروع ہوا۔ اگر آپ 3٪ trade_value کے پیرامیٹرز کو دیکھتے ہیں تو ، یہ شاید 1٪ کم ہو گیا ہے۔ تاہم ، بڑھے ہوئے پیرامیٹرز کی وجہ سے ، بہت سے تاجر کم کماتے ہیں اور ہر ایک کو کماتے ہیں۔ ریٹریکشن کی یہ لہر بروقت ، تھوڑا سا پرسکون

img

آئیے حکمت عملی 2 کے مکمل کرنسی بیک ٹیسٹ پر ایک نظر ڈالتے ہیں۔ یہاں ، چونکہ یہ ایک منٹ کی سطح کی تازہ کاری ہے ، لہذا الفا پیرامیٹر کو ایڈجسٹ کرنے کی ضرورت ہے۔ حقیقی مارکیٹ کے نقطہ نظر سے ، منحنی رجحان مستقل ہے ، جس سے یہ ظاہر ہوتا ہے کہ ہمارا بیک ٹیسٹ ایک مضبوط حوالہ کے طور پر استعمال کیا جاسکتا ہے۔ خالص قیمت 4.13 سے خالص قیمت کی چوٹی تک پہنچ گئی ہے اور اس میں واپسی اور ضمنی مرحلے میں رہی ہے۔

Alpha = 0.001
#price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.rolling(20).mean() # Ordinary moving average
price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() # Here is consistent with the strategy, using EMA
trade_symbols = list(set(symbols))
price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.00075,log=False)
trade_value = 300
for row in price_usdt.iloc[-7500:].iterrows():
    e.Update(row[0], row[1])
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        if aim_value - now_value > 0.5*trade_value:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -0.5*trade_value:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2a = e
(stragey_2a.df['total']/stragey_2d.initial_balance).plot(figsize=(17,6),grid = True);

img

حکمت عملی 1، مختصر الٹکوئن حکمت عملی مثبت واپسی حاصل کرتی ہے

trade_symbols = list(set(symbols)-set(['LINK','BTC','XTZ','BCH', 'ETH'])) # Selling short currencies
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.00075,log=False)
trade_value = 2000
for row in price_usdt.iloc[-7500:].iterrows():
    e.Update(row[0], row[1])
    empty_value = 0
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        if e.account[symbol]['value'] - trade_value  < -120 :
            e.Sell(symbol, price, round((trade_value-e.account[symbol]['value'])/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if e.account[symbol]['value'] - trade_value > 120 :
            e.Buy(symbol, price, round((e.account[symbol]['value']-trade_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        empty_value += e.account[symbol]['value']
    price = row[1]['BTC']
    if e.account['BTC']['value'] - empty_value < -120:
        e.Buy('BTC', price, round((empty_value-e.account['BTC']['value'])/price,6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
    if e.account['BTC']['value'] - empty_value > 120:
        e.Sell('BTC', price, round((e.account['BTC']['value']-empty_value)/price,6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
stragey_1 = e
(stragey_1.df['total']/stragey_1.initial_balance).plot(figsize=(17,6),grid = True);

img

حکمت عملی 2 خریدنا طویل زیادہ کمی اور فروخت مختصر زیادہ اضافہ منافع تجزیہ

حتمی اکاؤنٹ کی معلومات کو پرنٹ کرنے سے پتہ چلتا ہے کہ زیادہ تر کرنسیوں نے منافع حاصل کیا ہے ، اور بی این بی نے سب سے زیادہ نقصان اٹھایا ہے۔ اس کی بنیادی وجہ یہ بھی ہے کہ بی این بی آزاد رجحان کی لہر سے باہر نکل گیا ہے ، بہت زیادہ بڑھ رہا ہے اور سب سے بڑا انحراف 0.06 ہے۔

pd.DataFrame(stragey_2a.account).T.apply(lambda x:round(x,3)).sort_values(by='realised_profit')

img

# BNB deviation
(price_usdt_btc_norm2.iloc[-7500:].BNB-price_usdt_btc_norm_mean[-7500:]).plot(figsize=(17,6),grid = True);
#price_usdt_btc_norm_mean[-7500:].plot(figsize=(17,6),grid = True);

img

اگر بی این بی اور اے ٹی او ایم کو ہٹا دیا جائے تو نتیجہ بہتر ہے، لیکن حکمت عملی ابھی بھی حال ہی میں واپسی کے مرحلے میں ہوگی.

Alpha = 0.001
price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() # Here is consistent with the strategy, using EMA
trade_symbols = list(set(symbols)-set(['BNB','ATOM']))
price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.00075,log=False)
trade_value = 300
for row in price_usdt.iloc[-7500:].iterrows():
    e.Update(row[0], row[1])
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        if aim_value - now_value > 0.5*trade_value:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -0.5*trade_value:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2b = e
(stragey_2b.df['total']/stragey_2b.initial_balance).plot(figsize=(17,6),grid = True);

img

پچھلے دو دنوں میں ، مرکزی دھارے کی کرنسی کی حکمت عملیوں کو چلانے میں مقبولیت حاصل ہوگئی ہے۔ آئیے اس حکمت عملی کا بیک ٹیسٹ کریں۔ کرنسی کی قسم میں کمی کی وجہ سے ، موازنہ کے لئے trade_value کو مناسب طریقے سے 4 گنا بڑھا دیا گیا ، اور نتائج نے اچھی کارکردگی کا مظاہرہ کیا ، خاص طور پر چونکہ حالیہ ریٹریکشن چھوٹا تھا۔

یہ نوٹ کیا جانا چاہئے کہ صرف مرکزی کرنسی طویل وقت کے بیک ٹسٹ میں پوری کرنسی کی طرح اچھی نہیں ہے ، اور اس میں مزید ریٹریکشنز ہیں۔ آپ ذیل میں گھنٹہ وار لائن پر اپنا بیک ٹسٹ کرسکتے ہیں ، بنیادی طور پر اس لئے کہ کرنسی کم منتشر ہے اور اس کی بجائے اتار چڑھاؤ بڑھتا ہے۔

Alpha = 0.001
price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() # Here is consistent with the strategy, using EMA
trade_symbols = ['ETH','LTC','EOS','XRP','BCH']
price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.00075,log=False)
trade_value = 1200
for row in price_usdt.iloc[-7500:].iterrows():
    e.Update(row[0], row[1])
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        if aim_value - now_value > 0.5*trade_value:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -0.5*trade_value:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2c = e
(stragey_2c.df['total']/e.initial_balance).plot(figsize=(17,6),grid = True);

img

ہینڈلنگ فیس اور حکمت عملی پیرامیٹر تجزیہ

چونکہ پہلے چند رپورٹس نے گھنٹے کی سطح کی لائن کا استعمال کیا ، اور اصل پیرامیٹرز حقیقی مارکیٹ کی صورتحال سے بہت مختلف ہیں ، اب منٹ کی سطح کی لائن کے ساتھ ، آپ دیکھ سکتے ہیں کہ کچھ پیرامیٹرز کو کیسے ترتیب دیا جائے۔ پہلے ڈیفالٹ پیرامیٹر کی ترتیبات کو دیکھیں:

  • الفا = 0.03 ایکسپونینشل چلتی اوسط کا الفا پیرامیٹر۔ ترتیب جتنی بڑی ہوگی ، قیمت کی نگرانی کی قیمت اور کم لین دین زیادہ حساس ہوگی۔ حتمی ہولڈنگ پوزیشن بھی کم ہوگی ، جس سے فائدہ کم ہوگا ، لیکن واپسی اور زیادہ سے زیادہ ریٹریکشن کو بھی کم کرے گا۔

  • Update_base_price_time_interval = 30 * 60 کتنی بار سیکنڈ میں، الفا پیرامیٹر کے ساتھ منسلک، الفا کی ترتیب چھوٹا ہے، کم وقفہ مقرر کیا جا سکتا ہے کی بنیاد قیمت کو اپ ڈیٹ کرنے کے لئے

  • ٹریڈ_ویلیو: الٹکوئن کی قیمت (بی ٹی سی میں بیان کردہ) کا ہر 1٪ انڈیکس ہولڈنگ ویلیو سے انحراف کرتا ہے ، جس کا تعین کل فنڈز کی سرمایہ کاری اور رسک کی ترجیح کے مطابق کرنے کی ضرورت ہے۔ مجموعی فنڈز کا 3-10٪ مقرر کرنے کی سفارش کی جاتی ہے۔ آپ ریسرچ ماحول کے بیک ٹیسٹ کے ذریعے فائدہ اٹھانے کے سائز کو دیکھ سکتے ہیں۔ ٹریڈ_ویلیو ایڈجسٹ_ویلیو سے کم ہوسکتا ہے ، جیسے ایڈجسٹ_ویلیو کا نصف ، جو انڈیکس سے 2٪ کے ہولڈنگ ویلیو کے برابر ہے۔

  • ایڈجسٹ_ویلیو: معاہدے کی قیمت (USDT تشخیص) انحراف کی قیمت کو ایڈجسٹ کرتی ہے۔ جب انڈیکس * ٹریڈ_ویلیو-موجودہ پوزیشن> ایڈجسٹ_ویلیو سے انحراف کرتا ہے ، یعنی ہدف پوزیشن اور موجودہ پوزیشن کے مابین فرق اس قدر سے تجاوز کرتا ہے تو ، تجارت شروع ہوجائے گی۔ بہت بڑی ایڈجسٹمنٹ سست ہوتی ہے ، بہت چھوٹی ٹرانزیکشنز کثرت سے ہوتی ہیں اور 10 سے کم نہیں ہوسکتی ہیں ، ورنہ کم سے کم ٹرانزیکشن تک نہیں پہنچ پائے گی ، اس کی سفارش کی جاتی ہے کہ اسے ٹریڈ_ویلیو کے 40٪ سے زیادہ مقرر کریں۔

یہ کہنے کی ضرورت نہیں ہے کہ ، تجارت کی قیمت براہ راست ہماری کمائی اور خطرات سے متعلق ہے۔ اگر تجارت کی قیمت میں کوئی تبدیلی نہیں کی گئی ہے تو ، اب تک اسے منافع بخش ہونا چاہئے۔

چونکہ الفا کے پاس اس بار اعلی تعدد کے اعداد و شمار ہیں ، لہذا ظاہر ہے کہ اسے ہر 1 منٹ میں اپ ڈیٹ کرنا زیادہ معقول ہے۔ قدرتی طور پر ، یہ اصل سے چھوٹا ہے۔ مخصوص تعداد کا تعین بیک ٹیسٹ کے ذریعہ کیا جاسکتا ہے۔

ایڈجسٹ_ویلیو نے ہمیشہ ٹریڈ_ویلیو کے 40٪ سے زیادہ کی سفارش کی ہے۔ اصل 1h K لائن کی ترتیب کا کم اثر ہے۔ کچھ لوگ اسے بہت کم ایڈجسٹ کرنا چاہتے ہیں ، تاکہ یہ ہدف کی پوزیشن کے قریب ہو سکے۔ یہاں ہم تجزیہ کریں گے کہ اسے کیوں نہیں کرنا چاہئے۔

سب سے پہلے فیس ہینڈلنگ کا مسئلہ تجزیہ

یہ دیکھا جاسکتا ہے کہ 0.00075 کی ڈیفالٹ شرح کے تحت ، ہینڈلنگ فیس 293 ہے اور منافع 270 ہے ، جو ایک بہت ہی زیادہ تناسب ہے۔ ہم ہینڈلنگ فیس کو 0 اور ایڈجسٹ_ویلیو کو 10 پر مقرر کرتے ہیں تاکہ یہ دیکھ سکیں کہ کیا ہوتا ہے۔

stragey_2a.account['USDT']
{'fee': 293.85972778530453,
 'leverage': 0.45999999999999996,
 'margin': 236.23559736312995,
 'realised_profit': 281.77464608744435,
 'total': 10271.146238,
 'unrealised_profit': -10.628408369648495}
Alpha = 0.001
#price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.rolling(20).mean() # Ordinary moving average
price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() # Here is consistent with the strategy, using EMA
trade_symbols = list(set(symbols))
price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0,log=False)
trade_value = 300
for row in price_usdt.iloc[-7500:].iterrows():
    e.Update(row[0], row[1])
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        if aim_value - now_value > 10:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < 10:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2d = e
(stragey_2d.df['total']/e.initial_balance).plot(figsize=(17,6),grid = True);

img

نتیجہ ایک سیدھی لائن اوپر کی طرف ہے ، بی این بی صرف تھوڑا سا موڑ اور موڑ لاتا ہے ، کم ایڈجسٹ_ویلیو ہر اتار چڑھاؤ کو پکڑتا ہے۔ اگر ہینڈلنگ فیس نہیں ہے تو ، منافع بہترین ہوگا۔

کیا اگر ایڈجسٹمنٹ_ویلیو چھوٹا ہے اگر ہینڈلنگ فیس کی چھوٹی مقدار ہے؟

Alpha = 0.001
#price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.rolling(20).mean() # Ordinary moving average
price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() # Here is consistent with the strategy, using EMA
trade_symbols = list(set(symbols))
price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.00075,log=False)
trade_value = 300
for row in price_usdt.iloc[-7500:].iterrows():
    e.Update(row[0], row[1])
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        if aim_value - now_value > 10:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < 10:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2e = e
(stragey_2e.df['total']/e.initial_balance).plot(figsize=(17,6),grid = True);

img

اس کے نتیجے میں ، یہ بھی سیدھے نیچے والے منحنی خطوط سے باہر آیا۔ اگر آپ اس کے بارے میں سوچتے ہیں تو یہ سمجھنا آسان ہے ، ایک چھوٹے پھیلاؤ کے اندر کثرت سے ایڈجسٹمنٹ صرف ہینڈلنگ فیس کو کھو دے گی۔

مجموعی طور پر ، فیس کی سطح جتنی کم ہوگی ، ایڈجسٹ_ویلیو جتنی چھوٹی ہوسکتی ہے ، ٹرانزیکشن اتنی ہی کثرت سے ہوگی ، اور منافع اتنا ہی زیادہ ہوگا۔

الفا ترتیبات کے ساتھ مسائل

چونکہ ایک منٹ لائن ہے ، لہذا بینچ مارک کی قیمت کو ایک منٹ میں ایک بار اپ ڈیٹ کیا جائے گا ، یہاں ہم صرف الفا کے سائز کا تعین کرنے کے لئے بیک ٹیسٹ کرتے ہیں۔ موجودہ تجویز کردہ الفا کی ترتیب 0.001 ہے۔

for Alpha in [0.0001, 0.0003, 0.0006, 0.001, 0.0015, 0.002, 0.004, 0.01, 0.02]:
#price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.rolling(20).mean() # Ordinary moving average
    price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() #Here is consistent with the strategy, using EMA
    trade_symbols = list(set(symbols))
    price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
    e = Exchange(trade_symbols,initial_balance=10000,commission=0.00075,log=False)
    trade_value = 300
    for row in price_usdt.iloc[-7500:].iterrows():
        e.Update(row[0], row[1])
        for symbol in trade_symbols:
            price = row[1][symbol]
            if np.isnan(price):
                continue
            diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
            aim_value = -trade_value*round(diff/0.01,1)
            now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
            if aim_value - now_value > 0.5*trade_value:
                e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
            if aim_value - now_value < -0.5*trade_value:
                e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
    print(Alpha, e.account['USDT']['unrealised_profit']+e.account['USDT']['realised_profit'])
0.0001 -77.80281760941007
0.0003 179.38803796199724
0.0006 218.12579924541367
0.001 271.1462377177959
0.0015 250.0014065973528
0.002 207.38692166891275
0.004 129.08021828803027
0.01 65.12410041648158
0.02 58.62356792410955

پچھلے دو ماہ میں منٹ لائن کے بیک ٹیسٹ کے نتائج

آخر میں ، ایک طویل وقت کے بیک ٹیسٹ کے نتائج کو دیکھیں۔ ابھی ، ایک کے بعد ایک اضافہ ، اور آج کی خالص مالیت ایک نئی کم سطح پر ہے۔ آئیے آپ کو مندرجہ ذیل اعتماد دیں۔ چونکہ منٹ لائن کی تعدد زیادہ ہے ، اس کی وجہ سے یہ ایک گھنٹے کے اندر پوزیشنیں کھولے گی اور بند کردے گی ، لہذا منافع بہت زیادہ ہوگا۔

ایک اور نکتہ، ہم ہمیشہ ایک مقررہ trade_value کا استعمال کر رہے ہیں، جو بعد کی مدت میں فنڈز کے استعمال کو ناکافی بناتا ہے، اور اصل شرح واپسی اب بھی بہت زیادہ اضافہ کر سکتا ہے.

ہم دو ماہ کے بیک ٹیسٹ کی مدت میں کہاں ہیں؟

img

Alpha = 0.001
#price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.rolling(20).mean() # Ordinary moving average
price_usdt_btc_norm2 = price_usdt_btc/price_usdt_btc.ewm(alpha=Alpha).mean() # Here is consistent with the strategy, using EMA
trade_symbols = list(set(symbols))
price_usdt_btc_norm_mean = price_usdt_btc_norm2[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.00075,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
    e.Update(row[0], row[1])
    for symbol in trade_symbols:
        price = row[1][symbol]
        if np.isnan(price):
            continue
        diff = price_usdt_btc_norm2.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
        aim_value = -trade_value*round(diff/0.01,1)
        now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
        if aim_value - now_value > 0.5*trade_value:
            e.Buy(symbol, price, round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
        if aim_value - now_value < -0.5*trade_value:
            e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
stragey_2f = e
(stragey_2f.df['total']/stragey_2e.initial_balance).plot(figsize=(17,6),grid = True);

img

(stragey_2f.df['leverage']/stragey_2e.initial_balance).plot(figsize=(17,6),grid = True);

img


متعلقہ

مزید