CryptoLowVolAnomalySpotBasketLongOnly
فرضیهها
ناهنجاری کمنوسانی رمزارز، انتخاب فقط-خرید (بدون پایه فروش استقراضی): نگهداری 5 نام با نوسان واقعیشده LOWEST از یک مجموعه اسپات نقدشونده ثابت 25-کوین، هموزن، بازتوازن 10-روزه روی کندلهای DAILY، پرتفوی مقیاسشده به هدف نوسان پیشینی 15% — OHLCV خالص، بدون دروازه، بدون فید مکمل
فرضیهها
یک استراتژی مقطعی (cross-sectional) LONG-ONLY، SELECTION-BASED (بهطور صریح NOT دلار-خنثی (dollar-neutral)، NOT بتا-هجشده (beta-hedged)، NO پایهی فروش (short leg)) روی BINANCE_SPOT در سراسر یک جهان نقدشوندهی FIXED 25-نمادی. در هر 10اُمین کندل روزانه، هر ارز بر اساس نوسانپذیری تحققیافتهی 20-روزهی متحرک خودش رتبهبندی میشود و 5 LOWEST بهصورت هموزن نگهداشته میشوند؛ سپس کل سبد با یک ضریب واحد min(1.0, 0.15 / mean_RV_of_the_5) مقیاسدهی میشود تا پرتفوی نوسانپذیری سالانهی هدفِ ~15% را داشته باشد و هرگز از ارزش اسمی (notional) 1.0x فراتر نرود (بدون اهرم، حساب نقدی). هیچ جملهی مومنتوم، هیچ فیلتر روند، هیچ دروازهی رژیم (regime gate)، هیچ فید مکمل، و هیچ پارامتر آستانهای وجود ندارد — نوسانپذیری تحققیافته سیگنالِ ENTIRE است و بهعنوان یک RANK استفاده میشود، نه بهعنوان یک دروازهی روشن/خاموش.
من این را پیش از پیشنهاد دادنش، روی کاتالوگ، اندازهگیری کردم نه اینکه صرفاً ادعا کنم. با رمزگشایی مستقیمِ کندلهای نقطهثابت (fixed-point) ناوتیلوس (BINANCE_SPOT روزانه، 25/25 نماد حاضر، 2017-10-27 -> 2026-09-19، ~9 سال)، پیکربندی بالا بازده شارپ +0.74 NET از کل چرخهی رفتوبرگشت (round-trip) اسپات 0.20%، بازده سالانهی 13.4% با نوسانپذیری 18.1%، حداکثر افت سرمایه (max drawdown) -33.6%، 430 ورود (entries)، و میانگین بازدهی هر معامله برابر با 1.37% از ارزش اسمی موقعیت را برمیگرداند. به تفکیک سال تقویمی: 2018 -19%، 2019 +17%، 2020 +49%، 2021 +40%، 2022 -26%، 2023 +40%، 2024 +41%، 2025 +6%، 2026 -5% — 6 از 9 سال مثبت بوده، و استراتژی از BOTH بازار نزولی (bear market) کامل جان سالم به در برده است.
CRITICAL ROBUSTNESS EVIDENCE (این یک بررسی تکرارپذیری (replication check) است، NOT یک پایهی جایگزین (proxy leg) — این استراتژی فقط BINANCE_SPOT معامله میکند): همان قانون رتبهبندی بهطور مستقل روی BYBIT پرپچوالهای خطی (linear perps) و BINANCE USD-M پرپچوالها اجرا شد. در یک بازهی زمانی همتاریخشدهی 2022-2026، دو صرافی تا رقم اعشار دوم توافق دارند — شارپِ کمترین-نوسان +0.58 (بایبیت) در برابر +0.57 (بایننس)، بیشترین-نوسان +0.11 در برابر +0.11، بازده سالانه 31.0% در برابر 30.4% — در برابر یک بنچمارک هموزن +0.25/+0.21. همین اثر در سه پایپلاین دادهی مستقل از صرافیهای مختلف بازتولید میشود. در یک بازهی زمانی همترازنشده، به نظر میرسید صرافیها اختلاف دارند (0.38 در برابر 1.01)؛ اما این صرفاً یک مصنوع (artifact) ناشی از شروع تاریخچهی داده بود (جهانِ بایبیت پیش از 2022 ناقص است)، که آن را جدا کردم بهجای اینکه بهعنوان یک نتیجه گزارش دهم.
علت اقتصادی و WHO PAYS: این همان ناهنجاری نوسانپذیری پایین / ترجیح لاتاری (low-volatility / lottery-preference anomaly) است (بالی-کاچیچی-وایتلاو؛ فرازینی-پدرسن)، و ارزهای دیجیتال خالصترین زیستگاه آن هستند. ارزهایی با نوسانپذیری تحققیافتهی بالا جایی هستند که جریان خردهفروشی بهدنبال اهرم و بهدنبال لاتاری متمرکز میشود — قیمت آنها بالا برده میشود چون خریداران برای CHANCE یک بازدهی بزرگ پول میپردازند، نه برای بازدهی مورد انتظار. آن خریداران طرف مقابل معامله هستند: آنها بهطور سیستماتیک بیش از حد برای نوسانپذیری میپردازند و بازدهی تعدیلشده با ریسک ضعیفی را میپذیرند. این اندازهگیری بارز است و ادعای اصلی قابل ابطال (falsifiable) به شمار میرود — در طول 2022-2026، 5 نامهای با نوسانپذیری HIGHEST بازدهی سالانهی ~9% داشتند در حالی که 5 LOWEST بازدهی ~31% داشت، در حالی که سبد با نوسان بالا تقریباً دو برابر نوسانپذیری داشت. این صرفپرمیوم (premium) یک اثر روند-قیمتی نیست: من تأیید کردم که رتبهبندی بر اساس مومنتوم متحرک روی بازههای زمانی صادقانهی غیرهمپوشان (non-overlapping) پروفایلی متفاوت و ضعیفتر (t=+1.25) نسبت به رتبهبندی نوسانپذیری (t=+3.30 خام، +2.53 خوشهبندیشده بر اساس تاریخ) ایجاد میکند.
فرضیهها
جهانِ 25-نمادیِ فرضیه و حداکثر مواجههی ناخالص (gross exposure) 1.0 را بازمیگرداند، در حالی که مکانیزم خالصِ رتبهبندیِ نوسانپذیری پایینِ OHLCV را حفظ میکند.
فرضیهها
verification_loop: تأیید (verification) با شکست مواجه شد (لایه 2 — سناریوهای مصنوعی):
پارامترهای استفادهشده: ['n_hold', 'cash_buffer', 'min_notional', '_param_bounds', 'rebalance_days', 'rv_lookback_days', 'target_annual_vol', 'max_gross_exposure', 'rebalance_tolerance']
بررسی کنید که __init__ تمام ویژگیها (attributes) را از self.parameters.get() تنظیم میکند.
- steady_uptrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
پیادهسازی
سبد اسپات بایننس با موقعیت خرید (long-only) که پنج نماد با کمترین نوسانپذیری تحققیافته (realized volatility) را از یک جهان ثابت 25 ارزی نگه میدارد، هر ده کندل روزانه یکبار توازن مجدد (rebalance) میشود و به سمت نوسانپذیری سالانه 15% با سقف ناخالص (gross cap) 1.0x مقیاسدهی میشود.
نتایج تأیید
تأیید (verification) با شکست مواجه شد (لایه 2 — سناریوهای مصنوعی):
پارامترهای استفادهشده: ['n_hold', 'cash_buffer', 'min_notional', '_param_bounds', 'rebalance_days', 'rv_lookback_days', 'target_annual_vol', 'max_gross_exposure', 'rebalance_tolerance']
بررسی کنید که __init__ تمام ویژگیها (attributes) را از self.parameters.get() تنظیم میکند.
- steady_uptrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
خلاصه نتیجه
CryptoLowVolAnomalySpotBasketLongOnl-7a915cf1a2
خلاصه نتیجه
این استراتژی یک سبد اسپات بایننس با موقعیت خرید (long-only) را آزمایش کرد که پنج ارز با کمترین نوسانپذیری را از یک جهان 25 ارزی نگه میداشت. اگرچه فرضیه نتایج تاریخی مثبتی گزارش کرده بود، تأیید (verification) در تمام سناریوهای مصنوعی به دلیل یک TypeError مربوط به Decimal/float با شکست مواجه شد، بنابراین استراتژی پیش از بکتست یا بهینهسازی کنار گذاشته شد.
خلاصه نتیجه
اطمینان حاصل کنید که محاسبات Decimal و float پیش از تأیید مصنوعی (synthetic verification) بهطور یکسان مدیریت میشوند.
خلاصه نتیجه
این استراتژی پس از سه تکرار (iteration) کنار گذاشته شد زیرا تأیید لایه 2 با شکست مواجه شد: هر شش سناریوی مصنوعی یک TypeError مربوط به Decimal/float ایجاد کردند. مراحل بعدی مورد بررسی قرار نگرفتند.
خلاصه نتیجه
این استراتژی تلاش میکرد با نگهداشتن پنج نماد با کمترین نوسانپذیری تحققیافته از یک جهان ثابت 25 ارزی اسپات بایننس، از یک ناهنجاری (anomaly) نوسانپذیری پایین در ارزهای دیجیتال بهرهبرداری کند.
خلاصه نتیجه
فرضیه یک نسبت شارپ خالص 0.74، بازده سالانه 13.4%، حداکثر افت سرمایه (maximum drawdown) -33.6%، 430 ورود (entries)، و میانگین بازده هر معامله 1.37% را گزارش کرد. هیچ گزارش بکتست یا بهینهسازی پایپلاین ثبت نشد.
Iteration History
شکست تأیید (لایه 4 — بازبینی QA) [کلاس=code_defect]:
- [edge_concern] اقتصاد سندباکس سالم و از نظر درونی سازگار است، بنابراین سودآوری NOT دلیل این شکست نیست. avg_trade_return_pct 3.73% × avg_position_pct 8.25% × 95 معامله = ~29% از سرمایه در برابر total_return 32.07% — دفتر کل با منحنی سرمایه مطابقت دارد (بدون نقص حسابداری)، و 3.73%/معامله رفتوبرگشت 0.20% BINANCE_SPOT را با حاشیهای حدود 18x پوشش میدهد در حالی که کارمزدها تنها 2.64% ناخالص است. دو نکته برای انتقال به تحلیلگر: (1) شارپ گزارششده 0.547 از نظر درونی با CAGR 19.26% روی annualized_volatility 8.12% سازگار نیست — سری روزانه MTM تنها در 580 از 2401 روز حرکت کرده است، در حالی که پرتفوی بهطور پیوسته از حدود نوامبر-2022 پایههای اسپات 5 را نگه داشته است، بنابراین اعداد ریسکتعدیلشده (شارپ، سورتینو، نوسان، VaR، کالمار) نسبت به دفتر کل واقعی رقیقشده/پراکنده هستند. علامت را بیان کن، بدون ادعای علت. (2) انتساب رژیم از هماکنون نشان میدهد که رژیم آرام +42.6% (شارپ 1.40) در برابر رژیم عادی -4.1% و رژیم پرتنش -3.7% — یعنی صرف کمنوسانی در این نمونه یک پدیده مختص رژیم آرام است — اما این سهدهکها روی بازهای محاسبه شدهاند که اکثریتش صاف/بدون تغییر است (به مسئله بحرانی مراجعه کنید)، پس آنها را پس از رفع مشکل بازه دوباره بخوانید نه اینکه اکنون بر اساس آنها عمل کنید.
- [بحرانی] UNIVERSE MAKES 58% OF THE BACKTEST WINDOW STRUCTURALLY UNTRADEABLE، CORRUPTING EVERY RISK METRIC. سد همترازی بینپایهای قالب پایه (base_template.py _maybe_process_primary + _sync_extra_iids) کندل اصلی را تا زمانی که EVERY پایه اضافی همبازهای دقیقاً در همان برچسب زمانی کندل داشته باشد به تعویق میاندازد، و این استراتژی علاوه بر آن یک ردیف کامل در _row_for() نیاز دارد. من تاریخهای اولین کندل را در data/catalog برای همه پایههای 25 بررسی کردم: نامهای محدودکننده APTUSDT.BINANCE_SPOT (اولین کندل 1-DAY در 2022-10-20) و ICPUSDT.BINANCE_SPOT (2021-05-12) هستند. پایه اصلی BTCUSDT.BINANCE_SPOT از 2017-08-18 شروع میشود، و بکتست کامل هیچ تاریخ شروعی ارسال نمیکند (backtest_agent._run_backtest فقط `end` را میفرستد)، بنابراین موتور از 2017-08 تا 2026-09 (~9.1 سال) اجرا میشود، در حالی که پرتفوی نمیتواند اولین سفارش خود را تا حدود 2022-11-10 ثبت کند (APT لیستشدن + 21 ردیف همتراز گرمکردن). حدود 5.25 از 9.1 سال (58%) بهعنوان روزهای صاف 0.00% روی شبکه روزانه علامتگذاری میشوند. سندباکس دقیقاً همین را نشان میدهد: بازههای استرس covid_crash_2020، china_ban_2021، luna_collapse_2022 و rate_shock_2022 (ژانویه تا اکتبر) همگی دقیقاً 0.0000% برمیگردانند، در حالی که ftx_collapse_2022 (شروع از 2022-11-06) اولین بازه غیرصفر با مقدار -8.20% است. پیامدها، که هیچکدام قابل بازگشت توسط بهینهساز یا تحلیلگر نیستند: (الف) هدف فاز-2 شارپ محاسبهشده روی سریای است که اکثریتش صفر است — سندباکس 0.547 گزارش میدهد در حالی که CAGR همان پرتفوی روی بازه ACTIVEاش 19.26% است؛ (ب) تقریباً پنج سال تقویمی دقیقاً 0.00% گزارش خواهند داد و در برابر آستانه اعتبار سهم-سالهای-مثبت بهعنوان غیرمثبت شمرده میشوند؛ (ج) ادعاهای پیشثبتشده خود فرضیه — شارپ +0.74 روی 2017-2026، 6 از 9 سال مثبت، «زندهمانی از BOTH بازار نزولی کامل» (2018 -19%، 2022 -26%) — اصلاً قابل تولید نیستند، زیرا 2018 و ده ماه اول 2022 درون بازه مرده قرار دارند؛ (د) سهدهکهای رژیم نوسان واقعیشده روی سریای محاسبه شدهاند که اکثریتش روزهای مرده است. این یک نقص اندازهگیری/پیکربندی با راهحلی بدیهی است، نه بیانی درباره خود مزیت: منطق معاملاتی بهخودیخود درست است (به یادداشتها مراجعه کنید). (خط 49) — راهحل: مجموعهای انتخاب کنید که همه اعضای آن در بازهای که قصد اندازهگیری دارید وجود داشته باشند، و در دلیل پیکربندی مشخص کنید کدام بازه است. تاریخهای اولین کندل کاتالوگ برای 25 فعلی تأیید شد: APT 2022-10-20، ICP 2021-05-12، سپس FIL 2020-10-16 / AAVE 2020-10-16 / NEAR 2020-10-15 / AVAX 2020-09-23 / UNI 2020-09-18 / DOT 2020-08-19 / SOL 2020-08-12، سپس BCH 2019-11-29 / HBAR 2019-09-30 / DOGE 2019-07-06 / ALGO 2019-06-23 / ATOM 2019-04-30 / LINK 2019-01-17، سپس VET 2018-07-26 / ETC 2018-06-13 / TRX 2018-06-12 / XLM 2018-06-01 / XRP 2018-05-05 / ADA 2018-04-18، و BTC/ETH 2017-08-18، BNB 2017-11-07،
- [هشدار] اندازه خرید در یک چرخش با `available = get_account_equity() * cash_buffer` محدود شده است، خواندهشده AFTER خروج و فروشهای کاهشی در خطوط 279-298 ثبت میشوند. در بکتست این درست است زیرا SimulatedExchange در NT سفارشهای بازار را در همان تکرار موتور اجرا میکند، بنابراین موجودی USDT از هماکنون فروشها را منعکس میکند. در حالت مجازی/زنده اینطور نیست: سفارشهای بازار تا تیک بعدی معطل میمانند، بنابراین در چرخشی که 2-3 نام را برای تأمین مالی 2-3 نام جدید میفروشد، استراتژی نقدینگی پیش از فروش را میبیند، هر کسری را با `ratio < 1` مقیاس میکند، و کمتر از حد نیاز مستقر میشود. از آنجا که نامهای نگهداشتهشده فقط زمانی که خارج از باند تحمل +/-25% منحرف شوند دوباره اندازهگیری میشوند، این کسری ممکن است تا چرخش بعدی باقی بماند. این واگرایی بکتست/مجازی است، نه یک اشکال صحت بکتست. (خط 309) — راهحل: یا `available` را بهصورت (نقدینگی + ارزش اسمی خروجها/کاهشهای تازه ثبتشده) محاسبه کنید، یا بخش خرید یک چرخش را به کندل بعدی پس از تسویه فروشها موکول کنید (صف خریدِ با تأخیر یککندلی که با دوره بازتوازن کلیدگذاری شده است). اگر به همین صورت باقی بماند، این را صراحتاً در دلیل ذکر کنید تا بررسی برابری مجازی این واگرایی را نقص تلقی نکند.
- [هشدار] قطعی داده در یک پایه بهتنهایی کل پرتفوی را متوقف میکند. `_row_for()` مقدار None برمیگرداند مگر اینکه EVERY یکی از پایههای 25 کندلی دقیقاً با برچسب زمانی کندل اصلی داشته باشد، و سد قالب پایه بهطور مستقل کندل اصلی را در همین وضعیت مسدود میکند. نبود یک کندل روزانه در هر نام (شکاف جمعآوری، توقف صرافی) بهطور خاموش آن ردیف روز را رد میکند و در پنجره بازده لگاریتمی مورد استفاده برای نوسان واقعیشده یک حفره ایجاد میکند؛ نامی که کاملاً از انتشار داده بازمیایستد (حذف از لیست) استراتژی را برای همیشه با پوزیشنهای باز منجمد میکند. این رفتار محافظهکارانه است نه نادرست، اما نامرئی است — چیزی روزهای ردشده را ثبت یا شمارش نمیکند. (خط 88) — راهحل: ردیفهای ردشده را بشمارید (یک عدد صحیح `self._skipped_rows` بهطور خودکار توسط قالب پایه ذخیره میشود) و زمانی که یک پایه برای بیش از حدود 2 کندل اصلی متوالی غایب باشد هشدار ثبت کنید، تا حذف از لیست بهجای یک پرتفوی صاف خاموش، بهصورت یک تشخیص نمایان شود.
Iteration History
تأیید (verification) با شکست مواجه شد (لایه 4 — بازبینی QA) [class=hypothesis_mismatch]:
- [edge_concern] بکتست دودی (smoke backtest) سودآور است، اما عملکرد بهعنوان معیار صحت (correctness verdict) استفاده نمیشود.
- [critical] فرضیه به یک جهان ثابت 25 ارزیِ اسپات بایننس نیاز دارد، اما پیادهسازی فقط 14 ابزار (instrument) را پیکربندی میکند. بنابراین نگهداشتن 5 نماد، 5/14 را بهجای 5/25 انتخاب میکند و استراتژی مقطعی را بهطور معناداری تغییر میدهد. (خط 45) — راهحل: جهانِ دقیقِ 25-نمادی را در extra_instruments و extra_bar_types بازیابی کنید، سپس تأیید و بکتست را دوباره اجرا کنید. در غیر این صورت، فرضیه را بهطور رسمی به نسخهی 14-نمادی اصلاح کنید.
- [critical] فرضیه حداکثر مواجههی ناخالص 1.0x را مجاز میداند، اما پیادهسازی max_gross_exposure را روی 0.95 تنظیم میکند و آن را در 0.95 محدود میکند. (خط 29) — راهحل: از حداکثرِ 1.0 استفاده کنید یا بهطور صریح فرضیه را برای پیشثبت (pre-register) سقف 0.95 اصلاح کنید.
دلیل کنارگذاری
verification_loop: شکست تأیید (لایه 2 — سناریوهای مصنوعی):
پارامترهای استفادهشده: ['n_hold', 'cash_buffer', 'min_notional', '_param_bounds', 'rebalance_days', 'rv_lookback_days', 'target_annual_vol', 'max_gross_exposure', 'rebalance_tolerance']
بررسی کنید که __init__ همه ویژگیها را از self.parameters.get() تنظیم میکند.
- steady_uptrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
- price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (برچسب زمانی کندل: 1735692060000)
Stratmill ابزاری برای پژوهش و معامله آزمایشی است، نه مشاوره مالی یا کارگزار. نتایج بکتست و معامله آزمایشی فرضی هستند. معاملهگری با ریسک زیان همراه است.