Hanya simulasi kasar, supaya semua orang mempunyai konsep tertentu jumlah margin yang hilang. anda boleh memuat turun buku nota dan memuat naik ke persekitaran penyelidikan FMZ, dan menjalankan kod sendiri.
Pertama lihat laporan asal:https://www.fmz.com/digest-topic/5584dan laporan yang lebih baik:https://www.fmz.com/digest-topic/5588
Strategi ini telah dikongsi oleh orang ramai selama 4 hari sekarang. Tahap awal dilakukan dengan sangat baik, dengan pulangan yang tinggi dan sedikit retracement, sehingga banyak pengguna menggunakan leverage yang sangat tinggi untuk berjudi pulangan 10% setiap hari. Walau bagaimanapun, seperti yang dinyatakan dalam laporan awal, tidak ada strategi yang sempurna. Menjual pendek melebihi kenaikan dan membeli panjang melebihi trend kejatuhan menggunakan ciri-ciri altcoin untuk naik dan jatuh bersama-sama. Jika mata wang bergerak keluar dari trend yang unik, ia akan mengumpulkan banyak kedudukan pegangan. walaupun purata bergerak digunakan untuk mengesan harga awal, risiko masih wujud. Laporan ini terutamanya mengukur risiko tertentu dan mengapa parameter yang disyorkan trade_value menyumbang 3% daripada jumlah dana.
Untuk menonjolkan kod, kita meletakkan dalam lanjutan bahagian ini, semua orang harus cuba pertama menjalankan kod berikut (bermula dari bahagian perpustakaan import).
Untuk mensimulasikan, kita menganggap terdapat 20 mata wang, tetapi hanya perlu menambah BTC dan ETH, dan menggunakan BTC untuk mewakili 19 mata wang dengan harga tetap. ETH mewakili mata wang dengan mata wang trend bebas. Oleh kerana ia hanya simulasi, tidak perlu mengesan harga awal dengan purata bergerak di sini, dengan mengandaikan bahawa harga meningkat pada kadar yang pesat.
Pertama, simulasi situasi di mana harga mata wang tunggal terus meningkat. Stop_loss menunjukkan bahawa stop loss menyimpang. Ini hanya simulasi. Situasi sebenar akan mempunyai retracement berselang-seling, ia tidak akan buruk seperti simulasi.
Misalkan tidak ada retracement ke mata wang ini, apabila penyimpangan stop loss adalah 0.41, ETH telah meningkat 44% pada masa ini, dan hasilnya akhirnya hilang 7 kali nilai dagangan, iaitu trade_value * 7. Jika trade_value ditetapkan kepada 3% daripada jumlah dana, maka kerugian = jumlah dana * 0.03 * 7. Retracement maksimum adalah kira-kira 0.03 * 7 = 21%.
Anda boleh menganggarkan toleransi risiko anda sendiri berdasarkan hasil di bawah.
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
Dalam mensimulasikan keadaan penurunan berterusan, penurunan disertai dengan penurunan nilai kontrak, jadi risiko lebih tinggi daripada kenaikan, dan apabila harga jatuh, kadar peningkatan kerugian semakin pesat. Apabila nilai penyimpangan stop loss adalah -0.31, harga mata wang jatuh sebanyak 33% pada masa ini, dan kerugian 6.5 urus niaga. Jika jumlah perdagangan trade_value ditetapkan kepada 3% daripada jumlah dana, retracement maksimum adalah kira-kira 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']]