3
fokus pada
1444
Pengikut

Penjelasan rinci tentang strategi perdagangan pasangan mata uang digital

Dibuat di: 2024-07-05 16:23:42, diperbarui pada: 2024-11-05 17:42:06
comments   3
hits   5800

Penjelasan rinci tentang strategi perdagangan pasangan mata uang digital

Penjelasan rinci tentang strategi perdagangan pasangan mata uang digital

perkenalan

Baru-baru ini saya melihat buku harian kuantitatif Buu yang menyebutkan bahwa Anda dapat menggunakan mata uang berkorelasi negatif untuk memilih mata uang, dan membuka posisi untuk menghasilkan keuntungan berdasarkan terobosan perbedaan harga. Mata uang digital pada dasarnya berkorelasi positif, dan hanya beberapa mata uang yang berkorelasi negatif. Mata uang digital sering kali memiliki kondisi pasar khusus, seperti kondisi pasar independen koin MEME beberapa waktu lalu, yang sama sekali tidak mengikuti tren pasar. Saring mata uang ini dan bertahan lama setelah terobosan, metode ini dapat menghasilkan keuntungan dalam kondisi pasar tertentu. Namun, metode yang paling umum di bidang perdagangan kuantitatif adalah menggunakan korelasi positif untuk perdagangan berpasangan. Artikel ini akan memperkenalkan strategi ini secara singkat.

Perdagangan pasangan mata uang kripto adalah strategi perdagangan yang didasarkan pada arbitrase statistik, yang berupaya memperoleh laba dari penyimpangan harga dengan membeli dan menjual dua kontrak berjangka mata uang kripto yang sangat berkorelasi secara bersamaan. Artikel ini akan memperkenalkan prinsip-prinsip strategi, mekanisme keuntungan, metode penyaringan mata uang, potensi risiko dan cara memperbaikinya, serta memberikan beberapa contoh kode Python praktis.

Prinsip Strategi

Strategi perdagangan berpasangan bergantung pada korelasi historis antara harga dua mata uang kripto. Ketika dua mata uang berkorelasi kuat, harga-harganya bergerak hampir selaras. Jika pada saat tertentu rasio harga keduanya menyimpang secara signifikan, dapat dianggap bahwa ini adalah anomali sementara dan harga akan cenderung kembali ke tingkat normal. Pasar mata uang digital sangat saling terkait. Ketika mata uang digital utama (seperti Bitcoin) mengalami fluktuasi yang signifikan, hal itu biasanya memicu reaksi berantai di antara mata uang digital lainnya. Beberapa mata uang mungkin memiliki korelasi positif yang sangat jelas, dan korelasi tersebut dapat dipertahankan, karena mata uang tersebut dimiliki oleh lembaga investasi yang sama, pembuat pasar yang sama, dan jalur yang sama. Beberapa mata uang berkorelasi negatif, tetapi jumlah mata uang yang berkorelasi negatif lebih sedikit, dan karena semuanya dipengaruhi oleh tren pasar secara keseluruhan, mata uang tersebut sering kali menunjukkan tren pasar yang konsisten.

Asumsikan koin A dan koin B memiliki korelasi harga yang tinggi. Pada saat tertentu, nilai rata-rata rasio harga A/B adalah 1. Jika pada saat tertentu, rasio harga A/B menyimpang dari kenaikan lebih dari 0,001, yaitu lebih dari 1,001, maka Anda dapat berdagang dengan cara berikut: membuka posisi panjang pada B dan membuka posisi pendek pada A . Sebaliknya, ketika rasio harga A/B lebih rendah dari 0,999: buka posisi panjang pada A dan posisi pendek pada B.

Kunci profitabilitas terletak pada keuntungan selisih harga saat harga menyimpang dan kembali normal. Karena penyimpangan harga biasanya berumur pendek, pedagang dapat menutup posisi mereka ketika harga kembali ke harga rata-rata dan mendapat untung dari selisihnya.

