নিখুঁতভাবে পুনরুৎপাদনযোগ্য ব্যাকটেস্ট কখনো সামান্য ওঠানামা করা ব্যাকটেস্টের চেয়ে কম বিশ্বাসযোগ্য হতে পারে। বারবার একই ফল পাওয়া প্রমাণ করে যে আপনি দুবার একই উত্তর পেতে পারেন; কিন্তু উত্তরটি কোনো একটি খামখেয়ালি ডেটা স্ন্যাপশট, লাইব্রেরির অদ্ভুত আচরণ বা আড়ালে থাকা কোনো ডিফল্টের ওপর নির্ভর করে কি না, সে বিষয়ে কিছু বলে না।
শুনে মনে হতে পারে এটি পুনরুৎপাদনযোগ্যতার বিরোধিতা, কিন্তু তা নয়। রানটি স্থির রাখুন, যাতে সেটি ব্যাখ্যা করতে পারেন। তারপর যেসব অনুমান ফল নির্ধারণ করার কথা নয়, সেগুলো ইচ্ছাকৃতভাবে বদলে দেখুন। প্রথম ধাপে ফলাফল নিরীক্ষাযোগ্য হয়; দ্বিতীয় ধাপে বোঝা যায়, এর আদৌ কোনো অর্থ আছে কি না।
পুনরুৎপাদনযোগ্য ব্যাকটেস্ট আসলে কী প্রতিষ্ঠা করে?
একই কোড, ডেটা, কনফিগারেশন ও র্যান্ডম সিড থেকে যদি একই ট্রেড এবং মেট্রিক পাওয়া যায়, তাহলে বিভ্রান্তির একটি গুরুত্বপূর্ণ উৎস আপনি নিয়ন্ত্রণে এনেছেন। কোনো এজেন্টের “উন্নতি” তার আগের রানের সঙ্গে তুলনা করা যায়। বাগ ফিক্সকে বদলে যাওয়া ফি সূচি থেকে আলাদা করে দেখা যায়। সহকর্মী একই লেজার খতিয়ে দেখে একই ফিল খুঁজে পেতে পারেন।
তবে ফলাফলটি আপনি যা কিছু স্থির রেখেছেন, সেসবের ওপর নির্ভরশীল। এমন একটি ক্রিপ্টো কৌশলের কথা ভাবুন, যার ঐতিহাসিক ফাইলে 1-মিনিটের বার আছে। আপনি ফাইলের হ্যাশ সংরক্ষণ করেন, কোডের নির্দিষ্ট সংস্করণ স্থির করেন এবং প্রতিবার আবার চালালে 1.4 Sharpe পান। পরে ভেন্ডর কয়েকটি ক্যান্ডেল সংশোধন করলে, এই পরিচ্ছন্ন পুনরুৎপাদনযোগ্যতা তখনও পুরোনো ফাইলটিকেই বর্ণনা করবে। সংশোধিত ইতিহাসেও সিগন্যালটি টিকে থাকে কি না, বা সেই সময়ে ওই ক্যান্ডেলগুলো ওই রূপে পাওয়া যেত কি না, তা এটি জানায় না।
হ্যাশটি কাজে লাগে: এটি নির্ভরতার বিষয়টি দৃশ্যমান করে। তবে নির্ভরতাটি ক্ষতিকর নয়, এমন প্রমাণ দেয় না।
রান স্থির রাখুন; ফলাফলকে যাচাইয়ের মুখে ফেলুন
আমি দুটি প্রশ্ন আলাদা রাখতে পছন্দ করি। আমরা কি এই নির্দিষ্ট রানটি হুবহু পুনর্গঠন করতে পারি? আর যুক্তিসংগত পরিবর্তনেও গবেষণার সিদ্ধান্ত কি টিকে থাকে? প্রথমটির জন্য অপরিবর্তনীয় রেকর্ড দরকার; দ্বিতীয়টির জন্য দরকার নিয়ন্ত্রিতভাবে, একবারে একটি করে, কিছু পরিবর্তন করে দেখা।
| যা রেকর্ড করবেন | পরে যা বদলে দেখবেন | যা জানা যেতে পারে |
|---|---|---|
| কাঁচা ডেটার সংস্করণ ও চেকসাম | ভেন্ডরের সংশোধিত সংস্করণ বা দ্বিতীয় কোনো উৎস | সংশোধিত বা ভেন্ডর-নির্দিষ্ট মানের ওপর নির্ভরতা |
| কোড কমিট ও প্যাকেজের সংস্করণ | সংখ্যাগতভাবে সমতুল্য বাস্তবায়ন | ক্রম, রাউন্ডিং বা লাইব্রেরির প্রতি সংবেদনশীলতা |
| ফি, ফান্ডিং ও ফিলের অনুমান | যুক্তিসংগত খরচের পরিসর | সামান্য এজ টিকিয়ে রাখতে অস্বাভাবিক অনুকূল এক্সিকিউশন লাগে কি না |
| ইউনিভার্স ও নির্দিষ্ট সময়ের সদস্যপদ | বিকল্প যোগ্য-বাজারের নিয়ম | অন্তর্ভুক্তি বা বাদ দেওয়ার সিদ্ধান্তের ওপর নির্ভরতা |
উদাহরণ হিসেবে, ধরা যাক ফিউচার্স কৌশলের বেসলাইন রিপ্লেতে বার্ষিকীকৃত অতিরিক্ত রিটার্ন 8%। টেকার খরচ 25% বাড়িয়ে, ফান্ডিং পরবর্তী পর্যবেক্ষিত সেটেলমেন্টে সরিয়ে এবং সবচেয়ে বেশি অবদান রাখা দুটি উপাদানকে পালা করে বাদ দিয়ে আবার চালান। এগুলো মডেল উন্নত করার তিনটি উপায় নয়। এগুলো যাচাই: প্রতিটিই জানতে চায়, বিশ্বাসযোগ্য কোনো খুঁটিনাটি কি শিরোনামের ফলটি নির্ধারণ করছে?
প্রতিটি যাচাই আলাদা রাখুন। ডেটা, ফি সূচি ও এক্সিকিউশনের সময় একসঙ্গে বদলালে, ফল খারাপ হওয়ার কারণ নির্ণয় করা কঠিন হবে। আর কোনো যাচাই যদি অবাস্তব হয়, তাহলে সম্ভাব্য ফল হিসেবে উপস্থাপন না করে সেটিকে স্ট্রেস কেস হিসেবে চিহ্নিত করুন।
বাইটে বাইটে এক হওয়াকে সংখ্যাগত সত্য বলে ভুল করবেন না
কিছু গণনা ক্রমের প্রতি সংবেদনশীল। ফ্লোটিং-পয়েন্ট যোগ সহযোগী নয়, তাই অনেক ছোট P&L মান অন্য ক্রমে যোগ করলে শেষের কয়েকটি অঙ্ক বদলে যেতে পারে। প্যারালাল রিডাকশন, হার্ডওয়্যার এবং লাইব্রেরির সংস্করণ—সবই হুবহু আউটপুটে প্রভাব ফেলতে পারে। সাধারণত এতে ক্ষতি হয় না; তবে কখনো সামান্য সংখ্যাগত পরিবর্তন কোনো থ্রেশহোল্ড পার করিয়ে পজিশন বদলে দেয় এবং সিমুলেশনের বাকি অংশকে অন্য পথে চালিত করে।
সেই কারণেই আমি তুলনার জন্য হুবহু আর্টিফ্যাক্ট এবং সহনসীমা—দুটিই সংরক্ষণ করব। শুধু চূড়ান্ত Sharpe নয়, ট্রেড লেজারও রেকর্ড করুন। আগে সিদ্ধান্ত ও নগদ প্রবাহ তুলনা করুন, তারপর নির্দিষ্ট সহনসীমার মধ্যে মেট্রিক তুলনা করুন। 1 সেন্টের পার্থক্যে অর্ডার জমা হবে কি না বদলে গেলে, ওই সীমান্তটি আলাদাভাবে খতিয়ে দেখুন।
একটি কার্যকর রান রেকর্ডে ডেটা ও কোডের পরিচয়, কনফিগারেশন, র্যান্ডম সিড, এক্সিকিউশন পরিবেশ এবং কোনো মেট্রিককে ফিল ও নগদ প্রবাহ পর্যন্ত অনুসরণ করার মতো যথেষ্ট মধ্যবর্তী আউটপুট থাকে। শুধু চূড়ান্ত স্কোর পুনরুৎপাদনযোগ্য গবেষণা আর্টিফ্যাক্ট নয়।
কখন পরিবর্তন নিছক নয়েজ, আর কখন তা একটি ফলাফল
সংখ্যার প্রতিটি পরিবর্তনই সংকট নয়। যোগের ক্রম বদলানোর কারণে মেট্রিকে সামান্য হেরফের হলেও ট্রেড অপরিবর্তিত থাকতে পারে। থ্রেশহোল্ডের কাছাকাছি কোনো ট্রেড বদলে গেলে তা পর্যালোচনার যোগ্য হতে পারে। ভেন্ডর ইতিহাসের ছোট একটি অংশ সংশোধন করতেই কোনো কৌশলের বেশির ভাগ ফল হারিয়ে গেলে, মূল রানটি পুরোপুরি পুনরুৎপাদনযোগ্য থাকলেও, সেটি কৌশলটির ভঙ্গুরতা সম্পর্কে কিছু জানায়।
রোবাস্টনেস যাচাইয়ের সমালোচকেরা একটি বিষয়ে ঠিক: পছন্দের কৌশলকে টেকসই দেখানো পর্যন্ত অনুমান বদলাতে থাকা সহজ, আবার ইচ্ছাকৃতভাবে চরম কোনো পরিস্থিতিতে ভেঙে পড়ে বলে ভালো ফলও বাতিল করা যায়। সম্ভাব্য পরিবর্তনগুলো আগে থেকে নির্ধারণ করুন, পুরো সেটটি জানান এবং সাধারণ বিকল্পকে স্ট্রেস কেস থেকে আলাদা করুন। তারপর বেসলাইন সংরক্ষণ করুন, যাতে অন্য গবেষক ঠিক আপনি যা দেখেছেন তা পুনরুৎপাদন করতে পারেন।
পুনরুৎপাদনযোগ্যতা আপনাকে নির্ভরযোগ্য সূচনাবিন্দু দেয়। এরপরের দরকারি প্রশ্ন হলো: ওই রানের আশপাশের জগৎ যুক্তিসংগতভাবে প্রত্যাশিত উপায়ে বদলালে উত্তরের কোন অংশগুলো অপরিবর্তিত থাকে?
← সব পোস্ট


