Type/to search
3
Follow
1505
Followers
Penjelasan terperinci mengenai strategi perdagangan pasangan mata wang digital
Discussions
Created 2024-07-05 16:23:42  Updated 2024-11-05 17:42:06
 3
 6566

img

Penjelasan terperinci mengenai strategi perdagangan pasangan mata wang digital

pengenalan

Baru-baru ini saya melihat diari kuantitatif Buu yang menyebut bahawa anda boleh menggunakan mata wang berkorelasi negatif untuk memilih mata wang, dan membuka kedudukan untuk membuat keuntungan berdasarkan penembusan perbezaan harga. Mata wang digital pada asasnya berkorelasi secara positif, dan hanya beberapa mata wang yang berkorelasi secara negatif. Mata wang ini selalunya mempunyai keadaan pasaran yang istimewa, seperti keadaan pasaran bebas syiling MEME suatu ketika dahulu, yang tidak mengikuti aliran pasaran sama sekali mata wang ini dan pergi lama selepas kejayaan , kaedah ini boleh membuat keuntungan di bawah keadaan pasaran tertentu. Walau bagaimanapun, kaedah yang paling biasa dalam bidang perdagangan kuantitatif adalah menggunakan korelasi positif untuk perdagangan pasangan Artikel ini akan memperkenalkan secara ringkas strategi ini.

Perdagangan pasangan mata wang kripto ialah strategi dagangan berdasarkan timbang tara statistik, yang bertujuan untuk mendapatkan keuntungan daripada sisihan harga dengan membeli dan menjual dua kontrak kekal mata wang kripto yang sangat berkorelasi secara serentak. Artikel ini akan memperkenalkan prinsip strategi, mekanisme keuntungan, kaedah menyaring mata wang, potensi risiko dan cara untuk memperbaikinya, dan menyediakan beberapa contoh kod Python praktikal.

Prinsip Strategi

Strategi perdagangan pasangan bergantung pada korelasi sejarah antara harga dua mata wang kripto. Apabila dua mata wang berkorelasi kuat, harga mereka bergerak secara kasar. Jika pada masa tertentu nisbah harga kedua-duanya menyimpang dengan ketara, ia boleh dianggap bahawa ini adalah anomali sementara dan harga akan cenderung untuk kembali ke paras normal. Pasaran mata wang digital sangat saling berkaitan Apabila mata wang digital utama (seperti Bitcoin) mengalami turun naik yang ketara, ia biasanya mencetuskan tindak balas berantai antara mata wang digital lain. Sesetengah mata wang mungkin mempunyai korelasi positif yang sangat jelas, dan korelasi itu mungkin dikekalkan, kerana ia tergolong dalam institusi pelaburan yang sama, pembuat pasaran yang sama dan landasan yang sama. Sesetengah mata wang berkorelasi negatif, tetapi terdapat lebih sedikit mata wang berkorelasi negatif, dan kerana kesemuanya dipengaruhi oleh aliran pasaran keseluruhan, mata wang tersebut sering menunjukkan arah aliran pasaran yang konsisten.

Andaikan syiling A dan syiling B mempunyai korelasi harga yang tinggi. Pada masa tertentu, nilai purata nisbah harga A/B ialah 1. Jika pada masa tertentu, nisbah harga A/B menyimpang daripada kenaikan lebih daripada 0.001, iaitu lebih daripada 1.001, maka anda boleh berdagang dengan cara berikut: buka kedudukan beli pada B dan buka kedudukan jual pada A . Sebaliknya, apabila nisbah harga A/B lebih rendah daripada 0.999: buka kedudukan beli pada A dan kedudukan jual pada B.

Kunci kepada keuntungan terletak pada keuntungan perbezaan harga apabila harga menyimpang dan kembali normal. Oleh kerana sisihan harga biasanya berumur pendek, peniaga boleh menutup kedudukan mereka apabila harga kembali kepada min dan mendapat keuntungan daripada perbezaan.

Sediakan data

Import perpustakaan yang sepadan

Kod ini boleh digunakan secara terus, tetapi yang terbaik adalah memuat turun Anancoda dan nyahpepijatnya dalam buku nota jupyer. Secara langsung termasuk pakej untuk analisis data yang biasa digunakan.

python
import requests from datetime import date,datetime import time import pandas as pd import numpy as np import matplotlib.pyplot as plt import requests, zipfile, io %matplotlib inline

Dapatkan semua pasangan dagangan yang didagangkan

