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.
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.
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
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 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
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')
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)
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:
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:
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.
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)
Berikut adalah kode retargeting spesifik. Langkah-langkah khusus adalah sebagai berikut:
Inisialisasi:
e
Dengan saldo awal sebesar US$10.000, biaya transaksi sebesar 0,02%.avg
。value = 1000
。Data harga yang diproses secara berulang:
df_close
。diff
。aim_value
, setiap deviasi 0.01, perdagangan satu nilai. Dan berdasarkan kepemilikan akun saat ini dan situasi harga memutuskan untuk membeli dan menjual operasi.pair_a
dan membelipair_b
Operasi.pair_a
dan menjualpair_b
Operasi.Rata-rata yang disesuaikan:
avg
Untuk memperlihatkan rasio harga terbaru.Pembaruan akun dan catatan:
res_list
。Hasil output:
res_list
Mengkonversi ke dataframeres
Untuk 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.
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.
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.
77924998Apakah ini layak untuk dipelajari?
Kacang 888"Mengharukan" karena ada yang kurang.