एल्गोरिथम ट्रेडिंग सिस्टम के लिए सर्वश्रेष्ठ प्रोग्रामिंग भाषा?

लेखक:अच्छाई, बनाया गयाः 2019-02-12 10:33:36, अद्यतन किया गयाः

मुझे मेलबैग में सबसे अधिक पूछे जाने वाले प्रश्नों में से एक है अल्गोरिदमिक ट्रेडिंग के लिए सबसे अच्छी प्रोग्रामिंग भाषा क्या है?. संक्षिप्त उत्तर यह है कि कोई सर्वश्रेष्ठ भाषा नहीं है। रणनीति मापदंडों, प्रदर्शन, मॉड्यूलरता, विकास, लचीलापन और लागत सभी पर विचार किया जाना चाहिए। यह लेख एक एल्गोरिदमिक ट्रेडिंग सिस्टम वास्तुकला के आवश्यक घटकों की रूपरेखा तैयार करेगा और कार्यान्वयन के बारे में निर्णय भाषा की पसंद को कैसे प्रभावित करते हैं।

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

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

व्यापार प्रणाली क्या करने की कोशिश कर रही है?

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

अनुसंधान ऐतिहासिक डेटा पर रणनीति के प्रदर्शन के मूल्यांकन से संबंधित है। पिछले बाजार डेटा पर एक ट्रेडिंग रणनीति का मूल्यांकन करने की प्रक्रिया को बैकटेस्टिंग के रूप में जाना जाता है। डेटा का आकार और एल्गोरिथम जटिलता का बैकटेस्टर की कम्प्यूटेशनल तीव्रता पर बड़ा प्रभाव पड़ेगा। सीपीयू गति और समवर्ती अक्सर अनुसंधान निष्पादन गति को अनुकूलित करने में सीमित कारक होते हैं।

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

रणनीति का प्रकार, आवृत्ति और मात्रा

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

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

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

रणनीति की आवृत्ति प्रौद्योगिकी स्टैक को परिभाषित करने के सबसे बड़े ड्राइवरों में से एक होने की संभावना है। मिनटों या दूसरे बार की तुलना में अधिक बार डेटा का उपयोग करने वाली रणनीतियों को प्रदर्शन के संबंध में महत्वपूर्ण विचार की आवश्यकता होती है।

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

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

अनुसंधान प्रणाली

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

इस क्षेत्र में विशिष्ट आईडीई में माइक्रोसॉफ्ट विजुअल सी ++ / सी # शामिल हैं, जिसमें व्यापक डिबगिंग उपयोगिताएं, कोड पूरा करने की क्षमताएं (Intellisense) और पूरे प्रोजेक्ट स्टैक का सीधा अवलोकन (डेटाबेस ORM, LINQ के माध्यम से) शामिल हैं; मैटलैब, जिसे व्यापक संख्यात्मक रैखिक बीजगणित और वेक्टर ऑपरेशन के लिए डिज़ाइन किया गया है, लेकिन एक इंटरैक्टिव कंसोल तरीके से; आर स्टूडियो, जो आरस्टैटिस्टिकल भाषा कंसोल को एक पूर्ण विकसित आईडीई में लपेटता है; जावा लिनक्स और सी ++ के लिए ग्रहण आईडीई; और अर्ध-स्वामित्व वाले आईडीई जैसे कि पायथन के लिए Enthought Canopy, जिसमें एक ही इंटरैक्टिव (कंसोल) वातावरण में NumPy, SciPy, scikit-learn और पांडा जैसे डेटा विश्लेषण पुस्तकालय शामिल हैं।

संख्यात्मक बैकटेस्टिंग के लिए, उपरोक्त सभी भाषाएँ उपयुक्त हैं, हालांकि एक जीयूआई / आईडीई का उपयोग करना आवश्यक नहीं है क्योंकि कोड को पृष्ठभूमि में निष्पादित किया जाएगा। इस चरण में मुख्य विचार निष्पादन गति का है। एक संकलित भाषा (जैसे सी ++) अक्सर उपयोगी होती है यदि बैकटेस्टिंग पैरामीटर आयाम बड़े होते हैं। याद रखें कि यदि ऐसा है तो ऐसे सिस्टम से सावधान रहना आवश्यक है!

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

पोर्टफोलियो निर्माण और जोखिम प्रबंधन

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

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

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

