21 সেপ্টেম্বর, 2026 · প্রকৌশল

ব্যাকটেস্টের মাঝপথে কৌশলটি আবার চালু করুন। এটি কি মনে রাখে তার মালিকানায় কী আছে?

ব্যাকটেস্টের মাঝপথে কৌশলটি আবার চালু করুন। এটি কি মনে রাখে তার মালিকানায় কী আছে?

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

না মিললে, আপনি স্টেট ব্যবস্থাপনার সমস্যা খুঁজে পেয়েছেন। কৌশলটি এমন কিছুর ওপর নির্ভর করছে যা আপনি সংরক্ষণ করেননি বা আবার তৈরি করতে পারেননি। গবেষণার রান আবার শুরু করা হলে, ওয়ার্কার বদলালে, কিংবা পেপার-ট্রেডিং পরিষেবায় নতুন কোড ডিপ্লয় হলে এই নির্ভরতা গুরুত্বপূর্ণ হয়ে ওঠে।

এই পরীক্ষাটি আমার ভালো লাগে, কারণ এর প্রত্যাশিত ফল অস্বাভাবিক রকম স্পষ্ট। বাজার বদলেছে কি না, তা নিয়ে তর্কের অবকাশ নেই। দুটি রানেই একই বাজারের ডেটা যায়।

এখানে পুনরায় চালু করার ৩টি ভুল পদ্ধতি দেখানো হলো। সংখ্যাগুলো উদাহরণস্বরূপ; অন্যথায় নির্ধারিত আচরণের সিস্টেমেও প্রতিটি ত্রুটি ঘটতে পারে।

1. কয়েকটি বার লোড করে ধরে নেওয়া যে সূচকগুলো প্রস্তুত

ধরা যাক, একটি কৌশল 100-পিরিয়ডের এক্সপোনেনশিয়াল মুভিং অ্যাভারেজ ব্যবহার করে। এর আপডেট:

alpha = 2 / 101
ema_next = alpha * close + (1 - alpha) * ema_previous

নিরবচ্ছিন্ন প্রক্রিয়াটি জমা হওয়া EMA-এর মান ধরে এগোয়। পুনরায় চালু হওয়া প্রক্রিয়াটি 100টি বার আনে, প্রথম ক্লোজ দিয়ে EMA-এর প্রাথমিক মান নির্ধারণ করে এবং ধরে নেয় যে 100-পিরিয়ডের সূচকের জন্য 100টি পর্যবেক্ষণই যথেষ্ট।

এই ধারণায় সূচকের স্মুথিং প্যারামিটারকে সীমিত স্মৃতির উইন্ডোর সঙ্গে গুলিয়ে ফেলা হয়। EMA-তে এর প্রাথমিক অবস্থার ক্ষয়িষ্ণু অবদান থেকে যায়। দুটি সংস্করণের EMA-এর পার্থক্য যদি শুরুতে 10 প্রাইস ইউনিট হয়, তাহলে পরের অভিন্ন দামগুলো সেই পার্থক্য এভাবে কমায়:

ইনিশিয়ালাইজেশনের পর আপডেটের সংখ্যাঅবশিষ্ট পার্থক্যপ্রাথমিক ত্রুটির ভগ্নাংশ
1001.35313.53%
2500.06740.674%
5000.0004540.00454%

হিসাবটি হলো 10 * (99 / 101)^k। প্রথম পর্যবেক্ষণটিকে প্রাথমিক মান ধরলে, 100টি বার আনলে আপনি পাবেন মাত্র 99টি আপডেট।

সাধারণত সিদ্ধান্তের সীমার কাছে গিয়ে সমস্যা দেখা দেয়। এক রানে দাম EMA-এর ওপরে, অন্য রানে নিচে। সামান্য সংখ্যাগত পার্থক্যেই একটি অতিরিক্ত ট্রেড তৈরি হয়। তা ঘটলে কুলডাউন, হাতে থাকা নগদ এবং পরের সিদ্ধান্তগুলোও ভিন্ন হয়ে যেতে পারে।

পুনরাবৃত্তিমূলক সূচকের অবস্থা, তার ইনিশিয়ালাইজেশনের অবস্থা এবং সর্বশেষ প্রক্রিয়াকৃত ইভেন্ট সংরক্ষণ করুন। বিকল্পভাবে, পরিচিত প্রাথমিক অবস্থা থেকে আবার রিপ্লে করুন। দীর্ঘতর ওয়ার্ম-আপে গ্রহণযোগ্য আনুমানিক মান পাওয়া যেতে পারে, তবে স্পষ্ট ত্রুটি-সহনসীমা ধরে এর দৈর্ঘ্য ঠিক করুন এবং দেখুন সেই সহনসীমার কারণে সিদ্ধান্ত বদলাতে পারে কি না। “পিরিয়ডের 5 গুণ” একটি প্রচলিত নিয়ম, প্রমাণ নয়।

