3
ध्यान केंद्रित करना
1444
समर्थक

प्रोग्रामेटिक ट्रेडर्स के लिए एक शक्तिशाली उपकरण: माध्य और विचरण की गणना करने के लिए वृद्धिशील अद्यतन एल्गोरिदम

में बनाया: 2023-11-08 16:28:36, को अपडेट: 2024-11-08 09:13:54
comments   0
hits   1735

प्रोग्रामेटिक ट्रेडर्स के लिए एक शक्तिशाली उपकरण: माध्य और विचरण की गणना करने के लिए वृद्धिशील अद्यतन एल्गोरिदम

परिचय

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

सरल माध्य और प्रसरण

यदि हम \(n\)वें डेटा बिंदु के औसत को दर्शाने के लिए \(\mu_n\) का उपयोग करते हैं, यह मानते हुए कि हमने पहले ही \({n-1}\)वें डेटा बिंदु के \(\mu_{n-1}\) के औसत की गणना कर ली है अब हमें एक नया डेटा बिंदु \(x_{n}\) प्राप्त हुआ है। हम नए माध्य \(\mu_{n}\) की गणना करना चाहते हैं जिसमें यह नया डेटा बिंदु शामिल हो। निम्नलिखित एक विस्तृत व्युत्पत्ति है।

\(\mu_n = \frac{1}{n} \sum_{i=1}^{n} x_i\) \(\mu_n = \frac{1}{n} \left( x_n + \sum_{i=1}^{n-1} x_i \right)\) \(\mu_{n-1} = \frac{1}{n-1} \sum_{i=1}^{n-1} x_i\) \((n-1)\mu_{n-1} = \sum_{i=1}^{n-1} x_i\) \(\mu_n = \frac{1}{n} \left( x_n + (n-1)\mu_{n-1} \right)\) \(\mu_n = \mu_{n-1} + \frac{1}{n} (x_n - \mu_{n-1})\)

विचरण अद्यतन प्रक्रिया को निम्नलिखित चरणों में विभाजित किया जा सकता है:

\(S_n = \sum_{i=1}^{n} (x_i - \mu_n)^2\) \(S_n = \sum_{i=1}^{n} x_i^2 - n\mu_n^2\) \(S_n - S_{n-1} = x_n^2 - n\mu_n^2 + (n - 1)\mu_{n-1}^2\) \(S_n - S_{n-1} = (x_n - \mu_{n-1})(x_n - \mu_n)\) \(S_n = S_{n-1} + (x_n - \mu_{n-1})(x_n - \mu_n)\) \(\sigma_n^2 = \frac{S_n}{n}\)

जैसा कि ऊपर दिए गए दो सूत्रों से देखा जा सकता है, यह प्रक्रिया हमें प्रत्येक नए डेटा बिंदु \(x_n\) को प्राप्त करते समय, ऐतिहासिक डेटा को सहेजे बिना, केवल पिछले डेटा के माध्य और विचरण को बनाए रखते हुए नए माध्य और विचरण को अपडेट करने की अनुमति देती है। गणना तेज़ है. लेकिन समस्या यह है कि इस तरीके से जो गणना की जाती है वह पूरे नमूने का माध्य और विचरण है, जबकि वास्तविक रणनीति में हमें एक निश्चित अवधि पर विचार करना होता है। ऊपर दिए गए माध्य अद्यतन को देखकर, हम देख सकते हैं कि नया माध्य अद्यतन राशि पिछले माध्य से नए डेटा का विचलन है जिसे एक अनुपात से गुणा किया जाता है। यदि यह अनुपात तय है, तो हमें घातीय भारित औसत मिलेगा जिसकी हम आगे चर्चा करेंगे।

घातांकीय भारित माध्य

घातांकीय भारित औसत को निम्नलिखित पुनरावर्ती संबंध द्वारा परिभाषित किया जा सकता है:

\(\mu_t = \alpha x_t + (1 - \alpha) \mu_{t-1}\)

जहाँ \(\mu_t\) समय बिंदु \(t\) पर घातांकीय भारित माध्य है, \(x_t\) समय बिंदु \(t\) पर प्रेक्षित मान है, \(\alpha\) भार कारक है, और \(\mu_{t-1}\) यह पिछले समय बिंदु का घातांकीय भारित औसत है।

घातांकीय भारित विचरण

विचरण के लिए, हमें प्रत्येक समय बिंदु पर वर्ग विचलन के चरघातांकी भारित औसत की गणना करने की आवश्यकता है। इसे निम्नलिखित पुनरावृत्ति संबंध के माध्यम से प्राप्त किया जा सकता है:

\(S_n = \alpha S_{n-1} + (1 - \alpha)(x_n - \mu_n)(x_n - \mu_{n-1})\)

जहाँ \(\sigma_t^2\) समय बिंदु \(t\) पर घातांकीय भारित विचरण है, और \(\sigma_{t-1}^2\) पिछले समय बिंदु पर घातांकीय भारित विचरण है।

