প্রতিটি ব্যাকটেস্ট যে প্রশ্নটি এড়িয়ে যায়, তা হলো: একই কোডকে লাইভে একই বাজারের ডেটা দিলে, সেটি কি একই কাজ করত? আরও ব্যাকটেস্ট করে এর উত্তর পাওয়া যায় না। লাইভ ডেটা ও বাস্তব এক্সিকিউশন নিয়মে স্ট্র্যাটেজি চালিয়ে, তারপর ট্রেড ধরে ধরে যাচাই করেই শুধু বোঝা যায়—দুই জগতের ফল মেলে কি না। আমরা প্রতিদিন স্বয়ংক্রিয়ভাবে এই যাচাই করি, আর প্ল্যাটফর্মে বাগ খুঁজে বের করার কাজে এটিই সবচেয়ে ফলপ্রসূ পদ্ধতি হয়ে উঠেছে।
প্রথম দিন: প্রতিরূপ তৈরি
প্রতিটি অনুমোদিত স্ট্র্যাটেজি নিজস্ব বিচ্ছিন্ন লাইভ নোডে চলে এবং এক্সচেঞ্জের প্রকৃত স্ট্রিম গ্রহণ করে: ফিলের জন্য লাইভ কোট, বাস্তব স্প্রেড, বাস্তব ট্রেডিং সময়। স্ট্র্যাটেজিগুলোর মধ্যে কোনো শেয়ার করা স্টেট নেই (এই ভুলের মাশুল আমরা দিয়েছি—একটি শেয়ার করা নোডের কারণে এক স্ট্র্যাটেজির পজিশন-সংক্রান্ত কোয়েরি অন্যটিতে গিয়ে পড়েছিল)। প্রতিটি ফিলের সঙ্গে সেটি তৈরি করা সিগন্যালের মানও রেকর্ড করা হয়।
প্রতি সকালে: রিপ্লে ও তুলনা
একটি দৈনিক কাজ প্রতিটি স্ট্র্যাটেজির পেপার ট্রেডিংয়ের সময়সীমা নিয়ে, একই সময়ের ক্যাটালগ ডেটায় ব্যাকটেস্ট ইঞ্জিনে হুবহু একই কোড চালায়, তারপর ফিলগুলো একে একে মেলায়: একই দিক, একই টাইমস্ট্যাম্পের সহনসীমা, একই পরিমাণ। ফলাফল কোনো পারস্পরিক সম্পর্কের হিসাব বা অনুমাননির্ভর ধারণা নয়। এটি একটি টেবিল: মিলেছে, শুধু পেপারে, শুধু রিপ্লেতে। সুস্থ স্ট্র্যাটেজিতে 55টির মধ্যে 54টি মেলে। অসুস্থ স্ট্র্যাটেজি ঠিক কোন ট্রেডে, কখন অমিল হয়েছে তা দেখিয়ে দেয়।
যা যা ভেঙেছে, যে ক্রমে ভেঙেছে
- ওয়ার্মআপ ফিল। লাইভ নোড ইন্ডিকেটর ওয়ার্মআপ করার জন্য ইতিহাসের ডেটা পাঠাত—আর কাস্টম বার হ্যান্ডলার থাকা স্ট্র্যাটেজিগুলো সেই ডেটায় নির্দ্বিধায় ট্রেড করত। ব্যাকটেস্টে এই কাল্পনিক এন্ট্রিগুলো কখনো দেখা যায়নি। সমাধান ছিল সাবমিশন স্তরে একটি গার্ড যোগ করা, স্ট্র্যাটেজি ঠিক করা নয়; কারণ তা না হলে প্রতিটি স্ট্র্যাটেজিই এই বাগ পেত।
- একাধিক লেগের ধারাবাহিক ওয়ার্মআপ। একটি ক্রস-সেকশনাল স্ট্র্যাটেজি একবারে একটি ইনস্ট্রুমেন্ট ওয়ার্মআপ করত; প্রতিটি লেগের কাছে অন্য লেগগুলো ফাঁকা থাকত, ফলে অ্যাঙ্কর কখনোই ইনিশিয়ালাইজ হতো না। লাইভে এটি কোনো ট্রেড করেনি, অথচ রিপ্লেতে ঠিকই ট্রেড করেছে। মেলা ট্রেডের সংখ্যা শূন্য—কিন্তু পার্থক্যটি স্পষ্ট করে বলেছিল শুধু তুলনাটিই।
- টিকের নির্ভুলতায় ক্র্যাশ লুপ। লাইভ aggTrade টিক স্যান্ডবক্স ইনস্ট্রুমেন্টের প্রত্যাশিত নির্ভুলতার চেয়ে ভিন্ন নির্ভুলতায় আসে। একটি অ্যাসারশনে নোড বারবার ক্র্যাশ করে—যে অ্যাসারশন ব্যাকটেস্টে কখনো ট্রিগার হতো না, কারণ ক্যাটালগ বারের মান আগেই স্বাভাবিকীকৃত।
- রিস্টার্টে স্মৃতিভ্রংশ। প্রসেস রিস্টার্ট হলে আগে থেকেই থাকা পজিশনে এন্ট্রি লজিক আবার চালু হতো—রিব্যালান্সিং স্ট্র্যাটেজিতে রিস্টার্ট নিঃশব্দে রিব্যালান্সে পরিণত হতো। লাইভ ট্রেডিংয়ে এটা প্যারিটির ছোটখাটো টীকা নয়; টাকার ঝুঁকিসহ এক বিপৎসংকেত।
ধরনটা লক্ষ করুন: এগুলোর একটিও সিগন্যালের বাগ নয়। সবই এক্সিকিউশন সীমান্তের বাগ—ওয়ার্মআপ, স্টেট, নির্ভুলতা, রিস্টার্ট। এই ধরনের ব্যর্থতাই ব্যাকটেস্টের কাঠামোগতভাবে চোখ এড়ায়, কারণ ব্যাকটেস্টে ব্যাকটেস্ট ইঞ্জিনই হলো এক্সিকিউশন সীমান্ত।
যে অসামঞ্জস্যগুলো আমরা ইচ্ছা করেই রাখি
দুই জগতকে ইচ্ছাকৃতভাবেই অভিন্ন রাখা হয় না। ব্যাকটেস্টে PnL-এর মধ্যে মডেল করা অর্ধেক স্প্রেড এবং বর্গমূল-ভিত্তিক ইমপ্যাক্ট ধরা হয়; পেপার ট্রেডিংয়ে ফিল প্রাইসে প্রকৃত স্প্রেড পড়ে, কোনো ইমপ্যাক্ট মডেল নেই। পেপারে মডেল করা স্প্রেড (অথবা ব্যাকটেস্টে প্রকৃত স্প্রেড) যোগ করলে একই খরচ দুবার গোনা হবে। প্যারিটি মানে একই সিদ্ধান্ত, সহনসীমার মধ্যে একই ফিল—PnL বিটে বিটে অভিন্ন হওয়া নয়। কোন পার্থক্যগুলো যুক্তিসংগত আর কোনগুলো বাগ, তা জানা—এই শৃঙ্খলার বড় অংশ।
ব্যাকটেস্ট একটি অনুমান। পেপার ট্রেডিং হলো পরীক্ষা। রিপ্লে প্যারিটি হলো সেই ল্যাব নোটবুক, যা নিজেকেই ভুল বোঝানোর প্রবণতা ধরে ফেলে।
আপনি যদি স্ট্র্যাটেজি চালান, অথচ নির্দিষ্ট সময়সূচিতে লাইভ আচরণকে রিপ্লে করা আচরণের সঙ্গে তুলনা না করেন, তাহলে এমন এক ধরনের বাগ রয়েছে যা আপনি কখনো দেখেননি। আমরা মোটামুটি প্রতি কয়েক সপ্তাহে একটি করে খুঁজে পাই, আর প্রতিটি ব্যাকটেস্টের ভেতর থেকে অদৃশ্য ছিল।
← সব পোস্ট