আর ইতিহাস বলতে শুধু সূচক বোঝায় না। চলমান পার্সেন্টাইলের জন্য তার উইন্ডো দরকার। অনলাইন মডেলের অপ্টিমাইজারের অবস্থার প্রয়োজন হতে পারে। লোকসানের পর 3 বার অপেক্ষা করা কোনো নিয়মের সেই লোকসান ও কাউন্টার মনে রাখা দরকার।

2. পজিশন সংরক্ষণ করে চলমান অর্ডার ভুলে যাওয়া

আপনার লক্ষ্য পজিশন 10 ইউনিট। 10 ইউনিটের একটি বাই অর্ডারের 4 ইউনিট পূরণ হয়েছে, 6 ইউনিট বাকি। আপনি চেকপয়েন্টে পজিশন 4 হিসেবে সংরক্ষণ করে পুনরায় চালু করেন, তারপর বাকি 6 ইউনিটের জন্য আরেকটি বাই অর্ডার দেন।

মূল অর্ডারের বাকি অংশ এবং নতুন অর্ডার—দুটিই পূরণ হলে, আপনার মালিকানায় থাকবে 16 ইউনিট।

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

পুনরায় চালুর সময়প্রকৃত অবস্থাশুধু পজিশন দেখে পুনরুদ্ধারে যা দেখা যায়
লক্ষ্য পজিশন1010
পূরণ হওয়া পজিশন44
বাকি বাই পরিমাণ60
অতিরিক্ত প্রয়োজনীয় পরিমাণ06

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

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

স্থিতিশীল ক্লায়েন্ট অর্ডার আইডি দিয়ে কী ঘটেছিল তা খুঁজে দেখা যায়। তবে প্রাপক সিস্টেম প্রয়োজনীয় স্বতন্ত্রতা বা আইডেমপোটেন্সির নিয়ম বাস্তবে প্রয়োগ করলেই কেবল এগুলো ডুপ্লিকেট ঠেকায়। প্রক্রিয়াকৃত এক্সিকিউশন আইডিগুলোও সংরক্ষণ করুন, যাতে রিপ্লে করা ফিল পজিশন দুবার না বাড়ায়।

সাদামাটা অর্ডার-স্ট্যাটাস স্ক্রিনটির প্রতি আমার একটু দুর্বলতা আছে। পুনরায় চালুর দিনে এর ছোট ছোট সারিগুলোই হঠাৎ পুরো অফিসের সবচেয়ে আকর্ষণীয় ইন্টারফেস হয়ে ওঠে।

3. পজিশন পুনরুদ্ধার করে নতুন P&L খতিয়ান শুরু করা

ফি ছাড়া লিভারেজবিহীন স্পট ট্রেডের একটি উদাহরণ ধরা যাক। শুরুতে নগদ $10,000, $100 দরে 10 ইউনিট কিনলেন এবং মার্ক $110 হলে চেকপয়েন্ট করলেন।

সঠিক অবস্থা হলো $9,000 নগদ এবং $1,100 মূল্যের পজিশন: মোট ইকুইটি $10,100। পুনরুদ্ধারে 10 ইউনিট ফিরিয়ে এনে নগদ আবার মূল $10,000 করলে, রিপোর্টে দেখা যাবে $11,100। প্রক্রিয়া পুনরায় চালু করেই আপনি $1,000 বানিয়ে ফেলেছেন।

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

কিংবা সিস্টেম আগের ইকুইটি-সর্বোচ্চ মানটি ভুলে যায়। ধরা যাক, $10,100-এ নামার আগে ইকুইটি $10,600-এ উঠেছিল। ড্রডাউন প্রায় 4.72%। পুনরুদ্ধারের সময় সর্বোচ্চ মানটি রিসেট করলে, কৌশলটি হঠাৎ মনে করে তার ড্রডাউন শূন্য। ড্রডাউনের ওপর নির্ভরশীল যেকোনো রিস্ক কন্ট্রোল অননুমোদিতভাবে রিসেট হয়ে গেল।

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

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

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

সাবমিশনের পর কিন্তু স্বীকৃতি পাওয়ার আগে ক্র্যাশ হলে, হারনেসে এক্সিকিউশন পরিষেবার অবস্থা কৌশলের প্রক্রিয়া থেকে আলাদাভাবে সংরক্ষণ করতে হবে। তা না হলে, যে অনিশ্চয়তা পরীক্ষা করতে চাইছেন সেটাই মুছে ফেলবেন।

কৌশলের স্পেসিফিকেশনের অংশ হলো এটি কী মনে রাখে। সেই স্মৃতিকে যথেষ্ট স্পষ্ট করে তুলুন, যাতে রিপ্লের মাঝপথে প্রক্রিয়াটি বন্ধ করে দেখাতে পারেন, কীভাবে এটি আবার কাজ শুরু করে।

কৌশলের অবস্থাব্যাকটেস্টিংচেকপয়েন্ট পুনরুদ্ধারপেপার ট্রেডিং
শেয়ার করুনXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← সব পোস্ট