घातीय भारित माध्य और विचरण का निरीक्षण करें। उनके वृद्धिशील अद्यतन रूप अंतर्ज्ञान के अनुरूप हैं। वे दोनों पिछले मूल्य का हिस्सा बनाए रखते हैं और नया परिवर्तन जोड़ते हैं। विशिष्ट व्युत्पत्ति प्रक्रिया को इस पेपर में संदर्भित किया जा सकता है: https://fanf2.user . srcf.net/hermes/doc/antiforgery/stats.pdf

सरल मूविंग एवरेज (एसएमए) बनाम एक्सपोनेंशियल मूविंग एवरेज (ईएमए)

सरल औसत (जिसे अंकगणितीय माध्य भी कहा जाता है) और चरघातांकी भारित औसत दो सामान्य सांख्यिकीय माप हैं, जिनमें से प्रत्येक की अलग-अलग विशेषताएं और उपयोग हैं। सरल माध्य प्रत्येक अवलोकन को समान महत्व देता है तथा डेटा सेट के केंद्रीय स्थान को दर्शाता है। चरघातांकी भारित औसत एक पुनरावर्ती गणना है जो हाल के अवलोकनों को अधिक महत्व देती है। जैसे-जैसे अवलोकन वर्तमान समय से दूर होता जाता है, भार तेजी से घटता जाता है।

  • वजन वितरणसरल औसत प्रत्येक डेटा बिंदु को समान महत्व देता है, जबकि चरघातांकी रूप से भारित औसत सबसे हाल के डेटा बिंदुओं को अधिक महत्व देता है।
  • नई जानकारी के प्रति संवेदनशीलतासरल औसत नये जोड़े गए डेटा के प्रति पर्याप्त संवेदनशील नहीं है, क्योंकि इसमें सभी डेटा बिंदुओं की पुनर्गणना करनी पड़ती है। चरघातांकी भारित औसत नवीनतम डेटा में परिवर्तनों को अधिक शीघ्रता से प्रतिबिंबित कर सकते हैं।
  • कम्प्यूटेशनल जटिलतासरल औसत की गणना अपेक्षाकृत सरल है, लेकिन जैसे-जैसे डेटा बिंदुओं की संख्या बढ़ेगी, गणना लागत भी बढ़ेगी। चरघातांकी भारित औसत की गणना करना अधिक जटिल है, लेकिन इसकी पुनरावर्ती प्रकृति के कारण यह सतत डेटा धाराओं के लिए अधिक कुशल हो सकता है।

ईएमए और एसएमए अनुमानित रूपांतरण विधि

यद्यपि सरल औसत और घातांकीय भारित औसत संकल्पनात्मक रूप से भिन्न हैं, फिर भी हम \(\alpha\) का उपयुक्त मान चुनकर घातांकीय भारित औसत को विशिष्ट संख्या में प्रेक्षणों के लिए सरल औसत के लगभग बराबर बना सकते हैं। इस अनुमानित संबंध को प्रभावी नमूना आकार द्वारा वर्णित किया जा सकता है, जो कि घातीय भारित औसत में भार कारक \(\alpha\) का एक फलन है।

सरल चल औसत (एसएमए) एक निश्चित समयावधि में सभी कीमतों का अंकगणितीय माध्य है। एक समय खिड़की \(N\) के लिए, एसएमए का केन्द्रक (जहाँ माध्य है) माना जा सकता है:

\(\text{SMA केन्द्रक} = \frac{1 + N}{2}\)

घातीय मूविंग औसत (ईएमए) एक भारित औसत है, जहां नवीनतम डेटा बिंदुओं का अधिक महत्व होता है। ईएमए का भार समय के साथ तेजी से घटता है। ईएमए का केन्द्रक निम्नलिखित श्रृंखला को जोड़कर प्राप्त किया जा सकता है:

\(\text{EMA केन्द्रक} = \alpha \times \left[1 + 2(1 - \alpha) + 3(1 - \alpha)^2 + \cdots \right] = \frac{1}{\alpha}\)

जब हम मानते हैं कि SMA और EMA का द्रव्यमान केंद्र समान है, तो हमें यह प्राप्त होता है:

\(\frac{1 + N}{2} = \frac{1}{\alpha}\)

इस समीकरण को हल करने पर, हम \(\alpha\) और \(N\) के बीच संबंध प्राप्त कर सकते हैं:

\(\alpha = \frac{2}{N + 1}\)

इसका अर्थ यह है कि, किसी दिए गए \(N\)-दिन SMA के लिए, संगत \(\alpha\) मान का उपयोग “समतुल्य” EMA की गणना करने के लिए किया जा सकता है, जिससे दोनों का द्रव्यमान केंद्र समान हो और परिणाम बहुत समान हों।

विभिन्न अद्यतन आवृत्तियों के साथ ईएमए का रूपांतरण

