प्रोग्रामेटिक ट्रेडिंग में अक्सर औसत और अंतरों को गणना करने की आवश्यकता होती है, जैसे कि औसत और उतार-चढ़ाव जैसे मापदंडों की गणना करना। जब हमें उच्च आवृत्ति और दीर्घकालिक गणना की आवश्यकता होती है, तो लंबे समय तक ऐतिहासिक डेटा को बनाए रखने की आवश्यकता होती है, जो कि अनावश्यक और संसाधन-खर्चीला होता है। यह लेख एक ऑनलाइन अद्यतन एल्गोरिथ्म का परिचय देता है जो भारित औसत और अंतरों की गणना के लिए उपयोग किया जाता है, जो कि वास्तविक समय डेटा प्रवाह और गतिशील समायोजन ट्रेडिंग रणनीतियों, विशेष रूप से उच्च आवृत्ति रणनीतियों के साथ काम करने के लिए विशेष रूप से महत्वपूर्ण है। लेख में प्रासंगिक पायथन कोड कार्यान्वयन भी दिए गए हैं, जो व्यापारियों को वास्तविक ट्रेडिंग में जल्दी से तैनात करने और इस एल्गोरिथ्म को लागू करने में मदद करते हैं।
यदि हम $\mu_n$ का मतलब $\n$ डेटा बिंदुओं के लिए देते हैं, तो मान लीजिए कि हमने $\mu_{n-1}$ डेटा बिंदुओं की औसत गणना की है, और अब हमें एक नया डेटा बिंदु $\mu_{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}) $S_n = S_{n-1} + (x_n - \mu_{n-1}) $\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$ का कार्य है।
सरल चलती औसत (SMA) एक समय खिड़की के भीतर सभी कीमतों का अंकगणितीय औसत है। एक समय खिड़की $N$ के लिए, SMA का द्रव्यमान (SMA) माना जा सकता हैः
$\text{SMA} = \frac{1 + N}{2}$
सूचकांक चलती औसत (EMA) एक भारित औसत है जिसमें निकटतम डेटा बिंदुओं का अधिक वजन होता है। EMA का वजन समय के साथ सूचकांक स्तर के साथ कम होता है। EMA का द्रव्यमान निम्न स्तरों से प्राप्त किया जा सकता हैः
$\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$ का मूल्य एक एनीमे के बराबर एनीमे के ईएमए की गणना करने के लिए इस्तेमाल किया जा सकता है, जिससे दोनों के पास समान द्रव्यमान होता है और परिणाम बहुत करीब होते हैं।
मान लीजिए कि हमारे पास एक ईएमए है जो प्रति सेकंड $\alpha_1$ के भार के साथ अद्यतन होता है। इसका मतलब है कि प्रत्येक सेकंड में, नए डेटा बिंदु $\alpha_1$ के भार के साथ ईएमए में जोड़े जाते हैं, जबकि पुराने डेटा बिंदु के प्रभाव को $1 - \alpha_1$ से गुणा किया जाता है।
यदि हम अद्यतनों की आवृत्ति बदलते हैं, जैसे कि हर $f$ सेकंड में एक बार, तो हम एक नया भार कारक $\alpha_2$ ढूंढना चाहते हैं, ताकि $f$ सेकंड में डेटा बिंदुओं का कुल प्रभाव प्रति सेकंड अद्यतन के समान हो।
$f$ सेकंड के दौरान, यदि अद्यतन नहीं किया जाता है, तो पुराने डेटा बिंदुओं का प्रभाव $f$ बार लगातार घटता है, प्रत्येक बार $1 - \alpha_1$ से गुणा किया जाता है। इसलिए, $f$ सेकंड के बाद कुल घटने का कारक $(1 - \alpha_1) ^ f$ है।
ताकि $f$ सेकंड में एक बार अपडेट किए जाने वाले ईएमए में एक अपडेट चक्र में एक बार प्रति सेकंड अपडेट किए जाने वाले ईएमए के समान गिरावट प्रभाव हो, हम $f$ सेकंड के बाद कुल गिरावट कारक को एक अपडेट चक्र में गिरावट कारक के बराबर सेट करते हैंः
$(1 - \alpha_1) ^f = 1 - \alpha_2$
इस समीकरण को हल करने के लिए, हम एक नया वजन कारक $\alpha_2$ मिलता हैः
$\alpha_2 = 1 - (1 - \alpha_1) ^ f$
यह सूत्र नए भारित कारक $\alpha_2$ का अनुमानित मान देता है, जो EMA को स्थिर रखने के लिए आवृत्ति परिवर्तनों के दौरान स्थिर रहता है। उदाहरण के लिए, यदि हम $\alpha_1$ के औसत मूल्य को 0.001 के रूप में गणना करते हैं, तो हर 10s में नवीनतम मूल्य को अपडेट किया जाता है, और यदि हम 1s में एक बार अपडेट करते हैं, तो $\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)
उच्च आवृत्ति प्रोग्रामेटिक लेनदेन में, वास्तविक समय में डेटा का तेजी से प्रसंस्करण महत्वपूर्ण है. गणना की दक्षता बढ़ाने और संसाधनों की खपत को कम करने के लिए, इस लेख में एक ऑनलाइन अद्यतन एल्गोरिथ्म का परिचय दिया गया है, जो डेटा प्रवाह के लिए निरंतर गणना के लिए उपयोग किया जाता है। वास्तविक समय में वृद्धिशील अद्यतन गणना भी विभिन्न सांख्यिकीय आंकड़ों और संकेतों के लिए उपयोग की जा सकती है, जैसे कि दो परिसंपत्तियों के मूल्य संबंध, रैखिक फिट, आदि। वृद्धिशील अद्यतन डेटा को संकेत प्रणाली के रूप में देखने के लिए एक विकास है, जो कि निश्चित चक्र गणना के विपरीत है।