पोर्टफोलियो निर्माण अक्सर रैखिक बीजगणित समस्या (जैसे मैट्रिक्स कारककरण) तक कम हो जाता है और इसलिए प्रदर्शन उपलब्ध संख्यात्मक रैखिक बीजगणित कार्यान्वयन की प्रभावशीलता पर अत्यधिक निर्भर करता है। सामान्य पुस्तकालयों में uBLAS, LAPACK और NAG शामिल हैं। मैटलैब में व्यापक रूप से अनुकूलित मैट्रिक्स संचालन भी हैं। पायथन इस तरह की गणनाओं के लिए NumPy / SciPy का उपयोग करता है। एक बार फिर से संतुलित पोर्टफोलियो को इस चरण को पूरा करने के लिए संकलित (और अच्छी तरह से अनुकूलित!

जोखिम प्रबंधन एक एल्गोरिथम ट्रेडिंग प्रणाली का एक और बेहद महत्वपूर्ण हिस्सा है। जोखिम कई रूपों में आ सकता हैः बढ़ी हुई अस्थिरता (हालांकि यह कुछ रणनीतियों के लिए वांछनीय माना जा सकता है!), परिसंपत्ति वर्गों के बीच बढ़े हुए सहसंबंध, प्रतिपक्ष डिफ़ॉल्ट, सर्वर आउटेज, black swan घटनाएं और ट्रेडिंग कोड में अनदेखी कीड़े, कुछ का नाम लेने के लिए।

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

निष्पादन प्रणाली

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

एपीआई की गुणवत्ता यह दर्शाता है कि यह कितनी अच्छी तरह से प्रलेखित है, यह किस प्रकार का प्रदर्शन प्रदान करता है, क्या इसे एक्सेस करने के लिए स्टैंडअलोन सॉफ़्टवेयर की आवश्यकता है या क्या एक गेटवे को हेडलेस फैशन में स्थापित किया जा सकता है (यानी कोई जीयूआई नहीं) । इंटरएक्टिव ब्रोकरों के मामले में, ट्रेडर वर्कस्टेशन टूल को उनके एपीआई तक पहुंचने के लिए एक जीयूआई वातावरण में चलाने की आवश्यकता होती है। मुझे एक बार एक डेस्कटॉप उबंटू संस्करण को अमेज़ॅन क्लाउड सर्वर पर इंस्टॉल करना पड़ा ताकि दूरस्थ रूप से इंटरएक्टिव ब्रोकर तक पहुंच सकें, केवल इस कारण से!

अधिकांश एपीआई एक सी ++ और / या जावा इंटरफ़ेस प्रदान करेंगे। यह आमतौर पर सी #, पायथन, आर, एक्सेल और मैटलैब के लिए भाषा-विशिष्ट रैपर विकसित करने के लिए समुदाय पर निर्भर करता है। ध्यान दें कि प्रत्येक अतिरिक्त प्लगइन (विशेष रूप से एपीआई रैपर) का उपयोग करने के साथ सिस्टम में बग के लिए गुंजाइश है। हमेशा इस तरह के प्लगइन्स का परीक्षण करें और सुनिश्चित करें कि वे सक्रिय रूप से बनाए रखे गए हैं। एक सार्थक गेज यह देखना है कि हाल के महीनों में कोडबेस में कितने नए अपडेट किए गए हैं।

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

स्थिर रूप से टाइप की गई भाषाएं (नीचे देखें) जैसे सी ++ / जावा सामान्य रूप से निष्पादन के लिए इष्टतम हैं लेकिन विकास समय, परीक्षण और रखरखाव की आसानी में एक व्यापार-बंद है। गतिशील रूप से टाइप की गई भाषाएं, जैसे पायथन और पर्ल अब आम तौर पर पर्याप्त तेजी से हैं। हमेशा सुनिश्चित करें कि घटक मॉड्यूलर तरीके से डिज़ाइन किए गए हैं (नीचे देखें) ताकि उन्हें सिस्टम स्केल के रूप में बाहर स्वैप किया जा सके।

वास्तुशिल्प योजना और विकास प्रक्रिया

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

चिंताओं को अलग करना

सबसे महत्वपूर्ण निर्णयों में से एक जो शुरुआत में किया जाना चाहिए वह यह है कि व्यापार प्रणाली की चिंताओं को कैसे अलग किया जाए। सॉफ्टवेयर विकास में, इसका मूल रूप से मतलब है कि व्यापार प्रणाली के विभिन्न पहलुओं को अलग-अलग मॉड्यूलर घटकों में कैसे विभाजित किया जाए।

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

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

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

अलग-अलग घटकों का एक और लाभ यह है कि यह समग्र प्रणाली में विभिन्न प्रकार की प्रोग्रामिंग भाषाओं का उपयोग करने की अनुमति देता है। यदि घटकों की संचार विधि भाषा स्वतंत्र है तो एक ही भाषा तक सीमित होने की आवश्यकता नहीं है। यह मामला होगा यदि वे टीसीपी / आईपी, जीरोएमक्यू या किसी अन्य भाषा-स्वतंत्र प्रोटोकॉल के माध्यम से संवाद कर रहे हैं।

एक ठोस उदाहरण के रूप में, number crunching प्रदर्शन के लिए C++ में लिखी गई बैकटेस्टिंग प्रणाली के मामले पर विचार करें, जबकि पोर्टफोलियो प्रबंधक और निष्पादन प्रणाली SciPy और IBPy का उपयोग करके पायथन में लिखी गई हैं।

प्रदर्शन पर विचार

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

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

प्रोफाइलिंग टूल का उपयोग यह निर्धारित करने के लिए किया जाता है कि फ्लाट क्लोज़ कहाँ उत्पन्न होते हैं। प्रोफाइल को ऊपर सूचीबद्ध सभी कारकों के लिए बनाया जा सकता है, या तो एमएस विंडोज या लिनक्स वातावरण में। ऐसा करने के लिए कई ऑपरेटिंग सिस्टम और भाषा उपकरण उपलब्ध हैं, साथ ही तीसरे पक्ष की उपयोगिताएं भी हैं। भाषा विकल्प अब प्रदर्शन के संदर्भ में चर्चा की जाएगी।

सी++, जावा, पायथन, आर और मैटलैब सभी में बुनियादी डेटा संरचना और एल्गोरिथम कार्य के लिए उच्च प्रदर्शन पुस्तकालय (या तो अपने मानक के हिस्से के रूप में या बाहरी रूप से) होते हैं। सी++ मानक टेम्पलेट लाइब्रेरी के साथ जहाज करता है, जबकि पायथन में NumPy/SciPy होता है। इन पुस्तकालयों में सामान्य गणितीय कार्य पाए जाते हैं और शायद ही कभी एक नया कार्यान्वयन लिखना फायदेमंद होता है।

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

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

उच्च आवृत्ति संचालन के लिए कर्नेल अनुकूलन के साथ-साथ नेटवर्क संचरण के अनुकूलन के साथ घनिष्ठ रूप से परिचित होना आवश्यक है। यह एक गहरा क्षेत्र है और लेख के दायरे से काफी परे है लेकिन यदि एक यूएचएफटी एल्गोरिथ्म वांछित है तो आवश्यक ज्ञान की गहराई के बारे में जागरूक रहें!

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

ट्रेडिंग स्थितियों के लिए कैशिंग बेहद फायदेमंद हो सकती है। उदाहरण के लिए, एक रणनीति पोर्टफोलियो की वर्तमान स्थिति को कैश में तब तक संग्रहीत किया जा सकता है जब तक कि यह पुनः संतुलित न हो जाए, ताकि ट्रेडिंग एल्गोरिथ्म के प्रत्येक लूप पर सूची को पुनर्जीवित करने की आवश्यकता न हो। ऐसा पुनर्जन्म उच्च सीपीयू या डिस्क I / O ऑपरेशन होने की संभावना है।

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

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

कचरा संग्रह विकास के दौरान बेहद उपयोगी है क्योंकि यह त्रुटियों को कम करता है और पठनीयता में सहायता करता है। हालांकि, यह अक्सर कुछ उच्च आवृत्ति ट्रेडिंग रणनीतियों के लिए उप-अनुकूल होता है। इन मामलों के लिए कस्टम कचरा संग्रह अक्सर वांछनीय होता है। उदाहरण के लिए, जावा में, कचरा कलेक्टर और ढेर कॉन्फ़िगरेशन को ट्यून करके, एचएफटी रणनीतियों के लिए उच्च प्रदर्शन प्राप्त करना संभव है।

C++ में एक मूल कचरा कलेक्टर नहीं है और इसलिए किसी ऑब्जेक्ट के कार्यान्वयन के हिस्से के रूप में सभी मेमोरी आवंटन/डिआलोकेशन को संभालना आवश्यक है। जबकि संभावित रूप से त्रुटि प्रवण (संभावित रूप से लटकते पॉइंटर के लिए अग्रणी) यह बहुत उपयोगी है कि कुछ अनुप्रयोगों के लिए ढेर पर ऑब्जेक्ट कैसे दिखाई देते हैं, इस पर बारीकी से नियंत्रण है। एक भाषा का चयन करते समय यह सुनिश्चित करें कि कचरा कलेक्टर कैसे काम करता है और क्या इसे किसी विशेष उपयोग के मामले के लिए अनुकूलित करने के लिए संशोधित किया जा सकता है।

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

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

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

इस तरह के GPU हार्डवेयर आम तौर पर मात्रात्मक वित्त के अनुसंधान पहलू के लिए ही उपयुक्त है, जबकि अन्य अधिक विशेष हार्डवेयर (फील्ड-प्रोग्राम करने योग्य गेट सरणी सहित - FPGAs) का उपयोग (U) HFT के लिए किया जाता है। आजकल, अधिकांश आधुनिक लैंग्वेज एक डिग्री समवर्ती / मल्टीथ्रेडिंग का समर्थन करते हैं। इस प्रकार बैकटेस्टर को अनुकूलित करना सीधा है, क्योंकि सभी गणनाएं आम तौर पर दूसरों से स्वतंत्र होती हैं।

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

जबकि सिस्टम को स्केलेबल के लिए डिज़ाइन किया जाना चाहिए, यह पहले से अनुमान लगाना अक्सर मुश्किल होता है कि एक बोतल का गला कहाँ होगा। कठोर लॉगिंग, परीक्षण, प्रोफाइलिंग और निगरानी एक सिस्टम को स्केलेबल करने की अनुमति देने में बहुत मदद करेगी। भाषाओं को अक्सर "अनस्केलेबल" के रूप में वर्णित किया जाता है। यह आमतौर पर कठिन तथ्य के बजाय गलत सूचना का परिणाम है। यह कुल प्रौद्योगिकी ढेर है जिसे स्केलेबिलिटी के लिए निर्धारित किया जाना चाहिए, भाषा नहीं। स्पष्ट रूप से कुछ भाषाओं में विशेष उपयोग के मामलों में दूसरों की तुलना में अधिक प्रदर्शन होता है, लेकिन एक भाषा हर अर्थ में दूसरे से "बेहतर" कभी नहीं होती है।

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

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

हार्डवेयर और ऑपरेटिंग सिस्टम

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

डेस्कटॉप मशीनों को स्थापित करना और प्रबंधित करना आसान है, विशेष रूप से नए उपयोगकर्ता के अनुकूल ऑपरेटिंग सिस्टम जैसे विंडोज 7/8, मैक ओएसएक्स और उबंटू के साथ। डेस्कटॉप सिस्टम में कुछ महत्वपूर्ण नुकसान हैं, हालांकि। सबसे महत्वपूर्ण यह है कि डेस्कटॉप मशीनों के लिए डिज़ाइन किए गए ऑपरेटिंग सिस्टम के संस्करणों को रिबूट / पैचिंग की आवश्यकता होती है (और अक्सर सबसे खराब समय में) । वे ग्राफिकल यूजर इंटरफेस (जीयूआई) की आवश्यकता के कारण अधिक कंप्यूटेशनल संसाधनों का भी उपयोग करते हैं।

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

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

विंडोज में यह आम तौर पर जीयूआई रिमोट डेस्कटॉप प्रोटोकॉल (आरडीपी) के माध्यम से होता है। यूनिक्स-आधारित सिस्टम में कमांड-लाइन सिक्योर शेल (एसएसएच) का उपयोग किया जाता है। यूनिक्स-आधारित सर्वर बुनियादी ढांचा लगभग हमेशा कमांड-लाइन आधारित होता है जो तुरंत जीयूआई-आधारित प्रोग्रामिंग टूल (जैसे मैटलैब या एक्सेल) को अनुपयोगी बनाता है।

एक सह-स्थित सर्वर, जैसा कि वाक्यांश पूंजी बाजारों में उपयोग किया जाता है, बस एक समर्पित सर्वर है जो व्यापार एल्गोरिथ्म के विलंबता को कम करने के लिए एक एक्सचेंज के भीतर रहता है। यह कुछ उच्च आवृत्ति व्यापार रणनीतियों के लिए बिल्कुल आवश्यक है, जो अल्फा उत्पन्न करने के लिए कम विलंबता पर निर्भर करते हैं।

हार्डवेयर विकल्प और प्रोग्रामिंग भाषा की पसंद का अंतिम पहलू प्लेटफॉर्म-स्वतंत्रता है। क्या कोड को कई अलग-अलग ऑपरेटिंग सिस्टम पर चलाने की आवश्यकता है? क्या कोड को एक विशेष प्रकार के प्रोसेसर आर्किटेक्चर पर चलाने के लिए डिज़ाइन किया गया है, जैसे कि इंटेल x86/x64 या क्या आरएएम द्वारा निर्मित आरआईएससी प्रोसेसर पर निष्पादित करना संभव होगा? ये मुद्दे आवृत्ति और लागू की जा रही रणनीति के प्रकार पर बहुत निर्भर होंगे।

लचीलापन और परीक्षण

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

यह संभावना है कि किसी भी काफी जटिल कस्टम मात्रात्मक व्यापार अनुप्रयोग में कम से कम 50% विकास समय डिबगिंग, परीक्षण और रखरखाव पर खर्च किया जाएगा।

लगभग सभी प्रोग्रामिंग भाषाएँ या तो एक संबंधित डिबगर के साथ शिप करती हैं या अच्छी तरह से सम्मानित तृतीय-पक्ष विकल्पों के मालिक हैं। अनिवार्य रूप से, एक डिबगर कोड पथ में मनमाने ब्रेक बिंदुओं के सम्मिलन के साथ एक कार्यक्रम के निष्पादन की अनुमति देता है, जो सिस्टम की स्थिति की जांच करने के लिए निष्पादन को अस्थायी रूप से रोकता है। डिबगिंग का मुख्य लाभ यह है कि ज्ञात क्रैश बिंदु से पहले कोड के व्यवहार की जांच करना संभव है।

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

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

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

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

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

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

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

सिस्टम मॉनिटरिंग अक्सर सिस्टम व्यवस्थापक या संचालन प्रबंधक का डोमेन होता है। हालांकि, एक एकल ट्रेडिंग डेवलपर के रूप में, इन मैट्रिक्स को बड़े डिजाइन के हिस्से के रूप में स्थापित किया जाना चाहिए। मॉनिटरिंग के लिए कई समाधान मौजूद हैंः मालिकाना, होस्ट और ओपन सोर्स, जो एक विशेष उपयोग मामले के लिए मैट्रिक्स के व्यापक अनुकूलन की अनुमति देते हैं।

बैकअप और उच्च उपलब्धता एक ट्रेडिंग सिस्टम की प्राथमिक चिंताएं होनी चाहिए। निम्नलिखित दो प्रश्नों पर विचार करें: 1) यदि बाजार डेटा और ट्रेडिंग इतिहास का एक पूरा उत्पादन डेटाबेस हटा दिया गया था (बैकअप के बिना) तो अनुसंधान और निष्पादन एल्गोरिथ्म कैसे प्रभावित होगा? 2) यदि ट्रेडिंग सिस्टम एक विस्तारित अवधि के लिए आउटेज का सामना करता है (खुली पदों के साथ) तो खाता इक्विटी और चल रही लाभप्रदता कैसे प्रभावित होगी? इन दोनों सवालों के जवाब अक्सर गंभीर होते हैं!

