संसाधन लोड हो रहा है... लोड करना...

बाइनेंस फ्यूचर्स मल्टी-करेंसी हेजिंग रणनीति भाग 3 पर शोध

लेखक:अच्छाई, बनाया गयाः 2020-05-12 12:14:29, अद्यतन किया गयाः 2023-11-04 19:50:43

img

सिर्फ एक मोटा सिमुलेशन, ताकि हर किसी को खोए हुए मार्जिन की मात्रा का एक विशिष्ट विचार हो। आप नोटबुक डाउनलोड कर सकते हैं और इसे एफएमजेड अनुसंधान वातावरण में अपलोड कर सकते हैं, और कोड को स्वयं चला सकते हैं।

Binance की बढ़ोतरी के ऊपर शॉर्ट बेचने और गिरावट के ऊपर लंबी खरीदने की रणनीति के जोखिम का अनुमान

पहले मूल रिपोर्ट को देखें:https://www.fmz.com/digest-topic/5584और सुधारित रिपोर्टःhttps://www.fmz.com/digest-topic/5588

यह रणनीति अब 4 दिनों से सार्वजनिक रूप से साझा की जा रही है। शुरुआती चरण में बहुत अच्छा प्रदर्शन किया गया, उच्च रिटर्न और कुछ रिट्रेसमेंट के साथ, ताकि कई उपयोगकर्ता प्रति दिन 10% रिटर्न जुआ खेलने के लिए बहुत उच्च लाभप्रदता का उपयोग कर रहे हों। हालांकि, जैसा कि प्रारंभिक रिपोर्ट में कहा गया है, कोई सही रणनीति नहीं है। बढ़ोतरी से अधिक शॉर्ट बेचना और गिरावट की प्रवृत्ति से अधिक लंबी खरीदना एक साथ बढ़ने और गिरने के लिए अल्टकोइन की विशेषताओं का उपयोग करते हैं। यदि कोई मुद्रा एक अद्वितीय प्रवृत्ति से बाहर निकलती है, तो यह कई होल्डिंग पदों को जमा करेगी। हालांकि प्रारंभिक मूल्य को ट्रैक करने के लिए एक चलती औसत का उपयोग किया गया था, जोखिम अभी भी मौजूद हैं। यह रिपोर्ट मुख्य रूप से विशिष्ट जोखिमों को मापती है और क्यों पैरामीटर अनुशंसित trade_value कुल धन का 3% है।

कोड को उजागर करने के लिए, हम इस भाग के उन्नत में डाल दिया, हर किसी को पहले निम्नलिखित कोड चलाने की कोशिश करनी चाहिए (आयात पुस्तकालयों भाग से शुरू).

अनुकरण करने के लिए, हम मानते हैं कि 20 मुद्राएं हैं, लेकिन केवल बीटीसी और ईटीएच जोड़ने की आवश्यकता है, और स्थिर कीमतों के साथ 19 मुद्राओं का प्रतिनिधित्व करने के लिए बीटीसी का उपयोग करें। ईटीएच स्वतंत्र प्रवृत्ति मुद्रा के साथ मुद्रा का प्रतिनिधित्व करता है। क्योंकि यह केवल एक अनुकरण है, यहां मूविंग एवरेज द्वारा प्रारंभिक मूल्य को ट्रैक करने की आवश्यकता नहीं है, यह मानते हुए कि कीमत तेजी से बढ़ रही है।

सबसे पहले, एक ऐसी स्थिति का अनुकरण करें जहां एक मुद्रा की कीमत लगातार बढ़ रही हो। स्टॉप_लॉस इंगित करता है कि स्टॉप लॉस विचलित हो जाता है। यहाँ केवल एक अनुकरण है। वास्तविक स्थिति में अंतरालगत प्रतिगमन होगा, यह अनुकरण के रूप में बुरा नहीं होगा।

