28 অক্টোবর, 2026 · অপশনস

সংকেতটি ঠিক ছিল। আমাদের অপশনস ব্যাকটেস্ট ভুল মেয়াদপূর্তির চুক্তি কিনেছিল।

সংকেতটি ঠিক ছিল। আমাদের অপশনস ব্যাকটেস্ট ভুল মেয়াদপূর্তির চুক্তি কিনেছিল।

মঙ্গলবার 10:07-এ, আমাদের রিসার্চ এজেন্ট একটি ইনডেক্স ETF-এ স্বল্পমেয়াদি বুলিশ সেটআপ শনাক্ত করল। অন্তর্নিহিত সংকেতটি ছিল সাধারণ: দাম তার 20-বারের গড়ের ওপরে উঠেছিল, বাস্তবায়িত ভোলাটিলিটি কমছিল, আর পরের সেশনে একটি নির্ধারিত সামষ্টিক অর্থনৈতিক ঘোষণা ছিল। প্রস্তাবিত ট্রেডটি ছিল মেয়াদপূর্তিতে প্রায় দুই সপ্তাহ বাকি থাকা একটি কল স্প্রেড।

ব্যাকটেস্টে সেটি ভালো লেগেছিল। পেপার স্ট্র্যাটেজি ট্রেডটি দেয়নি। অর্ডারগুলো তুলনা করে দেখলাম, সংকেতের টাইমস্ট্যাম্প মিলে গেছে এবং অন্তর্নিহিত সম্পদের দাম কয়েক সেন্টের মধ্যেই ছিল। কিন্তু চুক্তি আলাদা: ব্যাকটেস্টটি ঐতিহাসিক চেইনে সবচেয়ে ভালো মনে হওয়া শুক্রবারের মেয়াদপূর্তির চুক্তি কিনেছিল; পেপার প্রক্রিয়াটি বেছে নিয়েছিল তালিকাভুক্ত পরের মেয়াদপূর্তি, যা এক সপ্তাহ পরে।

এই ব্যবধানের কারণ ছিল একটি ক্যালেন্ডার জয়েন। আমরা “মেয়াদপূর্তিতে বাকি দিন”কে একটি তারিখের বৈশিষ্ট্য ধরে নিয়েছিলাম, তারপর এমন চুক্তি বেছেছিলাম যার মেয়াদপূর্তির তারিখ লক্ষ্য তারিখের সবচেয়ে কাছাকাছি। ঐতিহাসিক ডেটায় মেয়াদপূর্তির ক্যালেন্ডারে এমন একটি সাপ্তাহিক তালিকাভুক্তি ছিল, যা আমরা যে তারিখ পরীক্ষা করছিলাম তার পরে যোগ করা হয়েছিল। ব্যাকটেস্টটি ভবিষ্যতের একটি চুক্তি এমনভাবে ব্যবহার করেছিল, যেন সেটি নিছক সুবিধার বিষয়।

প্রথমে আমাদের সন্দেহ হয়েছিল টাইমজোনের ত্রুটি। অপশনসের মেয়াদপূর্তির তারিখ এমন ত্রুটি ঘটানোর জন্য বিশেষভাবে উপযোগী: নিউ ইয়র্কে বাজার সেশন শেষ হয়, এক্সচেঞ্জের টাইমস্ট্যাম্প UTC-তে সংরক্ষিত হতে পারে, আর পাইপলাইন অসতর্কভাবে কাস্ট করলে মধ্যরাতের তারিখ বদলে যেতে পারে। আমরা যাচাই করলাম। টাইমস্ট্যাম্প ঠিক ছিল। সেই মঙ্গলবার ঐতিহাসিক ইউনিভার্সে চুক্তিটির অস্তিত্বই ছিল না।

এটাই ছিল প্রথম শিক্ষা: ঐতিহাসিক অপশন চেইনের জন্য পয়েন্ট-ইন-টাইম তালিকাভুক্তির ইউনিভার্স দরকার। কোনো চুক্তির মেয়াদপূর্তির তারিখ বলে দেয় সেটি কখন শেষ হবে। কিন্তু সেটি কখন তালিকাভুক্ত হয়েছিল, কখন লেনদেনযোগ্য হয়েছিল, অথবা তখন আপনার সিস্টেম সেটি বেছে নিতে পারত কি না—তা বলে না।