python
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo') b_symbols = [s['symbol'] for s in Info.json()['symbols'] if s['contractType'] == 'PERPETUAL' and s['status'] == 'TRADING' and s['quoteAsset'] == 'USDT'] b_symbols = list(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in b_symbols])) b_symbols = [x[:-4] for x in b_symbols] print(b_symbols) # 获取所有的正在交易的交易对

Muat turun fungsi K-line

Fungsi utama fungsi GetKlines adalah untuk mendapatkan data K-line sejarah kontrak kekal bagi pasangan dagangan yang ditentukan daripada bursa Binance dan menyimpan data ini dalam Pandas DataFrame. Data K-line termasuk harga pembukaan, harga tertinggi, harga terendah, harga penutupan, volum dagangan dan maklumat lain. Kali ini kami menggunakan data harga penutupan terutamanya.

python
def GetKlines(symbol='BTCUSDT',start='2020-8-10',end='2024-7-01',period='1h',base='fapi',v = 'v1'): Klines = [] start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000 end_time = min(int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000,time.time()*1000) intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000} while start_time < end_time: time.sleep(0.3) mid_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]] url = 'https://'+base+'.binance.com/'+base+'/'+v+'/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000'%(symbol,period,start_time,mid_time) res = requests.get(url) res_list = res.json() if type(res_list) == list and len(res_list) > 0: start_time = res_list[-1][0]+int(period[:-1])*intervel_map[period[-1]] Klines += res_list if type(res_list) == list and len(res_list) == 0: start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]] if mid_time >= end_time: break df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float') df.index = pd.to_datetime(df.time,unit='ms') return df

Muat turun data

Jumlah data agak besar Untuk memuat turun dengan lebih pantas, hanya data K-line setiap jam untuk tiga bulan yang lalu diperolehi. df_close mengandungi data harga penutupan untuk semua mata wang

python
start_date = '2024-04-01' end_date = '2024-07-05' period = '1h' df_dict = {} for symbol in b_symbols: print(symbol) if symbol in df_dict.keys(): continue df_s = GetKlines(symbol=symbol+'USDT',start=start_date,end=end_date,period=period) if not df_s.empty: df_dict[symbol] = df_s df_close = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys()) for symbol in symbols: df_close[symbol] = df_dict[symbol].close df_close = df_close.dropna(how='all')

Enjin Uji Balik

Mentakrifkan objek Exchange untuk ujian belakang berikut

python
class Exchange: def __init__(self, trade_symbols, fee=0.0002, initial_balance=10000): self.initial_balance = initial_balance #初始的资产 self.fee = fee self.trade_symbols = trade_symbols self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0, 'leverage':0, 'hold':0, 'long':0, 'short':0}} for symbol in trade_symbols: self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0} def Trade(self, symbol, direction, price, amount): 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.fee #扣除手续费 self.account['USDT']['fee'] += price*amount*self.fee self.account[symbol]['fee'] += price*amount*self.fee if cover_amount > 0: #先平仓 self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #利润 self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount self.account[symbol]['amount'] -= -direction*cover_amount 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[symbol]['hold_price'] = total_cost/total_amount self.account[symbol]['amount'] += direction*open_amount def Buy(self, symbol, price, amount): self.Trade(symbol, 1, price, amount) def Sell(self, symbol, price, amount): self.Trade(symbol, -1, price, amount) def Update(self, close_price): #对资产进行更新 self.account['USDT']['unrealised_profit'] = 0 self.account['USDT']['hold'] = 0 self.account['USDT']['long'] = 0 self.account['USDT']['short'] = 0 for symbol in self.trade_symbols: if not np.isnan(close_price[symbol]): 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'] = self.account[symbol]['amount']*close_price[symbol] if self.account[symbol]['amount'] > 0: self.account['USDT']['long'] += self.account[symbol]['value'] if self.account[symbol]['amount'] < 0: self.account['USDT']['short'] += self.account[symbol]['value'] self.account['USDT']['hold'] += abs(self.account[symbol]['value']) 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']['hold']/self.account['USDT']['total'],3)

Analisis korelasi untuk menapis mata wang