मान लीजिए हमारे पास एक EMA है जो हर सेकंड \(\alpha_1\) के भार कारक के साथ अद्यतन होता है। इसका अर्थ यह है कि प्रत्येक सेकंड, EMA में \(\alpha_1\) के भार के साथ एक नया डेटा बिंदु जोड़ा जाता है, जबकि पुराने डेटा बिंदुओं के प्रभाव को \(1 - \alpha_1\) से गुणा किया जाता है।

यदि हम अद्यतन आवृत्ति को बदलते हैं, जैसे कि हर \(f\) सेकंड में अद्यतन करना, तो हम एक नया भार कारक \(\alpha_2\) खोजना चाहते हैं, ताकि \(f\) सेकंड के भीतर डेटा बिंदु का कुल प्रभाव हर सेकंड अद्यतन करने के समान हो। .

\(f\) सेकंड में, यदि कोई अद्यतन नहीं किया जाता है, तो पुराने डेटा बिंदुओं का प्रभाव क्रमिक रूप से \(f\) बार कम हो जाएगा, प्रत्येक बार \(1 - \alpha_1\) से गुणा किया जाएगा। इसलिए, \(f\) सेकंड के बाद कुल क्षय कारक \((1 - \alpha_1)^f\) है।

प्रत्येक \(f\) सेकंड में अपडेट किए गए EMA का एक अद्यतन चक्र में वही क्षय प्रभाव हो, जो प्रति सेकंड एक बार अपडेट किए गए EMA का होता है, इसके लिए हमने \(f\) सेकंड के बाद कुल क्षय कारक को एक अद्यतन में क्षय कारक के बराबर निर्धारित किया है। चक्र:

\((1 - \alpha_1)^f = 1 - \alpha_2\)

इस समीकरण को हल करने पर हमें नया भार कारक \(\alpha_2\) प्राप्त होता है:

\(\alpha_2 = 1 - (1 - \alpha_1)^f\)

यह सूत्र नए भार कारक \(\alpha_2\) के लिए एक अनुमान देता है जो अद्यतन आवृत्ति में परिवर्तन होने पर EMA समरूपण प्रभाव को स्थिर रखता है। उदाहरण के लिए, हम मूल्य माध्य \(\alpha_1\) की गणना 0.001 के रूप में करते हैं, और हर 10 सेकंड में नवीनतम मूल्य को अपडेट करते हैं। यदि हम इसे 1 सेकंड में बदल देते हैं, तो समतुल्य \(\alpha_2\) लगभग 0.01 है

पायथन कोड कार्यान्वयन

class ExponentialWeightedStats:
    def __init__(self, alpha):
        self.alpha = alpha
        self.mu = 0
        self.S = 0
        self.initialized = False

    def update(self, x):
        if not self.initialized:
            self.mu = x
            self.S = 0
            self.initialized = True
        else:
            temp = x - self.mu
            new_mu = self.mu + self.alpha * temp
            self.S = self.alpha * self.S + (1 - self.alpha) * temp * (x - self.mu)
            self.mu = new_mu

    @property
    def mean(self):
        return self.mu

    @property
    def variance(self):
        return self.S

# 使用示例
alpha = 0.05  # 权重因子
stats = ExponentialWeightedStats(alpha)
data_stream = [] # 数据流
for data_point in data_stream:
    stats.update(data_point)

संक्षेप

उच्च आवृत्ति प्रोग्रामेटिक ट्रेडिंग में, वास्तविक समय डेटा का तेजी से प्रसंस्करण महत्वपूर्ण है। कम्प्यूटेशनल दक्षता में सुधार लाने और संसाधन खपत को कम करने के लिए, यह पेपर एक डेटा स्ट्रीम के भारित माध्य और विचरण की निरंतर गणना करने के लिए एक ऑनलाइन अद्यतन एल्गोरिथ्म प्रस्तुत करता है। वास्तविक समय में वृद्धिशील अद्यतन की गणना का उपयोग विभिन्न सांख्यिकीय डेटा और संकेतकों की गणना करने के लिए भी किया जा सकता है, जैसे कि दो परिसंपत्ति की कीमतों के बीच सहसंबंध, रैखिक फिटिंग, आदि, जिसमें काफी संभावनाएं हैं। वृद्धिशील अद्यतन डेटा को एक संकेत प्रणाली के रूप में मानते हैं, जो निश्चित-अवधि गणनाओं की तुलना में सोच का एक विकास है। यदि आपकी रणनीति में ऐसा भाग भी है जो ऐतिहासिक डेटा गणनाओं को सहेजता है, तो आप इसे इस विचार के अनुसार संशोधित कर सकते हैं, केवल सिस्टम स्थिति का अनुमान रिकॉर्ड कर सकते हैं, और जब नया डेटा आता है, तो सिस्टम स्थिति को अपडेट कर सकते हैं, इत्यादि।