Penyelidikan mengenai Strategi Hedging Multi-mata wang Binance Futures Bahagian 1
Klik butang carian pada halaman Dasbor, dan kemudian klik anak panah untuk masuk. Buka fail akhiran.pynb yang dimuat naik dan tekan shift + enter untuk menjalankan baris demi baris. Terdapat tutorial asas dalam bantuan pengguna persekitaran penyelidikan.
Binance telah menyenaraikan banyak altcoin di tempat. Walaupun turun naik jangka pendek tidak pasti, jika anda melihat garis harian untuk masa yang lama, anda akan mendapati bahawa mereka pada dasarnya telah jatuh lebih dari 90%, dan beberapa bahkan hanya mempunyai pecahan pecahan harga tertinggi. Walau bagaimanapun, tidak ada kaedah jual pendek universal untuk tempat, dan tidak ada cadangan khas kecuali untuk tidak menyentuh altcoin. Dalam dua bulan yang lalu, Binance Futures telah melancarkan lebih daripada 20 kontrak kekal, yang kebanyakannya mata wang arus perdana, dan beberapa tidak diketahui. Ini memberi kita cara untuk memendekkan kombinasi altcoin ini. Menggunakan pekali korelasi antara altcoin dan BTC akan menjadi kaedah analisis yang berkesan, dua strategi boleh direka.
Strategi pertama: Jual pendek bakul altcoin yang dipilih dalam setara terdesentralisasi, dan pada masa yang sama membeli panjang jumlah BTC yang sama untuk lindung nilai, untuk mengurangkan risiko dan turun naik.
Strategi kedua: shorting mata wang dengan harga yang lebih tinggi daripada indeks harga altcoin-bitcoin, dan merindui dengan mata wang yang lebih rendah daripada indeks, semakin besar penyimpangan, semakin besar kedudukan. Pada masa yang sama, lindung nilai kedudukan yang tidak dilindungi dengan BTC (atau tidak).
# Libraries to import
import pandas as pd
import requests
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
Kontrak abadi Binance yang kini disenaraikan mata wang, yang boleh diperoleh dengan menggunakan antara muka API, adalah jumlah 23 (tidak termasuk BTC).
#Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
#symbols = [symbol_info['baseAsset'] for symbol_info in Info.json()['symbols']]
symbols = ['ETH', 'BCH', 'XRP', 'EOS', 'LTC', 'TRX', 'ETC', 'LINK', 'XLM', 'ADA', 'XMR', 'DASH', 'ZEC', 'XTZ', 'BNB', 'ATOM', 'ONT', 'IOTA', 'BAT', 'VET', 'NEO', 'QTUM', 'IOST']
Pertama, mari
price_btc = pd.read_csv('https://www.fmz.com/upload/asset/1ef1af8ec28a75a2dcb.csv', index_col = 0)
price_btc.index = pd.to_datetime(price_btc.index,unit='ms') #Index date
price_btc.tail()
Hasilnya:
5 baris × 23 lajur
Pertama-tama menarik harga mata wang ini untuk melihat trend, data harus dinormalisasi.
price_btc_norm = price_btc/price_btc.fillna(method='bfill').iloc[0,]
price_btc_norm.plot(figsize=(16,6),grid = True,legend=False);
Dengan menyusun perubahan harga terakhir, anda boleh mencari beberapa syiling yang jelas berbeza, iaitu LINK, XTZ, BCH, ETH. Terangkan bahawa mereka sering dapat menjalankan trend mereka sendiri, dan shorting mereka mempunyai risiko yang lebih tinggi dan perlu dikecualikan dari strategi.
Merancang peta haba pekali korelasi mata wang yang selebihnya, dan mendapati bahawa trend ETC dan ATOM juga agak istimewa dan boleh dikecualikan.
price_btc_norm.iloc[-1,].sort_values()[-5:]
Hasilnya:
ETH 0.600417
ETC 0.661616
BCH 1.141961
XTZ 2.512195
LINK 2.764495
Name: 2020-03-25 00:00:00, dtype: float64
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) # Remaining currencies
plt.subplots(figsize=(12, 12)) # Set the screen size
sns.heatmap(price_btc[trade_symbols].corr(), annot=True, vmax=1, square=True, cmap="Blues");
Mata wang terakhir yang tersisa jatuh rata-rata 66% setahun, jelas ada ruang yang cukup untuk pendek. Menganalisis trend syiling ini ke dalam indeks harga altcoin, didapati bahawa pada dasarnya jatuh sepanjang jalan, ia lebih stabil pada separuh kedua tahun lalu, dan mula jatuh sepanjang tahun ini. Kajian ini menyaring
Perlu diperhatikan bahawa indeks altcoin semasa berada di titik terendah tahun lalu.
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH', 'ETC','ATOM','BNB','EOS','LTC'])) # You can set the remaining currencies, which you want to subtract.
1-price_btc_norm[trade_symbols].iloc[-1,].mean()
Hasilnya:
0.6714306758250285
price_btc_norm[trade_symbols].mean(axis=1).plot(figsize=(16,6),grid = True,legend=False);
Begitu juga, data mengenai Kemampanan Binance telah disusun, anda juga boleh mengutipnya secara langsung di buku nota anda, data adalah garis K pasaran 1h dari 28 Januari hingga 31 Mac 2020, kerana kebanyakan kontrak kekal Binance telah makan tengah hari hanya dua bulan, jadi data itu mencukupi untuk backtest.
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.tail()
Hasilnya:
Pertama melihat trend keseluruhan dengan data normal. Dalam kejatuhan Mac, berbanding dengan harga pada awal Februari, harga secara amnya diturunkan, menunjukkan bahawa risiko kontrak kekal juga sangat tinggi. Gelombang penurunan ini juga merupakan ujian cabaran besar untuk strategi.
price_usdt_norm = price_usdt/price_usdt.fillna(method='bfill').iloc[0,]
price_usdt_norm.plot(figsize=(16,6),grid = True,legend=False);
Lukiskan harga indeks duit syiling yang ingin kita jual berbanding Bitcoin, prinsip strategi adalah untuk short kurva ini, dan pulangan pada dasarnya adalah kebalikan daripada kurva ini.
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,]
price_usdt_btc_norm[trade_symbols].mean(axis=1).plot(figsize=(16,6),grid = True);
#price_usdt_btc_norm.mean(axis=1).plot(figsize=(16,6),grid = True,legend=False);
Oleh kerana FMZ backtest tempatan tidak mempunyai data untuk semua mata wang dan tidak menyokong backtest pelbagai mata wang, adalah perlu untuk melaksanakan semula enjin backtest. Jadi saya menulis enjin backtest baru, ia agak mudah, tetapi pada dasarnya cukup. Mengambil kira bayaran urus niaga, tetapi pada dasarnya mengabaikan kadar modal, tidak mempertimbangkan keadaan mengekalkan modal margin. Jumlah ekuiti, margin yang diduduki, dan leverage direkodkan. Oleh kerana strategi ini mempunyai atribut bahawa kedudukan panjang sama dengan kedudukan pendek, maka kesan kadar modal tidak penting.
Ujian belakang tidak mengambil kira keadaan seluncur harga, anda boleh meningkatkan simulasi yuran urus niaga sendiri, memandangkan yuran urus niaga pembuat Binance yang rendah, walaupun perbezaan jurang harga di pasaran mata wang yang tidak popular sangat kecil, anda boleh menggunakan kaedah komisen gunung ais di pasaran sebenar ketika membuat pesanan, kesannya tidak harus signifikan.
Apabila membuat objek pertukaran, anda perlu menentukan mata wang yang akan didagangkan. Beli adalah panjang dan Jual adalah pendek. Oleh kerana batasan kontrak kekal, apabila membuka kedudukan, kedudukan panjang dan pendek ditutup secara automatik bersama-sama. Apabila menjual kedudukan pendek dan bilangan mata wang adalah negatif. Parameter adalah seperti berikut:
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}}
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}
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 transaction fee
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 the 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']
if self.date.hour in [0,8,16]:
pass
self.account['USDT']['realised_profit'] += -self.account[symbol]['amount']*close_price[symbol]*0.01/100
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']]
# First test the backtest engine
e = Exchange(['BTC','XRP'],initial_balance=10000,commission=0,log=True)
e.Buy('BTC',100, 5)
e.Sell('XRP',10, 50)
e.Sell('BTC',105,e.account['BTC']['amount'])
e.Buy('XRP',9,-e.account['XRP']['amount'])
round(e.account['USDT']['realised_profit'],4)
75.0
Logik strategi:
Posisi perdagangan_nilai pendek menentukan saiz kedudukan.
# Need to hedge with BTC
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH', 'ETC','ATOM','BNB','EOS','LTC'])) # Remaining currencies
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 2000
for row in price_usdt.iloc[:].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 < -20 :
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 > 20 :
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 < -20:
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 > 20:
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
Keuntungan akhir setiap mata wang adalah seperti berikut:
pd.DataFrame(stragey_1.account).T.apply(lambda x:round(x,3))
Dua grafik di bawah adalah lengkung kekayaan bersih dan leverage yang digunakan.
Warna kuning dalam kurva kekayaan bersih adalah kesan leverage 1x yang memendekkan indeks altcoin. Dapat dilihat bahawa strategi pada dasarnya memperkuat turun naik indeks, yang selaras dengan jangkaan. Pengembalian dua bulan terakhir adalah 60%, retracement maksimum adalah 20%, dan leverage maksimum adalah kira-kira 8 kali. Kebanyakan masa, ia kurang dari 6 kali. Ia masih selamat. Yang paling penting, lindung nilai lengkap telah membuat strategi kehilangan sedikit dalam kejatuhan 12 Mac.
Apabila harga mata wang jualan pendek meningkat dan nilai kontrak meningkat, kedudukan dikurangkan, sebaliknya, apabila memperoleh keuntungan, kedudukan meningkat. Ini mengekalkan nilai keseluruhan kontrak yang tidak berubah, walaupun kejatuhan yang meroket mempunyai kerugian yang terhad.
Tetapi risiko juga disebutkan sebelumnya, altcoin sangat mungkin menjalankan trend mereka sendiri, dan mungkin meningkat banyak dari bawah. Ia bergantung kepada bagaimana anda menggunakannya. Jika anda optimis tentang altcoin dan berfikir bahawa ia telah mencapai bahagian bawah, anda boleh beroperasi ke arah dan membeli panjang indeks ini. atau jika anda optimis tentang mata wang tertentu, anda boleh lindung nilai dengan mereka.
(stragey_1.df['total']/stragey_1.initial_balance).plot(figsize=(18,6),grid = True); # Net worth curve
#(2-price_usdt_btc_norm[trade_symbols].mean(axis=1)).plot(figsize=(18,6),grid = True);
# Strategy leverage
stragey_1.df['leverage'].plot(figsize=(18,6),grid = True);
Di samping itu, kerana harga altcoin terhadap USDT juga jatuh, rancangan melampau tidak dilindungi, langsung menjual pendek, tetapi turun naiknya sangat besar dan retracement tinggi
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH', 'ETC','ATOM','BNB','EOS','LTC'])) # Remaining currencies
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 2000
for row in price_usdt.iloc[:].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 < -20 :
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 > 20 :
pass
#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']
stragey_1b = e
(stragey_1b.df['total']/stragey_1.initial_balance).plot(figsize=(18,6),grid = True); # Net worth curve
(2-price_usdt_btc_norm[trade_symbols].mean(axis=1)).plot(figsize=(18,6),grid = True);
Logik strategi:
Trade_value juga mengawal saiz kedudukan terbuka. anda juga boleh mengubah suai faktor penukaran diff/0.001
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) # Remaining currencies
price_usdt_btc_norm_mean = price_usdt_btc_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
e.Update(row[0], row[1])
empty_value = 0
for symbol in trade_symbols:
price = row[1][symbol]
if np.isnan(price):
continue
diff = price_usdt_btc_norm.loc[row[0],symbol] - price_usdt_btc_norm_mean[row[0]]
aim_value = -trade_value*round(diff/0.01,0)
now_value = e.account[symbol]['value']*np.sign(e.account[symbol]['amount'])
empty_value += now_value
if aim_value - now_value > 50:
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 < -50:
e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
price = row[1]['BTC']
aim_value = -empty_value
now_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount'])
if aim_value - now_value > 50:
e.Buy('BTC', price, round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
if aim_value - now_value < -50:
e.Sell('BTC', price, -round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
stragey_2 = e
Pengembalian strategi kedua jauh lebih baik daripada strategi pertama. Dalam dua bulan yang lalu, ia mempunyai pulangan 100%, tetapi masih mempunyai retracement 20%. Pada minggu lalu, disebabkan oleh turun naik pasaran yang kecil, pulangan tidak jelas. Leverage keseluruhan tidak banyak. Strategi ini bernilai mencuba. Bergantung pada tahap penyimpangan, lebih daripada 7800 kedudukan USDT dibuka paling banyak.
Perhatikan bahawa jika mata wang menjalankan trend bebas, sebagai contoh, ia telah meningkat beberapa kali berbanding indeks, ia akan mengumpul sebilangan besar kedudukan pendek dalam mata wang, dan penurunan tajam yang sama juga akan membuat strategi untuk membeli panjang, yang boleh mengehadkan kedudukan pembukaan maksimum.
(stragey_2.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);
# Summary results by currency
pd.DataFrame(e.account).T.apply(lambda x:round(x,3))
e.df['leverage'].plot(figsize=(18,6),grid = True);
Jika hasil daripada tidak lindung nilai adalah seperti berikut, perbezaan sebenarnya tidak banyak. kerana kedudukan panjang dan pendek pada dasarnya seimbang.
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) # Remaining currencies
price_usdt_btc_norm_mean = price_usdt_btc_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
e.Update(row[0], row[1])
empty_value = 0
for symbol in trade_symbols:
price = row[1][symbol]
if np.isnan(price):
continue
diff = price_usdt_btc_norm.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'])
empty_value += now_value
if aim_value - now_value > 20:
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 < -20:
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_2.initial_balance).plot(figsize=(18,6),grid = True);
#(stragey_2.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True); # Can be stacked together
Jika anda merujuk kepada regresi harga USDT, kesannya akan menjadi lebih teruk
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH']))+['BTC'] #Remaining currencies
price_usdt_norm_mean = price_usdt_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols,initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
e.Update(row[0], row[1])
empty_value = 0
for symbol in trade_symbols+['BTC']:
price = row[1][symbol]
if np.isnan(price):
continue
diff = price_usdt_norm.loc[row[0],symbol] - price_usdt_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'])
empty_value += now_value
if aim_value - now_value > 20:
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 < -20:
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']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);
(stragey_2b.df['total']/stragey_2.initial_balance).plot(figsize=(18,6),grid = True);
Jika anda mengehadkan nilai kedudukan maksimum, prestasi akan menjadi lebih teruk
trade_symbols = list(set(symbols)-set(['LINK','XTZ','BCH', 'ETH'])) #Remaining currencies
price_usdt_btc_norm_mean = price_usdt_btc_norm[trade_symbols].mean(axis=1)
e = Exchange(trade_symbols+['BTC'],initial_balance=10000,commission=0.0005,log=False)
trade_value = 300
for row in price_usdt.iloc[:].iterrows():
e.Update(row[0], row[1])
empty_value = 0
for symbol in trade_symbols:
price = row[1][symbol]
if np.isnan(price):
continue
diff = price_usdt_btc_norm.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'])
empty_value += now_value
if aim_value - now_value > 20 and abs(aim_value)<3000:
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 < -20 and abs(aim_value)<3000:
e.Sell(symbol, price, -round((aim_value - now_value)/price, 6),round(e.account[symbol]['realised_profit']+e.account[symbol]['unrealised_profit'],2))
price = row[1]['BTC']
aim_value = -empty_value
now_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount'])
if aim_value - now_value > 20:
e.Buy('BTC', price, round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
if aim_value - now_value < -20:
e.Sell('BTC', price, -round((aim_value - now_value)/price, 6),round(e.account['BTC']['realised_profit']+e.account['BTC']['unrealised_profit'],2))
stragey_2d = e
(stragey_2d.df['total']/stragey_2.initial_balance).plot(figsize=(17,6),grid = True);
Strategi pertama mengambil kesempatan daripada fakta bahawa nilai keseluruhan altcoin tidak sebaik bitcoin. Jika anda membeli bitcoin panjang, anda mungkin ingin berpegang pada strategi ini untuk masa yang lama. Oleh kerana kesamaan kedudukan panjang dan pendek, anda pada dasarnya tidak takut dengan kadar pembiayaan 8h. Dalam jangka panjang, kadar kemenangan agak tinggi. Tetapi saya juga bimbang bahawa altcoin pada masa ini berada di bahagian bawah, dan ia mungkin keluar dari trend menaik dan menyebabkan kerugian strategi ini.
Strategi kedua menggunakan ciri regresi harga altcoin, yang meningkat lebih daripada indeks dan mempunyai kemungkinan tinggi untuk jatuh kembali. Walau bagaimanapun, ia mungkin mengumpul terlalu banyak kedudukan dalam mata wang tunggal. Jika mata wang tertentu benar-benar tidak jatuh kembali, ia akan menyebabkan kerugian yang besar.
Oleh kerana masa permulaan strategi yang berbeza dan parameter khusus, kesan orang yang menggunakan strategi ini untuk masa yang lama tidak sepatutnya besar.
Singkatnya, tidak ada strategi yang sempurna, hanya sikap yang betul terhadap strategi, ia pada akhirnya bergantung kepada pengguna memahami risiko dan penilaian masa depan.