
मैं यहां हूंबिनेंस शॉर्ट ओवर-राइजिंग लॉन्ग ओवर-स्लम्पिंग मल्टी-करेंसी हेजिंग रणनीतिउसी समय एक बैकटेस्टिंग इंजन भी जारी किया गया। पहली रिपोर्ट ने एक घंटे के के-लाइन बैकटेस्ट के आधार पर रणनीति की प्रभावशीलता को सत्यापित किया। हालाँकि, सार्वजनिक रणनीति का वास्तविक निष्क्रियता समय 1s है, जो एक बहुत ही उच्च आवृत्ति वाली रणनीति है। प्रति घंटा K-लाइन के साथ बैकटेस्टिंग करके सटीक परिणाम प्राप्त करना स्पष्ट रूप से असंभव है। बाद में जोड़ा गयामिनट लाइन बैकटेस्टपरिणामस्वरूप, बैकटेस्टिंग लाभ बहुत बढ़ गया है, लेकिन यह निर्धारित करना अभी भी असंभव है कि दूसरे स्तर की स्थिति में कौन से मापदंडों का उपयोग किया जाना चाहिए, और पूरी रणनीति की समझ बहुत स्पष्ट नहीं है। इसका मुख्य कारण K-लाइन आधारित बैकटेस्टिंग का महत्वपूर्ण नुकसान है।
सबसे पहले, ऐतिहासिक के-लाइन क्या है? के-लाइन के डेटा में चार मूल्य शामिल हैं: उच्च उद्घाटन और निम्न समापन, दो प्रारंभिक समय, और रेंज ट्रेडिंग वॉल्यूम। अधिकांश मात्रात्मक प्लेटफॉर्म और फ्रेमवर्क K-लाइन बैकटेस्टिंग पर आधारित हैं, और FMZ मात्रात्मक प्लेटफॉर्म भी टिक-स्तर बैकटेस्टिंग प्रदान करता है। के-लाइन बैकटेस्टिंग बहुत तेज है और ज्यादातर मामलों में कोई समस्या नहीं होती है, लेकिन इसमें बहुत गंभीर खामियां भी हैं, खासकर जब बहु-विविधता रणनीतियों और उच्च आवृत्ति रणनीतियों का बैकटेस्टिंग करते हैं, तो सही निष्कर्ष निकालना लगभग असंभव है।
पहला मुद्दा समय का है। K-लाइन डेटा के उच्चतम और निम्नतम मूल्यों का समय नहीं दिया गया है, इसलिए इस पर विचार करने की आवश्यकता नहीं है। लेकिन सबसे महत्वपूर्ण उद्घाटन और समापन मूल्य उद्घाटन और समापन से शुरू नहीं होते हैं। बंद करने का समय। यहां तक कि कम लोकप्रिय ट्रेडिंग उत्पादों के लिए भी, अक्सर दस सेकंड से ज़्यादा समय तक ट्रेडिंग नहीं होती है। जब हम मल्टी-प्रोडक्ट रणनीतियों का बैकटेस्ट करते हैं, तो हम अक्सर यह मान लेते हैं कि उनके खुलने और बंद होने के मूल्य एक साथ हैं। यह समापन मूल्य के बैकटेस्ट का आधार भी है।
कल्पना करें कि दो किस्मों के आर्बिट्रेज का बैकटेस्ट करने के लिए मिनट लाइन का उपयोग किया जाता है। उनका मूल्य अंतर आमतौर पर 10 युआन होता है। अब यह पाया जाता है कि 10:01 पर, अनुबंध A का समापन मूल्य 100 है और अनुबंध B का 112 है। मूल्य अंतर 12 युआन है। इसलिए रणनीति हेजिंग शुरू करती है। इस समय, मूल्य अंतर वापस आ गया, और रणनीति ने 2 युआन का रिटर्न लाभ अर्जित किया।
वास्तविक स्थिति यह हो सकती है कि 10:00:45 पर, अनुबंध ए ने 100 युआन का लेनदेन उत्पन्न किया, और उसके बाद कोई लेनदेन नहीं हुआ। 10:00:58 पर, अनुबंध बी ने 112 युआन का लेनदेन उत्पन्न किया। 10:01 पर, यदि दोनों कीमतें मौजूद नहीं हैं, तो इस समय बाजार मूल्य क्या है, और हेजिंग द्वारा कितना मूल्य अंतर प्राप्त किया जा सकता है? जानने का कोई उपाय भी नहीं है। एक संभावित परिदृश्य यह है: 10:00:58 पर, अनुबंध A का बोली-मांग मूल्य 101.9-102.1 है, और 2 युआन का कोई मूल्य अंतर नहीं है। इससे हमारी रणनीति अनुकूलन में भारी गड़बड़ी होगी।
दूसरा मुद्दा मिलान का है। वास्तविक मिलान में कीमत और समय को प्राथमिकता दी जाती है। यदि खरीदार पूछी गई कीमत से अधिक कीमत लेता है, तो लेनदेन आम तौर पर सीधे पूछी गई कीमत पर पूरा हो जाएगा। अन्यथा, यह ऑर्डर बुक में दर्ज हो जाएगा और प्रतीक्षा करेगा। के-लाइन डेटा में स्पष्ट रूप से खरीद और बिक्री मूल्य नहीं होता है, और विस्तृत स्तर पर मिलान का अनुकरण करना असंभव है।
अंत में, बाजार पर रणनीति का प्रभाव भी होता है। यदि यह छोटी पूंजी वाला बैकटेस्ट है, तो इसका प्रभाव महत्वपूर्ण नहीं होगा। लेकिन यदि ट्रेडिंग वॉल्यूम का अनुपात बड़ा है, तो इसका बाजार पर प्रभाव पड़ेगा। न केवल लेनदेन तुरंत निष्पादित होने पर मूल्य में गिरावट बड़ी होगी, बल्कि यदि आपका खरीद आदेश बैकटेस्टिंग के माध्यम से निष्पादित किया जाता है, तो यह वास्तव में अन्य व्यापारियों के लेनदेन को रोक देगा जो मूल रूप से खरीदना चाहते थे, और तितली प्रभाव का प्रभाव पड़ेगा। बाज़ार। इस प्रभाव को परिमाणित नहीं किया जा सकता है, तथा हम अनुभव के आधार पर केवल यह कह सकते हैं कि उच्च आवृत्ति व्यापार केवल छोटे फंडों को ही समायोजित कर सकता है।
एफएमजेड वास्तविक समय बैकटेस्टिंग प्रदान करता है, जो वास्तविक ऐतिहासिक 20-स्तरीय गहराई, वास्तविक समय द्वितीय-स्तरीय टिक, लेनदेन-दर-लेनदेन डेटा और अन्य डेटा प्राप्त कर सकता है।वास्तविक समय प्लेबैक फ़ंक्शन. बैकटेस्टिंग डेटा की मात्रा बहुत बड़ी है और गति बहुत धीमी है, आमतौर पर केवल दो दिन। अपेक्षाकृत उच्च आवृत्ति वाली रणनीतियों या ऐसी रणनीतियों के लिए जिनमें सख्त समय निर्णय की आवश्यकता होती है, वास्तविक समय बैकटेस्टिंग आवश्यक है। एफएमजेड द्वारा एकत्रित लेनदेन जोड़े और समयावधियां लंबी नहीं हैं, लेकिन इसमें 70 बिलियन से अधिक ऐतिहासिक डेटा हैं। वर्तमान मिलान प्रणाली यह है कि यदि खरीद आदेश, बिक्री आदेश से अधिक है, तो मात्रा पर विचार किए बिना इसे तुरंत पूर्ण रूप से मिलान कर दिया जाएगा; यदि यह बिक्री आदेश से कम है, तो इसे मिलान कतार में प्रवेश कराया जाएगा। ऐसा बैकटेस्टिंग तंत्र K-लाइन बैकटेस्टिंग की पहली दो समस्याओं को हल करता है, लेकिन यह अभी भी अंतिम समस्या को हल नहीं कर सकता है। और क्योंकि डेटा की मात्रा बहुत बड़ी है, बैकटेस्टिंग की गति और समय सीमा सीमित है।