সিদ্ধান্তের টাইমস্ট্যাম্পে যে তথ্য পাওয়া যেত, তার ভিত্তিতে আমরা নির্বাচন ধাপটি নতুন করে তৈরি করলাম। প্রতিটি সম্ভাব্য চুক্তির ক্ষেত্রে আমরা নিশ্চিত করলাম, তালিকাভুক্তির টাইমস্ট্যাম্প সিদ্ধান্তের সময়ের পরে নয়, কোটটি আমাদের সতেজতার সীমার চেয়ে পুরোনো নয়, এবং এমন বাজার সেশন চলছে যাতে স্ট্র্যাটেজি অর্ডার দিতে পারে। র‍্যাঙ্ক করার আগে সম্ভাব্য চুক্তিগুলোর সেটও সংরক্ষণ করলাম। শেষের এই বিষয়টি গুরুত্বপূর্ণ ছিল, কারণ পুরোনো ব্যাকটেস্ট শুধু বিজয়ীটিকেই রাখত; সেটি পাঁচটি যোগ্য চুক্তির তুলনা করেছিল, নাকি চুপিসারে এমন ক্যালেন্ডার থেকে বেছে নিয়েছিল যা তখনও আসেনি, তা আমরা বুঝতে পারতাম না।

10:07সংকেতের সিদ্ধান্তের সময়
1 সপ্তাহমেয়াদপূর্তির অমিল
0নির্বাচিত চুক্তির জন্য যোগ্য ঐতিহাসিক তালিকাভুক্তি

এরপর স্প্রেডের দাম নির্ধারণে ব্যবহৃত কোটটি পরীক্ষা করলাম। ব্যাকটেস্টে প্রতিটি লেগের সর্বশেষ কোট আলাদাভাবে নেওয়া হয়েছিল। কলের আস্ক ছিল 10:06:58-এর; শর্ট কলের বিড ছিল 10:04:11-এর। বিস্তৃত ডেটা নীতির অধীনে দুটিই প্রযুক্তিগতভাবে সাম্প্রতিক ছিল, কিন্তু এই সময়ের মধ্যে বাজার সরে গিয়েছিল। বিভিন্ন সময়ের লেগের মিডপয়েন্ট দিয়ে তৈরি স্প্রেড এমন একটি বাজারের চিত্র দিতে পারে, যা কখনো বাস্তবে ছিলই না।

আমরা কোটের নিয়ম বদলে দিলাম: দুই লেগের টাইমস্ট্যাম্পের ব্যবধান সর্বোচ্চ দুই সেকেন্ড হতে হবে এবং ক্রসড বা শূন্য-সাইজের বাজার বাদ যাবে। এতে ব্যবহারযোগ্য ঐতিহাসিক পর্যবেক্ষণের সংখ্যা কমল। তবে বাকি মার্কগুলো আরও বিশ্বাসযোগ্য হলো। সমন্বিত কোট না থাকলে, পুরোনো দাম দিয়ে ফাঁক পূরণ না করে সম্ভাব্য চুক্তিটিকে অনুপলব্ধ হিসেবে চিহ্নিত করলাম।

এরপর এল র‍্যাঙ্কিংয়ের নিয়ম। এজেন্ট সর্বনিম্ন কোটকৃত স্প্রেড খরচের মেয়াদপূর্তি বেছে নিয়েছিল। স্প্রেডটি এক চুক্তি চওড়া হলে আর কোটটি পুরোনো হলে এই সিদ্ধান্তকে যুক্তিযুক্ত মনে হয় না। আমরা লক্ষ্যটি স্পষ্ট করলাম: ন্যূনতম কোট-সাইজ, সতেজতা এবং তালিকাভুক্তির যাচাইয়ে উত্তীর্ণ চুক্তিগুলোর মধ্যে নির্ধারিত ঝুঁকির প্রতি এককে প্রত্যাশিত পেআফ সর্বাধিক করা। এই উদাহরণে, নিকটতম যোগ্য মেয়াদপূর্তিতে দুই লেগের কোটকৃত ব্যবধান ছিল $0.42, আর পরের মেয়াদপূর্তিতে ব্যবধান ছিল $0.31। কম খরচের মনে হওয়া বিকল্পটিতে শর্ট লেগে প্রদর্শিত চুক্তির সংখ্যাও ছিল মাত্র 1।

