Sumber daya yang dimuat... Pemuatan...

Strategi perdagangan pasangan mata uang digital

Penulis:Rumput, Dibuat: 2024-07-05 16:23:42, Diperbarui: 2024-11-05 17:42:06

img

Strategi perdagangan pasangan mata uang digital

Pengantar

Baru-baru ini melihat catatan kuantitatif dari BoE menyebutkan bahwa dapat menggunakan mata uang yang terkait negatif untuk melakukan transaksi mata uang, berdasarkan perbedaan harga yang terpecah untuk membuka perdagangan untuk mendapatkan keuntungan. Mata uang digital pada dasarnya adalah terkait positif, terkait negatif adalah beberapa mata uang, sering memiliki pasar khusus, seperti pasar independen mata uang MEME beberapa waktu yang lalu, tidak mengikuti tren besar, menyaring mata uang ini, dan melakukan lebih banyak setelah terpecah, cara ini dapat menguntungkan dalam situasi tertentu.

Perdagangan pasangan mata uang digital adalah strategi perdagangan yang didasarkan pada keuntungan statistik, dengan membeli dan menjual dua kontrak permanen mata uang digital yang sangat terkait secara bersamaan untuk mendapatkan keuntungan dari deviasi harga. Artikel ini akan menjelaskan secara rinci prinsip-prinsip strategi, mekanisme keuntungan, metode penyaringan mata uang, risiko potensial dan cara memperbaikinya, serta memberikan beberapa contoh kode Python yang praktis.

Prinsip Strategi

Strategi perdagangan berpasangan bergantung pada korelasi historis antara harga dua mata uang digital. Ketika dua mata uang menunjukkan korelasi yang kuat, pergerakan harga mereka hampir sinkronisasi. Jika rasio harga keduanya terjadi pada saat tertentu, ini dapat dianggap sebagai kelainan sementara, dan harga cenderung kembali ke level normal. Pasar mata uang digital memiliki konektivitas yang tinggi, dan ketika salah satu mata uang digital utama (seperti Bitcoin) mengalami fluktuasi besar, biasanya reaksi konektivitas dari mata uang digital lainnya akan dipicu.

Asumsikan bahwa mata uang A dan mata uang B memiliki korelasi harga yang lebih tinggi. Pada suatu saat, rata-rata rasio harga A/B adalah 1. Jika pada suatu saat rasio harga A/B naik lebih dari 0.001, yaitu lebih dari 1.001, maka perdagangan dapat dilakukan dengan cara berikut: buka lebih banyak B, buka lebih banyak A. Sebaliknya, ketika rasio harga A/B kurang dari 0.999: buka lebih banyak A, buka lebih banyak B.

Kunci keuntungan adalah keuntungan dari perbedaan ketika harga menyimpang kembali normal. Karena perbedaan harga biasanya singkat, pedagang dapat mengakhiri ketika harga kembali ke rata-rata dan mendapatkan keuntungan dari itu, menghasilkan perbedaan.

Persiapkan data

Memperkenalkan repositori

Kode-kode ini dapat digunakan secara langsung, sebaiknya dengan mengunduh Anancoda, dan di-debug di notebook jupyer.

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

Fungsi untuk mengunduh K-line

Fungsi utama dari fungsi GetKlines adalah untuk mengambil data K-line sejarah dari transaksi yang ditentukan untuk kontrak permanen dari bursa Binance dan menyimpan data ini dalam Pandas DataFrame. Data K-line mencakup informasi seperti harga buka, harga tertinggi, harga terendah, harga penutupan, volume transaksi.

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

Mengunduh data

Data yang relatif besar, untuk unduhan yang lebih cepat, hanya mendapatkan data K-line jam terakhir selama 3 bulan terakhir.

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 pengukur ulang

Mengidentifikasi objek Exchange untuk diulang

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 Relevansi Mendaftar Mata Uang

Kalkulasi korelasi adalah metode dalam statistik yang digunakan untuk mengukur hubungan linier antara dua variabel. Kalkulasi korelasi yang paling umum digunakan adalah koefisien korelasi Pearson. Berikut ini adalah prinsip, rumus, dan implementasi perhitungan korelasi. Koefisien korelasi Pearson digunakan untuk mengukur hubungan linier antara dua variabel dengan rentang nilai antara -1 dan 1:

  • 1Menunjukkan bahwa dua variabel selalu berubah secara sinkron. Ketika satu variabel meningkat, variabel lainnya juga meningkat secara proporsional. Semakin dekat 1 mewakili semakin kuatnya hubungan.
  • -1Menunjukkan bahwa dua variabel selalu berubah secara terbalik. Semakin dekat -1 berarti semakin kuat hubungan negatif.
  • 0Ini menunjukkan hubungan nirkabel, tidak ada hubungan linier antara dua variabel.

Koefisien hubungan Pearson ditentukan dengan menghitung perbedaannya antara dua variabel dengan perbedaannya antara perbedaannya dengan perbedaannya dengan perbedaannya dengan perbedaannya.