के-लाइन की जानकारी बहुत कम है और गहराई झूठी हो सकती है, लेकिन एक प्रकार का डेटा है जो बाजार के सच्चे लेन-देन के इरादे को दर्शाता है और सबसे प्रामाणिक लेनदेन इतिहास को दर्शाता है - यानी लेनदेन दर लेनदेन। यह लेख ऑर्डर फ्लो पर आधारित एक उच्च-आवृत्ति बैकटेस्टिंग प्रणाली का प्रस्ताव करेगा, जो वास्तविक समय बैकटेस्टिंग के लिए डेटा की मात्रा को बहुत कम कर देगा और एक निश्चित सीमा तक बाजार पर ट्रेडिंग वॉल्यूम के प्रभाव का अनुकरण करेगा।
मैंने पिछले 5 दिनों में Binance XTZ परपेचुअल कॉन्ट्रैक्ट के ट्रांजेक्शन रिकॉर्ड डाउनलोड किए हैं (डाउनलोड पता: https://www.fmz.com/upload/asset/1ff487b007e1a848ead.csv)। बहुत लोकप्रिय उत्पाद नहीं होने के कारण, इसमें 213,000 ट्रांजेक्शन हैं कुल डेटा, आइए सबसे पहले डेटा की संरचना पर नज़र डालें:
[['XTZ', 1590981301905, 2.905, 0.4, 'False\n'],
['XTZ', 1590981303044, 2.903, 3.6, 'True\n'],
['XTZ', 1590981303309, 2.903, 3.7, 'True\n'],
['XTZ', 1590981303738, 2.903, 238.1, 'True\n'],
['XTZ', 1590981303892, 2.904, 0.1, 'False\n'],
['XTZ', 1590981305250, 2.904, 0.1, 'False\n'],
['XTZ', 1590981305643, 2.903, 197.3, 'True\n'],
डेटा एक द्वि-आयामी सूची है, जो लेन-देन के समय के अनुसार क्रमबद्ध है। विशिष्ट अर्थ हैं: उत्पाद का नाम, लेनदेन मूल्य, लेनदेन टाइमस्टैम्प, लेनदेन मात्रा, और क्या यह एक सक्रिय विक्रय आदेश लेनदेन है। खरीदार और विक्रेता होते हैं, और प्रत्येक लेनदेन में एक खरीदार और एक विक्रेता शामिल होता है। यदि खरीदार एक मार्केट मेकर है और विक्रेता एक टेकर है, तो अंतिम डेटा सत्य है।
सबसे पहले, लेन-देन की दिशा के आधार पर, बाजार में खरीद और बिक्री की कीमतों का काफी सटीक अनुमान लगाया जा सकता है। यदि यह एक सक्रिय बिक्री आदेश है, तो इस समय खरीद मूल्य लेनदेन मूल्य है। यदि यह एक सक्रिय खरीद आदेश है, तो बिक्री मूल्य लेनदेन मूल्य है। यदि कोई नया लेनदेन होता है, तो नया कोटेशन अपडेट किया जाएगा। यदि इसे अपडेट नहीं किया जाता है, तो पिछला परिणाम बरकरार रखा जाएगा। यह निष्कर्ष निकालना आसान है कि उपरोक्त आंकड़ों के अंतिम क्षण में क्रय मूल्य 2.903 था और विक्रय मूल्य 2.904 था।
ऑर्डर प्रवाह के अनुसार, मिलान इस प्रकार किया जा सकता है: एक खरीद ऑर्डर को उदाहरण के रूप में लेते हुए, कीमत कीमत है, ऑर्डर मात्रा राशि है, और खरीद और बिक्री ऑर्डर क्रमशः बोली और पूछ हैं। यदि कीमत पूछी गई कीमत से कम और बोली से अधिक है, तो इसे पहले निर्माता के रूप में आंका जाता है और इसे पहले लेनदेन के साथ मिलान किया जा सकता है। फिर, ऑर्डर के अस्तित्व के समय के भीतर, सभी लेनदेन जिनकी लेनदेन कीमत कम या बराबर है इस ऑर्डर के साथ कीमत का मिलान किया जाएगा (यदि कीमत पूछ से कम है, तो लेनदेन मूल्य बोली से अधिक है)। यदि बोली मूल्य बोली के बराबर या बराबर है, तो इसे पहले ट्रेड नहीं किया जा सकता है। सभी ऑर्डर इस ऑर्डर के साथ कीमत से कम लेनदेन मूल्य का मिलान किया जाएगा। मिलान मूल्य मूल्य है, और लेनदेन की मात्रा प्रत्येक लेनदेन की लेनदेन मात्रा है जब तक कि ऑर्डर पूरी तरह से निष्पादित या रद्द नहीं हो जाता है। यदि कीमत पूछी गई कीमत से अधिक है, तो इसे लेने वाला माना जाता है। उसके बाद, ऑर्डर के अस्तित्व के समय के भीतर कीमत से कम या बराबर कीमत वाले सभी लेनदेन इस ऑर्डर के साथ मेल खाएंगे, और मिलान मूल्य होगा लेनदेन का लेनदेन मूल्य. मेकर्स और टेकर्स के बीच का अंतर इसलिए है क्योंकि एक्सचेंज मूल रूप से ऑर्डर देने को प्रोत्साहित करते हैं और तरजीही लेनदेन शुल्क प्रदान करते हैं। उच्च आवृत्ति रणनीतियों के लिए, इस अंतर को ध्यान में रखा जाना चाहिए।
इस प्रकार के मिलान में समस्या देखना आसान है। यदि ऑर्डर लेने वाला है, तो वास्तविक स्थिति यह है कि इसे मिलान करने के लिए नए ऑर्डर की प्रतीक्षा करने के बजाय, इसे तुरंत निष्पादित किया जा सकता है। सबसे पहले, हमने लंबित ऑर्डर की मात्रा को ध्यान में नहीं रखा। अगर डेटा था भी, तो सीधे लेनदेन का आकलन करने से गहराई बदल जाएगी और बाजार पर असर पड़ेगा। नए ऑर्डर के आधार पर मिलान करना इतिहास में मौजूद वास्तविक ऑर्डर को अपने ऑर्डर से बदलने के बराबर है। किसी भी स्थिति में, यह बाज़ार की अपनी ट्रेडिंग वॉल्यूम की सीमा से अधिक नहीं होगा, और अंतिम लाभ बाज़ार द्वारा उत्पन्न अधिकतम लाभ से अधिक नहीं होगा। कुछ मिलान तंत्र ऑर्डरों के लेनदेन की मात्रा को भी प्रभावित करते हैं, जो बदले में रणनीति के रिटर्न को प्रभावित करता है, और मात्रात्मक रूप से रणनीति क्षमता को दर्शाता है। इसमें कोई पारंपरिक बैकटेस्ट नहीं होगा, जहां धनराशि दोगुनी होने पर लाभ दोगुना हो जाएगा।
कुछ छोटी-छोटी जानकारियाँ हैं। यदि ऑर्डर खरीदने की कीमत एक खरीदने की कीमत के बराबर है, तो वास्तव में अभी भी एक निश्चित संभावना है कि यह एक खरीदने की कीमत पर मेल खाएगा। लंबित ऑर्डर की प्राथमिकता और लेन-देन की संभावना आदि। यह अपेक्षाकृत जटिल है और इस पर यहां विचार नहीं किया जाएगा।
एक्सचेंज ऑब्जेक्ट्स शुरुआत में परिचय को संदर्भित कर सकते हैं, जो मूल रूप से अपरिवर्तित हैं। केवल निर्माता और लेने वाले शुल्क के बीच का अंतर जोड़ा जाता है, और बैकटेस्टिंग की गति को अनुकूलित किया जाता है। निम्नलिखित में मुख्य रूप से मिलान कोड का परिचय दिया जाएगा।
symbol = 'XTZ'
loop_time = 0
intervel = 1000 #策略的休眠时间为1000ms
init_price = data[0][2] #初始价格
e = Exchange([symbol],initial_balance=1000000,maker_fee=maker_fee,taker_fee=taker_fee,log='') #初始化交易所
depth = {'ask':data[0][2], 'bid':data[0][2]} #深度
order = {'buy':{'price':0,'amount':0,'maker':False,'priority':False,'id':0},
'sell':{'price':0,'amount':0,'maker':False,'priority':False,'id':0}} #订单
for tick in data:
price = int(tick[2]/tick_sizes[symbol])*tick_sizes[symbol] #成交价格
trade_amount = tick[3] #成交数量
time_stamp = tick[1] #成交时间戳
if tick[4] == 'False\n':
depth['ask'] = price
else:
depth['bid'] = price
if depth['bid'] < order['buy']['price']:
order['buy']['priority'] = True
if depth['ask'] > order['sell']['price']:
order['sell']['priority'] = True
if price > order['buy']['price']:
order['buy']['maker'] = True
if price < order['sell']['price']:
order['sell']['maker'] = True
#订单网络延时也可以作为撮合条件之一,这里没考虑
cond1 = order['buy']['priority'] and order['buy']['price'] >= price and order['buy']['amount'] > 0
cond2 = not order['buy']['priority'] and order['buy']['price'] > price and order['buy']['amount'] > 0
cond3 = order['sell']['priority'] and order['sell']['price'] <= price and order['sell']['amount'] > 0
cond4 = not order['sell']['priority'] and order['sell']['price'] < price and order['sell']['amount'] > 0
if cond1 or cond2:
buy_price = order['buy']['price'] if order['buy']['maker'] else price
e.Buy(symbol, buy_price, min(order['buy']['amount'],trade_amount), order['buy']['id'], order['buy']['maker'])
order['buy']['amount'] -= min(order['buy']['amount'],trade_amount)
e.Update(time_stamp,[symbol],{symbol:price})
if cond3 or cond4:
sell_price = order['sell']['price'] if order['sell']['maker'] else price
e.Sell(symbol, sell_price, min(order['sell']['amount'],trade_amount), order['sell']['id'], order['sell']['maker'])
order['sell']['amount'] -= min(order['sell']['amount'],trade_amount)
e.Update(time_stamp,[symbol],{symbol:price})
if time_stamp - loop_time > intervel:
order = get_order(e,depth,order) #交易逻辑,这里未给出
loop_time += int((time_stamp - loop_time)/intervel)*intervel
ध्यान देने योग्य कुछ विवरण:
अंत में, हम वास्तविक बैकटेस्टिंग चरण पर पहुँच गए हैं। हम सबसे क्लासिक ग्रिड रणनीतियों में से एक का बैकटेस्ट करेंगे, यह देखने के लिए कि क्या यह अपेक्षित परिणाम प्राप्त करता है। रणनीति का सिद्धांत यह है कि हर बार जब कीमत 1% बढ़ती है, तो हम एक निश्चित मूल्य का शॉर्ट ऑर्डर रखते हैं (या इसके विपरीत, एक लंबा ऑर्डर रखते हैं), खरीद और बिक्री के ऑर्डर की गणना करते हैं, और उन्हें पहले ही रख देते हैं। कोड जारी नहीं किया जाएगा. सभी कोड को इसमें समाहित करेंGrid('XTZ',100,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)फ़ंक्शन में पैरामीटर हैं: ट्रेडिंग जोड़ी, होल्डिंग मूल्य का 1% मूल्य विचलन, 0.3% का ऑर्डर घनत्व, एमएस में स्लीप अंतराल, ऑर्डर मेकर शुल्क और ऑर्डर लेने वाला शुल्क।
पिछले पांच दिनों में, एक्सटीजेड बाजार अस्थिर दौर में रहा है, जो ग्रिड के लिए बहुत उपयुक्त है। 
हम सबसे पहले रिटर्न पर अलग-अलग पोजीशन साइज़ के प्रभाव का बैकटेस्ट करते हैं। पारंपरिक बैकटेस्टिंग तंत्र द्वारा मापा गया रिटर्न निश्चित रूप से पोजीशन में वृद्धि के साथ आनुपातिक रूप से बढ़ेगा।
e1 = Grid('XTZ',100,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e1.account['USDT'])
e2 = Grid('XTZ',1000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e2.account['USDT'])
e3 = Grid('XTZ',10000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e3.account['USDT'])
e4 = Grid('XTZ',100000,0.3,1000,maker_fee=-0.00002,taker_fee=0.0003)
print(e4.account['USDT'])
कुल चार समूहों का बैकटेस्ट किया गया, जिनके होल्डिंग मान क्रमशः 100, 1000, 10000 और 100000 थे, और कुल बैकटेस्टिंग समय 1.3s था। परिणाम इस प्रकार हैं:
{'realised_profit': 28.470993031132966, 'margin': 0.7982662957624465, 'unrealised_profit': 0.0104554474048441, 'total': 10000028.481448, 'leverage': 0.0, 'fee': -0.3430967859046398, 'maker_fee': -0.36980249726699727, 'taker_fee': 0.026705711362357405}
{'realised_profit': 275.63148945320177, 'margin': 14.346335829979132, 'unrealised_profit': 4.4382117331794045e-14, 'total': 10000275.631489, 'leverage': 0.0, 'fee': -3.3102045933457784, 'maker_fee': -3.5800688964477048, 'taker_fee': 0.2698643031019274}
{'realised_profit': 2693.8701498889504, 'margin': 67.70120400534114, 'unrealised_profit': 0.5735269329348516, 'total': 10002694.443677, 'leverage': 0.0001, 'fee': -33.984021415250744, 'maker_fee': -34.879233866850974, 'taker_fee': 0.8952124516001403}
{'realised_profit': 22610.231198585603, 'margin': 983.3853688758861, 'unrealised_profit': -20.529965947304365, 'total': 10022589.701233, 'leverage': 0.002, 'fee': -200.87094000385412, 'maker_fee': -261.5849078470078, 'taker_fee': 60.71396784315319}
यह देखा जा सकता है कि अंतिम प्राप्त लाभ क्रमशः स्थिति मूल्य का 28.4%, 27.5%, 26.9% और 22.6% था। यह वास्तविक स्थिति के अनुरूप भी है। स्थिति का मूल्य जितना अधिक होगा, लंबित ऑर्डर का मूल्य उतना ही अधिक होगा, आंशिक लेनदेन होने की संभावना उतनी ही अधिक होगी, और अंतिम प्राप्त लाभ तुलनात्मक रूप से छोटा होगा। लंबित आदेश मात्रा. निम्नलिखित आंकड़ा क्रमशः 100 और 10,000 के मूल्यों के साथ होल्डिंग्स के सापेक्ष रिटर्न की तुलना करता है:

हम बैकटेस्टिंग रिटर्न पर विभिन्न मापदंडों के प्रभाव का भी बैकटेस्ट कर सकते हैं, जैसे ऑर्डर घनत्व, निष्क्रियता समय, हैंडलिंग शुल्क, आदि। नींद के समय को उदाहरण के रूप में लेते हुए, इसे 100ms में बदलें और लाभ देखने के लिए इसकी तुलना 1000ms के नींद के समय से करें। बैकटेस्ट के परिणाम इस प्रकार हैं:
{'realised_profit': 29.079440803790423, 'margin': 0.7982662957624695, 'unrealised_profit': 0.0104554474048441, 'total': 10000029.089896, 'leverage': 0.0, 'fee': -0.3703702128662524, 'maker_fee': -0.37938946377435134, 'taker_fee': 0.009019250908098965}
लाभ में थोड़ी वृद्धि हुई है। ऐसा इसलिए है क्योंकि रणनीति केवल ऑर्डर का एक सेट रखती है। कुछ ऑर्डर उतार-चढ़ाव वाली कीमतों से लाभ नहीं उठा सकते क्योंकि उन्हें समय पर बदला नहीं जा सकता। निष्क्रियता समय में कमी ने इस समस्या को सुधार दिया है। यह ग्रिड रणनीति में ऑर्डर के कई समूहों को रखने के महत्व को भी दर्शाता है।
यह पेपर अभिनव रूप से ऑर्डर फ्लो पर आधारित एक नई बैकटेस्टिंग प्रणाली का प्रस्ताव करता है, जो लंबित ऑर्डर, ऑर्डर लेना, आंशिक लेनदेन, देरी आदि जैसी मिलान स्थितियों का आंशिक रूप से अनुकरण कर सकता है, और रिटर्न पर रणनीति निधि के प्रभाव को आंशिक रूप से प्रतिबिंबित कर सकता है। इसका महत्वपूर्ण महत्व है हेजिंग रणनीतियों के लिए संदर्भ मूल्य, और उच्च परिशुद्धता बैकटेस्टिंग रणनीति मापदंडों को अनुकूलित करने की दिशा को इंगित करता है। इसे दीर्घकालिक वास्तविक व्यापार के माध्यम से भी सत्यापित किया गया है। यह बैकटेस्टिंग के लिए आवश्यक डेटा की मात्रा को भी बेहतर ढंग से नियंत्रित करता है, और बैकटेस्टिंग की गति भी बहुत तेज़ है।