मैंने डिजिटल मुद्राओं के उच्च आवृत्ति व्यापार पर दो लेख लिखे हैं, अर्थात्
अपने पिछले लेखों में, मैंने उल्लेख किया है कि उच्च आवृत्ति रणनीतियाँ विशेष रूप से अत्यधिक अस्थिर उतार-चढ़ाव वाले बाजारों के लिए उपयुक्त हैं। एक व्यापारिक उपकरण के मूल्य परिवर्तन में कम समय के भीतर समग्र रुझानों और दोलनों से मिलकर होता है। जबकि यह वास्तव में लाभदायक है यदि हम सटीक रूप से प्रवृत्ति परिवर्तनों की भविष्यवाणी कर सकते हैं, यह सबसे चुनौतीपूर्ण पहलू भी है। इस लेख में, मैं मुख्य रूप से उच्च आवृत्ति निर्माता रणनीतियों पर ध्यान केंद्रित करूंगा और प्रवृत्ति भविष्यवाणी में गहराई से नहीं जाऊंगा। दोलन बाजारों में, बोली लगाने और रणनीतिक रूप से आदेश देने से, यदि बोली की आवृत्ति पर्याप्त रूप से अधिक है और लाभ मार्जिन महत्वपूर्ण है, तो यह रुझानों के कारण संभावित नुकसान को कवर कर सकता है। इस तरह, बाजार की गति की भविष्यवाणी किए बिना लाभप्रदता प्राप्त की जा सकती है। वर्तमान में, एक्सचेंज मेकर ट्रेडों के लिए छूट प्रदान करते हैं, जो लाभ का एक घटक भी हैं। अधिक प्रतिस्पर्धी बाजार घटक, छूट का अनुपात अधिक होना चाहिए।
एक रणनीति को लागू करने में पहली समस्या जो खरीद और बिक्री दोनों ऑर्डर रखती है, यह निर्धारित करना है कि इन ऑर्डर को कहां रखा जाए। ऑर्डर को बाजार की गहराई के करीब रखा जाता है, निष्पादन की संभावना अधिक होती है। हालांकि, अत्यधिक अस्थिर बाजार स्थितियों में, जिस कीमत पर एक ऑर्डर को तुरंत निष्पादित किया जाता है, वह बाजार की गहराई से दूर हो सकती है, जिसके परिणामस्वरूप अपर्याप्त लाभ हो सकता है। दूसरी ओर, ऑर्डर को बहुत दूर रखना निष्पादन की संभावना को कम करता है। यह एक अनुकूलन समस्या है जिसे संबोधित करने की आवश्यकता है।
जोखिम प्रबंधन के लिए स्थिति नियंत्रण महत्वपूर्ण है। एक रणनीति लंबी अवधि के लिए अत्यधिक पदों को जमा नहीं कर सकती है। इसे रखे गए आदेशों की दूरी और मात्रा को नियंत्रित करके और साथ ही समग्र पदों पर सीमाएं निर्धारित करके संबोधित किया जा सकता है।
उपरोक्त उद्देश्यों को प्राप्त करने के लिए, निष्पादन संभावनाओं, निष्पादन से लाभ और बाजार अनुमान जैसे विभिन्न पहलुओं के लिए मॉडलिंग और अनुमान की आवश्यकता होती है। इस विषय पर कई लेख और पेपर उपलब्ध हैं, जैसे कि
बिनेंस प्रदान करता हैडाउनलोड करने योग्य डेटाव्यक्तिगत ट्रेडों और सर्वोत्तम बोली/पूछने के आदेशों के लिए। गहराई डेटा को उनके एपीआई के माध्यम से डाउनलोड किया जा सकता है, या इसे मैन्युअल रूप से एकत्र किया जा सकता है। बैकटेस्टिंग उद्देश्यों के लिए, एकत्रित व्यापार डेटा पर्याप्त है। इस लेख में, हम HOOKUSDT-aggTrades-2023-01-27 डेटा के उदाहरण का उपयोग करेंगे।
में [1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
व्यक्तिगत व्यापारिक आंकड़ों में निम्नलिखित शामिल हैंः
यह देखा जा सकता है कि उस दिन 660,000 ट्रेड निष्पादित किए गए थे, जो एक अत्यधिक सक्रिय बाजार का संकेत देते हैं।
[4] मेंः
trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades
बाहर[4]: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
664475 पंक्तियाँ × 7 स्तंभ
सबसे पहले, डेटा को मूल ट्रेडों को दो समूहों में विभाजित करके संसाधित किया जाता हैः निर्माताओं के रूप में निष्पादित खरीद ऑर्डर और लेने वालों के रूप में निष्पादित बिक्री ऑर्डर। इसके अलावा, मूल एकत्रित व्यापार डेटा एक ही समय में, एक ही मूल्य पर और एक ही दिशा में निष्पादित ट्रेडों को एक एकल डेटा बिंदु में जोड़ता है। उदाहरण के लिए, यदि 100 की मात्रा के साथ एक एकल खरीद ऑर्डर है, तो इसे क्रमशः 60 और 40 की मात्रा के साथ दो ट्रेडों में विभाजित किया जा सकता है, यदि कीमतें अलग हैं। इससे खरीद ऑर्डर की मात्रा का अनुमान प्रभावित हो सकता है। इसलिए, लेनदेन_समय के आधार पर डेटा को फिर से एकत्र करना आवश्यक है। इस दूसरे एकत्रीकरण के बाद, डेटा मात्रा 140,000 रिकॉर्ड से कम हो जाती है।
[6] मेंः
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
'agg_trade_id': 'last',
'price': 'last',
'quantity': 'sum',
'first_trade_id': 'first',
'last_trade_id': 'last',
'is_buyer_maker': 'last',
'date': 'last',
'transact_time':'last'
})
sell_trades = sell_trades.groupby('transact_time').agg({
'agg_trade_id': 'last',
'price': 'last',
'quantity': 'sum',
'first_trade_id': 'first',
'last_trade_id': 'last',
'is_buyer_maker': 'last',
'date': 'last',
'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
[10] मेंः
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
बाहर [10]: 146181
उदाहरण के लिए खरीद ऑर्डर लें, आइए पहले एक हिस्टोग्राम प्लॉट करें। यह देखा जा सकता है कि एक महत्वपूर्ण लंबी पूंछ प्रभाव है, जिसमें अधिकांश डेटा हिस्टोग्राम के सबसे बाएं हिस्से की ओर केंद्रित है। हालांकि, कुछ बड़े ट्रेड भी पूंछ के अंत की ओर वितरित हैं।
[36] मेंः
buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));
बाहर [36]:
आसान अवलोकन के लिए, आइए पूंछ को काटें और डेटा का विश्लेषण करें। यह देखा जा सकता है कि जैसे-जैसे व्यापार राशि बढ़ती है, घटना की आवृत्ति कम हो जाती है, और कमी की दर तेजी से होती है।
[37] मेंः
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
बाहर [37]:
व्यापार की मात्रा के वितरण पर कई अध्ययन किए गए हैं। यह पाया गया है कि व्यापार की मात्रा एक शक्ति-कानून वितरण का पालन करती है, जिसे पैरेटो वितरण के रूप में भी जाना जाता है, जो सांख्यिकीय भौतिकी और सामाजिक विज्ञान में एक सामान्य संभावना वितरण है। एक शक्ति-कानून वितरण में, किसी घटना के आकार (या आवृत्ति) की संभावना उस घटना के आकार के नकारात्मक घातांक के आनुपातिक होती है। इस वितरण की मुख्य विशेषता यह है कि बड़ी घटनाओं की आवृत्ति (यानी, औसत से दूर) कई अन्य वितरणों में अपेक्षित से अधिक होती है। यह वास्तव में व्यापार मात्रा वितरण की विशेषता है। पैरेटो वितरण का रूप P ((x) = C ((x^-α) द्वारा दिया गया है। आइए इसे अनुभवजन्य रूप से सत्यापित करें।
निम्नलिखित ग्राफ एक निश्चित मूल्य से अधिक व्यापार राशि की संभावना का प्रतिनिधित्व करता है। नीली रेखा वास्तविक संभावना का प्रतिनिधित्व करती है, जबकि नारंगी रेखा अनुकरणीय संभावना का प्रतिनिधित्व करती है। कृपया ध्यान दें कि हम इस बिंदु पर विशिष्ट मापदंडों में नहीं जाएंगे। यह देखा जा सकता है कि वितरण वास्तव में एक पैरेटो वितरण का पालन करता है। चूंकि व्यापार राशि की संभावना शून्य से अधिक है 1, और सामान्यीकरण को पूरा करने के लिए, वितरण समीकरण निम्नानुसार होना चाहिएः
यहाँ, एन सामान्यीकरण के लिए पैरामीटर है। हम औसत व्यापार राशि, एम चुनेंगे, और अल्फा को -2.06 पर सेट करेंगे। अल्फा का विशिष्ट अनुमान पी-मूल्य की गणना करके प्राप्त किया जा सकता है जब डी = एन। विशेष रूप से, अल्फा = लॉग (((पी)) डी> एम)) / लॉग ((2) । विभिन्न बिंदुओं के चयन के परिणामस्वरूप अल्फा के मूल्य में मामूली अंतर हो सकते हैं।
[55] मेंः
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
बाहर[55]:
[56] मेंः
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
बाहर[56]:
हालांकि, यह अनुमान केवल अनुमानित है, जैसा कि ग्राफ में दिखाया गया है जहां हम अनुकरणीय और वास्तविक मूल्यों के बीच अंतर को प्लॉट करते हैं। जब व्यापार राशि छोटी होती है, तो विचलन महत्वपूर्ण होता है, यहां तक कि 10% तक भी पहुंच जाता है। हालांकि पैरामीटर अनुमान के दौरान विभिन्न बिंदुओं का चयन करने से उस विशिष्ट बिंदु की संभावना की सटीकता में सुधार हो सकता है, यह विचलन समस्या को समग्र रूप से हल नहीं करता है। यह विचलन शक्ति-कानून वितरण और वास्तविक वितरण के बीच अंतर से उत्पन्न होता है। अधिक सटीक परिणाम प्राप्त करने के लिए, शक्ति-कानून वितरण के समीकरण को संशोधित करने की आवश्यकता होती है। विशिष्ट प्रक्रिया यहां विस्तृत नहीं है, लेकिन सारांश में, एक क्षण की अंतर्दृष्टि के बाद, यह पाया जाता है कि वास्तविक समीकरण निम्नानुसार होना चाहिएः
सरलीकरण के लिए, चलो r = q / M का उपयोग सामान्य व्यापार राशि का प्रतिनिधित्व करने के लिए करते हैं। हम पहले की तरह ही विधि का उपयोग करके मापदंडों का अनुमान लगा सकते हैं। निम्नलिखित ग्राफ से पता चलता है कि संशोधन के बाद, अधिकतम विचलन 2% से अधिक नहीं है। सिद्धांत रूप में, आगे समायोजन किए जा सकते हैं, लेकिन सटीकता का यह स्तर पहले से ही पर्याप्त है।
[52] मेंः
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
बाहर[52]:
[53] मेंः
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
बाहर[53]:
व्यापार राशि वितरण के लिए अनुमानित समीकरण के साथ, यह ध्यान रखना महत्वपूर्ण है कि समीकरण में संभावनाएं वास्तविक संभावनाएं नहीं हैं, बल्कि सशर्त संभावनाएं हैं। इस बिंदु पर, हम प्रश्न का उत्तर दे सकते हैंः अगले आदेश की संभावना एक निश्चित मूल्य से अधिक होगी? हम विभिन्न गहराई पर आदेशों की निष्पादन की संभावना भी निर्धारित कर सकते हैं (आदर्श परिदृश्य में, आदेश जोड़ों, रद्द करने और एक ही गहराई पर कतार में विचार किए बिना) ।
इस बिंदु पर, पाठ की लंबाई पहले से ही काफी लंबी है, और अभी भी कई प्रश्न हैं जिनका उत्तर देने की आवश्यकता है। निम्नलिखित लेखों की श्रृंखला में उत्तर प्रदान करने का प्रयास किया जाएगा।