डेटा का बैकअप लेने और ऐसे डेटा की बहाली का परीक्षण करने के लिए एक प्रणाली स्थापित करना अनिवार्य है। कई व्यक्ति बहाली रणनीति का परीक्षण नहीं करते हैं। यदि किसी दुर्घटना से पुनर्प्राप्ति का सुरक्षित वातावरण में परीक्षण नहीं किया गया है, तो क्या गारंटी है कि बहाली सबसे खराब संभव समय पर उपलब्ध होगी?

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

भाषा चुनना

एक कस्टम उच्च प्रदर्शन एल्गोरिथम ट्रेडिंग सिस्टम विकसित करते समय उत्पन्न होने वाले विभिन्न कारकों पर अब काफी विस्तार प्रदान किया गया है। अगला चरण यह चर्चा करना है कि प्रोग्रामिंग भाषाओं को सामान्य रूप से कैसे वर्गीकृत किया जाता है।

प्रकार प्रणाली

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

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

स्थैतिक रूप से टाइप किए गए भाषाओं का एक और लाभ यह है कि संकलक कई अनुकूलन करने में सक्षम है जो अन्यथा गतिशील रूप से टाइप की गई भाषा के लिए अनुपलब्ध हैं, केवल इसलिए कि प्रकार (और इसलिए मेमोरी आवश्यकताएं) संकलन के समय ज्ञात हैं। वास्तव में, कई गतिशील रूप से टाइप की गई भाषाओं की अक्षमता का एक हिस्सा इस तथ्य से निकलता है कि कुछ वस्तुओं को रन-टाइम पर प्रकार-निरीक्षण किया जाना चाहिए और इससे प्रदर्शन हिट होता है। गतिशील भाषाओं के लिए पुस्तकालय, जैसे कि NumPy/SciPy, सरणी के भीतर एक प्रकार को लागू करने के कारण इस मुद्दे को कम करते हैं।