Pengiraan korelasi adalah kaedah dalam statistik yang digunakan untuk mengukur hubungan linear antara dua pembolehubah. Kaedah pengiraan korelasi yang paling biasa digunakan ialah pekali korelasi Pearson. Di bawah ialah prinsip, formula dan kaedah pelaksanaan untuk pengiraan korelasi. Pekali korelasi Pearson digunakan untuk mengukur hubungan linear antara dua pembolehubah, dan julat nilainya adalah antara -1 dan 1:

  • 1 Menunjukkan korelasi positif yang sempurna, di mana kedua-dua pembolehubah sentiasa berubah secara serentak. Apabila satu pembolehubah meningkat, pembolehubah yang lain juga meningkat secara berkadar. Semakin hampir kepada 1, semakin kuat korelasinya.
  • -1 Menunjukkan korelasi negatif yang sempurna, di mana kedua-dua pembolehubah sentiasa berubah dalam arah yang bertentangan. Semakin hampir nilainya dengan -1, semakin kuat korelasi negatifnya.
  • 0 Menunjukkan tiada korelasi linear, tiada hubungan garis lurus antara dua pembolehubah.

Pekali korelasi Pearson menentukan korelasi antara dua pembolehubah dengan mengira kovarians dan sisihan piawainya. Formulanya adalah seperti berikut:

[ \rho_{X,Y} = \frac{\text{cov}(X,Y)}{\sigma_X \sigma_Y} ]

dalam:

  • ( \rho_{X,Y} ) ialah pembolehubah( X ) dan( Y ) Pekali korelasi Pearson.
  • ( \text{cov}(X,Y) ) ya( X ) dan( Y ) Kovarians bagi .
  • ( \sigma_X ) dan( \sigma_Y ) Mereka adalah( X ) dan( Y ) Sisihan piawai bagi .

Sudah tentu, anda tidak perlu terlalu risau tentang cara ia dikira Anda boleh mengira korelasi semua mata wang menggunakan hanya satu baris kod Python. Rajah menunjukkan peta haba korelasi Merah mewakili korelasi positif, biru mewakili korelasi negatif, dan lebih gelap warna, lebih kuat korelasi. Ia boleh dilihat bahawa kawasan besar berwarna merah gelap, jadi korelasi positif mata wang digital adalah sangat kuat.

img

