जब मैंने लिखाबिनेंस फ्यूचर्स मल्टी-करेंसी हेजिंग रणनीति पर शोध, मैंने एक बैकटेस्ट इंजन भी जारी किया। और पहली रिपोर्ट एक घंटे के-लाइन बैकटेस्ट पर आधारित थी, जिसने रणनीति की प्रभावशीलता की पुष्टि की। लेकिन वास्तविक ओपन सोर्स रणनीति का नींद का समय
सबसे पहले, ऐतिहासिक के-लाइन क्या है? के-लाइन डेटा में उच्च, खुला, निम्न, बंद, पहले दो
पहला समय का मुद्दा है। के-लाइन डेटा के उच्चतम मूल्य और निम्नतम मूल्य का समय नहीं दिया गया है और इस पर विचार करने की आवश्यकता नहीं है, लेकिन सबसे महत्वपूर्ण उद्घाटन और समापन मूल्य उद्घाटन और समापन समय नहीं हैं। यहां तक कि कम लोकप्रिय व्यापारिक किस्मों में अक्सर दस सेकंड से अधिक समय तक कोई व्यापार नहीं होता है, और जब हम बहु-विविधता रणनीति का बैकटेस्ट करते हैं, तो हम अक्सर मानते हैं कि उनकी शुरुआती कीमत और समापन मूल्य समान हैं, जो कि समापन मूल्य के बैकटेस्ट पर भी आधारित है।
दो किस्मों के मध्यस्थता के लिए मिनट स्तर के रेखा का उपयोग करने की कल्पना करें। उनके बीच का अंतर आमतौर पर 10 युआन ((या डॉलर) है। अब, 10:01 पर, अनुबंध ए का समापन मूल्य 100, अनुबंध बी का 112 है, और अंतर 12 युआन है। इसलिए रणनीति हेज करना शुरू करती है। एक निश्चित क्षण में, मूल्य अंतर वापस आ गया, और रणनीति ने 2 युआन का रिटर्न लाभ कमाया।
लेकिन वास्तविक स्थिति यह हो सकती है कि 10:00:45 पर अनुबंध ए ने 100 युआन का लेनदेन किया, जिसके बाद कोई लेनदेन नहीं हुआ, अनुबंध बी के पास 10:00:58 पर 112 युआन का लेनदेन था, 10:01:00 दोनों कीमतें मौजूद नहीं हैं। इस समय बाजार मूल्य क्या है, और हेज ऑपरेशन कितना प्राप्त कर सकता है? मुझे नहीं पता। एक संभावित स्थिति हैः 10:00:58 पर, अनुबंध ए का 101.9
तक102.1
, और 2 युआन का कोई अंतर नहीं है। यह हमारी रणनीति अनुकूलन को बहुत भ्रामक बना देगा।
दूसरा मैचमेकिंग समस्या है। असली मैचमेकिंग मूल्य प्राथमिकता और समय प्राथमिकता है। यदि खरीदार
अंतिम है बाजार पर रणनीति का प्रभाव। यदि यह छोटी राशि के फंडों का बैकटेस्ट है, तो प्रभाव बड़ा नहीं है। लेकिन यदि लेनदेन की मात्रा बड़ी है, तो इसका बाजार पर प्रभाव पड़ेगा। न केवल जब आप एक बड़ी मात्रा में ऑर्डर देते हैं, तो मूल्य फिसलन बड़ा होगा, यदि आप खरीदते हैं लंबे आदेश निष्पादित, इस तरह की कार्रवाई वास्तव में अन्य व्यापारियों के आदेशों को जब्त करते हैं जो मूल रूप से खरीदना चाहते थे,
FMZ वास्तविक स्तर के बैकटेस्ट प्रदान करता है, जो वास्तविक ऐतिहासिक डेटा प्राप्त कर सकता है।20 layer depth price
, वास्तविक समय में दूसरे स्तरTicks
, Each Individual Transaction
इन विशेषताओं के आधार पर, एफएमजेड ने वास्तविक समय में लेनदेन प्लेबैक फ़ंक्शन बनाया।
इस तरह के बैकटेस्ट डेटा की मात्रा बहुत बड़ी है, और बैकटेस्ट गति भी बहुत धीमी है, आम तौर पर केवल दो दिनों के लिए बैकटेस्ट कर सकती है। अपेक्षाकृत उच्च आवृत्ति या समय-महत्वपूर्ण रणनीतियों के लिए, वास्तविक बाजार स्तर बैकटेस्ट आवश्यक है। एफएमजेड द्वारा एकत्र किए गए व्यापारिक जोड़े और व्यापार समय बहुत लंबे नहीं हैं, लेकिन अभी भी 70 बिलियन से अधिक ऐतिहासिक डेटा हैं।
वर्तमान मैचमेकिंग तंत्र यह है कि यदि खरीद आदेश
K रेखा में बहुत कम जानकारी है, और मूल्य गहराई भी एक नकली गहराई हो सकती है, लेकिन एक प्रकार का डेटा है जो बाजार की वास्तविक लेनदेन इच्छा है, जो सबसे वास्तविक लेनदेन इतिहास को दर्शाता है, अर्थात्,Each Individual Transaction
इस लेख में ऑर्डर प्रवाह के आधार पर एक उच्च आवृत्ति बैकटेस्ट प्रणाली का प्रस्ताव दिया जाएगा, जो वास्तविक बाजार स्तर के बैकटेस्ट डेटा की मात्रा को काफी कम करेगा, और कुछ हद तक बाजार पर ट्रेडिंग वॉल्यूम के प्रभाव का अनुकरण करेगा।
मैंने पिछले 5 दिनों के लेनदेन को डाउनलोड किया Binance XTZ स्थायी अनुबंध (डाउनलोड पताःhttps://www.fmz.com/upload/asset/1ff487b007e1a848ead.csv), एक लोकप्रिय किस्म के रूप में, इसमें कुल 213000 लेनदेन डेटा हैं, पहले आइए डेटा की संरचना को देखेंः
[['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'],
डेटा एक दो आयामी सूची है, जिसे कालानुक्रमिक क्रम में क्रमबद्ध किया गया है। विशिष्ट अर्थ इस प्रकार हैंः किस्म का नाम, लेनदेन की कीमत, लेनदेन का टाइमस्टैम्प, लेनदेन की मात्रा, क्या यह एक बिक्री आदेश सक्रिय लेनदेन है। खरीद और बिक्री पक्ष हैं, और प्रत्येक लेनदेन में खरीदार और विक्रेता शामिल हैं। यदि खरीदार एक बाजार हैMaker
और विक्रेता एक सक्रिय हैTaker
, अंतिम आंकड़ा हैTrue
.
सबसे पहले, लेनदेन की दिशा के अनुसार, आप बाजार में
आदेश प्रवाह के अनुसार, यह इस तरह से मेल खा सकता हैः उदाहरण के लिए एक खरीद आदेश लें, कीमत हैprice
, आदेश मात्रा हैamount
, तो खरीदें और इस समय 1 बेच रहे हैंbid
औरask
क्रमशः यदिprice
से कम हैask
और अधिक से अधिकbid
, तो यह माना जाता हैmaker
सबसे पहले, और प्राथमिकता एक सौदा करने के लिए मिलान किया जा सकता है, तो सभी सौदों के साथ एक लेनदेन मूल्य से कम या बराबर हैprice
आदेश के अस्तित्व समय के दौरान इस आदेश के साथ मेल खाएगा (यदिprice
से कम या बराबर हैbid
, लेनदेन को कोई प्राथमिकता नहीं दी जाती है।price
इस क्रम के साथ मेल खाते हैं)
मिलान मूल्य हैprice
, और मात्रा लेन-देन की मात्रा हैEach Individual Transaction
, जब तक आदेश पूरी तरह से पूरा नहीं हो जाता या आदेश रद्द नहीं हो जाता।ask
, यह एकtaker
उसके बाद, आदेश के अस्तित्व के दौरान, सभी सौदे एक लेनदेन मूल्य से कम या बराबर के साथprice
इस आदेश के साथ मेल खाते हैं, और मेल कीमत लेनदेन मूल्य हैEach Individual Transaction
. के बीच अंतरmaker
औरtaker
उच्च आवृत्ति रणनीतियों के लिए, इस अंतर को ध्यान में रखा जाना चाहिए।
इस तरह के मिलान के साथ एक समस्या को देखना आसान है।taker
, वास्तविक स्थिति यह है कि यह तुरंत निष्पादित किया जा सकता है, इसके साथ मेल खाने के लिए एक नए आदेश की प्रतीक्षा करने के बजाय। सबसे पहले, हम लंबित आदेशों की मात्रा पर विचार नहीं करते हैं, भले ही कुछ डेटा हैं, सीधे निर्णय लेनदेन भी मूल्य गहराई बदल गया है, बाजार को प्रभावित करता है।
नए आदेशों के मिलान के आधार पर, यह आपके आदेशों के साथ इतिहास में मौजूदा आदेशों को बदलने के बराबर है। किसी भी मामले में, यह बाजार की अपनी ट्रेडिंग मात्रा की सीमा से अधिक नहीं होगा, और अंतिम लाभ बाजार द्वारा उत्पन्न अधिकतम लाभ से अधिक नहीं हो सकता है। मिलान तंत्र का एक हिस्सा आदेशों की मात्रा को भी प्रभावित करता है, जो बदले में रणनीति की आय को प्रभावित करता है, मात्रात्मक रूप से रणनीति की क्षमता को दर्शाता है। कोई पारंपरिक बैकटेस्ट नहीं होगा, जब धन की मात्रा दोगुनी हो जाती है और लाभ दोगुना हो जाता है।
अभी भी कुछ छोटे विवरण हैं। यदि आदेश की खरीद मूल्य
एक्सचेंज ऑब्जेक्ट्स शुरुआत में परिचय को संदर्भित कर सकते हैं, मूल रूप से अपरिवर्तित, केवल अंतर जोड़करmaker
औरtaker
नीचे मुख्य रूप से मिलान कोड पेश किया जाएगा।
symbol = 'XTZ'
loop_time = 0
intervel = 1000 # The sleep time of the strategy is 1000ms
init_price = data[0][2] # Initial price
e = Exchange([symbol],initial_balance=1000000,maker_fee=maker_fee,taker_fee=taker_fee,log='') # Initialize the exchange
depth = {'ask':data[0][2], 'bid':data[0][2]} # depth
order = {'buy':{'price':0,'amount':0,'maker':False,'priority':False,'id':0},
'sell':{'price':0,'amount':0,'maker':False,'priority':False,'id':0}} # order
for tick in data:
price = int(tick[2]/tick_sizes[symbol])*tick_sizes[symbol] # executed price
trade_amount = tick[3] # executed volume
time_stamp = tick[1] # executed timestamp
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
# Order network delay can also be used as one of the matching conditions, not considered here
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) # Trading logic, not given here
loop_time += int((time_stamp - loop_time)/intervel)*intervel
ध्यान देने योग्य कुछ विवरण:
जब कोई नया लेन-देन होता है, तो हमें पहले ऑर्डर को मेल खाना चाहिए, और फिर नवीनतम मूल्य के अनुसार ऑर्डर देना चाहिए।
प्रत्येक ऑर्डर में दो विशेषताएं होती हैंः निर्माताmaker
, और जब खरीद मूल्य Priority matching
, priority
यह निर्धारित करता है कि मूल्य खरीद मूल्य के बराबर है या नहीं, और निर्माता लेनदेन शुल्क निर्धारित करता है।
..maker
औरpriority
यदि एक बड़ी खरीद की गई है और बाजार क्षमता से अधिक है। जब एक कीमत खरीद मूल्य से अधिक है, तो शेष मात्राmaker
.
रणनीतिinterval
आवश्यक है, यह बाजार की देरी का प्रतिनिधित्व कर सकता है।
अंत में, यह वास्तविक बैकटेस्ट चरण है। आइए हम यहां सबसे क्लासिक ग्रिड रणनीतियों में से एक का बैकटेस्ट करें यह देखने के लिए कि क्या हम अपेक्षित परिणाम प्राप्त कर सकते हैं। रणनीति का सिद्धांत यह है कि हर बार जब कीमत 1% बढ़ जाती है, तो हम एक निश्चित मूल्य का एक छोटा ऑर्डर रखते हैं (इसके विपरीत, हम एक लंबा ऑर्डर रखते हैं), अग्रिम में खरीद ऑर्डर और बिक्री ऑर्डर की गणना करते हैं। मैं आपको स्रोत कोड नहीं दिखाऊंगा। वे सभी में शामिल हैंGrid('XTZ', 100, 0.3, 1000, maker_fee=-0.00002, taker_fee=0.0003)
फंक्शन, पैरामीटर हैंः व्यापार जोड़ी, मूल्य 1% के होल्डिंग मूल्य से विचलित, लंबित आदेश घनत्व 0.3% है, नींद अंतरालms
, लंबित आदेश शुल्क और निष्पादित आदेश शुल्क।
पिछले 5 दिनों से एक्सटीजेड
पहले हम लाभ पर विभिन्न होल्डिंग पदों के प्रभाव का बैकटेस्ट करते हैं। पारंपरिक बैकटेस्ट तंत्र द्वारा बैकटेस्ट किया गया रिटर्न निश्चित रूप से होल्डिंग पदों में वृद्धि के अनुपात में बढ़ेगा।
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, 100,000 था, और कुल बैकटेस्ट समय 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 और 10000 की स्थिति मूल्य के सापेक्ष रिटर्न की तुलना है:
हम बैकटेस्ट राजस्व पर विभिन्न मापदंडों के प्रभाव को भी बैकटेस्ट कर सकते हैं, जैसे लंबित ऑर्डर घनत्व, नींद का समय, लेनदेन शुल्क, आदि। उदाहरण के रूप में नींद का समय लें, इसे 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}
आय में थोड़ी वृद्धि हुई है, क्योंकि रणनीति केवल आदेशों का एक सेट भेजती है, कुछ आदेश उतार-चढ़ाव की कीमतों को निष्पादित करने में सक्षम नहीं होंगे क्योंकि उनके पास बदलने का समय नहीं है, और नींद के समय में कमी इस समस्या को बेहतर बनाती है। यह कई आदेशों के सेट रखने के लिए ग्रिड रणनीति के महत्व को भी दर्शाता है।
इस लेख में अभिनव रूप से ऑर्डर फ्लो पर आधारित एक नई बैकटेस्ट प्रणाली का प्रस्ताव है, जो आंशिक रूप से लंबित ऑर्डर, निष्पादित ऑर्डर, आंशिक निष्पादित ऑर्डर, देरी आदि की मिलान स्थिति का अनुकरण कर सकती है, और आंशिक रूप से राजस्व पर रणनीति धन की राशि के प्रभाव को दर्शाती है। उच्च आवृत्ति और हेजिंग रणनीतियों के लिए, इसका महत्वपूर्ण संदर्भ मूल्य है। उच्च परिशुद्धता बैकटेस्ट रणनीति पैरामीटर अनुकूलन के लिए दिशा दर्शाता है। यह लंबे समय से सत्यापित भी है। इसके अलावा, बैकटेस्ट के लिए आवश्यक डेटा की मात्रा अच्छी तरह से नियंत्रित है, और बैकटेस्ट गति भी बहुत तेज है।