یک پرسش هست که هر بکتستی از آن طفره میرود: آیا همان کد، اگر همان بازار را بهصورت زنده دریافت میکرد، همان کار را انجام میداد؟ این را نمیشود با بکتست بیشتر پاسخ داد. تنها راه پاسخ این است که استراتژی را روی دادهٔ زنده و با معناشناسی اجرای واقعی اجرا کنید و بعد — معامله به معامله — بررسی کنید که این دو دنیا با هم میخوانند یا نه. ما این بررسی را هر روز و بهصورت خودکار انجام میدهیم و این پربازدهترین باگیاب کل پلتفرم بوده است.
روز اول: ساختن آینه
هر استراتژی ارتقایافته در نود زندهٔ ایزولهٔ خودش اجرا میشود و استریمهای واقعی صرافی را مصرف میکند: مظنههای زنده برای فیلها، اسپردهای واقعی، ساعات معاملاتی واقعی. هیچ وضعیت مشترکی بین استراتژیها وجود ندارد (این یکی را به سختی یاد گرفتیم — یک نود مشترک باعث میشد کوئریهای پوزیشن یک استراتژی به استراتژی دیگر نشت کند). هر فیل به همراه مقدار سیگنالی که آن را تولید کرده ثبت میشود.
هر صبح: بازپخش و مقایسه
یک جاب روزانه بازهٔ کاغذی هر استراتژی را برمیدارد، دقیقاً همان کد را در همان بازه روی دادهٔ کاتالوگ از موتور بکتست عبور میدهد و فیلها را یکبهیک تطبیق میدهد: همان سمت، همان تلورانس زمانی، همان اندازه. خروجی یک ضریب همبستگی یا یک حسوحال کلی نیست؛ یک جدول است: تطبیقشده، فقطکاغذی، فقطبازپخش. یک استراتژی سالم روی ۵۴ از ۵۵ تطبیقشده مینشیند. استراتژی ناسالم دقیقاً به شما میگوید کدام معامله و در چه زمانی واگرا شده است.
چه چیزهایی خراب شد، به ترتیب خرابشدن
- فیلهای دورهٔ گرمکردن. نود زنده برای گرمکردن اندیکاتورها تاریخچه را تغذیه میکرد — و استراتژیهایی که هندلر کندل سفارشی داشتند با کمال میل روی همان داده معامله میکردند. بکتستها هرگز این ورودهای شبحوار را نمیدیدند. راهحل یک محافظ در لایهٔ ثبت سفارش بود، نه اصلاح تکتک استراتژیها، چون در غیر این صورت همهٔ استراتژیها این باگ را به ارث میبرند.
- گرمکردن ترتیبی در حالت چندپایه. یک استراتژی مقطعی، ابزارها را یکییکی گرم میکرد؛ هر پایه، پایههای دیگر را خالی میدید و لنگر هرگز مقداردهی اولیه نمیشد. در حالت زنده هیچ معاملهای نمیکرد؛ در بازپخش بیعیب معامله میکرد. صفر معاملهٔ تطبیقشده — و فقط مقایسه بود که این را با صدای بلند گفت.
- حلقههای کرش بر سر دقت تیک. تیکهای زندهٔ aggTrade با دقتی متفاوت از آنچه ابزار سندباکس انتظار داشت میرسند. نود روی assertionای وارد حلقهٔ کرش میشد که بکتست هرگز نمیتوانست آن را فعال کند، چون کندلهای کاتالوگ از پیش نرمالسازی شدهاند.
- فراموشی پس از ریاستارت. ریاستارت پروسه، منطق ورود را روی پوزیشنهایی که از قبل وجود داشتند دوباره فعال میکرد — برای یک استراتژی متعادلسازی، هر ریاستارت بیسروصدا تبدیل به یک متعادلسازی میشد. در معاملهٔ زنده این یک پانویس در گزارش تطابق نیست؛ یک پرچم قرمز است که پول به آن گره خورده.
به الگو توجه کنید: هیچکدام از اینها باگ سیگنال نیستند. همه باگ مرز اجرا هستند — گرمکردن، وضعیت، دقت، ریاستارت. این دقیقاً همان دسته از خرابیهاست که بکتست ساختاراً نسبت به آن کور است، چون در یک بکتست خودِ موتور بکتست همان مرز اجراست.
عدمتقارنهایی که عمداً نگه میداریم
این دو دنیا عامدانه یکسان نیستند. بکتست یک نیماسپرد مدلشده بهعلاوهٔ اثر جذر را درون PnL لحاظ میکند؛ معاملهٔ کاغذی اسپرد واقعی را در قیمت فیل میپردازد و هیچ مدل اثری ندارد. افزودن اسپرد مدلشده به معاملهٔ کاغذی (یا اسپرد واقعی به بکتست) یعنی محاسبهٔ دوباره و مضاعف. تطابق یعنی تصمیمهای یکسان، فیلهای یکسان در محدودهٔ تلورانس — نه PnL بیتبهبیت یکسان. دانستن اینکه کدام تفاوت اصولی است و کدام باگ، بخش عمدهٔ این انضباط است.
بکتست یک فرضیه است. معاملهٔ کاغذی آزمایش است. تطابق بازپخش همان دفترچهٔ آزمایشگاه است که مچ شما را موقع گولزدن خودتان میگیرد.
اگر استراتژی اجرا میکنید و رفتار زنده را بهصورت زمانبندیشده با رفتار بازپخش مقایسه نمیکنید، دستهای از باگها دارید که هرگز ندیدهاید. ما تقریباً هر دو هفته یکی از آنها را پیدا میکنیم و هر کدام از درون بکتست کاملاً نامرئی بودند.
← همهٔ مطالب
