আপনার ব্যাকটেস্টে এন্ট্রি সিগন্যালটাই সম্ভবত সবচেয়ে কম গুরুত্বপূর্ণ বিষয়। আমি একটি মাঝারি মানের মোমেন্টাম নিয়ম নিয়ে, প্রতিটি এন্ট্রি ও এক্সিটের টাইমস্ট্যাম্প অপরিবর্তিত রেখে, শুধু কতগুলো কন্ট্র্যাক্ট ধরে রাখতে হবে তা নির্ধারণের ফাংশন বদলে নেট Sharpe 0.41 থেকে 0.71-এ এবং সর্বোচ্চ ড্রডাউন 31% থেকে 13%-এ আনতে পারি। ট্রেড একই। ফিল একই। কৌশল আলাদা।
এই দাবি অনেকেরই বিরক্তিকর লাগে, আর লাগাটাই স্বাভাবিক, কারণ এর অর্থ লুকব্যাক ও ফিল্টার থ্রেশহোল্ড ঠিক করতে যে সময় ব্যয় হয়, তার বেশির ভাগই যায় ছোট অংশটিতে। তাই আসল রানগুলো দেখাই, তারপর সমালোচকদের কথারও যথাযথ জবাব দিই। কারণ এই যুক্তির একটি ভুল সংস্করণ আছে, আর আমি কোন সংস্করণটি বলছি তা জানা জরুরি।
একটি সিগন্যাল, ধরে রাখার 6টি পদ্ধতি
সিগন্যাল: Binance USDⓈ-M-এ ETHUSDT perpetual, 1-ঘণ্টার বার; 12-ঘণ্টার EMA 96-ঘণ্টার EMA-র ওপরে থাকলে লং, অন্যথায় ফ্ল্যাট, শর্ট নেই। জুলাই 2022 থেকে জুন 2026। 431টি রাউন্ড ট্রিপ। দুই দিকেই taker ফি 5.0 bps, প্রকৃত পজিশনের ওপর প্রতি 8 ঘণ্টায় ফান্ডিং দেওয়া বা নেওয়া হয়েছে, আর স্লিপেজ হিসাব করা হয়েছে টপ-অফ-বুক ডেপথ ধরে। সিগন্যালটি ইচ্ছে করেই একঘেয়ে—এটি বেছে নিয়েছি কারণ কেউই এর পক্ষ নেবে না, ফলে পরীক্ষার জন্য পরিষ্কার ভিত্তি পাওয়া যায়।
নিচের প্রতিটি সারিতে এন্ট্রি ও এক্সিট বারের টাইমস্ট্যাম্প হুবহু এক। পার্থক্য শুধু সাইজিং ফাংশনে।
| সাইজিং নিয়ম | নেট Sharpe | সর্বোচ্চ DD | বছরে ট্রেড করা নোটিয়নাল (গড় পজিশনের × গুণ) | গ্রস PnL-এর কত % খরচ হয়েছে | সর্বোচ্চ লিভারেজ |
|---|---|---|---|---|---|
| স্থির $10k নোটিয়নাল | 0.41 | 18.2% | 246× | 14% | 1.0× |
| স্থির অনুপাত, ইকুইটির 100% | 0.44 | 30.8% | 251× | 15% | 1.0× |
| 20 দিনের realized vol-এর বিপরীত অনুপাতে | 0.68 | 14.1% | 690× | 29% | 4.4× |
| 20% বার্ষিক ভোলাটিলিটি টার্গেট, প্রতি ঘণ্টায় রিব্যালেন্স, কোনো সীমা নেই | 0.71 | 12.9% | 1,180× | 41% | 6.3× |
| 20% ভোলাটিলিটি টার্গেট, 20% নো-ট্রেড ব্যান্ড, 3× লিভারেজ সীমা | 0.66 | 15.3% | 402× | 19% | 3.0× |
| 60 দিনের রোলিং গড়/ভ্যারিয়েন্সের ওপর হাফ-Kelly | 0.52 | 24.6% | 830× | 33% | 8.1× |
ফারাকটা দেখুন। সবচেয়ে খারাপ আর সেরা সারির মধ্যে Sharpe-এ 73% আপেক্ষিক পার্থক্য, আর ড্রডাউনে 2.4 গুণ ফারাক। এবার এই ডেটাসেটে এমন একটি এন্ট্রি-সিগন্যাল প্যারামিটার দেখান, যা স্পষ্ট ওভারফিটিং ছাড়া Sharpe 0.30 বাড়ায়। আমি খুঁজেছি। পুরো যুক্তিসংগত গ্রিডে EMA জোড়ার দৈর্ঘ্য Sharpe-এ প্রায় 0.12 পরিবর্তন আনে, আর এর বেশির ভাগই এমন নয়েজ যা OOS-এ ধরে রাখা যায় না।
ইনভার্স-ভল এত ভালো দেখায় কেন, আর এর কতটা আসল
এর পেছনের প্রক্রিয়াটা রহস্যময় নয়। স্থির নোটিয়নালে আপনার পজিশনের আকারের সঙ্গে realized volatility-র কোনো সম্পর্ক থাকে না। ফলে প্রতি ট্রেডে ডলারে ঝুঁকি ওই সপ্তাহের ভোলাটিলিটির সমানুপাতে ওঠানামা করে। এই সময়ে ETH-এর 20 দিনের realized vol বার্ষিক হিসাবে 31% থেকে 118% পর্যন্ত ছিল। স্থির-নোটিয়নাল রানে জুলাই 2023-এর তুলনায় মার্চ 2024-এ ডলারে ঝুঁকি ছিল 3.8× বেশি—সিগন্যাল বেশি আত্মবিশ্বাসী ছিল বলে নয়, বাজার বেশি অস্থির ছিল বলে। এর প্রায় পুরো ড্রডাউনই ভোলাটিলিটির শীর্ষ 20% সময়ে কেন্দ্রীভূত। ইনভার্স-ভল সাইজিং এই সংযোগ সরিয়ে দেয়, আর সেটি সরানো রিটার্নের প্রবাহকে সত্যিই উন্নত করে।
তবে Sharpe বৃদ্ধির একাংশ পরিমাপের কৌশলগত ফল, আর দুটোকে আলাদা না করলে পরের ধাপে ভুল সিদ্ধান্ত নেবেন। Sharpe রিটার্নের স্ট্যান্ডার্ড ডেভিয়েশন দিয়ে ভাগ করা হয়। ভোলাটিলিটি টার্গেটিং সংজ্ঞা অনুযায়ী রিটার্নের স্ট্যান্ডার্ড ডেভিয়েশন স্থিতিশীল করার প্রক্রিয়া। অর্থাৎ আপনি সরাসরি হরটিকেই অপ্টিমাইজ করছেন। যে নিয়ম পজিশনের আকার বদলে আগাম নির্ধারিত স্থির vol-এ পৌঁছায়, vol clustering থাকা প্রায় যেকোনো রিটার্ন প্রবাহেই Sharpe বাড়াবে—এমনকি কোনো edge না থাকলেও। shuffled সিগন্যাল দিয়ে এটি যাচাই করেছি: এন্ট্রির টাইমস্ট্যাম্প এলোমেলো করে, vol-target overlay অপরিবর্তিত রাখলে, শূন্য-গড় ভিত্তিতেও Sharpe স্থির নোটিয়নালের তুলনায় প্রায় 0.06 বাড়ে। বৃদ্ধি সামান্য, তবে শূন্য নয়, এবং পুরোটা প্রক্রিয়াগত।
তাই ভেতরে ভেতরে সাইজিং নিয়ম তুলনা করার সময় Sharpe কখনোই শিটের একমাত্র সংখ্যা নয়। আমি Calmar চাই, গড়ে নিয়োজিত নোটিয়নালের প্রতি এককে নেট PnL চাই, আর গ্রস-টু-নেট হিসাবের ধারাবাহিক বিবরণ চাই। এই তিনটি একসঙ্গে থাকলে হরের কৌশলে ফল সাজানো অনেক কঠিন।
ভোলাটিলিটির অনুমান একটি মডেল, আর মডেলের মতোই এতে লিকেজ হয়
ভালো সাইজিং ফল ভুয়া হওয়ার সবচেয়ে সাধারণ কারণ: ভোলাটিলিটির অনুমানে সেই বারের তথ্য ব্যবহার করা হয়েছে, যার জন্য সাইজ নির্ধারণ করা হচ্ছে। আপনার vol সিরিজ যদি centered window দিয়ে হিসাব করা হয়, অথবা বর্তমান আংশিক বার থাকা resample-এর পরে pandas-এর default `rolling().std()` দিয়ে হিসাব হয়, অথবা পুরো sample-কে standardize করে আসে, তাহলে লিকেজ আছে। ব্যাপারটা সূক্ষ্ম, কারণ vol স্থায়ী থাকে; তাই যেকোনো একটি সারিতে লিকেজ সামান্য হয়, আর ইকুইটি কার্ভও বিশ্বাসযোগ্য দেখায়। শুধু যে সপ্তাহগুলো গুরুত্বপূর্ণ, ঠিক সেগুলোতেই কার্ভটা একটু বেশিই মসৃণ লাগে।
কোনো ফল paper-trading queue-তে যাওয়ার আগে আমাদের agents প্রতিটি সাইজিং নিয়মে 4টি বিষয় যাচাই করে:
- সিদ্ধান্তের সময় তথ্যের প্রাপ্যতা। 14:00-এ খোলা বারে ব্যবহৃত সাইজ হিসাব করা যাবে এমন ডেটা থেকে, যার close timestamp ≤ 13:59:59.999। এলোমেলোভাবে নেওয়া 200টি সিদ্ধান্তের সময়ে truncated frame থেকে সাইজ সিরিজ আবার হিসাব করে পার্থক্য মিলিয়ে আমরা এটি নিশ্চিত করি।
- Estimator-এর lookback-ও একটি প্রকৃত প্যারামিটার। 20 দিনের vol window আর 60 দিনের vol window দুটি আলাদা কৌশল। অন্য সবকিছুর সঙ্গে lookback-ও walk-forward grid-এ যায়। ফল যদি কেবল একটি window দৈর্ঘ্যেই কাজ করে, তবে কৌশলটির ভঙ্গুরতা সম্পর্কে সেটিও একটি গুরুত্বপূর্ণ তথ্য।
- শুধু সর্বোচ্চ লিভারেজ নয়, পুরো লিভারেজের গতিপথ। গ্রস লিভারেজের সম্পূর্ণ বণ্টন দেখান। ওপরের uncapped vol-target রানে 4% সময় 5×-এর বেশি লিভারেজ ছিল। সারসংক্ষেপের টেবিলে এমন তথ্য কখনো দেখা যায় না, অথচ কৌশলটি বাস্তবে চালানো যাবে কি না, তা পুরোপুরি এর ওপর নির্ভর করে।
- দৃঢ়তা যাচাইয়ে সাইজিংয়ের সংবেদনশীলতা। ভোলাটিলিটি টার্গেট 20% থেকে 25% করলেই Sharpe ধসে পড়লে, কৌশলটি ভোলাটিলিটি টার্গেট করছে না; এটি লিভারেজের সঙ্গে খাপ খাওয়ানো হচ্ছে, আর একটি নির্দিষ্ট সংখ্যা বেছে নিয়েই আপনি edge পেয়েছেন।
লিভারেজ সীমা ঝুঁকি ব্যবস্থাপনার বাড়তি সাজসজ্জা নয়; এটি কৌশলের সংজ্ঞারই অংশ। পজিশনের নোটিয়নাল বাড়লে Binance-এর ETHUSDT tier সর্বোচ্চ লিভারেজ কমায়, আর সঙ্গে maintenance margin rate-ও ধাপে ধাপে বাড়ে। যে ব্যাকটেস্ট vol-target নিয়মকে $400k নোটিয়নালে 6.3× পর্যন্ত যেতে দেয়, সেটি এমন একটি পজিশনের বর্ণনা দিচ্ছে যা ওই মার্জিনে এক্সচেঞ্জ ধরে রাখতে দেবে না। টেবিলের capped সারিতে Sharpe 0.05 কম, কিন্তু দুটির মধ্যে বাস্তব কোনো কিছুর বর্ণনা শুধু এটিই দেয়।
রিব্যালেন্সেই খরচ হয় টাকা
খরচের কলামটি লক্ষ করুন। ভোলাটিলিটি টার্গেটে পৌঁছাতে প্রতি ঘণ্টায় রিব্যালেন্স করলে শিরোনামে সবচেয়ে ভালো Sharpe পাওয়া গেছে, আবার গ্রস PnL-এর 41% এক্সচেঞ্জকে দিতে হয়েছে। প্রতি পাশে 5 bps, সঙ্গে স্প্রেড ও ইমপ্যাক্ট যোগ করে বছরে গড় পজিশন নোটিয়নালের 1,180× ট্রেড করা হয়েছে। সহজ সমাধান মনে হতে পারে, নির্দিষ্ট সময়সূচিতে কম ঘন ঘন রিব্যালেন্স করা। ভালো সমাধান নো-ট্রেড ব্যান্ড: বর্তমান পজিশন টার্গেট থেকে নির্দিষ্ট সীমার বেশি সরে গেলেই শুধু আকার বদলান।
20% ব্যান্ডে বছরে ট্রেড করা নোটিয়নাল 1,180× থেকে 402×-এ নেমেছে—66% হ্রাস—আর Sharpe কমেছে 0.05। এখন পর্যন্ত 8টি সিগন্যালে এটি পরীক্ষা করেছি, ফলের ধরন একই: 15% থেকে 25% ব্যান্ডে টার্নওভারের এক-তৃতীয়াংশে ঝুঁকি নিয়ন্ত্রণের বেশির ভাগ সুবিধা পাওয়া যায়। আর 10%-এর নিচে নামলে 20 দিনের window দিয়ে যে পরিমাণ অনুমান করছেন, তাতে বাহ্যিক সূক্ষ্মতার জন্য ফি দেওয়া ছাড়া আর কিছু হয় না। স্ট্যান্ডার্ড এরর 15% এমন একটি সংখ্যার বিপরীতে আপনি তিন দশমিক ঘর পর্যন্ত রিব্যালেন্স করতে পারেন না।
ফেব্রুয়ারিতে একবার দেখা গেল, এক agent-এর রিপোর্টে 0.22 Sharpe উন্নতির কৃতিত্ব দেওয়া হয়েছিল “উন্নত এন্ট্রি ফিল্টার”-কে। sizing module-এ বদলেছিল এক লাইন। ফিল্টার অপরিবর্তিত ছিল। এখন রিপোর্টের শুরুতে sizing config hash দেখাই, কারণ ফলের কৃতিত্ব ঠিকভাবে নির্ধারণ করাও একটি নিয়মশৃঙ্খলা, আর অন্য সবার মতো মডেলও গুছিয়ে গল্প বলতে ভালোবাসে।
paper trading-এ আপনার সাইজিং নিয়মের কী হয়
ব্যাকটেস্ট আর paper trading-এর ফারাক এখানে সবচেয়ে বেশি হয়, আর এর কারণ মূলত সাধারণ অঙ্ক। ভোলাটিলিটির সঙ্গে বদলানো সাইজিংয়ে sample জুড়ে আপনার পজিশনের আকার 4 থেকে 8 গুণ পর্যন্ত ওঠানামা করে। এই সীমার দুই প্রান্তেই এমন exchange constraint আসে, যা ব্যাকটেস্টে মডেল করা হয়নি।
ছোট প্রান্তে আছে step size ও minimum notional। ETHUSDT perp-এ quantity step 0.001 আর minimum $5। কম-ভোলাটিলিটির সময় আপনার সাইজ যদি 0.0004 ETH হয়, ব্যাকটেস্ট সেটি ধরে রাখে, কিন্তু paper trading-এ কিছুই ধরা হয় না। শুনতে ব্যতিক্রমী মনে হতে পারে, যতক্ষণ না বোঝেন vol-target নিয়ম তার সবচেয়ে ছোট সাইজগুলো দেয় শান্ততম বাজারে—যা ট্রেন্ড সিগন্যালের ক্ষেত্রে প্রায়ই ভালো এন্ট্রির সময়। বড় প্রান্তে আছে পজিশন সীমা, মার্জিন tier, আর 6× পজিশনের জন্য বিচ্ছিন্ন-মার্জিন ব্যবস্থাপনার প্রয়োজন—যার জন্য আপনি liquidation model দিয়ে ব্যাকটেস্টই করেননি।
একটি ক্ষেত্রে দেখেছিলাম, 6 সপ্তাহ ধরে paper-এর ইকুইটি কার্ভ ব্যাকটেস্টের 3%-এর মধ্যে ছিল, তারপর হঠাৎ অনেক দূরে সরে যায়। কারণ ছিল rounding: order sizer-এ rounding-to-step-এর বদলে `int()` truncation, গড়ে 1.4 step-এর পজিশনে প্রয়োগ করা হয়েছিল। ব্যাকটেস্ট সাইজ করছিল অবিচ্ছিন্ন মানে, আর live sizer প্রতিটি ছোট ট্রেডে কাঙ্ক্ষিত পজিশনের 20-30% বাদ দিচ্ছিল। ফিল মডেলের কোনো বিচিত্রতা নয়, latency-র গল্পও নয়। Truncation।
সমালোচকেরা যেখানে ঠিক
তিনটি আপত্তি যথার্থ, আর সেগুলো পাশ কাটিয়ে আমি কথাটা বিক্রি করতে চাই না।
প্রথমত, এবং সবচেয়ে গুরুত্বপূর্ণ: সাইজিং edge বরাদ্দ করে, edge বানাতে পারে না। বাস্তবসম্মত ফি ও ফান্ডিং বাদ দেওয়ার পর আপনার সিগন্যালের গ্রস প্রত্যাশিত রিটার্ন শূন্য বা তার নিচে হলে, টেবিলের প্রতিটি নিয়মেই টাকা হারাবেন—চটকদার নিয়মগুলো শুধু আরও সুন্দর ভ্যারিয়েন্স প্রোফাইলে হারাবে। এই সময়সীমায় সামান্য হলেও পজিটিভ নেট edge আছে এমন সিগন্যাল বেছেছি। প্রতি ট্রেডে নেট −1.2 bps সিগন্যালে একই 6টি নিয়ম চালালে ক্রম একই থাকবে, কিন্তু সব ক্ষেত্রেই শেষের ইকুইটি শুরুর চেয়ে কম হবে। সাইজিং কোনো কিছুর গুণক। সেই “কিছু” আপনার দরকার।
দ্বিতীয়ত, ভোলাটিলিটি টার্গেটিংয়ের একটি বাস্তব ও সুপরিচিত ব্যর্থতার ধরন আছে: দ্রুত দরপতনের একেবারে নিচে এটি লিভারেজ কমায়, আর দ্রুত প্রত্যাবর্তনের পরে আবার বাড়ায়। তীব্র V-আকৃতির বাজারে স্থির নোটিয়নাল জেতে, কখনো অনেক ব্যবধানে। ইকুইটিতে মার্চ 2020-এর ঘটনা এবং ক্রিপ্টোতে আগস্ট 2024-এর পতন—দুটিতেই পুনরুদ্ধারের ধাপে ভোলাটিলিটি-নির্ভর সাইজিং ক্ষতিগ্রস্ত হয়েছে। ETH-এর আমার 4 বছরের window-তে V-আকৃতির ওঠানামার চেয়ে ভোলাটিলিটি-গুচ্ছের মধ্যে দীর্ঘ ওঠানামা বেশি, তাই ইনভার্স-ভল সারিগুলো সুবিধা পেয়েছে। অন্য সময়সীমায় কিছু ক্রম উল্টে যায়, আর 2020-এর টেবিল দিয়ে শুরু করলে এই যুক্তির দুর্বল সংস্করণই তুলে ধরতাম।
তৃতীয়ত, সাইজিং নিয়মও অন্য যেকোনো কিছুর মতোই overfit হতে পারে। আমার টেবিলের Half-Kelly-ই তার স্পষ্ট উদাহরণ: দেখতে জটিল, তত্ত্বের ভিত্তিও আছে, কিন্তু দ্বিতীয়-সবচেয়ে বড় ড্রডাউন দিয়েছে। কারণ নয়েজপূর্ণ রিটার্ন সিরিজের রোলিং গড়ের অনুমান একেবারেই নির্ভরযোগ্য নয়, আর Kelly সেই অনুমানের প্রতি ভীষণ সংবেদনশীল। প্রত্যাশিত রিটার্নের অনুমান ইনপুট হিসেবে নেওয়া যেকোনো সাইজিং নিয়ম ওই অনুমানের ভুল উত্তরাধিকারসূত্রে পায়, তাও বাড়িয়ে। শুধু ভ্যারিয়েন্সের অনুমান ব্যবহার করা নিয়ম অনেক বেশি স্থিতিশীল, কারণ 4 বছরের ঘণ্টাভিত্তিক ডেটা থেকে বাস্তবে নির্ভরযোগ্যভাবে অনুমান করা যায়—একমাত্র সেই মুহূর্তটি।
এসব থেকে আমি যা মনে রাখব: ব্যাকটেস্টের ফল দেখে অবাক হলে সিগন্যালে নতুন কৌশল খোঁজার আগে sizing module দেখুন। আর Sharpe রিপোর্ট করার সময় তার পাশে লিভারেজের গতিপথ ও খরচের পূর্ণ হিসাবও দিন, কারণ সাইজিংয়ের সিদ্ধান্তের ওপর এতটা নির্ভরশীল সংখ্যা সিগন্যালের নিজস্ব বৈশিষ্ট্য নয়।
← সব পোস্ট