ব্যাকটেস্টে এমন দামে ফিল দেখাতে পারে, যা বাজারে কখনো প্রদর্শিত হয়নি। সাধারণত সিমুলেটর অসম্পূর্ণ ডেটা থেকে দেখতে বিশ্বাসযোগ্য এক্সিকিউশন অনুমান করে: বারের সর্বোচ্চ ও সর্বনিম্ন দাম, মিডপয়েন্ট, অথবা কোনো একক ট্রেডে ছোঁয়া লিমিট প্রাইস। এতে ট্রেড লগ নির্ভুল মনে হলেও বাজারে আসলে কী পাওয়া যাচ্ছিল, তা আড়ালে থেকে যায়।
প্রথমে জিজ্ঞেস করুন, আপনার অর্ডার কোন দামের সঙ্গে লেনদেন করতে পারত। শেষ ট্রেডের বার জানায়, একটি সময়পর্বে কোন কোন দামে ট্রেড হয়েছে। কিন্তু আপনার অর্ডার পৌঁছানোর সময় বিড ও আস্ক কত ছিল, সেখানে কত পরিমাণ পাওয়া যাচ্ছিল, কিংবা কিউয়ের সামনে আপনার অর্ডার পৌঁছাতে পারত কি না—এসব জানায় না।
আমার ব্যাকটেস্টে বাজারদরের বাইরের দামে ফিল দেখাচ্ছে কেন?
প্রথমে “বাইরে” বলতে কী বোঝাচ্ছেন, তা নির্দিষ্ট করুন। বারের সর্বনিম্ন দামের নিচে বাই ফিল বা সর্বোচ্চ দামের ওপরে সেল ফিল হলে, তা স্পষ্ট হিসাব বা সময় নির্ধারণের ত্রুটি। হাই-লো রেঞ্জের ভেতরের ফিলও কাল্পনিক হতে পারে: অর্ডার তৈরি হওয়ার আগেই ওই দামে ট্রেড হয়ে থাকতে পারে, স্প্রেডের উল্টো পাশে লেনদেন হয়ে থাকতে পারে, অথবা পরিমাণ এত কম হতে পারে যে আপনার অর্ডার পূরণ হতো না।
ধরুন, 1-মিনিটের একটি বারে ওপেন 100.00, লো 99.80 এবং ক্লোজ 100.10। আপনার স্ট্র্যাটেজি সম্পূর্ণ বার দেখে বাই অর্ডার পাঠায়, আর সিমুলেটর সেটি 99.80-এ ফিল করে। ওই লো হয়তো মিনিটের একেবারে শুরুতে, সিগনালের 50 সেকেন্ড আগে দেখা দিয়েছিল। সিদ্ধান্ত নেওয়ার পর 99.80-এ পাওয়া যাচ্ছিল—বার থেকে তার কোনো প্রমাণ মেলে না।
| আপনার কাছে যা আছে | এটি থেকে যা জানা যায় | এটি থেকে যা জানা যায় না |
|---|---|---|
| OHLCV বার | একটি সময়পর্বে ট্রেড হওয়া দামের পরিসর ও ভলিউম | দামের ক্রম, বিড ও আস্ক, অথবা অর্ডার পৌঁছানোর সময়ে কতটা পাওয়া যাচ্ছিল |
| ট্রেড প্রিন্ট | টাইমস্ট্যাম্প ও দামসহ রিপোর্ট করা এক্সিকিউশন | বুকের অপেক্ষমাণ লিকুইডিটি বা কিউয়ে আপনার অবস্থান |
| টপ-অফ-বুক কোট | নমুনা নেওয়ার সময়ের সেরা প্রদর্শিত বিড ও আস্ক | সেরা স্তরের বাইরের গভীরতা, অথবা নমুনাগুলোর মধ্যবর্তী সময়ে কোটটি বজায় ছিল কি না |
| অর্ডার-বুক ইভেন্ট | ফিডে যতটা কভারেজ আছে, সেই সীমার মধ্যে প্রদর্শিত গভীরতার পরিবর্তন ও কিউয়ের ইভেন্ট | লুকানো লিকুইডিটি, ভেন্যুতে প্রবেশাধিকার, অথবা নিশ্চিত অগ্রাধিকার |
আরেকটি সাধারণ কারণ হলো মিডপয়েন্টকে এক্সিকিউটেবল দাম মনে করা। কোট 99.99 বিড এবং 100.01 আস্ক হলে, রিপোর্টে 100.00 মিডপয়েন্টে বাই দেখাতে বেশ পরিপাটি লাগে। তবে বাজারযোগ্য বাই সাধারণত আস্কে হয়, অর্ডারের আকারের কারণে হওয়া ইমপ্যাক্টের খরচও যোগ হয়। মিডপয়েন্টকে ফিল বললে নীরবে স্প্রেডের অর্ধেক বাদ পড়ে যায়।
বাজার লিমিট প্রাইস ছুঁলেই কি লিমিট অর্ডার ফিল হতে পারে?
দাম ছোঁয়া মানে ওই লিমিট প্রাইসে কোনো ট্রেড প্রিন্ট হয়েছে—এমন প্রমাণ। কিন্তু আপনার অপেক্ষমাণ অর্ডার এক্সিকিউট হতো, তার নিশ্চয়তা নয়। অন্য অর্ডার আপনার আগে থাকলে, ওই দামে ট্রেডের পরিমাণ আপনার কিউ অবস্থান পর্যন্ত পৌঁছানোর জন্য যথেষ্ট নাও হতে পারে। প্রিন্টটি অন্য ভেন্যু থেকেও আসতে পারে, অথচ আপনার অর্ডার অপেক্ষমাণ ছিল অন্য কোথাও।
ধরুন, আপনার বাই লিমিট 50.00, আর অর্ডার দেওয়ার পরে বাজারে ওই দামে 200 শেয়ারের ট্রেড হয়। দাম-ছোঁয়া-ভিত্তিক সিমুলেটর পুরো 500 শেয়ার ফিল করে। আরও সতর্ক মডেল জিজ্ঞেস করবে, অর্ডার পৌঁছানোর পর 50.00-এ বা তার চেয়ে ভালো দামে মোট কত ট্রেড হয়েছে, তারপর সামনে আনুমানিক কত অর্ডার ছিল তা হিসাব করবে। অর্ডার-স্তরের বুক ডেটা ছাড়া, ওই কিউ একটি অনুমান। ফলাফলে সেটি স্পষ্ট থাকা উচিত; নিশ্চিত তথ্যের মতো চুপিসারে ঢুকিয়ে দেওয়া নয়।
ছোট গবেষণা সিস্টেমে, ক্যান্ডেল ডেটা থেকে কিউয়ে অগ্রাধিকার বোঝা যায় এমন ভান করার চেয়ে অনুমানটি স্পষ্ট করে তার বিভিন্ন মান পরীক্ষা করাই আমার পছন্দ। উপযুক্ত পরিসর নির্ভর করে ভেন্যু, অর্ডারের আকার এবং স্ট্র্যাটেজি কত ঘন ঘন ট্রেড করে তার ওপর। দিনের শুরুতে শান্ত কোনো শেয়ার আর 03:00 UTC-তে পাতলা লিকুইডিটির ক্রিপ্টো কন্ট্রাক্ট—এক্সিকিউশনের সমস্যা দুটো এক নয়।
বার ডেটার জন্য ফিল মডেল কীভাবে বেছে নেব?
মডেলকে ডেটা এবং স্ট্র্যাটেজির দাবি—দুটোর সঙ্গেই মেলান। ধীরগতির স্ট্র্যাটেজির জন্য বার-ভিত্তিক ব্যাকটেস্ট তবুও কাজে লাগতে পারে, তবে ফিলের ক্ষেত্রে বার থেকে যা জানা যায়, সেটুকুই মানা উচিত।
- সিদ্ধান্ত ও অর্ডার পৌঁছানোর সময় নির্ধারণ করুন। সিগনাল যদি বারের ক্লোজ ব্যবহার করে, ক্লোজ হওয়ার পরে অর্ডার পাঠান। সম্পূর্ণ বারের আগের লো থেকে নয়, পরের উপলভ্য সময়পর্ব বা কোট থেকে এক্সিকিউশন মডেল করুন।
- স্প্রেডের সঠিক দিক ব্যবহার করুন। বাজারযোগ্য বাইয়ের জন্য আস্ক থেকে শুরু করুন; সেলের জন্য বিড থেকে। শুধু ট্রেড বার থাকলে, আলাদা কোনো উৎস থেকে স্প্রেড অনুমান করুন অথবা রিপোর্টে জানান যে মডেলে এটি বাদ পড়েছে।
- বাস্তবসম্মত লিকুইডিটি অনুযায়ী ফিলের সীমা নির্ধারণ করুন। পর্যবেক্ষিত ভলিউমের ওপর অংশগ্রহণের সীমা প্রয়োগ করুন এবং ফি ও মার্কেট ইমপ্যাক্ট হিসাব করুন। বারের মোট ভলিউম মানেই আপনার বেছে নেওয়া দামে তার সবটুকু পাওয়া যাচ্ছিল না।
- অনুমানগুলো কঠিন পরিস্থিতিতে যাচাই করুন। সতর্ক স্লিপেজসহ নেক্সট-ওপেন ফিলের তুলনা করুন, এবং আরও খারাপ এক্সিকিউশনেও ফল টিকে থাকে কি না পরীক্ষা করুন। স্ট্র্যাটেজি জেতা পর্যন্ত ফিল মডেল টিউন করবেন না।
এগুলো মডেলিংয়ের সিদ্ধান্ত; অসম্পূর্ণ ডেটা থেকে একমাত্র সঠিক ফিল বের করার কোনো রেসিপি নয়। স্ট্র্যাটেজি যদি কয়েকটি বেসিস পয়েন্ট পাওয়ার ওপর নির্ভর করে, তবে সেই দাবি সমর্থনের জন্য বার ডেটা যথেষ্ট প্রমাণ নাও হতে পারে।
অসম্ভব ফিলটি ব্যাকটেস্টে কোথা থেকে ঢুকেছে, তা কীভাবে খুঁজব?
সন্দেহজনক একটি ট্রেডকে সিগনাল থেকে লেজার পর্যন্ত অনুসরণ করুন। সিদ্ধান্তের টাইমস্ট্যাম্প, অর্ডার পাঠানোর টাইমস্ট্যাম্প, সিমুলেটেড পৌঁছানোর সময়, বেছে নেওয়া বাজার পর্যবেক্ষণ, ফিল প্রাইস, ফিলের পরিমাণ এবং ফি—প্রতিটিকে আলাদা ফিল্ডে রাখুন। তারপর এই ক্রমে যাচাই করুন:
- সিদ্ধান্তের সময়ে যে বার শেষ হয়নি, তার ডেটা ব্যবহার করে কি ফিচার গণনা করা হয়েছিল?
- দামটি অর্ডার পৌঁছানোর আগেই দেখা গেলেও, ফিলে কি বারের হাই, লো বা ক্লোজ ব্যবহার করা হয়েছিল?
- বাই কি বিডের সঙ্গে, অথবা সেল কি আস্কের সঙ্গে মেলানো হয়েছিল?
- সিমুলেটেড পরিমাণ কি উপলভ্য কোট সাইজ বা মডেলের অংশগ্রহণ-সীমা ছাড়িয়ে গিয়েছিল?
- ফিল বেছে নেওয়ার পরে কি দাম রাউন্ড করা, কন্ট্র্যাক্টের টিক সাইজ এবং ফি প্রয়োগ করা হয়েছিল?
ট্রেড রেকর্ড থেকে এই প্রশ্নগুলোর উত্তর দিতে না পারলে, ব্যাকটেস্টে এক্সিকিউশনের প্রমাণ নেই। ফিল্ডগুলো যোগ করুন, কাঁচা ডেটার সঙ্গে হাতে গুনে কয়েকটি ট্রেড আবার মিলিয়ে দেখুন, এবং আপনার নির্ধারিত মডেল অনুযায়ী রিপোর্ট করা ফিলটি হওয়া সম্ভব ছিল কি না যাচাই করুন। পরিষ্কার ইকুইটি কার্ভ সিমুলেটরের ভেতরেই শুধু থাকা কোনো দাম ধরতে পারবে না।
← সব পোস্ট