ओपन सोर्स या प्राइवेट?

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

माइक्रोसॉफ्ट.NET स्टैक (विजुअल सी ++, विजुअल सी # सहित) और मैथवर्क मैटलैब कस्टम एल्गोरिथम ट्रेडिंग सॉफ्टवेयर विकसित करने के लिए दो बड़े मालिकाना विकल्प हैं। दोनों उपकरणों में वित्तीय स्थान में महत्वपूर्ण बैटल टेस्टिंग रही है, पूर्व निवेश बैंकिंग ट्रेडिंग बुनियादी ढांचे के लिए प्रमुख सॉफ्टवेयर स्टैक बनाते हैं और बाद में निवेश कोषों के भीतर मात्रात्मक ट्रेडिंग अनुसंधान के लिए भारी रूप से उपयोग किया जाता है।

माइक्रोसॉफ्ट और मैथवर्क्स दोनों अपने उत्पादों के लिए व्यापक उच्च गुणवत्ता वाले प्रलेखन प्रदान करते हैं। इसके अलावा, प्रत्येक उपकरण के आसपास के समुदाय दोनों के लिए सक्रिय वेब मंचों के साथ बहुत बड़े हैं।.NET सॉफ्टवेयर सी ++, सी # और वीबी जैसी कई भाषाओं के साथ सामंजस्यपूर्ण एकीकरण की अनुमति देता है, साथ ही LINQ के माध्यम से एसक्यूएल सर्वर डेटाबेस जैसे अन्य माइक्रोसॉफ्ट उत्पादों के साथ आसान लिंक भी प्रदान करता है। मैटलैब में लगभग किसी भी मात्रात्मक अनुसंधान डोमेन के लिए कई प्लगइन्स / पुस्तकालय (कुछ मुफ्त, कुछ वाणिज्यिक) भी हैं।

विज़ुअल स्टूडियो के कुछ नुकसान भी हैं. सॉफ्टवेयर के किसी भी टुकड़े के साथ लागत एक अकेला व्यापारी के लिए महत्वहीन नहीं है (हालांकि माइक्रोसॉफ्ट विज़ुअल स्टूडियो का एंट्री-लेवल संस्करण मुफ्त में प्रदान करता है). माइक्रोसॉफ्ट टूल एक-दूसरे के साथ अच्छी तरह से खेलते हैं, लेकिन बाहरी कोड के साथ कम अच्छी तरह से एकीकृत करते हैं। विज़ुअल स्टूडियो को माइक्रोसॉफ्ट विंडोज पर भी निष्पादित किया जाना चाहिए, जो संभवतः एक समकक्ष लिनक्स सर्वर की तुलना में बहुत कम प्रदर्शन करता है जो इष्टतम रूप से ट्यून किया गया है।

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

ओपन सोर्स टूल कुछ समय के लिए उद्योग ग्रेड रहे हैं। वैकल्पिक परिसंपत्ति अंतरिक्ष का अधिकांश भाग उच्च प्रदर्शन उत्पादन भूमिकाओं में ओपन-सोर्स लिनक्स, MySQL / PostgreSQL, पायथन, R, C ++ और जावा का व्यापक उपयोग करता है। हालांकि, वे इस डोमेन तक सीमित नहीं हैं। विशेष रूप से पायथन और R में लगभग किसी भी प्रकार के डेटा विश्लेषण की कल्पना करने के लिए व्यापक संख्यात्मक पुस्तकालयों का खजाना होता है, अक्सर संकलित भाषाओं के बराबर निष्पादन गति पर, कुछ चेतावनी के साथ।

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

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

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

जबकि मालिकाना सॉफ्टवेयर निर्भरता/संस्करण मुद्दों से प्रतिरक्षित नहीं है, ऐसे वातावरणों में गलत पुस्तकालय संस्करणों से निपटना बहुत कम आम है। लिनक्स जैसे ओपन सोर्स ऑपरेटिंग सिस्टम को प्रबंधित करना अधिक मुश्किल हो सकता है।

मैं यहां अपनी व्यक्तिगत राय का साहस करूंगा और यह बताऊंगा कि मैं अपने सभी ट्रेडिंग टूल को ओपन सोर्स प्रौद्योगिकियों के साथ बनाता हूं। विशेष रूप से मैं उपयोग करता हूंः उबंटू, MySQL, पायथन, C ++ और R। परिपक्वता, समुदाय का आकार, समस्याएं होने पर गहरी खुदाई करने की क्षमता और कम कुल लागत स्वामित्व (TCO) स्वामित्व वाले जीयूआई की सादगी और आसान स्थापना से कहीं अधिक है। यह कहते हुए, माइक्रोसॉफ्ट विजुअल स्टूडियो (विशेष रूप से C ++ के लिए) एक शानदार एकीकृत विकास वातावरण (IDE) है जिसे मैं भी अत्यधिक अनुशंसा करूंगा।

बैटरी शामिल?

इस अनुभाग का शीर्षक भाषा की क्षमताओं को संदर्भित करता है - इसमें कौन से पुस्तकालय हैं और वे कितने अच्छे हैं? यह वह जगह है जहां परिपक्व भाषाओं को नए वेरिएंट पर लाभ होता है। सी ++, जावा और पायथन सभी अब नेटवर्क प्रोग्रामिंग, एचटीटीपी, ऑपरेटिंग सिस्टम इंटरैक्शन, जीयूआई, नियमित अभिव्यक्ति (रेजेक्स), पुनरावृत्ति और बुनियादी एल्गोरिदम के लिए व्यापक पुस्तकालयों का मालिक हैं।

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

मानक पुस्तकालयों के बाहर, सी ++ बूस्ट पुस्तकालय का उपयोग करता है, जो मानक पुस्तकालय के गायब भागों को भरता है। वास्तव में, बूस्ट के कई भागों ने इसे टीआर 1 मानक में बनाया और बाद में लैम्ब्डा अभिव्यक्ति और समवर्ती के लिए देशी समर्थन सहित सी ++ 11 विनिर्देश में उपलब्ध हैं।

पायथन में उच्च प्रदर्शन NumPy/SciPy/Pandas डेटा विश्लेषण पुस्तकालय संयोजन है, जिसने एल्गोरिथम ट्रेडिंग अनुसंधान के लिए व्यापक स्वीकृति प्राप्त की है। इसके अलावा, मुख्य संबंधपरक डेटाबेस, जैसे MySQL++ (MySQL/C++), JDBC (Java/MatLab), MySQLdb (MySQL/Python) और psychopg2 (PostgreSQL/Python) तक पहुंचने के लिए उच्च प्रदर्शन वाले प्लगइन्स मौजूद हैं। पायथन RPy प्लगइन के माध्यम से R के साथ भी संवाद कर सकता है!

प्रारंभिक अनुसंधान और डिजाइन चरण में एक ट्रेडिंग सिस्टम का एक अक्सर अनदेखा पहलू एक ब्रोकर एपीआई के लिए कनेक्टिविटी है। अधिकांश एपीआई मूल रूप से सी ++ और जावा का समर्थन करते हैं, लेकिन कुछ सी # और पायथन का भी समर्थन करते हैं, या तो सीधे या सी ++ एपीआई के लिए समुदाय द्वारा प्रदान किए गए रैपर कोड के साथ। विशेष रूप से, इंटरएक्टिव ब्रोकर को IBPy प्लगइन के माध्यम से जोड़ा जा सकता है। यदि उच्च प्रदर्शन की आवश्यकता है, तो ब्रोकर FIX प्रोटोकॉल का समर्थन करेंगे।

निष्कर्ष

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

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


अधिक