Siapkan datanya

Impor pustaka yang sesuai

Kode-kode ini dapat digunakan secara langsung, tetapi yang terbaik adalah mengunduh Anancoda dan men-debug-nya di jupyer notebook. Secara langsung mencakup paket untuk analisis data yang umum digunakan.

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 perdagangan yang diperdagangkan

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) # 获取所有的正在交易的交易对

Unduh fungsi K-line

Fungsi utama fungsi GetKlines adalah untuk memperoleh data K-line historis dari kontrak abadi pasangan perdagangan tertentu dari bursa Binance dan menyimpan data ini dalam Pandas DataFrame. Data K-line meliputi harga pembukaan, harga tertinggi, harga terendah, harga penutupan, volume perdagangan, dan informasi lainnya. Kali ini kami terutama menggunakan data harga penutupan.

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

Unduh data

Jumlah datanya relatif besar. Agar dapat mengunduh lebih cepat, hanya data K-line per jam selama tiga bulan terakhir yang diperoleh. df_close berisi data harga penutupan untuk semua mata uang

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

Mesin Uji Ulang

Menentukan objek Exchange untuk backtest berikut

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 memfilter mata uang

Perhitungan korelasi adalah metode dalam statistika yang digunakan untuk mengukur hubungan linear antara dua variabel. Metode perhitungan korelasi yang paling umum digunakan adalah koefisien korelasi Pearson. Berikut adalah prinsip, rumus, dan metode implementasi untuk perhitungan korelasi. Koefisien korelasi Pearson digunakan untuk mengukur hubungan linear antara dua variabel, dan rentang nilainya antara -1 dan 1:

  • 1 Menunjukkan korelasi positif sempurna, di mana kedua variabel selalu berubah secara serempak. Jika satu variabel meningkat, maka variabel lain pun ikut meningkat secara proporsional. Semakin mendekati angka 1, semakin kuat korelasinya.
  • -1 Menunjukkan korelasi negatif sempurna, di mana kedua variabel selalu berubah ke arah yang berlawanan. Semakin mendekati -1, semakin kuat korelasi negatifnya.
  • 0 Menunjukkan tidak ada korelasi linear, tidak ada hubungan garis lurus antara dua variabel.

Koefisien korelasi Pearson menentukan korelasi antara dua variabel dengan menghitung kovariansi dan deviasi standarnya. Rumusnya adalah sebagai berikut:

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

di dalam:

  • ( \rho_{X,Y} ) adalah sebuah variabel( X ) Dan ( Y ) Koefisien korelasi Pearson.
  • ( \text{cov}(X,Y) ) Ya ( X ) Dan ( Y ) Kovariansi dari .
  • ( \sigma_X ) Dan ( \sigma_Y ) Mereka adalah( X ) Dan ( Y ) Simpangan baku dari .

Tentu saja, Anda tidak perlu terlalu khawatir tentang cara penghitungannya. Anda dapat menghitung korelasi semua mata uang hanya dengan menggunakan satu baris kode Python. Gambar tersebut menunjukkan peta panas korelasi. Merah menunjukkan korelasi positif, biru menunjukkan korelasi negatif, dan semakin gelap warnanya, semakin kuat korelasinya. Terlihat bahwa area yang luas berwarna merah tua, sehingga korelasi positif mata uang digital sangat kuat.

Penjelasan rinci tentang strategi perdagangan pasangan mata uang digital

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 pasangan mata uang paling relevan dipilih. Hasilnya adalah sebagai berikut. Korelasinya sangat kuat, semuanya di atas 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

Kode yang sesuai adalah sebagai berikut:

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)

Verifikasi pengujian ulang