python
import seaborn as sns corr = df_close.corr() plt.figure(figsize=(20, 20)) sns.heatmap(corr, annot=False, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Correlation Heatmap of Cryptocurrency Closing Prices', fontsize=20);

Berdasarkan korelasi, 20 teratas pasangan mata wang paling relevan dipilih. Hasilnya adalah seperti berikut. Korelasi mereka sangat kuat, semuanya melebihi 0.99.

MANA SAND 0.996562 ICX ZIL 0.996000 STORJ FLOW 0.994193 FLOW SXP 0.993861 STORJ SXP 0.993822 IOTA ZIL 0.993204 SAND 0.993095 KAVA SAND 0.992303 ZIL SXP 0.992285 SAND 0.992103 DYDX ZIL 0.992053 DENT REEF 0.991789 RDNT MANTA 0.991690 STMX STORJ 0.991222 BIGTIME ACE 0.990987 RDNT HOOK 0.990718 IOST GAS 0.990643 ZIL HOOK 0.990576 MATIC FLOW 0.990564 MANTA HOOK 0.990563

Kod yang sepadan adalah seperti berikut:

python
corr_pairs = corr.unstack() # 移除自身相关性(即对角线上的值) corr_pairs = corr_pairs[corr_pairs != 1] sorted_corr_pairs = corr_pairs.sort_values(kind="quicksort") # 提取最相关和最不相关的前20个币种对 most_correlated = sorted_corr_pairs.tail(40)[::-2] print("最相关的前20个币种对:") print(most_correlated)

Pengesahan ujian belakang

Kod ujian belakang khusus adalah seperti berikut. Strategi demo memberi tumpuan kepada pemerhatian nisbah harga dua mata wang kripto (IOTA dan ZIL) dan perdagangan berdasarkan perubahan dalam nisbah ini. Langkah-langkah khusus adalah seperti berikut:

  1. permulaan

    • Tentukan pasangan dagangan (pair_a = 'IOTA', pair_b = 'ZIL').
    • Buat objek pertukarane, baki awal ialah $10,000 dan yuran transaksi ialah 0.02%.
    • Mengira nisbah harga purata awalavg
    • Tetapkan nilai transaksi awalvalue = 1000
  2. Memproses data harga secara berulang

    • Lintas data harga pada setiap titik masadf_close
    • Mengira sisihan nisbah harga semasa daripada mindiff
    • Kira nilai transaksi sasaran berdasarkan sisihanaim_value, untuk setiap sisihan 0.01, dagangan satu nilai. Dan memutuskan operasi jual beli berdasarkan kedudukan akaun semasa dan keadaan harga.
    • Jika sisihan terlalu besar, laksanakan jualanpair_a dan belipair_b beroperasi.
    • Jika sisihan terlalu kecil, laksanakan pembelianpair_a dan jualpair_b beroperasi.
  3. Min diselaraskan

    • Nisbah harga purata dikemas kiniavg, untuk mencerminkan nisbah harga terkini.
  4. Mengemas kini Akaun dan Rekod

    • Kemas kini maklumat kedudukan dan baki akaun pertukaran.
    • Catatkan status akaun pada setiap langkah (jumlah aset, pegangan, yuran transaksi, kedudukan panjang dan pendek) keres_list
  5. Output Keputusan

    • akanres_list Tukar kepada bingkai datares, untuk analisis dan pembentangan lanjut.
python
pair_a = 'IOTA' pair_b = "ZIL" e = Exchange([pair_a,pair_b], fee=0.0002, initial_balance=10000) #Exchange定义放在评论区 res_list = [] index_list = [] avg = df_close[pair_a][0] / df_close[pair_b][0] value = 1000 for idx, row in df_close.iterrows(): diff = (row[pair_a] / row[pair_b] - avg)/avg aim_value = -value * diff / 0.01 if -aim_value + e.account[pair_a]['amount']*row[pair_a] > 0.5*value: e.Sell(pair_a,row[pair_a],(-aim_value + e.account[pair_a]['amount']*row[pair_a])/row[pair_a]) e.Buy(pair_b,row[pair_b],(-aim_value - e.account[pair_b]['amount']*row[pair_b])/row[pair_b]) if -aim_value + e.account[pair_a]['amount']*row[pair_a] < -0.5*value: e.Buy(pair_a, row[pair_a],(aim_value - e.account[pair_a]['amount']*row[pair_a])/row[pair_a]) e.Sell(pair_b, row[pair_b],(aim_value + e.account[pair_b]['amount']*row[pair_b])/row[pair_b]) avg = 0.99*avg + 0.01*row[pair_a] / row[pair_b] index_list.append(idx) e.Update(row) res_list.append([e.account['USDT']['total'],e.account['USDT']['hold'], e.account['USDT']['fee'],e.account['USDT']['long'],e.account['USDT']['short']]) res = pd.DataFrame(data=res_list, columns=['total','hold', 'fee', 'long', 'short'],index = index_list) res['total'].plot(grid=True);

Sebanyak 4 kumpulan mata wang telah diuji balik, dan hasilnya agak ideal. Pengiraan korelasi semasa menggunakan data masa hadapan, jadi ia tidak begitu tepat. Artikel ini juga membahagikan data kepada dua bahagian, berdasarkan korelasi yang dikira di hadapan dan urus niaga yang diuji belakang di belakang. Hasilnya agak kurang tetapi masih bagus. Ia diserahkan kepada pengguna untuk melaksanakan pengesahan.

img

Potensi risiko dan cara untuk menambah baik

Walaupun strategi perdagangan pasangan boleh menguntungkan secara teori, masih terdapat beberapa risiko dalam operasi sebenar: korelasi antara mata wang mungkin berubah dari semasa ke semasa, menyebabkan strategi gagal dalam keadaan pasaran yang melampau, sisihan harga mungkin meningkat, mengakibatkan kerugian besar; kecairan yang rendah bagi mata wang tertentu boleh menyebabkan urus niaga sukar dilaksanakan atau meningkatkan kos;

Untuk mengurangkan risiko dan meningkatkan kestabilan strategi, langkah-langkah penambahbaikan berikut boleh dipertimbangkan: kerap mengira semula korelasi antara mata wang dan melaraskan pasangan dagangan dalam masa yang ditetapkan untuk menghentikan kerugian dan mengambil mata keuntungan untuk mengawal kerugian maksimum satu transaksi; berdagang berbilang pasangan Syiling untuk mempelbagaikan risiko.

kesimpulannya

Strategi perdagangan pasangan mata wang digital mencapai keuntungan dengan mengambil kesempatan daripada korelasi antara harga mata wang dan melaksanakan operasi arbitraj apabila harga menyimpang. Strategi ini mempunyai kebolehlaksanaan teori yang tinggi. Kod sumber strategi masa nyata ringkas berdasarkan strategi ini akan dikeluarkan kemudian. Jika anda mempunyai lebih banyak soalan atau memerlukan perbincangan lanjut, sila berasa bebas untuk berkomunikasi.

Comment
All comments (2)

    这个值得研究,码源呢?

    2 years ago

    张总加班 - -! 哈哈哈

    2 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)