ビナンス・フューチャーズ・マルチ通貨・ヘッジ戦略に関する研究 第3部

作者: リン・ハーン優しさ, 作成日: 2020-05-12 12:14:29, 更新日: 2023-11-04 19:50:43

img

計算機をダウンロードして FMZ 研究環境にアップロードして コードを実行できます

Binanceのリスク評価は,上昇傾向の短期販売と減少傾向の長期購入

最初のレポートを見てくださいhttps://www.fmz.com/digest-topic/5584改善された報告書:https://www.fmz.com/digest-topic/5588

この戦略は4日間公開されている.初期段階は高いリターンと少数のリトラセーションで非常にうまく機能し,多くのユーザーが非常に高いレバレッジを使用して,1日当たり10%のリターンを賭けている.しかし,初期レポートで述べたように,完璧な戦略はありません. 短売り超上昇と長買い超落ちトレンドは,アルトコインの特徴を利用して同時に上昇し落ちます.通貨がユニークなトレンドから動くと,多くの保有ポジションを蓄積します.初期価格を追跡するために移動平均を使用しましたが,リスクは依然として存在しています.このレポートは主に特定のリスクを定量化し,推奨パラメーター trade_value が総資金の3%を占める理由を説明しています.

この部分の先端を表示するために,誰もが最初に次のコードを実行してみましょう (インポートライブラリ部分から開始します).

シミュレーションを行うには,20の通貨があると仮定しますが,BTCとETHを足して,BTCを使用して 19の通貨を定価で表します.ETHは独立したトレンド通貨を表します.これはシミュレーションに過ぎませんので,価格が急速に上昇していると仮定して,ここでは移動平均値で初期価格を追跡する必要はありません.

まず,単一の通貨の価格が上昇し続ける状況をシミュレートします. Stop_loss は,ストップ・ロスが逸脱することを示します. これはシミュレーションだけです.実際の状況では間歇的なリトラセイメントがあり,シミュレーションほど悪いものではありません.

ストップロスの偏差が0.41で,ETHが44%上昇し,結果が最終的に取引価値の7倍,つまりtrade_value * 7を失ってしまったと仮定します. trade_valueが総資金の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']]

関連性

もっと