Kode backtest spesifiknya adalah sebagai berikut. Strategi demo berfokus pada pengamatan rasio harga dua mata uang kripto (IOTA dan ZIL) dan perdagangan berdasarkan perubahan rasio ini. Langkah-langkah spesifiknya adalah sebagai berikut:

  1. inisialisasi

    • Tentukan pasangan perdagangan (pair_a = ‘IOTA’, pair_b = ‘ZIL’).
    • Buat objek pertukarane, saldo awal adalah $10.000 dan biaya transaksi adalah 0,02%.
    • Menghitung rasio harga rata-rata awalavg
    • Tetapkan nilai transaksi awalvalue = 1000
  2. Memproses data harga secara berulang

    • Telusuri data harga di setiap titik waktudf_close
    • Menghitung deviasi rasio harga saat ini dari rata-ratadiff
    • Hitung nilai transaksi target berdasarkan deviasiaim_value, untuk setiap deviasi 0,01, perdagangkan satu nilai. Dan memutuskan operasi pembelian dan penjualan berdasarkan posisi akun berjalan dan kondisi harga.
    • Jika penyimpangannya terlalu besar, lakukan penjualanpair_a dan membelipair_b beroperasi.
    • Jika penyimpangannya terlalu kecil, lakukan pembelianpair_a dan menjualpair_b beroperasi.
  3. Rata-rata yang disesuaikan

    • Rasio harga rata-rata yang diperbaruiavg, untuk mencerminkan rasio harga terkini.
  4. Memperbarui Akun dan Catatan

    • Perbarui informasi posisi dan saldo akun bursa.
    • Catat status akun di setiap langkah (total aset, kepemilikan, biaya transaksi, posisi panjang dan pendek) untukres_list
  5. Hasil Keluaran

    • Akan res_list Konversi ke kerangka datares, untuk analisis dan presentasi lebih lanjut.
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 kelompok mata uang diuji kembali, dan hasilnya relatif ideal. Perhitungan korelasi saat ini menggunakan data masa depan, sehingga tidak terlalu akurat. Artikel ini juga membagi data menjadi dua bagian, berdasarkan perhitungan korelasi di bagian depan dan pengujian kembali transaksi di bagian belakang. Hasilnya sedikit mengecewakan, tetapi masih cukup bagus. Terserah kepada pengguna untuk melakukan verifikasi.

Penjelasan rinci tentang strategi perdagangan pasangan mata uang digital

Risiko potensial dan cara untuk memperbaikinya

Meskipun strategi perdagangan berpasangan dapat menguntungkan secara teori, masih ada beberapa risiko dalam operasi sebenarnya: korelasi antara mata uang dapat berubah seiring waktu, yang menyebabkan strategi gagal; dalam kondisi pasar yang ekstrem, deviasi harga dapat meningkat, yang mengakibatkan kerugian besar; Likuiditas mata uang tertentu yang rendah dapat membuat transaksi sulit dilaksanakan atau meningkatkan biaya; biaya yang dihasilkan oleh transaksi yang sering dilakukan dapat mengikis keuntungan.

Untuk mengurangi risiko dan meningkatkan stabilitas strategi, langkah-langkah perbaikan berikut dapat dipertimbangkan: menghitung ulang korelasi antara mata uang secara berkala dan menyesuaikan pasangan perdagangan tepat waktu; menetapkan titik stop loss dan take profit untuk mengendalikan kerugian maksimum dari satu transaksi; perdagangkan beberapa pasangan Koin untuk mendiversifikasi risiko.

sebagai kesimpulan

Strategi perdagangan pasangan mata uang digital memperoleh keuntungan dengan memanfaatkan korelasi antara harga mata uang dan melakukan operasi arbitrase ketika harga menyimpang. Strategi ini memiliki kelayakan teoritis yang tinggi. Kode sumber strategi waktu nyata sederhana berdasarkan strategi ini akan dirilis kemudian. Jika Anda memiliki pertanyaan lebih lanjut atau memerlukan diskusi lebih lanjut, jangan ragu untuk berkomunikasi.