সম্ভাব্য চুক্তিতখন মেয়াদপূর্তি পাওয়া যেত?কোটের বয়সপ্রদর্শিত শর্ট-লেগ সাইজসিদ্ধান্ত
শুক্রবারের সাপ্তাহিক মেয়াদপূর্তিনাপ্রযোজ্য নয়প্রযোজ্য নয়বাদ দিন
পরের শুক্রবারহ্যাঁ1.4 সেকেন্ড18টি চুক্তিযোগ্য
তৃতীয় শুক্রবারহ্যাঁ9.8 সেকেন্ড1টি চুক্তিপুরোনো ও পাতলা হওয়ায় বাদ দিন

এই নিয়মগুলো দিয়ে ঘটনাটি আবার চালিয়ে দেখলাম। ব্যাকটেস্টে এখন পেপারের মতো একই মেয়াদপূর্তি বেছে নেওয়া হলো, এবং অন্য চুক্তিগুলো কেন বাদ পড়েছিল, সেটাও রেকর্ড করা হলো। ফলে স্প্রেডে এন্ট্রি আগের ঐতিহাসিক ফিলের চেয়ে $0.11 খারাপ হলো। এর মানে এই নয় যে স্ট্র্যাটেজির কোনো মূল্য ছিল না; এর মানে পুরোনো পারফরম্যান্সের সংখ্যায় এমন একটি ট্রেড নির্বাচন অন্তর্ভুক্ত ছিল, যা লাইভ প্রক্রিয়া পুনরুৎপাদন করতে পারত না।

একটি ছোটখাটো ঝামেলা হলো: এক্সচেঞ্জের সিম্বল ফরম্যাট মেয়াদপূর্তির বাগকে ডেটা-মানের বাগ বলে মনে করায়। এক ভেন্ডরের সাপ্তাহিক কোড মাসিক কোড থেকে একটি অক্ষরে আলাদা ছিল। অডিট লগে আমি এখনও নরমালাইজ করা কন্ট্র্যাক্ট কি-র পাশে কাঁচা সিম্বলটি রাখি। এটি খুব মার্জিত সমাধান নয়, তবে পরিপাটি কোনো জয়েনকে তাড়াহুড়ো করে বিশ্বাস করা থেকে আমাদের বাঁচিয়েছে।

আপনি যদি অপশনস ব্যাকটেস্ট তৈরি করেন, প্রতিটি সিদ্ধান্তের সময় পুরো সম্ভাব্য চুক্তির সেট সংরক্ষণ করুন, সঙ্গে রাখুন প্রতিটি চুক্তির তালিকাভুক্তির অবস্থা, কোটের টাইমস্ট্যাম্প, সাইজ এবং বাদ পড়ার কারণ। তারপর সেই স্ন্যাপশটের ভিত্তিতে চুক্তি নির্বাচনকে একটি ডিটারমিনিস্টিক ফাংশন হিসেবে নির্ধারণ করুন। মেয়াদপূর্তি বেছে নেওয়াও স্ট্র্যাটেজির অংশ। ব্যাকটেস্ট যদি এমন চুক্তি দেখতে পায় যা পেপার দেখতে পায়নি, তাহলে সংকেতের তুলনা শুরু হওয়ার আগেই উত্তর বদলে গেছে।

অপশনস ব্যাকটেস্টিংমেয়াদপূর্তি নির্বাচনপয়েন্ট-ইন-টাইম ডেটাএক্সিকিউশন মডেলিং
শেয়ার করুনXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← সব পোস্ট