যখন আমি লিখেছিলামবাইনারেন্স ফিউচারস মাল্টি মুদ্রা হেজিং কৌশল সম্পর্কিত গবেষণা, আমি একটি ব্যাকটেস্ট ইঞ্জিনও প্রকাশ করেছি। এবং প্রথম প্রতিবেদনটি এক ঘন্টার কে-লাইন ব্যাকটেস্টের উপর ভিত্তি করে তৈরি করা হয়েছিল, যা কৌশলটির কার্যকারিতা যাচাই করেছিল। তবে প্রকৃত ওপেন সোর্স কৌশলটির ঘুমের সময়
প্রথমত, ঐতিহাসিক কে-লাইন কী? একটি কে-লাইন ডেটাতে উচ্চ, খোলা, নিম্ন, বন্ধ, প্রথম দুটি
প্রথমটি হ'ল সময়ের বিষয়। কে-লাইন ডেটাগুলির সর্বোচ্চ মূল্য এবং সর্বনিম্ন মূল্যের সময় দেওয়া হয় না এবং বিবেচনা করার দরকার নেই, তবে সর্বাধিক গুরুত্বপূর্ণ খোলার এবং বন্ধের দামগুলি খোলার এবং বন্ধের সময় নয়। এমনকি কম জনপ্রিয় ট্রেডিং জাতগুলির প্রায়শই দশ সেকেন্ডের বেশি সময় ধরে কোনও বাণিজ্য হয় না এবং যখন আমরা মাল্টি-ভেরিয়েট কৌশলটি ব্যাকটেস্ট করি, আমরা প্রায়শই ধরে নিই যে তাদের খোলার দাম এবং বন্ধের দাম একই, যা বন্ধের দামের ব্যাকটেস্টেও ভিত্তি করে।
কল্পনা করুন যে আপনি দুই ধরণের মধ্যস্থতা ব্যাকটেস্ট করার জন্য মিনিটের স্তরের কে লাইন ব্যবহার করছেন। তাদের মধ্যে পার্থক্য সাধারণত 10 ইউয়ান ((বা ডলার) । এখন, 10:01-এ, চুক্তি এ এর বন্ধের মূল্য 100, চুক্তি বি এর 112 এবং পার্থক্য 12 ইউয়ান। সুতরাং কৌশলটি হেজিং শুরু করে। নির্দিষ্ট মুহুর্তে, মূল্য পার্থক্য ফিরে আসে, এবং কৌশলটি 2 ইউয়ান রিটার্ন মুনাফা করেছে।
কিন্তু প্রকৃত পরিস্থিতি হতে পারে যে 10:00:45 এ, চুক্তি A 100 ইউয়ান একটি লেনদেন উত্পাদিত, যার পরে কোন লেনদেন ছিল না, চুক্তি বি একটি লেনদেন ছিল 112 ইউয়ান 10:00:58 এ, 10:01:00 উভয় দাম বিদ্যমান নেই। এই সময়ে বাজার মূল্য কি, এবং হেজ অপারেশন কত পেতে পারেন? আমি জানি না। একটি সম্ভাব্য পরিস্থিতিঃ 10:00:58 এ, 101.9
থেকে102.1
এটা আমাদের কৌশল অপ্টিমাইজেশানকে বিপথে নিয়ে যাবে।
দ্বিতীয়টি হ'ল ম্যাচমেকিং সমস্যা। আসল ম্যাচমেকিং হ'ল মূল্য অগ্রাধিকার এবং সময় অগ্রাধিকার। যদি ক্রেতা
শেষটি হ'ল বাজারে কৌশলটির প্রভাব। যদি এটি ছোট পরিমাণের তহবিলের ব্যাকটেস্ট হয় তবে প্রভাবটি বড় নয়। তবে যদি লেনদেনের পরিমাণ বড় হয় তবে এটি বাজারে প্রভাব ফেলবে। আপনি যখন বড় পরিমাণের অর্ডার দেন তখন কেবল দামের স্লিপিং বড় হবে না, আপনি যদি দীর্ঘ অর্ডার ক্রয় করেন তবে কার্যকর হয়, এই ধরণের ক্রিয়া আসলে অন্য ব্যবসায়ীদের অর্ডারগুলি দখল করে নেয় যারা মূলত কিনতে চেয়েছিল,
FMZ বাস্তব স্তরের ব্যাকটেস্ট প্রদান করে, যা বাস্তব ঐতিহাসিক তথ্য পেতে পারে।20 layer depth price
, রিয়েল-টাইম দ্বিতীয় স্তরেরTicks
, Each Individual Transaction
এই বৈশিষ্ট্যগুলির উপর ভিত্তি করে, এফএমজেড একটি রিয়েল-টাইম লেনদেন প্লেব্যাক ফাংশন তৈরি করেছে।
এই ধরণের ব্যাকটেস্ট ডেটা খুব বড়, এবং ব্যাকটেস্টের গতিও খুব ধীর, সাধারণত মাত্র দুই দিনের জন্য ব্যাকটেস্ট করতে পারে। তুলনামূলকভাবে উচ্চ ফ্রিকোয়েন্সি বা সময়-সমালোচনামূলক কৌশলগুলির জন্য, বাস্তব বাজার স্তরের ব্যাকটেস্ট প্রয়োজনীয়। এফএমজেড দ্বারা সংগৃহীত ট্রেডিং জোড়া এবং ট্রেডিং সময় খুব দীর্ঘ নয়, তবে এখনও 70 বিলিয়নেরও বেশি historicalতিহাসিক ডেটা রয়েছে।
বর্তমান ম্যাচমেকিং প্রক্রিয়াটি হ'ল যদি ক্রয় আদেশটি
K রেখায় খুব কম তথ্য আছে, এবং মূল্য গভীরতাও একটি ভুয়া গভীরতা হতে পারে, কিন্তু এমন একটি তথ্য আছে যা বাজারের বাস্তব লেনদেনের ইচ্ছাকে প্রতিফলিত করে, যা সবচেয়ে বাস্তব লেনদেনের ইতিহাসকে প্রতিফলিত করে, অর্থাৎEach Individual Transaction
এই প্রবন্ধে অর্ডার প্রবাহের উপর ভিত্তি করে একটি উচ্চ-ফ্রিকোয়েন্সি ব্যাকটেস্ট সিস্টেম প্রস্তাব করা হবে, যা বাস্তব বাজারের স্তরের ব্যাকটেস্ট ডেটা ভলিউমকে ব্যাপকভাবে হ্রাস করবে এবং একটি নির্দিষ্ট পরিমাণে বাজারে ট্রেডিং ভলিউমের প্রভাবকে অনুকরণ করবে।
আমি গত ৫ দিনের লেনদেন ডাউনলোড করেছি (ডাউনলোড ঠিকানাঃ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
, বাস্তব পরিস্থিতি হল যে এটি অবিলম্বে কার্যকর করা যেতে পারে, পরিবর্তে একটি নতুন অর্ডার এর সাথে মেলে অপেক্ষা করার জন্য. প্রথম সব, আমরা অপেক্ষমান আদেশ ভলিউম বিবেচনা করেনি, এমনকি যদি কিছু তথ্য আছে, সরাসরি বিচার লেনদেন এছাড়াও মূল্য গভীরতা পরিবর্তন হয়েছে, বাজার প্রভাবিত.
নতুন অর্ডারগুলির মিলের উপর ভিত্তি করে, এটি আপনার অর্ডারগুলির সাথে ইতিহাসের বিদ্যমান অর্ডারগুলি প্রতিস্থাপনের সমতুল্য। যে কোনও ক্ষেত্রে, এটি বাজারের নিজস্ব ট্রেডিং ভলিউমের সীমা অতিক্রম করবে না এবং চূড়ান্ত লাভ বাজারের দ্বারা উত্পন্ন সর্বাধিক লাভের সীমা অতিক্রম করতে পারে না। ম্যাচিং প্রক্রিয়াটির অংশটি অর্ডারগুলির পরিমাণকেও প্রভাবিত করে, যা পরিবর্তে কৌশলটির আয়ের উপর প্রভাব ফেলে, পরিমাণগতভাবে কৌশলটির ক্ষমতা প্রতিফলিত করে। কোনও traditionalতিহ্যবাহী ব্যাকটেস্ট থাকবে না, যখন তহবিলের পরিমাণ দ্বিগুণ হয় এবং লাভ দ্বিগুণ হয়।
এখনও কিছু ছোটখাট বিবরণ আছে। যদি অর্ডারের ক্রয় মূল্য
এক্সচেঞ্জ অবজেক্ট শুরুতে ভূমিকা উল্লেখ করতে পারেন, মূলত অপরিবর্তিত, শুধুমাত্র পার্থক্য যোগ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
কিছু বিবরণ উল্লেখ করা দরকার:
যখন নতুন লেনদেন হয়, আমাদের প্রথমে অর্ডারটি মেলে দিতে হবে, এবং তারপরে সর্বশেষ মূল্য অনুযায়ী অর্ডারটি স্থাপন করতে হবে।
প্রতিটি অর্ডারের দুটি বৈশিষ্ট্য রয়েছে: makermaker
, এবং যখন ক্রয় মূল্য 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
, অপেক্ষমান অর্ডার ফি এবং কার্যকর অর্ডার ফি।
গত ৫ দিন ধরে এক্সটিজেডের বাজার মূল্য শক অবস্থায় রয়েছে, যা গ্রিডের জন্য খুবই উপযুক্ত।
আমরা প্রথমে লাভের উপর বিভিন্ন হোল্ডিং পজিশনের প্রভাব ব্যাকটেস্ট করি। ঐতিহ্যগত ব্যাকটেস্ট প্রক্রিয়া দ্বারা ব্যাকটেস্ট করা রিটার্ন অবশ্যই হোল্ডিং পজিশনের বৃদ্ধির অনুপাতে বৃদ্ধি পাবে।
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.3 সেকেন্ড। ফলাফলগুলি নিম্নরূপঃ
{'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}
এটি দেখা যায় যে চূড়ান্ত উপলব্ধ মুনাফা যথাক্রমে হোল্ডিং পজিশনের মানের ২৮.৪%, ২৭.৫%, ২৬.৯% এবং ২২.৬%। এটি বাস্তব পরিস্থিতির সাথেও সামঞ্জস্যপূর্ণ। হোল্ডিং পজিশনের মান যত বেশি হবে, অপেক্ষমান অর্ডারের মান তত বেশি হবে, আংশিক লেনদেন হওয়ার সম্ভাবনা তত বেশি হবে এবং অপেক্ষমান অর্ডারের পরিমাণের তুলনায় চূড়ান্ত উপলব্ধ লাভ তত কম হবে। নিম্নলিখিত চার্টটি যথাক্রমে 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}
উপার্জন কিছুটা বৃদ্ধি পেয়েছে, কারণ কৌশলটি কেবলমাত্র একটি সেট অর্ডার প্রেরণ করে, কিছু অর্ডার পরিবর্তনের জন্য সময় না থাকায় দামের ওঠানামা সম্পাদন করতে সক্ষম হবে না এবং ঘুমের সময় হ্রাস এই সমস্যাটি উন্নত করে। এটি একাধিক সেট অর্ডার স্থাপনের জন্য গ্রিড কৌশলটির গুরুত্বকেও চিত্রিত করে।
এই নিবন্ধটি উদ্ভাবনীভাবে অর্ডার প্রবাহের উপর ভিত্তি করে একটি নতুন ব্যাকটেস্ট সিস্টেম প্রস্তাব করে, যা আংশিকভাবে মুলতুবি অর্ডার, কার্যকর অর্ডার, আংশিক কার্যকর অর্ডার, বিলম্ব ইত্যাদির ম্যাচিং পরিস্থিতি সিমুলেট করতে পারে এবং আংশিকভাবে আয়ের উপর কৌশল তহবিলের পরিমাণের প্রভাবকে প্রতিফলিত করে। উচ্চ-ফ্রিকোয়েন্সি এবং হেজিং কৌশলগুলির জন্য, এটির গুরুত্বপূর্ণ রেফারেন্স মান রয়েছে। উচ্চ-নির্ভুলতা ব্যাকটেস্ট কৌশল পরামিতি অপ্টিমাইজেশনের দিক নির্দেশ করে। এটি দীর্ঘদিন ধরে যাচাই করা হয়েছে। তদতিরিক্ত, ব্যাকটেস্টের জন্য প্রয়োজনীয় ডেটা পরিমাণ ভালভাবে নিয়ন্ত্রিত এবং ব্যাকটেস্টের গতিও খুব দ্রুত।