हाल ही में, मैंने BuOu
डिजिटल मुद्रा जोड़ी व्यापार सांख्यिकीय मध्यस्थता पर आधारित एक व्यापार रणनीति है, जो मूल्य विचलन से लाभ प्राप्त करने के लिए एक साथ दो अत्यधिक सहसंबंधित क्रिप्टोकरेंसी खरीदता है और बेचता है। यह लेख इस रणनीति के सिद्धांतों, लाभ तंत्र, मुद्राओं के चयन के तरीकों, संभावित जोखिमों और उन्हें बेहतर बनाने के तरीकों का परिचय देगा, और कुछ व्यावहारिक पायथन कोड उदाहरण प्रदान करेगा।
जोड़ी व्यापार रणनीतियाँ दो डिजिटल मुद्राओं की कीमतों के बीच ऐतिहासिक सहसंबंध पर निर्भर करती हैं। जब दो मुद्राओं की कीमतें एक मजबूत सहसंबंध दिखाती हैं, तो उनकी मूल्य प्रवृत्तियां आम तौर पर सिंक्रनाइज़ होती हैं। यदि एक निश्चित क्षण में दोनों के बीच मूल्य अनुपात काफी विचलित हो जाता है, तो इसे एक अस्थायी असामान्यता माना जा सकता है और कीमत सामान्य स्तर पर लौटने की प्रवृत्ति होगी। डिजिटल मुद्रा बाजार अत्यधिक परस्पर जुड़ा हुआ है। जब एक प्रमुख डिजिटल मुद्रा (जैसे बिटकॉइन) महत्वपूर्ण रूप से उतार-चढ़ाव करती है, तो यह आमतौर पर अन्य डिजिटल मुद्राओं में एक समन्वित प्रतिक्रिया को ट्रिगर करेगी। कुछ मुद्राओं में एक बहुत ही स्पष्ट सकारात्मक सहसंबंध हो सकता है जो एक ही निवेश संस्थानों, एक ही बाजार निर्माताओं और एक ही ट्रैक के कारण रह सकता है। कुछ मुद्राएं नकारात्मक रूप से सहसंबंधित हैं, लेकिन कम नकारात्मक रूप से सहसंबंधित मुद्राएं हैं, और चूंकि वे सभी बाजार प्रवृत्ति से प्रभावित होते हैं, इसलिए उनके पास अक्सर सुसंगत बाजार प्रवृत्तियां होती हैं।
मान लीजिए कि मुद्रा A और मुद्रा B में एक उच्च मूल्य सहसंबंध है। एक निश्चित क्षण में, A/B मूल्य अनुपात का औसत मूल्य 1 है। यदि एक निश्चित क्षण में, A/B मूल्य अनुपात 0.001 से अधिक, अर्थात 1.001 से अधिक से विचलित होता है, तो आप निम्नलिखित तरीकों से व्यापार कर सकते हैंः B पर एक लंबी स्थिति खोलें और A पर एक छोटी स्थिति खोलें। इसके विपरीत, जब A/B मूल्य अनुपात 0.999 से कम होता हैः A पर एक लंबी स्थिति खोलें और B पर एक छोटी स्थिति खोलें।
लाभप्रदता की कुंजी स्प्रेड लाभ में निहित है जब कीमतें औसत से विचलित होती हैं और सामान्य स्थिति में लौटती हैं। चूंकि मूल्य विचलन आमतौर पर अल्पकालिक होते हैं, इसलिए व्यापारी अपनी स्थिति को बंद कर सकते हैं जब कीमतें औसत पर लौटती हैं और स्प्रेड से लाभान्वित होती हैं।
इन कोडों का सीधा उपयोग किया जा सकता है। Anancoda को डाउनलोड करना और इसे 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) # Get all trading pairs being traded
GetKlines फ़ंक्शन का मुख्य कार्य बिनेंस एक्सचेंज से निर्दिष्ट ट्रेडिंग जोड़ी के स्थायी अनुबंध के ऐतिहासिक K-लाइन डेटा प्राप्त करना और डेटा को एक पांडा डेटाफ्रेम में संग्रहीत करना है। K-लाइन डेटा में खुलने की कीमत, उच्चतम मूल्य, सबसे कम मूल्य, समापन मूल्य और व्यापारिक मात्रा जैसी जानकारी शामिल है। इस बार हम मुख्य रूप से समापन मूल्य डेटा का उपयोग करते हैं।
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
डेटा की मात्रा अपेक्षाकृत बड़ी है। तेजी से डाउनलोड करने के लिए, केवल पिछले तीन महीनों के प्रति घंटे के-लाइन डेटा प्राप्त किए जाते हैं। df_close में सभी मुद्राओं के समापन मूल्य डेटा होते हैं।
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')
हम निम्नलिखित बैकटेस्ट के लिए एक एक्सचेंज ऑब्जेक्ट को परिभाषित करते हैं।
class Exchange:
def __init__(self, trade_symbols, fee=0.0002, initial_balance=10000):
self.initial_balance = initial_balance #Initial assets
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 #Deduction fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #Close the position first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #profit
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): #Update the assets
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)
सहसंबंध गणना दो चर के बीच रैखिक संबंध को मापने के लिए उपयोग की जाने वाली सांख्यिकी में एक विधि है। सहसंबंध गणना की सबसे अधिक उपयोग की जाने वाली विधि पीयरसन सहसंबंध गुणांक है। निम्नलिखित सहसंबंध गणना का सिद्धांत, सूत्र और कार्यान्वयन विधि है। पीयरसन सहसंबंध गुणांक का उपयोग दो चर के बीच रैखिक संबंध को मापने के लिए किया जाता है और इसका मान रेंज -1 और 1 के बीच हैः
पीयरसन सहसंबंध गुणांक दो चरों के बीच सहसंबंध को निर्धारित करता है, उनके सह-परिवर्तन और मानक विचलन की गणना करके। सूत्र इस प्रकार है:
जिसमें:
बेशक, आपको इसकी गणना के बारे में बहुत चिंता करने की आवश्यकता नहीं है। आप सभी मुद्राओं के सहसंबंध की गणना करने के लिए पायथन में कोड की 1 पंक्ति का उपयोग कर सकते हैं। चित्र एक सहसंबंध हीट मैप दिखाता है। लाल सकारात्मक सहसंबंध का प्रतिनिधित्व करता है, नीला नकारात्मक सहसंबंध का प्रतिनिधित्व करता है, और जितना गहरा रंग होगा, उतना ही मजबूत सहसंबंध होगा। आप देख सकते हैं कि अधिकांश क्षेत्र गहरा लाल है, इसलिए डिजिटल मुद्राओं का सकारात्मक सहसंबंध बहुत मजबूत है।
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);
सहसंबंध के आधार पर, शीर्ष 20 सबसे अधिक सहसंबंधित मुद्रा जोड़े चुने जाते हैं। परिणाम इस प्रकार हैं। उनके सहसंबंध बहुत मजबूत हैं, सभी 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
संबंधित कोड इस प्रकार है:
corr_pairs = corr.unstack()
# Remove self-correlation (i.e. values on the diagonal)
corr_pairs = corr_pairs[corr_pairs != 1]
sorted_corr_pairs = corr_pairs.sort_values(kind="quicksort")
# Extract the top 20 most and least correlated currency pairs
most_correlated = sorted_corr_pairs.tail(40)[::-2]
print("The top 20 most correlated currency pairs are:")
print(most_correlated)
विशिष्ट बैकटेस्ट कोड निम्नानुसार है। प्रदर्शन रणनीति मुख्य रूप से दो क्रिप्टोकरेंसी (IOTA और ZIL) के मूल्य अनुपात का निरीक्षण करती है और इस अनुपात में परिवर्तन के अनुसार व्यापार करती है। विशिष्ट चरण निम्नलिखित हैंः
e
$10,000 के प्रारंभिक शेष राशि के साथ और 0.02% के लेनदेन शुल्क के साथ।avg
.value = 1000
.df_close
.diff
.aim_value
, और प्रत्येक 0.01 विचलन के लिए एक मूल्य का कारोबार किया जाता है। खरीद और बिक्री संचालन चालू खाता स्थिति और मूल्य स्थिति के आधार पर निर्धारित किए जाते हैं।pair_a
और खरीदेंpair_b
operations.pair_a
और बेचनाpair_b
ऑपरेशन किए जाते हैं।avg
नवीनतम मूल्य अनुपात को प्रतिबिंबित करने के लिए।res_list
.res_list
डेटाफ्रेम परres
आगे के विश्लेषण और प्रस्तुति के लिए।pair_a = 'IOTA'
pair_b = "ZIL"
e = Exchange([pair_a,pair_b], fee=0.0002, initial_balance=10000) #Exchange definition is placed in the comments section
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);
कुल 4 समूहों की मुद्राओं का बैकटेस्ट किया गया था, और परिणाम आदर्श थे। वर्तमान सहसंबंध गणना भविष्य के डेटा का उपयोग करती है, इसलिए यह बहुत सटीक नहीं है। यह लेख सहसंबंध की पिछली गणना और बाद के बैकटेस्ट ट्रेडिंग के आधार पर डेटा को दो भागों में भी विभाजित करता है। परिणाम थोड़ा अलग हैं लेकिन बुरे नहीं हैं। हम इसे उपयोगकर्ता को अभ्यास और सत्यापित करने के लिए छोड़ देते हैं।
यद्यपि युग्म व्यापार रणनीति सैद्धांतिक रूप से लाभदायक हो सकती है, लेकिन वास्तविक संचालन में अभी भी कुछ जोखिम हैंः मुद्राओं के बीच संबंध समय के साथ बदल सकता है, जिससे रणनीति विफल हो सकती है; चरम बाजार स्थितियों में, मूल्य विचलन बढ़ सकते हैं, जिसके परिणामस्वरूप बड़े नुकसान हो सकते हैं; कुछ मुद्राओं की कम तरलता लेनदेन को निष्पादित करना मुश्किल बना सकती है या लागत बढ़ा सकती है; और लगातार लेनदेन से उत्पन्न शुल्क मुनाफे को कम कर सकता है।
जोखिमों को कम करने और रणनीतियों की स्थिरता में सुधार के लिए निम्नलिखित सुधार उपायों पर विचार किया जा सकता हैः मुद्राओं के बीच सहसंबंध की नियमित रूप से पुनर्गणना करें और व्यापारिक जोड़े को समय पर समायोजित करें; एक एकल लेनदेन के अधिकतम नुकसान को नियंत्रित करने के लिए स्टॉप लॉस और लाभ बिंदु निर्धारित करें; जोखिमों को विविधता प्रदान करने के लिए एक ही समय में कई मुद्रा जोड़े का व्यापार करें।
डिजिटल मुद्रा जोड़ी व्यापार रणनीति मुद्रा मूल्य के संबंध का लाभ उठाते हुए लाभ प्राप्त करती है और कीमतों में विचलन होने पर मध्यस्थता संचालन करती है। इस रणनीति की उच्च सैद्धांतिक व्यवहार्यता है। इस रणनीति के आधार पर एक सरल लाइव ट्रेडिंग रणनीति स्रोत कोड बाद में जारी किया जाएगा। यदि आपके पास अधिक प्रश्न हैं या आगे की चर्चा की आवश्यकता है, तो कृपया संवाद करने के लिए स्वतंत्र महसूस करें।