मान लीजिए कि इस मुद्रा के लिए कोई रिट्रेसमेंट नहीं है, जब स्टॉप लॉस विचलन 0.41 है, तो इस समय ईटीएच 44% बढ़ गया है, और परिणाम अंततः ट्रेडिंग मूल्य के 7 गुना खो गए हैं, अर्थात, व्यापार_मूल्य * 7. यदि व्यापार_मूल्य कुल धन का 3% सेट किया गया है, तो हानि = कुल धन * 0.03 * 7. अधिकतम रिट्रेसमेंट लगभग 0.03 * 7 = 21% है।

आप नीचे दिए गए परिणामों के आधार पर अपनी जोखिम सहिष्णुता का अनुमान लगा सकते हैं।

btc_price = [1]*500 # Bitcoin price, always unchanged
eth_price = [i/100. for i in range(100,500)] # Ethereum, up 1% in one cycle

for stop_loss in [i/1000. for i in range(10,1500,50)]:
    e = Exchange(['BTC','ETH'],initial_balance=10000,commission=0.0005,log=False)
    trade_value  = 300 # 300 transactions
    
    for i in range(200):

        index = (btc_price[i]*19+eth_price[i])/20. # index

        e.Update(i,{'BTC':btc_price[i], 'ETH':eth_price[i]}) 

        diff_btc = btc_price[i] - index # deviation
        diff_eth = eth_price[i] - index

        btc_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount'])
        eth_value = e.account['ETH']['value']*np.sign(e.account['ETH']['amount'])

        aim_btc_value = -trade_value*round(diff_btc/0.01,1)*19 # Here BTC replaces 19 currencies
        aim_eth_value = -trade_value*round(diff_eth/0.01,1)

        if aim_btc_value - btc_value > 20:
            e.Buy('BTC',btc_price[i],(aim_btc_value - btc_value)/btc_price[i])

        if aim_eth_value - eth_value < -20 and diff_eth < stop_loss:
            e.Sell('ETH',eth_price[i], (eth_value-aim_eth_value)/eth_price[i],diff_eth)

        if diff_eth > stop_loss and eth_value < 0: # Stop loss
            stop_price = eth_price[i]
            e.Buy('ETH',eth_price[i], (-eth_value)/eth_price[i],diff_eth)

    print('Currency price:',stop_price,' Stop loss deviation:', stop_loss,'Final balance:',e.df['total'].iloc[-1], ' Multiple of losing trade volume:',round((e.initial_balance-e.df['total'].iloc[-1])/300,1))