{\cH00FFFF} {\cH00FFFF}{\cH00FFFF}{\cH00FFFF}{\cH00FFFF}{\cH00FFFF}Aku tidak tahu.

Di antaranya:

  • (\rho_{X,Y}) adalah koefisien Pearson dari variabel (X) dan (Y)
  • (\text{cov}(X,Y)) adalah perbandingan dari X dan Y.
  • (\sigma_X) dan (\sigma_Y) adalah standar perbedaan (X) dan (Y) masing-masing.

Tentu saja, tanpa terlalu peduli bagaimana perhitungannya, Anda dapat menghitung korelasi semua mata uang dengan menggunakan kode baris 1 Python. Gambar ini menunjukkan grafik termal korelasi, perwakilan merah yang positif, perwakilan biru yang negatif, semakin mendalam korelasi warna. Anda dapat melihat bahwa bagian besar adalah merah gelap, jadi kata korelasi positif mata uang digital yang kuat.

img

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 relevansi, 20 pasangan mata uang teratas yang paling relevan dipilih. Hasilnya adalah sebagai berikut. Mereka semua memiliki relevansi yang 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)

Pengujian ulang

Berikut adalah kode retargeting spesifik. Langkah-langkah khusus adalah sebagai berikut:

  1. Inisialisasi

    • Definisi pasangan transaksi (pair_a = IOTA, pair_b = ZIL) ⇒
    • Membuat Obyek BursaeDengan saldo awal sebesar US$10.000, biaya transaksi sebesar 0,02%.
    • Perhitungan rasio harga rata-rata awalavg
    • Menetapkan nilai transaksi awalvalue = 1000
  2. Data harga yang diproses secara berulang

    • Data harga di setiap titik waktudf_close
    • Menghitung perbandingan harga saat ini terhadap rata-ratadiff
    • Perhitungan nilai transaksi berdasarkan deviasiaim_value, setiap deviasi 0.01, perdagangan satu nilai. Dan berdasarkan kepemilikan akun saat ini dan situasi harga memutuskan untuk membeli dan menjual operasi.
    • Jika deviasi terlalu besar, lakukan penjualan.pair_adan membelipair_bOperasi.
    • Jika deviasi terlalu kecil, lakukan pembelian.pair_adan menjualpair_bOperasi.
  3. Rata-rata yang disesuaikan

    • Perbarui rasio harga rata-rataavgUntuk memperlihatkan rasio harga terbaru.
  4. Pembaruan akun dan catatan

    • Untuk memperbarui informasi tentang saham dan saldo akun di bursa tersebut.
    • Mencatat status akun setiap langkah (total aset, aset yang dipegang, biaya transaksi, posisi multi dan kosong) hinggares_list
  5. Hasil output

    • akanres_listMengkonversi ke dataframeresUntuk analisis dan demonstrasi 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);

Hasilnya relatif ideal. Perhitungan korelasi saat ini menggunakan data masa depan, jadi tidak terlalu akurat. Artikel ini juga membagi data menjadi dua bagian, berdasarkan korelasi perhitungan sebelumnya, hasil re-test berikutnya.

img

Potensi risiko dan cara untuk memperbaiki

Meskipun strategi perdagangan berpasangan dapat menguntungkan secara teori, ada beberapa risiko dalam operasi praktis: korelasi antara mata uang dapat berubah seiring waktu, menyebabkan strategi gagal; dalam kondisi pasar yang ekstrem, deviasi harga dapat meningkat, menyebabkan kerugian yang lebih besar; likuiditas tertentu dalam mata uang yang lebih rendah, yang dapat menyebabkan transaksi sulit dilaksanakan atau meningkat biaya; biaya proses yang dihasilkan dari perdagangan yang sering dapat mengikis keuntungan.

Untuk mengurangi risiko dan meningkatkan stabilitas strategi, langkah-langkah perbaikan berikut dapat dipertimbangkan: perhitungan ulang korelasi antara mata uang secara teratur, penyesuaian pasangan perdagangan secara tepat waktu; pengaturan stop loss dan stop target, untuk mengendalikan kerugian maksimum dari satu transaksi; perdagangan beberapa pasangan mata uang pada saat yang sama, menyebarkan risiko.

Kesimpulan

Strategi perdagangan pasangan mata uang digital menghasilkan keuntungan dengan memanfaatkan keterkaitan harga mata uang untuk melakukan operasi suap saat harga menyimpang. Strategi ini memiliki kelayakan teoritis yang lebih tinggi. Sebuah kode sumber strategi real-time sederhana berdasarkan strategi ini akan kemudian dirilis. Jika ada pertanyaan lebih lanjut atau perlu diskusi lebih lanjut, silakan hubungi kami.


Lebih banyak

77924998Apakah ini layak untuk dipelajari?

Kacang 888"Mengharukan" karena ada yang kurang.