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, יש לדרג כל מטבע לפי התנודתיות הממומשת (realized volatility) הנסוגה (trailing) של 20 ימים משלו, ולהחזיק את 5 LOWEST במשקל שווה (equal-weight); לאחר מכן כל התיק מכויל בגורם יחיד min(1.0, 0.15 / mean_RV_of_the_5) כך שהתיק מכוון ליעד תנודתיות שנתית של כ-15% ולעולם אינו חורג מ-1.0x ערך נקוב (notional) (ללא מינוף, חשבון מזומן). אין רכיב מומנטום, אין מסנן מגמה, אין שער משטר (regime gate), אין הזנה משלימה, ואין פרמטר סף — התנודתיות הממומשת היא ENTIRE האות (signal) והיא משמשת כ-RANK, לא כשער הפעלה/כיבוי.
מדדתי זאת לפני שהצעתי אותה, על הקטלוג, במקום לטעון זאת סתם. בפענוח ברי נקודה-קבועה (fixed-point) של Nautilus ישירות (BINANCE_SPOT יומי, 25/25 שמות נוכחים, 2017-10-27 -> 2026-09-19, כ-9 שנים), התצורה שלעיל מניבה Sharpe של +0.74 NET עבור מחזור מלא של קניה-מכירה (round-trip) ב-0.20% ספוט, תשואה שנתית של 13.4% על תנודתיות 18.1%, ירידה מקסימלית (max drawdown) של -33.6%, 430 כניסות, ותשואה ממוצעת לעסקה של 1.37% מהערך הנקוב של הפוזיציה. לפי שנה קלנדרית: 2018 -19%, 2019 +17%, 2020 +49%, 2021 +40%, 2022 -26%, 2023 +40%, 2024 +41%, 2025 +6%, 2026 -5% — 6 מתוך 9 שנים חיוביות, והיא שורדת BOTH שווקי דובים (bear markets) מלאים.
CRITICAL ROBUSTNESS EVIDENCE (זוהי בדיקת שכפול (replication check), NOT רגל פרוקסי (proxy leg) — האסטרטגיה סוחרת רק BINANCE_SPOT): אותו כלל דירוג הופעל באופן עצמאי על BYBIT חוזי perp לינאריים וכן על BINANCE USD-M חוזי perp. בחלון 2022-2026 מיושר-תאריכים, שתי הזירות (venues) מסכימות עד לספרה העשרונית השנייה — Sharpe לתנודתיות-נמוכה +0.58 (Bybit) לעומת +0.57 (Binance), תנודתיות-גבוהה +0.11 לעומת +0.11, תשואה שנתית 31.0% לעומת 30.4% — לעומת מדד ייחוס (benchmark) במשקל שווה של +0.25/+0.21. אותו אפקט משוחזר על פני שלושה צינורות נתונים עצמאיים של זירות. בחלון לא מיושר, נראה שהזירות אינן מסכימות (0.38 לעומת 1.01); זה היה אך ורק ארטיפקט של תחילת ההיסטוריה (היקום של Bybit אינו שלם לפני 2022), אותו בודדתי במקום לדווח עליו כתוצאה.
גורם כלכלי וWHO PAYS: זוהי אנומליית תנודתיות-נמוכה / העדפת-לוטו (low-volatility / lottery-preference anomaly) (Bali-Cakici-Whitelaw; Frazzini-Pedersen), והקריפטו הוא בית הגידול הטהור ביותר שלה. מטבעות בעלי תנודתיות ממומשת גבוהה הם המקום שבו מתרכזת תזרימת קמעונאים המחפשת מינוף ולוטו — הם נרכשים ביתר משום שהקונים משלמים עבור CHANCE של תשלום גדול, לא עבור תשואה צפויה. אותם קונים הם הצד שכנגד (counterparty): הם משלמים באופן שיטתי יתר על המידה עבור תנודתיות ומקבלים תשואות מותאמות-סיכון גרועות. המדידה חדה וזוהי הטענה הניתנת להפרכה (falsifiable) המרכזית — במהלך 2022-2026 השמות 5 HIGHEST-תנודתיות החזירו כ-9% שנתי בעוד 5 LOWEST החזירו כ-31%, כאשר הסל בעל התנודתיות הגבוהה נושא בערך כפול תנודתיות. הפרמיה אינה אפקט מגמת-מחיר: וידאתי שדירוג מומנטום נסוג (trailing-momentum) מניב פרופיל שונה וחלש יותר בחלונות לא-חופפים (non-overlapping) ישרים (t=+1.25) לעומת דירוג תנודתיות (t=+3.30 גולמי, +2.53 מקובץ-תאריכים (date-clustered)).
השערות
משחזר את יקום 25 השמות של ההשערה ואת החשיפה הגולמית המקסימלית 1.0, תוך שמירה על מנגנון דירוג התנודתיות-הנמוכה הטהור OHLCV.
השערות
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' (bar timestamp: 1735692060000)
- steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
מימוש
סל Binance Spot בפוזיציית קנייה בלבד (long-only) המחזיק את חמשת השמות בעלי התנודתיות הממומשת (realized volatility) הנמוכה ביותר מתוך יקום קבוע של 25 מטבעות, מאוזן מחדש (rebalanced) כל עשרה ברים יומיים, ומכויל לתנודתיות שנתית של 15% עם תקרת חשיפה גולמית (gross cap) של 1.0x.
תוצאות אימות
האימות נכשל (שכבה 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' (bar timestamp: 1735692060000)
- steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
סיכום תוצאה
CryptoLowVolAnomalySpotBasketLongOnl-7a915cf1a2
סיכום תוצאה
האסטרטגיה בדקה סל Binance Spot בפוזיציית קנייה בלבד (long-only) המחזיק את חמשת המטבעות בעלי התנודתיות הנמוכה ביותר מתוך יקום של 25 מטבעות. למרות שההשערה דיווחה על תוצאות היסטוריות חיוביות, האימות נכשל בכל תרחיש סינתטי עקב שגיאת TypeError בין Decimal ל-float, ולכן האסטרטגיה ננטשה לפני שלב הבקטסט או האופטימיזציה.
סיכום תוצאה
יש לוודא שחישובי Decimal ו-float מטופלים באופן עקבי לפני האימות הסינתטי.
סיכום תוצאה
היא ננטשה לאחר שלוש איטרציות (iterations) מכיוון שאימות שכבה 2 נכשל: כל ששת התרחישים הסינתטיים העלו שגיאת TypeError בין Decimal ל-float. השלבים המאוחרים יותר לא הושגו.
סיכום תוצאה
היא ניסתה לנצל אנומליית תנודתיות נמוכה בקריפטו (crypto low-volatility anomaly) על ידי החזקת חמשת השמות בעלי התנודתיות הממומשת הנמוכה ביותר מתוך יקום קבוע של 25 מטבעות ב-Binance Spot.
סיכום תוצאה
ההשערה דיווחה על Sharpe נטו של 0.74, תשואה שנתית של 13.4%, ירידה מקסימלית (maximum drawdown) של -33.6%, 430 כניסות (entries), ותשואה ממוצעת לעסקה של 1.37%. לא נרשם דוח בקטסט (backtest) או אופטימיזציה של הצינור (pipeline).
Iteration History
האימות נכשל (שכבה 4 — סקירת QA) [class=code_defect]:
- [edge_concern] כלכלת ה-sandbox בריאה ועקבית פנימית, כך שהרווחיות NOT הסיבה לכישלון זה. avg_trade_return_pct 3.73% x avg_position_pct 8.25% x 95 עסקאות = ~29% מההון לעומת total_return 32.07% — הפנקס מתיישב עם עקומת ההון (אין פגם חשבונאי), ו-3.73%/עסקה עוברת בבירור את סבב ה-0.20% BINANCE_SPOT בכ-18x כשהעמלות מהוות רק 2.64% מהברוטו. שני דברים שעל האנליסט לקחת הלאה: (1) ה-Sharpe המדווח 0.547 אינו עקבי פנימית עם CAGR 19.26% על annualized_volatility 8.12% — סדרת ה-MTM היומית זזה רק ב-580 מתוך 2401 ימים בעוד התיק מחזיק ברציפות רגלי 5 ספוט מ-~נוב-2022, כך שהמדדים המותאמי-סיכון (Sharpe, Sortino, תנודתיות, VaR, Calmar) מדוללים/דלילים ביחס לפנקס המתממש. ציין את הסימפטום, אל תטען סיבה. (2) ייחוס משטרים כבר מראה +42.6% רגוע (Sharpe 1.40) לעומת -4.1% רגיל ו--3.7% במצוקה, כלומר פרמיית התנודתיות-הנמוכה כאן היא תופעה של משטר רגוע במדגם זה — אך שלישונים אלה מחושבים על חלון שרובו שטוח (ראה את הבעיה הקריטית), אז יש לקרוא אותם מחדש לאחר תיקון החלון ולא לפעול לפיהם כעת.
- [critical] UNIVERSE MAKES 58% OF THE BACKTEST WINDOW STRUCTURALLY UNTRADEABLE, CORRUPTING EVERY RISK METRIC. מחסום היישור בין רגליים (cross-leg alignment barrier) של תבנית הבסיס (base_template.py _maybe_process_primary + _sync_extra_iids) דוחה את הבר הראשי עד שEVERY רגל נוספת באותו טווח-זמן יש לה בר באותו חותם-זמן מדויק, ואסטרטגיה זו דורשת בנוסף שורה מלאה ב-_row_for(). וידאתי תאריכי בר-ראשון בקטלוג הנתונים עבור כל 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% שטוחים ברשת היומית. ה-sandbox כבר מדגים זאת בדיוק: חלונות הלחץ covid_crash_2020, china_ban_2021, luna_collapse_2022 ו-rate_shock_2022 (ינואר-אוקטובר) כולם מחזירים בדיוק 0.0000%, בעוד ftx_collapse_2022 (המתחיל 2022-11-06) הוא הראשון שאינו אפס ב--8.20%. השלכות, ואף אחת מהן אינה ניתנת לביטול על ידי האופטימייזר או האנליסט: (a) המטרה של שלב -2 היא Sharpe המחושב על סדרה שרובה אפסים — ה-sandbox מדווח 0.547 בעוד ה-CAGR של אותו תיק על פני הטווח ACTIVE שלו הוא 19.26%; (b) כחמש שנים קלנדריות ידווחו בדיוק 0.00% וייספרו כלא-חיוביות מול רף התקפות של חלק-השנים-החיוביות; (c) הטענות המוצהרות מראש של ההיפותזה עצמה — Sharpe +0.74 על 2017-2026, 6 מתוך 9 שנים חיוביות, 'שורדת BOTH שווקי דוב מלאים' (2018 -19%, 2022 -26%) — לא ניתנות להפקה כלל, מכיוון ש-2018 ועשרת החודשים הראשונים של 2022 נמצאים בתוך החלון המת; (d) שלישוני משטר התנודתיות המתממשת מחושבים על סדרה שרובה ימים מתים. זהו פגם בגודל/תצורה עם תיקון ברור, לא הצהרה על ה-edge: לוגיקת המסחר עצמה נכונה (ראה הערות). (שורה 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,
- [warning] גודל קניה ברוטציה מוגבל על ידי `available = get_account_equity() * cash_buffer`, שנקרא AFTER היציאה, ומכירות הקיטום נשלחות בשורות 279-298. בבקטסט זה נכון מכיוון ש-SimulatedExchange של NT ממלא פקודות שוק בתוך אותה איטרציית מנוע, כך שיתרת USDT כבר משקפת את המכירות. בפייפר/לייב זה אינו נכון: פקודות שוק ממתינות עד ה-tick הבא, כך שברוטציה שמוכרת 2-3 שמות כדי לממן 2-3 חדשים האסטרטגיה תראה מזומן טרום-מכירה, תקנה כל גירעון ב-`ratio < 1`, ותפרוס פחות מהנדרש. מכיוון ששמות מוחזקים משנים גודל רק כאשר הם סוטים מחוץ לרצועת הסבילות +/-25%, הגירעון עלול להימשך עד לרוטציה מאוחרת יותר. שונות בין בקטסט לפייפר, לא באג נכונות של הבקטסט. (שורה 309) — תיקון: או שחשב את `available` כ-(מזומן + נומינל היציאות/הקיטומים שזה עתה הוגשו), או דחה את רגל הקניה של רוטציה לבר הבא לאחר שהמכירות התיישבו (תור קניה דחוי-בר-אחד המקושר לתקופת האיזון מחדש). אם נשאר כפי שהוא, ציין זאת במפורש ברציונל כך שבדיקת שוויון-הפייפר לא תקרא את השונות כפגם.
- [warning] הפסקות נתונים ברגל בודדת עוצרות את כל התיק. `_row_for()` מחזיר None אלא אם לEVERY אחת מרגלי 25 יש בר הנושא בדיוק את חותם-הזמן של הבר הראשי, ומחסום תבנית הבסיס חוסם באופן עצמאי את הבר הראשי באותו מצב. בר יומי חסר אחד בשם בודד כלשהו (פער איסוף, השהיית בורסה) מדלג בשקט על שורת אותו יום, ומשאיר חור בחלון תשואות-הלוג המשמש לתנודתיות המתממשת; שם שמפסיק לפרסם לחלוטין (מחיקה מהמסחר) מקפיא את האסטרטגיה לנצח עם פוזיציות פתוחות. ההתנהגות שמרנית ולא שגויה, אך היא בלתי נראית — שום דבר לא רושם ביומן או סופר את הימים שדולגו. (שורה 88) — תיקון: ספור שורות שדולגו (מספר שלם `self._skipped_rows` נשמר אוטומטית על ידי תבנית הבסיס) ורשום אזהרה כאשר רגל נעדרת למשך יותר מ-~2 ברים ראשיים רצופים, כך שמחיקה מהמסחר תופיע כאבחון ולא כתיק שטוח שקט.
Iteration History
האימות נכשל (שכבה 4 — סקירת QA) [class=hypothesis_mismatch]:
- [edge_concern] בקטסט העשן (smoke backtest) רווחי, אך הביצועים אינם משמשים כפסיקת נכונות (correctness verdict).
- [critical] ההשערה דורשת יקום קבוע של 25 מטבעות ב-Binance Spot, אך המימוש מגדיר רק 14 מכשירים (instruments). לכן החזקת 5 שמות בוחרת 5/14 במקום 5/25, ומשנה באופן מהותי את האסטרטגיה חוצת-החתך. (שורה 45) — תיקון: לשחזר את יקום 25 השמות המדויק ב-extra_instruments וב-extra_bar_types, ולאחר מכן להריץ מחדש אימות ובקטסט. לחלופין, לתקן באופן פורמלי את ההשערה לגרסת 14 השמות.
- [critical] ההשערה מתירה חשיפה גולמית מקסימלית של 1.0x, אך המימוש מגדיר את max_gross_exposure ל-0.95 וכולא (clamps) אותה ב-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' (bar timestamp: 1735692060000)
- steady_downtrend: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- flat_ranging: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- volatility_spike: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- zero_volume: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
- price_gap: TypeError: unsupported operand type(s) for *: 'decimal.Decimal' and 'float' (bar timestamp: 1735692060000)
Stratmill הוא כלי למחקר ולמסחר נייר (Paper Trading), ואינו ייעוץ פיננסי או ברוקר. תוצאות בדיקה לאחור ומסחר נייר הן היפותטיות. מסחר טומן בחובו סיכון להפסד.