Currency price: 1.02  Stop loss deviation: 0.01 Final balance: 9968.840396  Multiple of losing trade volume: 0.1
Currency price: 1.07  Stop loss deviation: 0.06 Final balance: 9912.862738  Multiple of losing trade volume: 0.3
Currency price: 1.12  Stop loss deviation: 0.11 Final balance: 9793.616067  Multiple of losing trade volume: 0.7
Currency price: 1.17  Stop loss deviation: 0.16 Final balance: 9617.477263  Multiple of losing trade volume: 1.3
Currency price: 1.23  Stop loss deviation: 0.21 Final balance: 9337.527299  Multiple of losing trade volume: 2.2
Currency price: 1.28  Stop loss deviation: 0.26 Final balance: 9051.5166  Multiple of losing trade volume: 3.2
Currency price: 1.33  Stop loss deviation: 0.31 Final balance: 8721.285267  Multiple of losing trade volume: 4.3
Currency price: 1.38  Stop loss deviation: 0.36 Final balance: 8350.582251  Multiple of losing trade volume: 5.5
Currency price: 1.44  Stop loss deviation: 0.41 Final balance: 7856.720861  Multiple of losing trade volume: 7.1
Currency price: 1.49  Stop loss deviation: 0.46 Final balance: 7406.412066  Multiple of losing trade volume: 8.6
Currency price: 1.54  Stop loss deviation: 0.51 Final balance: 6923.898356  Multiple of losing trade volume: 10.3
Currency price: 1.59  Stop loss deviation: 0.56 Final balance: 6411.276143  Multiple of losing trade volume: 12.0
Currency price: 1.65  Stop loss deviation: 0.61 Final balance: 5758.736222  Multiple of losing trade volume: 14.1
Currency price: 1.7  Stop loss deviation: 0.66 Final balance: 5186.230956  Multiple of losing trade volume: 16.0
Currency price: 1.75  Stop loss deviation: 0.71 Final balance: 4588.802975  Multiple of losing trade volume: 18.0
Currency price: 1.81  Stop loss deviation: 0.76 Final balance: 3841.792751  Multiple of losing trade volume: 20.5
Currency price: 1.86  Stop loss deviation: 0.81 Final balance: 3193.215479  Multiple of losing trade volume: 22.7
Currency price: 1.91  Stop loss deviation: 0.86 Final balance: 2525.155765  Multiple of losing trade volume: 24.9
Currency price: 1.96  Stop loss deviation: 0.91 Final balance: 1837.699982  Multiple of losing trade volume: 27.2
Currency price: 2.02  Stop loss deviation: 0.96 Final balance: 988.009942  Multiple of losing trade volume: 30.0
Currency price: 2.07  Stop loss deviation: 1.01 Final balance: 260.639618  Multiple of losing trade volume: 32.5
Currency price: 2.12  Stop loss deviation: 1.06 Final balance: -483.509646  Multiple of losing trade volume: 34.9
Currency price: 2.17  Stop loss deviation: 1.11 Final balance: -1243.486107  Multiple of losing trade volume: 37.5
Currency price: 2.24  Stop loss deviation: 1.16 Final balance: -2175.438384  Multiple of losing trade volume: 40.6
Currency price: 2.28  Stop loss deviation: 1.21 Final balance: -2968.19255  Multiple of losing trade volume: 43.2
Currency price: 2.33  Stop loss deviation: 1.26 Final balance: -3774.613275  Multiple of losing trade volume: 45.9
Currency price: 2.38  Stop loss deviation: 1.31 Final balance: -4594.305499  Multiple of losing trade volume: 48.6
Currency price: 2.44  Stop loss deviation: 1.36 Final balance: -5594.651063  Multiple of losing trade volume: 52.0
Currency price: 2.49  Stop loss deviation: 1.41 Final balance: -6441.474964  Multiple of losing trade volume: 54.8
Currency price: 2.54  Stop loss deviation: 1.46 Final balance: -7299.652662  Multiple of losing trade volume: 57.7

निरंतर गिरावट की स्थिति का अनुकरण करने में, गिरावट अनुबंध के मूल्य में कमी के साथ होती है, इसलिए जोखिम वृद्धि से अधिक होता है, और जैसे-जैसे कीमत गिरती है, नुकसान में वृद्धि की दर तेज हो जाती है। जब स्टॉप लॉस विचलन मूल्य -0.31 होता है, तो इस समय मुद्रा मूल्य 33% गिर जाता है, और 6.5 लेनदेन का नुकसान होता है। यदि व्यापार राशि trade_value को कुल धनराशि के 3% पर सेट किया जाता है, तो अधिकतम प्रतिगमन लगभग 0.03 * 6.5 = 19.5% है।

btc_price = [1]*500 # Bitcoin price, always unchanged
eth_price = [2-i/100. for i in range(100,200)] # Ethereum

