पिछले लेख में, मैंने दिखाया कि कैसे संचयी लेनदेन का मॉडलिंग किया जाए, और मूल्य झटके के एक सरल विश्लेषण के साथ। यह लेख ट्रेड ऑर्डर डेटा के चारों ओर विश्लेषण जारी रखेगा।
आम तौर पर, यह माना जाता है कि ऑर्डर का आगमन समय पारसोनिक प्रक्रिया के अनुरूप है।पारसोन प्रक्रिया◊ मैं नीचे इसका प्रमाण दूंगा.
5 अगस्त को डाउनलोड किए गए एग ट्रेड्स में कुल 1,931,193 ट्रेडों की संख्या बहुत अधिक है। सबसे पहले, भुगतान के वितरण को देखें, आप देख सकते हैं कि 100ms और 500ms के आसपास एक चिकनी स्थानीय चोटी है, जो हिमशैल द्वारा सौंपे गए रोबोट टाइमिंग आदेशों के कारण होनी चाहिए, जो उस दिन की असामान्य स्थिति का एक कारण हो सकता है।
पारसोनिक वितरण का संभाव्यता द्रव्यमान कार्य (PMF) निम्नलिखित सूत्र द्वारा दिया गया हैः
इनमें से कुछ हैंः
पारसोनिक प्रक्रिया में, घटनाओं के बीच का समय अंतराल सूचकांक वितरण के अधीन होता है। सूचकांक वितरण का संभावना घनत्व कार्य निम्नलिखित सूत्र द्वारा दिया गया हैः
यह मिलान करके पाया गया कि परिणाम और पारसोनिक वितरण में अपेक्षित अंतर अधिक था, पारसोनिक प्रक्रिया ने लंबे अंतराल समय की आवृत्ति को कम करके और कम अंतराल समय की आवृत्ति को अधिक करके अनुमान लगाया। (वास्तविक अंतराल का वितरण संशोधित पारसोनिक वितरण के करीब है)
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
trades = pd.read_csv('YGGUSDT-aggTrades-2023-08-05.csv')
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].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'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
buy_trades.index = buy_trades['date']
buy_trades['interval'][buy_trades['interval']<1000].plot.hist(bins=200,figsize=(10, 5));
Intervals = np.array(range(0, 1000, 5))
mean_intervals = buy_trades['interval'].mean()
buy_rates = 1000/mean_intervals
probabilities = np.array([np.mean(buy_trades['interval'] > interval) for interval in Intervals])
probabilities_s = np.array([np.e**(-buy_rates*interval/1000) for interval in Intervals])
plt.figure(figsize=(10, 5))
plt.plot(Intervals, probabilities)
plt.plot(Intervals, probabilities_s)
plt.xlabel('Intervals')
plt.ylabel('Probability')
plt.grid(True)
सांख्यिकीय 1s के भीतर आदेशों की संख्या के वितरण की तुलना पापरसोन वितरण से की जाती है, जो समान रूप से बहुत स्पष्ट है; पापरसोन वितरण कम संभावना वाले घटनाओं की घटना की आवृत्ति को बहुत कम आंकता है; संभावित कारणः
यही है, वास्तविक परिस्थितियों में, आदेशों की घटना की आवृत्ति अस्थिर होती है, उन्हें वास्तविक समय में अपडेट करने की आवश्यकता होती है, और एक प्रोत्साहन कार्य होता है, यानी एक निश्चित समय में अधिक आदेश अधिक आदेशों को प्रेरित करते हैं। यह रणनीति को एक एकल पैरामीटर को तय करने में असमर्थ बनाता है।
result_df = buy_trades.resample('0.1S').agg({
'price': 'count',
'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
count_df = result_df['order_count'].value_counts().sort_index()[result_df['order_count'].value_counts()>20]
(count_df/count_df.sum()).plot(figsize=(10,5),grid=True,label='sample pmf');
from scipy.stats import poisson
prob_values = poisson.pmf(count_df.index, 1000/mean_intervals)
plt.plot(count_df.index, prob_values,label='poisson pmf');
plt.legend() ;
आदेश अंतराल के विश्लेषण से यह निष्कर्ष निकाला जा सकता है कि निश्चित पैरामीटर वास्तविक बाजार बाजार के लिए उपयुक्त नहीं हैं और रणनीति के लिए बाजार विवरण के लिए महत्वपूर्ण पैरामीटर को वास्तविक समय में अद्यतन करने की आवश्यकता है। सबसे आसान विकल्प स्लाइडिंग विंडो का एक गतिशील औसत है। नीचे दिए गए दो चित्रों में क्रमशः 1s में भुगतान की आवृत्ति और 1000 खिड़कियों में लेनदेन की मात्रा का औसत है। यह देखा जा सकता है कि लेनदेन एकत्रीकरण की घटना है, यानी एक समय के लिए आदेशों की आवृत्ति सामान्य से काफी अधिक है, और इस समय मात्रा भी सिंक्रोनस है। यहां पिछले एक के औसत का उपयोग नवीनतम एक सेकंड के लिए अपेक्षित मूल्य का अनुमान लगाने के लिए किया जाता है, शेष राशि के औसत के औसत के लिए पूर्ण त्रुटि का औसत अनुमान लगाने के लिए।
यह चित्र से भी समझा जा सकता है कि क्यों ऑर्डर की आवृत्ति पारसोनिक वितरण से बहुत अधिक विचलित होती है, जबकि प्रति सेकंड ऑर्डर की संख्या का औसत केवल 8.5 बार है, लेकिन चरम स्थितियों में प्रति सेकंड ऑर्डर का औसत बहुत अधिक विचलित होता है।
यहां पाया गया कि पहले दो सेकंड के औसत के साथ अनुमान लगाने में कम से कम त्रुटि होती है और यह सरल औसत अनुमान के परिणामों से बहुत बेहतर है।
result_df['order_count'][::10].rolling(1000).mean().plot(figsize=(10,5),grid=True);
result_df
order_count | मात्रा_अंत | |
---|---|---|
2023-08-05 03:30:06.100 | 1 | 76.0 |
2023-08-05 03:30:06.200 | 0 | 0.0 |
2023-08-05 03:30:06.300 | 0 | 0.0 |
2023-08-05 03:30:06.400 | 1 | 416.0 |
2023-08-05 03:30:06.500 | 0 | 0.0 |
… | … | … |
2023-08-05 23:59:59.500 | 3 | 9238.0 |
2023-08-05 23:59:59.600 | 0 | 0.0 |
2023-08-05 23:59:59.700 | 1 | 3981.0 |
2023-08-05 23:59:59.800 | 0 | 0.0 |
2023-08-05 23:59:59.900 | 2 | 534.0 |
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
6.985628185332997
result_df['mean_count'] = result_df['order_count'].ewm(alpha=0.11, adjust=False).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
0.6727616961866929
result_df['mean_quantity'] = result_df['quantity_sum'].ewm(alpha=0.1, adjust=False).mean()
(result_df['quantity_sum'] - result_df['mean_quantity'].shift()).abs().mean()
4180.171479076811
इस लेख में आदेश समय अंतराल विचलन के कारणों का एक संक्षिप्त परिचय दिया गया है, मुख्य रूप से क्योंकि पैरामीटर समय के साथ बदलते हैं। अधिक सटीक बाजार की भविष्यवाणी करने के लिए, रणनीतियों को बाजार के बुनियादी पैरामीटर के बारे में वास्तविक समय में भविष्यवाणी करने की आवश्यकता होती है। शेष राशि का उपयोग करके भविष्यवाणियों को मापा जा सकता है। ऊपर दिया गया सबसे सरल उदाहरण है। विशिष्ट समय अनुक्रम विश्लेषण, उतार-चढ़ाव के संचय आदि जैसे संबंधित अध्ययन बहुत अधिक हैं, जिन्हें आगे बढ़ाया जा सकता है।