उच्च आवृत्ति ट्रेडिंग रणनीतियों के बारे में सोचना (3)

लेखक:घास, बनाया गयाः 2023-08-07 18:17:28, अद्यतन किया गयाः 2023-09-18 19:50:53

img

पिछले लेख में, मैंने दिखाया कि कैसे संचयी लेनदेन का मॉडलिंग किया जाए, और मूल्य झटके के एक सरल विश्लेषण के साथ। यह लेख ट्रेड ऑर्डर डेटा के चारों ओर विश्लेषण जारी रखेगा।

ऑर्डर समय अंतराल

आम तौर पर, यह माना जाता है कि ऑर्डर का आगमन समय पारसोनिक प्रक्रिया के अनुरूप है।पारसोन प्रक्रिया◊ मैं नीचे इसका प्रमाण दूंगा.

5 अगस्त को डाउनलोड किए गए एग ट्रेड्स में कुल 1,931,193 ट्रेडों की संख्या बहुत अधिक है। सबसे पहले, भुगतान के वितरण को देखें, आप देख सकते हैं कि 100ms और 500ms के आसपास एक चिकनी स्थानीय चोटी है, जो हिमशैल द्वारा सौंपे गए रोबोट टाइमिंग आदेशों के कारण होनी चाहिए, जो उस दिन की असामान्य स्थिति का एक कारण हो सकता है।

पारसोनिक वितरण का संभाव्यता द्रव्यमान कार्य (PMF) निम्नलिखित सूत्र द्वारा दिया गया हैः

img

इनमें से कुछ हैंः

  • k हम में रुचि रखते हैं कि घटनाओं की संख्या है ।
  • λ इकाई समय (या इकाई स्थान) में घटनाओं की औसत घटना है।
  • P ((k; λ) एक औसत घटना λ की स्थिति में k घटनाओं के होने की संभावना को दर्शाता है।

पारसोनिक प्रक्रिया में, घटनाओं के बीच का समय अंतराल सूचकांक वितरण के अधीन होता है। सूचकांक वितरण का संभावना घनत्व कार्य निम्नलिखित सूत्र द्वारा दिया गया हैः

img

यह मिलान करके पाया गया कि परिणाम और पारसोनिक वितरण में अपेक्षित अंतर अधिक था, पारसोनिक प्रक्रिया ने लंबे अंतराल समय की आवृत्ति को कम करके और कम अंतराल समय की आवृत्ति को अधिक करके अनुमान लगाया। (वास्तविक अंतराल का वितरण संशोधित पारसोनिक वितरण के करीब है)

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));

img

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)

img

सांख्यिकीय 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() ;

img

वास्तविक समय में अद्यतन पैरामीटर

आदेश अंतराल के विश्लेषण से यह निष्कर्ष निकाला जा सकता है कि निश्चित पैरामीटर वास्तविक बाजार बाजार के लिए उपयुक्त नहीं हैं और रणनीति के लिए बाजार विवरण के लिए महत्वपूर्ण पैरामीटर को वास्तविक समय में अद्यतन करने की आवश्यकता है। सबसे आसान विकल्प स्लाइडिंग विंडो का एक गतिशील औसत है। नीचे दिए गए दो चित्रों में क्रमशः 1s में भुगतान की आवृत्ति और 1000 खिड़कियों में लेनदेन की मात्रा का औसत है। यह देखा जा सकता है कि लेनदेन एकत्रीकरण की घटना है, यानी एक समय के लिए आदेशों की आवृत्ति सामान्य से काफी अधिक है, और इस समय मात्रा भी सिंक्रोनस है। यहां पिछले एक के औसत का उपयोग नवीनतम एक सेकंड के लिए अपेक्षित मूल्य का अनुमान लगाने के लिए किया जाता है, शेष राशि के औसत के औसत के लिए पूर्ण त्रुटि का औसत अनुमान लगाने के लिए।

यह चित्र से भी समझा जा सकता है कि क्यों ऑर्डर की आवृत्ति पारसोनिक वितरण से बहुत अधिक विचलित होती है, जबकि प्रति सेकंड ऑर्डर की संख्या का औसत केवल 8.5 बार है, लेकिन चरम स्थितियों में प्रति सेकंड ऑर्डर का औसत बहुत अधिक विचलित होता है।

यहां पाया गया कि पहले दो सेकंड के औसत के साथ अनुमान लगाने में कम से कम त्रुटि होती है और यह सरल औसत अनुमान के परिणामों से बहुत बेहतर है।

result_df['order_count'][::10].rolling(1000).mean().plot(figsize=(10,5),grid=True);

img

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);

img

(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

सारांश

इस लेख में आदेश समय अंतराल विचलन के कारणों का एक संक्षिप्त परिचय दिया गया है, मुख्य रूप से क्योंकि पैरामीटर समय के साथ बदलते हैं। अधिक सटीक बाजार की भविष्यवाणी करने के लिए, रणनीतियों को बाजार के बुनियादी पैरामीटर के बारे में वास्तविक समय में भविष्यवाणी करने की आवश्यकता होती है। शेष राशि का उपयोग करके भविष्यवाणियों को मापा जा सकता है। ऊपर दिया गया सबसे सरल उदाहरण है। विशिष्ट समय अनुक्रम विश्लेषण, उतार-चढ़ाव के संचय आदि जैसे संबंधित अध्ययन बहुत अधिक हैं, जिन्हें आगे बढ़ाया जा सकता है।


अधिक