for stop_loss in [-i/1000. for i in range(10,1000,50)]:
    e = Exchange(['BTC','ETH'],initial_balance=10000,commission=0.0005,log=False)
    trade_value  = 300 # 300 transactions
    
    for i in range(100):

        index = (btc_price[i]*19+eth_price[i])/20. # index

        e.Update(i,{'BTC':btc_price[i], 'ETH':eth_price[i]}) 

        diff_btc = btc_price[i] - index # deviation
        diff_eth = eth_price[i] - index

        btc_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount'])
        eth_value = e.account['ETH']['value']*np.sign(e.account['ETH']['amount'])

        aim_btc_value = -trade_value*round(diff_btc/0.01,1)*19 # Here BTC replaces 19 currencies
        aim_eth_value = -trade_value*round(diff_eth/0.01,1)
        
        if aim_btc_value - btc_value < -20:
            e.Sell('BTC',btc_price[i],-(aim_btc_value - btc_value)/btc_price[i])
    
        if aim_eth_value - eth_value > 20 and diff_eth > stop_loss:
            e.Buy('ETH',eth_price[i], -(eth_value-aim_eth_value)/eth_price[i],diff_eth)

        if diff_eth < stop_loss and eth_value > 0:
            e.Sell('ETH',eth_price[i], (eth_value)/eth_price[i],diff_eth)
            stop_price = eth_price[i]
        
    print('Currency price:',round(stop_price,2),' Stop loss deviation:', stop_loss,'Final balance:',e.df['total'].iloc[-1], ' Multiple of losing trade volume:',round((e.initial_balance-e.df['total'].iloc[-1])/300,1))
Currency price: 0.98  Stop loss deviation: -0.01 Final balance: 9983.039091  Multiple of losing trade volume: 0.1
Currency price: 0.93  Stop loss deviation: -0.06 Final balance: 9922.200148  Multiple of losing trade volume: 0.3
Currency price: 0.88  Stop loss deviation: -0.11 Final balance: 9778.899361  Multiple of losing trade volume: 0.7
Currency price: 0.83  Stop loss deviation: -0.16 Final balance: 9545.316075  Multiple of losing trade volume: 1.5
Currency price: 0.77  Stop loss deviation: -0.21 Final balance: 9128.800213  Multiple of losing trade volume: 2.9
Currency price: 0.72  Stop loss deviation: -0.26 Final balance: 8651.260863  Multiple of losing trade volume: 4.5
Currency price: 0.67  Stop loss deviation: -0.31 Final balance: 8037.598952  Multiple of losing trade volume: 6.5
Currency price: 0.62  Stop loss deviation: -0.36 Final balance: 7267.230651  Multiple of losing trade volume: 9.1
Currency price: 0.56  Stop loss deviation: -0.41 Final balance: 6099.457595  Multiple of losing trade volume: 13.0
Currency price: 0.51  Stop loss deviation: -0.46 Final balance: 4881.767442  Multiple of losing trade volume: 17.1
Currency price: 0.46  Stop loss deviation: -0.51 Final balance: 3394.414792  Multiple of losing trade volume: 22.0
Currency price: 0.41  Stop loss deviation: -0.56 Final balance: 1575.135344  Multiple of losing trade volume: 28.1
Currency price: 0.35  Stop loss deviation: -0.61 Final balance: -1168.50508  Multiple of losing trade volume: 37.2
Currency price: 0.29  Stop loss deviation: -0.66 Final balance: -4071.007983  Multiple of losing trade volume: 46.9
Currency price: 0.25  Stop loss deviation: -0.71 Final balance: -7750.361195  Multiple of losing trade volume: 59.2
Currency price: 0.19  Stop loss deviation: -0.76 Final balance: -13618.366286  Multiple of losing trade volume: 78.7
Currency price: 0.14  Stop loss deviation: -0.81 Final balance: -20711.473968  Multiple of losing trade volume: 102.4
Currency price: 0.09  Stop loss deviation: -0.86 Final balance: -31335.965608  Multiple of losing trade volume: 137.8
Currency price: 0.04  Stop loss deviation: -0.91 Final balance: -51163.223715  Multiple of losing trade volume: 203.9
Currency price: 0.04  Stop loss deviation: -0.96 Final balance: -81178.565715  Multiple of losing trade volume: 303.9
# Libraries to import
import pandas as pd
import requests
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
price_usdt = pd.read_csv('https://www.fmz.com/upload/asset/20227de6c1d10cb9dd1.csv ', index_col = 0)
price_usdt.index = pd.to_datetime(price_usdt.index)
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 positions 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']]

संबंधित

अधिक