उन्नत प्लेटफार्म अनुसंधान
FMZ में एक अंतर्निहित jupyter नोटबुक है जो उपयोगकर्ताओं को प्लेटफ़ॉर्म एपीआई से परिचित होने और रणनीति अनुसंधान करने में मदद करता है, और पायथन 3 C ++ 11/17 और जावास्क्रिप्ट के सीखने के वातावरण का समर्थन करता है। नोटबुक+पायथन एक बहुत शक्तिशाली उपकरण है, जो डेटा विश्लेषण और रणनीति अनुसंधान के लिए लगभग अपरिहार्य है। हालांकि FMZ प्लेटफ़ॉर्म के साथ आने वाला बैकटेस्ट बहुत उपयोगी है, यह जटिल और बड़ी डेटा मात्रा वाली रणनीतियों के लिए उपयुक्त नहीं है। यह लेख jupyter नोटबुक के कुछ उन्नत उपयोग कौशल पेश करेगा, और यादृच्छिक जोड़ी व्यापार और बहु-जोड़ी व्यापार रणनीतियों के बैकटेस्ट का एहसास करेगा।
एफएमजेड के भीतर अनुसंधान वातावरण का उपयोग किया जा सकता है, लेकिन नेटवर्किंग असुविधाजनक है। अपने डिवाइस पर एनाकोंडा 3 स्थापित करने की सिफारिश की जाती है, जिसमें नोटबुक और सामान्य रूप से इस्तेमाल की जाने वाली संबंधित पुस्तकालयों के साथ गणितीय गणनाएं होती हैं; यह स्थानीय नेटवर्क वातावरण को साझा कर सकता है, और बेहतर प्रदर्शन कर सकता है। गूगल कोलैब का उपयोग करने की भी सिफारिश की जाती है। हालांकि कुछ भंडारण सीमाएं हैं, यह मुफ्त और शक्तिशाली है, रोबोट अध्ययन से संबंधित अनुसंधान के लिए उपयुक्त है।
नोटबुक और पायथन के विशिष्ट उपयोग कौशल के लिए कई ऑनलाइन ट्यूटोरियल हैं। आप पायथन क्वांटिफिकेशन और जूपिटर नोटबुक ट्यूटोरियल जैसे कीवर्ड खोजकर बहुत सारी जानकारी पा सकते हैं। आपको क्रॉलर, डेटा प्रोसेसिंग, बैकटेस्ट, रणनीति डिजाइन और प्लॉटिंग जैसी मूल बातें सीखने और मास्टर करने की आवश्यकता है।
प्लेटफ़ॉर्म आमतौर पर इतिहास डेटा के साथ के-लाइन प्राप्त करने के लिए एपीआई प्रदान करते हैं, और कुछ व्यापार द्वारा निष्पादन व्यापार का डेटा भी प्रदान करते हैं। हमें डेटा प्राप्त करने और सहेजने के लिए क्रॉलर का उपयोग करने की आवश्यकता है। आप सीधे प्लेटफ़ॉर्म द्वारा धकेल दिए गए डेटा प्राप्त कर सकते हैं और अपने आप से एक स्थानीय डेटाबेस भंडारण बना सकते हैं।
इसके बाद, हम दिखाएंगे कि बिनेंस पर स्थायी अनुबंधों के के-लाइन डेटा को कैसे प्राप्त और संग्रहीत किया जाए।
सबसे पहले, Binance Perpetual Swap दस्तावेज खोजेंःhttps://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. आप आवश्यक मापदंडों और लौटाए गए डेटा प्रारूपों को देख सकते हैं। आमतौर पर, एपीआई द्वारा अधिग्रहित के-लाइनों की संख्या सीमित होती है, और बाइनेंस में अधिकतम 1000 होते हैं, इसलिए इसे लूप पुनरावृत्ति द्वारा अधिग्रहित करने की आवश्यकता होती है। अन्य प्लेटफार्मों पर स्थिति बाइनेंस के समान है। ध्यान दें कि नेटवर्क को विदेशी नेटवर्क से कनेक्ट करने की आवश्यकता है (चीन में घरेलू नेटवर्क की तुलना में) के-लाइनों को क्रॉल करने के लिए।
अवधि Binance समर्थन करता हैः 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M।
[24] मेंः
आम पुस्तकालय के लिए आयात अनुरोध #नेटवर्क अनुरोध
आयात की तारीख से समय
आयात का समय
पीडी के रूप में आयात पांडा
[160 में]:
def GetKlines ((प्रतीक=
डेटा भंडारण और पढ़ने के लिए पांडा पुस्तकालय के अंदर के कार्यों का उपयोग कर सकते हैं। प्रारूप csv है, जिसे सीधे एक्सेल सॉफ्टवेयर के साथ खोला जा सकता है।
उच्चतम मूल्य, निम्नतम मूल्य, खुली कीमत, बंद मूल्य और निष्पादित मात्रा के अलावा, बिनेंस द्वारा लौटाए गए के-लाइन डेटा में कुल व्यापार राशि, पहल खरीद राशि, निष्पादन राशि आदि भी शामिल हैं। ये मूल्यवान जानकारी हैं जिनका उपयोग रणनीतियों के निर्माण के लिए किया जा सकता है।
[86] मेंः
df.to_csv ((
,
[88] मेंः
df.index = pd.to_datetime ((df.time,unit=
पिछले लेख में पायथन बैकटेस्ट इंजन भी दिया गया था, लेकिन यहां एक अनुकूलित संस्करण है। यूएसडीटी-मार्जिन (या अन्य उद्धरण मुद्रा-मार्जिन) स्थायी अनुबंध स्पॉट अनुबंधों के समान हैं। अंतर यह है कि स्थायी अनुबंध लाभ उठा सकते हैं और नकारात्मक राशि (छोटे बनाने के बराबर) रख सकते हैं, और एक बैकटेस्ट इंजन साझा कर सकते हैं। क्रिप्टो-मार्जिन वितरण अनुबंध विशेष हैं, क्योंकि वे मुद्रा में निपटान करते हैं और विशिष्ट बैकटेस्ट की आवश्यकता होती है।
यहाँ एक सरल उदाहरण दिया गया है, जो बहु-प्रतीक स्पॉट या बहु-प्रतीक शाश्वत बैकटेस्टिंग को लागू कर सकता है। कई विवरणों की अनदेखी की जाती हैः जैसे कि वायदा का लाभ, मार्जिन कब्जा, वित्तपोषण दर, परिसमापन तंत्र, बाजार बनाने और ऑर्डर लेने वाले लेनदेन के साथ-साथ ऑर्डर रखरखाव, लेकिन यह आमतौर पर सामान्य बैकटेस्ट परिणामों को प्रभावित नहीं करता है। और मिलान की कीमत और मात्रा, और खाता अद्यतन सभी को बाहरी रूप से आयात करने की आवश्यकता होती है। पाठक इसे इस आधार पर सुधार सकते हैं।
विनिमय वर्ग का परिचयः
account:USDT आधार मुद्रा दर्शाता है, जो आवश्यक नहीं है; realised_profit: लाभ और हानि पहले ही प्राप्त; unrealised_profit: लाभ और हानि अभी तक प्राप्त नहीं; कुलः कुल इक्विटी; शुल्कः हैंडलिंग शुल्क। अन्य ट्रेडिंग जोड़े के लिए, राशि (जो शॉर्टिंग के समय नकारात्मक संख्या है); hold_price: होल्डिंग मूल्य; मूल्यः होल्डिंग मूल्य; मूल्यः वर्तमान मूल्य।
trade_symbols: ट्रेडिंग जोड़े की सरणी; आप एक ट्रेडिंग जोड़ी में भी पास कर सकते हैं; डिफ़ॉल्ट उद्धरण मुद्रा USDT है, लेकिन आप बैकटेस्ट के लिए अन्य उद्धरण मुद्रा प्रतीकों का भी उपयोग कर सकते हैं।
शुल्कः वितरण शुल्क; सरलता से, निर्माता और प्राप्तकर्ता में अंतर न करें।
initial_balance: आरंभिक संपत्ति; डिफ़ॉल्ट ट्रेडिंग जोड़े की आरंभिक राशि 0 है।
खरीद कार्यः खरीदना, जो एक मिलान तंत्र के बिना, स्थायी अनुबंधों के लंबे और बंद करने के लिए कम है।
बिक्री कार्यः बेचना।
अद्यतन कार्यः खाता जानकारी को अद्यतन करने के लिए, जिसे सभी व्यापारिक जोड़े के मूल्य शब्दकोश में पारित करने की आवश्यकता होती है। [98] मेंः वर्ग विनिमयः
def आरंभ करना(स्वयं, trade_symbols, शुल्क=0.0004, प्रारंभिक_शेष=10000):
self.initial_balance = initial_balance #प्रारंभिक शेष राशि
स्व. शुल्क = शुल्क
self.trade_symbols = trade_symbols
self.account = {
व्यापार (स्वयं, प्रतीक, दिशा, मूल्य, राशि):
cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
open_amount = amount - cover_amount
self.account['USDT']['realised_profit'] -= price*amount*self.fee #take out the fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #close first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #profit
self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
self.account[symbol]['amount'] -= -direction*cover_amount
self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
if open_amount > 0:
total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
total_amount = direction*self.account[symbol]['amount']+open_amount
self.account[symbol]['hold_price'] = total_cost/total_amount
self.account[symbol]['amount'] += direction*open_amount
def खरीदें (स्वयं, प्रतीक, मूल्य, राशि):self.Trade(प्रतीक, 1, मूल्य, राशि)
def बेचना (स्वयं, प्रतीक, मूल्य, राशि):self.Trade(प्रतीक, -1, मूल्य, राशि)
def Update ((self, close_price): #सम्पत्तियों को अपडेट करें
स्व.खाते[
सबसे पहले, चलो एक क्लासिक शाश्वत ग्रिड रणनीति का बैकटेस्ट करते हैं। यह रणनीति हाल ही में हमारे प्लेटफॉर्म पर बहुत लोकप्रिय है। स्पॉट ग्रिड एक की तुलना में, इसे मुद्रा रखने की आवश्यकता नहीं है और लीवरेज जोड़ सकता है, जो स्पॉट ग्रिड एक की तुलना में बहुत अधिक सुविधाजनक है। हालांकि, चूंकि इसे सीधे बैकटेस्ट नहीं किया जा सकता है, इसलिए यह मुद्रा प्रतीकों का चयन करने के लिए अनुकूल नहीं है। यहां हम इसका परीक्षण करने के लिए अभी बैकटेस्ट इंजन का उपयोग करते हैं।
के-लाइन अवधि जितनी कम होगी, उतने ही सटीक बैकटेस्ट परिणाम होंगे, और जितनी बड़ी मात्रा में डेटा की आवश्यकता होगी। पाठक प्रतीक पैरामीटर को उस ट्रेडिंग जोड़ी में बदलने का प्रयास कर सकते हैं जिसे वे बैकटेस्ट करना चाहते हैं।
[241] मेंः
प्रतीक =
e = विनिमय (([प्रतीक], शुल्क=0.0002, प्रारंभिक_शेष=10000)
init_price = df.loc[0,
if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed
e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])
res = pd.DataFrame ((data=res_list, columns=[
इस प्रकार की रणनीति भी अपेक्षाकृत लोकप्रिय है, लेकिन एफएमजेड प्लेटफॉर्म बहु-प्रतीक रणनीतियों को बैकटेस्ट करने में बहुत अच्छा नहीं है, बस कोशिश करने के लिए इस बैकटेस्ट इंजन का उपयोग करें। हम चार मुख्यधारा के मुद्रा प्रतीकों, बीटीसी, ईटीएच, एलटीसी और एक्सआरपी का चयन करते हैं, और क्रमशः बाजार मूल्य का 25% कॉन्फ़िगर करते हैं, और प्रत्येक 1% विचलन को संतुलित करते हैं।
सबसे पहले, पिछले वर्ष में चार प्रतीकों की बंद कीमतें प्राप्त करें। यह देखा जा सकता है कि ईटीएच में सबसे बड़ी वृद्धि है, और अन्य तीन में समान वृद्धि है। यदि आप इन चार प्रतीकों को औसतन रखते हैं, तो अंतिम शुद्ध मूल्य 4.5 है। बैकटेस्ट के बाद, संतुलन रणनीति का अंतिम शुद्ध मूल्य 5.3 है, जो थोड़ा बढ़ा है।
[290 में]:
प्रतीक = [
कछुआ रणनीति एक क्लासिक ट्रेंड रणनीति है जिसमें पदों को जोड़ने के लिए पूर्ण स्टॉप-लॉस तर्क शामिल है। विवरण के लिए, कृपया देखेंःhttps://zhuanlan.zhihu.com/p/27987938हम बैकटेस्ट के लिए यहाँ एक सरल संस्करण लागू करेंगे.
कछुए की रणनीति अवधि की रणनीति पर बहुत प्रभाव पड़ता है, और यह एक अवधि है कि बहुत कम है चुनने के लिए अनुशंसित नहीं है। यहाँ, हम 6h चुनते हैं। डोंचियन चैनल अवधि 5 के रूप में चुना जाता है, और स्थिति अनुपात बैकटेस्ट के अनुसार 0.003 के रूप में चुना जाता है। जब कीमत 1 इकाई लंबी स्थिति खोलने के लिए चैनल के अपबैंड के माध्यम से टूट जाती है, और स्थिति खोलने के बाद कीमत 0.3 अस्थिरता बढ़ती रहती है, 1 इकाई जोड़ना जारी रखें, और मूल्य 2.5 से नीचे गिर जाता है। स्टॉप लॉस के लिए नवीनतम खुली कीमत की अस्थिरता। शॉर्ट ऑर्डर का सिद्धांत समान है। ईटीएच के बड़े बुल बाजार के कारण, कछुए की रणनीति ने मुख्य प्रवृत्ति को पकड़ लिया है और अंततः अवधि के दौरान अधिकतम 4 गुना लाभ प्राप्त किया है, अधिकतम लाभ के साथ।
कछुए की रणनीति के मापदंड अवधि से निकटता से संबंधित हैं और उन्हें बैकटेस्ट के माध्यम से चुना जाना चाहिए। प्रत्येक समय की खुली स्थिति की इकाई को भी उच्च जोखिम से बचने के लिए बहुत बड़ा नहीं होने का ध्यान रखना चाहिए।
यह अंतिम शुद्ध मूल्य चार्ट से देखा जा सकता है कि कछुए की रणनीति एक दीर्घकालिक रणनीति है, जिसके दौरान 3 से 4 महीने तक कोई लाभ नहीं हो सकता है, और बार-बार स्टॉप लॉस हो सकता है, लेकिन एक बार एक तरफ एक बड़ा बाजार उद्धरण होने के बाद, कछुए की रणनीति प्रवृत्ति का लाभ उठाकर एक बड़ी स्थिति जमा कर सकती है, इसे प्रवृत्ति के अंत तक रख सकती है, बहुत सारे लाभ कमा सकती है। वृद्धि के अंत में, रणनीति बहुत सारी स्थिति जमा करेगी। इस समय, अस्थिरता अपेक्षाकृत बड़ी होगी, और अक्सर बड़े लाभ वापस ले लिए जाएंगे। कछुए की रणनीति का उपयोग करने के लिए आपको इसकी कमियों और अपने धैर्य को स्वीकार करने की आवश्यकता होती है।
[424] मेंः
प्रतीक =
if kline.high > kline.up and e.account[symbol]['amount'] == 0: #first time to open long position
e.Buy(symbol,kline.up,unit) #notice the trading price here
last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in
e.Buy(symbol,last_price + open_times*kline.N,unit)
last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
if kline.low < kline.down and e.account[symbol]['amount'] == 0: #open short
e.Sell(symbol,kline.down,unit)
last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in
e.Sell(symbol,last_price - open_times*kline.N,unit)
last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])
res = pd.DataFrame ((data=res_list, columns=[
यदि आप jupyter नोटबुक अनुसंधान मंच का उपयोग करने में कुशल हैं, तो आप आसानी से डेटा अधिग्रहण, डेटा विश्लेषण, रणनीति बैकटेस्ट, चार्ट प्रदर्शन, आदि जैसे संचालन कर सकते हैं, जो मात्रात्मक व्यापार का अपरिहार्य तरीका है। यदि आपके पास अभी रणनीति लेखन के बारे में कोई सुराग नहीं है, तो आप पहले डेटा का विश्लेषण कर सकते हैं। शुरुआती लोगों के लिए, अनुशंसित संसाधनः
डेटा विश्लेषण करने के लिए पायथन का प्रयोग करेंःhttps://wizardforcel.gitbooks.io/pyda-2e/content/
पायथन मात्रात्मक ट्यूटोरियलःhttps://wizardforcel.gitbooks.io/python-quant-uqer/content/
[ ] मेंः