Penyelidikan mengenai Strategi Hedging Multi-mata wang Binance Futures Bahagian 1

Penulis:Kebaikan, Dicipta: 2020-05-09 11:14:50, Dikemas kini: 2023-11-04 19:49:01

img

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.

img

Sebab-sebab strategi

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.

Prinsip-prinsip strategi

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

Layar mata wang yang diperlukan

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 s mengkaji pergerakan harga altcoin ke Bitcoin pada tahun lepas. Saya telah memuat turun data terlebih dahulu dan menyiarkannya ke forum, yang boleh langsung dipetik dalam persekitaran penyelidikan.

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:

img img

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);

img

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");

img

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 LINK, XTZ, BCH, ETH, ETC, ATOM, BNB, EOS, LTC tidak mengambil bahagian dalam pendek strategi pertama, butiran khusus boleh diuji semula oleh diri anda sendiri.

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);

img

Data Kemampanan Binance

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:

img img

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);

img

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);

img

Enjin ujian belakang

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:

  • trade_symbols: senarai mata wang yang akan didagangkan
  • leverage: leverage, margin kesan,
  • Komisen: yuran urus niaga, lalai 0.00005
  • initial_balance: aset awal, penilaian USDT
  • log: sama ada untuk mencetak rekod urus niaga
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

Kod strategi pertama

Logik strategi:

  • Periksa harga mata wang, jika tidak nan, anda boleh berdagang
  • Periksa nilai kontrak altcoin. Jika ia kurang daripada nilai sasaran trade_value, perbezaan yang sepadan akan dijual pendek, dan jika lebih besar, jumlah yang sepadan akan dibeli untuk menutup kedudukan.
  • Tambah nilai pendek semua altcoin dan sesuaikan kedudukan BTC untuk lindung nilai terhadapnya.

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))

img

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);

img

# Strategy leverage
stragey_1.df['leverage'].plot(figsize=(18,6),grid = True);

img

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);

img

Kod strategi kedua

Logik strategi:

  • Periksa sama ada ada harga atau ada harga untuk berdagang
  • Periksa penyimpangan harga mata wang daripada indeks
  • Pergi panjang dan pendek berdasarkan penilaian penyimpangan, dan menilai kedudukan mengikut saiz penyimpangan
  • Mengira kedudukan yang tidak dilindungi dan lindung nilai dengan BTC

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);

img

# Summary results by currency
pd.DataFrame(e.account).T.apply(lambda x:round(x,3))

img

e.df['leverage'].plot(figsize=(18,6),grid = True);

img

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

img

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);

img

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);

img

Ringkasan dan Risiko

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.


Berkaitan

Lebih lanjut