כנראה שאות הכניסה שלכם הוא הדבר הכי פחות משמעותי בבדיקת הביצועים שלכם. אני יכול לקחת כלל מומנטום בינוני אחד, להשאיר ללא שינוי את כל חותמות הזמן של הכניסה והיציאה, לשנות רק את הפונקציה שקובעת כמה חוזים להחזיק, ולהעלות את Sharpe נטו מ־0.41 ל־0.71 ולהוריד את המשיכה המרבית מ־31% ל־13%. אותן עסקאות. אותן התמלאויות. אסטרטגיה אחרת.
הטענה הזאת מעצבנת אנשים, ובצדק, כי משתמע ממנה שרוב הזמן שמושקע בכוונון תקופות מבט לאחור וספי סינון מתבזבז על גורם שולי. אז אראה את הריצות בפועל, ואז אתן למבקרים את המגיע להם, כי יש גרסה של הטיעון הזה שהיא שגויה, וכדאי לדעת לאיזו גרסה אני מתכוון.
אות אחד, 6 דרכים להחזיק פוזיציה
האות: חוזה תמידי ETHUSDT ב־Binance USDⓈ-M, נרות של 1 שעה, לונג כשה־EMA ל־12 שעות מעל ה־EMA ל־96 שעות, ללא פוזיציה אחרת, בלי שורט. מיולי 2022 עד יוני 2026. 431 עסקאות הלוך ושוב. עמלות taker בשני הכיוונים בשיעור 5.0 bps, מימון ששולם או התקבל מדי 8 שעות לפי הפוזיציה בפועל, החלקה שמודלה לפי עומק בראש ספר הפקודות. זה אות משעמם במכוון — בחרתי בו כי איש לא יגן עליו, וכך מתקבלת סביבת בדיקה נקייה.
בכל השורות שלהלן חותמות הזמן של נרות הכניסה והיציאה זהות. ההבדל היחיד הוא פונקציית גודל הפוזיציה.
| כלל גודל פוזיציה | Sharpe נטו | משיכה מרבית | מחזור נומינלי בשנה (× הפוזיציה הממוצעת) | עלויות כאחוז מהרווח הגולמי | מינוף מרבי |
|---|---|---|---|---|---|
| ערך נומינלי קבוע של $10k | 0.41 | 18.2% | 246× | 14% | 1.0× |
| שיעור קבוע, 100% מההון העצמי | 0.44 | 30.8% | 251× | 15% | 1.0× |
| הופכי לתנודתיות ממומשת של 20 יום | 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× |
| חצי Kelly לפי ממוצע ושונות מתגלגלים של 60 יום | 0.52 | 24.6% | 830× | 33% | 8.1× |
שימו לב לפער. בין השורה הגרועה ביותר לטובה ביותר יש הבדל יחסי של 73% ב־Sharpe ופער של פי 2.4 במשיכה. עכשיו מצאו לי פרמטר של אות הכניסה במערך הנתונים הזה שמזיז את Sharpe ב־0.30 בלי להיראות כמו התאמת יתר ברורה. בדקתי. אורך צמד ה־EMA מזיז אותו בכ־0.12 על פני כל טווח הערכים הסביר, ורוב התזוזה הזאת היא רעש שלא מחזיק מחוץ למדגם.
למה גודל פוזיציה לפי תנודתיות הפוכה נראה כל כך טוב, וכמה מזה אמיתי
המנגנון לא מסתורי. בערך נומינלי קבוע, גודל הפוזיציה שלכם אינו מתואם לתנודתיות הממומשת, ולכן הסיכון הכספי לכל עסקה יחסי לתנודתיות באותו שבוע. ב־ETH לאורך התקופה הזאת, התנודתיות הממומשת ל־20 יום נעה בין 31% ל־118% במונחים שנתיים. בריצה עם ערך נומינלי קבוע, הסיכון הכספי במרץ 2024 היה גדול פי 3.8 מזה שביולי 2023, לא כי האות היה בטוח יותר, אלא כי השוק היה סוער יותר. כמעט כל המשיכה שלה מרוכזת בחמישון העליון של התנודתיות. גודל פוזיציה ביחס הפוך לתנודתיות מסיר את התלות הזאת, והסרתה היא שיפור אמיתי במבנה זרם התשואות.
אבל חלק מהשיפור ב־Sharpe הוא תוצר לוואי של אופן המדידה, ואם לא תפרידו בין השניים תקבלו החלטות גרועות בהמשך. Sharpe מחלק את התשואה בסטיית התקן שלה. יעד תנודתיות הוא, מעצם הגדרתו, פעולה שמייצבת את סטיית התקן של התשואות. אתם מבצעים אופטימיזציה ישירה למכנה. כלל שמתאים את הפוזיציות כדי להגיע לתנודתיות קבועה מראש ישפר את Sharpe כמעט בכל זרם תשואות עם התקבצות תנודתיות, גם בזרמים שאין בהם יתרון כלל. אימתתי את זה על אותות שעורבבו: אקרא את חותמות הזמן של הכניסה, משאירים את שכבת יעד התנודתיות, ו־Sharpe עדיין משתפר בכ־0.06 ביחס לערך נומינלי קבוע, על בסיס עם ממוצע אפס. השיפור קטן, אבל קיים, והוא נובע כולו מהמכניקה.
לכן, כשאני משווה כללי גודל פוזיציה בתוך החברה, Sharpe אף פעם אינו המספר היחיד בדוח. אני רוצה Calmar, אני רוצה רווח והפסד נטו ליחידת ערך נומינלי ממוצע שהוקצה, ואני רוצה פירוט מעבר הרווח הגולמי לנטו, כי הרבה יותר קשה לתמרן את שלושתם יחד באמצעות תרגיל במכנה.
אומדן התנודתיות הוא מודל, וגם הוא דולף
הסיבה הנפוצה ביותר לכך שתוצאת גודל פוזיציה טובה מתבררת כמזויפת: אומדן התנודתיות משתמש במידע מהנר שעבורו הוא קובע את הגודל. אם סדרת התנודתיות שלכם מחושבת עם חלון ממורכז, או עם `rolling().std()` ברירת המחדל של pandas אחרי דגימה מחדש שכוללת את הנר החלקי הנוכחי, או על בסיס תקנון של המדגם המלא, יש לכם זליגת מידע. קשה להבחין בזה, כי התנודתיות מתמידה, ולכן הזליגה קטנה בכל שורה בנפרד וגרף ההון עדיין נראה סביר. הוא רק נראה חלק מדי דווקא בשבועות החשובים.
הסוכנים שלנו בודקים 4 דברים בכל כלל גודל פוזיציה לפני שתוצאה עוברת לתור למסחר על הנייר:
- זמינות בזמן קבלת ההחלטה. את הגודל שבו משתמשים בנר שנפתח ב־14:00 חייבים לחשב מנתונים שחותמת זמן הסגירה שלהם היא ≤ 13:59:59.999. אנחנו מאמתים זאת על ידי חישוב מחדש של סדרת הגדלים מתוך מסגרת נתונים שנחתכה בנקודת זמן אקראית, עבור מדגם של 200 נקודות החלטה, והשוואת ההפרשים.
- תקופת המבט לאחור של האומדן היא פרמטר אמיתי. חלון תנודתיות של 20 יום וחלון תנודתיות של 60 יום הם שתי אסטרטגיות שונות. תקופת המבט לאחור נכנסת לרשת הבדיקות המתגלגלות יחד עם כל שאר הפרמטרים, ואם התוצאה עובדת רק באורך חלון אחד, זה ממצא על השבריריות שלה.
- מסלול המינוף, לא רק המינוף המרבי. הציגו את ההתפלגות המלאה של המינוף ברוטו. הריצה ללא תקרת מינוף ועם יעד תנודתיות שמופיעה למעלה בילתה 4% משעותיה מעל 5×. זה בדיוק מסוג הדברים שלא מופיעים בטבלת סיכום, אבל קובעים לחלוטין אם אפשר ליישם את האסטרטגיה.
- רגישות גודל הפוזיציה כבדיקת עמידות. אם Sharpe צונח כשמשנים את יעד התנודתיות מ־20% ל־25%, האסטרטגיה אינה מכוונת לתנודתיות, אלא מכווננת למינוף, ומצאתם את היתרון שלכם בכך שבחרתם מספר מסוים.
תקרת המינוף אינה תוספת קישוטית לניהול הסיכונים, אלא חלק מהגדרת האסטרטגיה. מדרגות המינוף של ETHUSDT ב־Binance מורידות את המינוף המרבי ככל שהערך הנומינלי של הפוזיציה גדל, ודרישת מרווח התחזוקה עולה בהתאם. בדיקת ביצועים שמאפשרת לכלל יעד התנודתיות להגיע ל־6.3× בערך נומינלי של $400k מתארת פוזיציה שהזירה לא תאפשר להחזיק באותה דרישת מרווח. השורה עם התקרה עולה 0.05 ב־Sharpe, והיא היחידה מבין השתיים שמתארת משהו אמיתי.
הכסף הולך על איזון מחדש
שימו לב לעמודת העלויות. איזון מחדש מדי שעה כדי לעמוד ביעד תנודתיות סיפק את Sharpe המרשים ביותר, וגם העביר 41% מהרווח הגולמי לבורסה. מדובר במחזור שנתי של 1,180× הערך הנומינלי של הפוזיציה הממוצעת, בעמלה של 5 bps לכל צד, נוסף על המרווח והשפעת השוק. הפתרון הנאיבי הוא לאזן מחדש לעיתים רחוקות יותר, לפי לוח זמנים. הפתרון הטוב יותר הוא רצועת אי־מסחר: משנים את גודל הפוזיציה רק כשהפוזיציה הנוכחית סוטה מהיעד מעבר לסף כלשהו.
רצועה של 20% הורידה את המחזור הנומינלי השנתי מ־1,180× ל־402× — ירידה של 66% — ועלתה 0.05 ב־Sharpe. בדקתי את זה עד עכשיו על 8 אותות, והתמונה חוזרת על עצמה: רצועות בין 15% ל־25% משמרות את רוב התועלת של בקרת הסיכון בשליש מהמחזור, וכל ערך מתחת ל־10% פירושו לשלם עמלות בשביל דיוק קוסמטי בכמות שאתם ממילא אומדים באמצעות חלון של 20 יום. אי אפשר לאזן מחדש עד 3 ספרות אחרי הנקודה מול מספר שיש לו שגיאת תקן של 15%.
בפברואר הייתה לנו ריצה שבה דוח שסוכן כתב ייחס שיפור של 0.22 ב־Sharpe ל״מסנן הכניסה המשופר״. השינוי היה שורה אחת במודול גודל הפוזיציה. המסנן לא השתנה. עכשיו אני גורם לדוח להציג בראשו את ה־hash של תצורת גודל הפוזיציה, כי ייחוס נכון הוא עניין של משמעת, ומודלים מוכנים לספר סיפור מסודר לא פחות מכל אחד אחר.
מה המסחר על הנייר עושה לכלל גודל הפוזיציה שלכם
כאן הפער בין בדיקת ביצועים למסחר על הנייר הוא הגדול ביותר, והסיבה היא בעיקר חשבון פשוט. גודל פוזיציה שמגיב לתנודתיות משתנה פי 4 עד 8 לאורך המדגם. שני הקצוות של הטווח נתקלים באילוצי זירה שהבדיקה מעולם לא דימתה.
בקצה הקטן: גודל צעד וסכום נומינלי מינימלי. בחוזה התמידי ETHUSDT יש צעד כמות של 0.001 וסכום מינימלי של $5. אם גודל הפוזיציה שלכם במשטר תנודתיות נמוכה הוא 0.0004 ETH, בדיקת הביצועים מחזיקה אותה, אבל במסחר על הנייר לא מחזיקים פוזיציה כלל. זה נשמע כמו מקרה קצה, עד שמבינים שכלל יעד תנודתיות מציב אתהפוזיציות הקטנות ביותר שלו בשווקים הרגועים ביותר, ובאות מגמה, שם נמצאות לעיתים קרובות הכניסות הטובות. בקצה הגדול: מגבלות פוזיציה, מדרגות מרווח, והעובדה שפוזיציה של 6× דורשת משמעת מרווח מבודד שלא מידלתם בסימולציית חיסול.
גילינו מקרה שבו עקומת ההון במסחר על הנייר עקבה אחרי בדיקת הביצועים בסטייה של 3% במשך 6 שבועות, ואז התרחקה ממנה בחדות. הסיבה הייתה עיגול: חיתוך באמצעות `int()` במקום עיגול לגודל הצעד בפונקציה לקביעת גודל ההוראה, שהוחל על פוזיציות שממוצען 1.4 צעדים. בדיקת הביצועים קבעה גדלים על רצף רציף, ובמערכת החיה אבדו 20-30% מהפוזיציה המיועדת בכל עסקה קטנה. בלי מודל מילוי מתוחכם, בלי סיפור על השהיה. חיתוך.
איפה המבקרים צודקים
יש 3 טענות נגדיות מוצדקות, ואני לא רוצה לנסות לשכנע אתכם מעבר להן.
ראשית, והכי חשוב: גודל הפוזיציה מקצה יתרון, הוא לא יכול לייצר אותו. אם התוחלת הגולמית של האות שלכם אפסית או שלילית אחרי עמלות ומימון מציאותיים, כל הכללים בטבלה מפסידים כסף — המתוחכמים פשוט מפסידים אותו עם פרופיל שונות יפה יותר. בחרתי אות עם יתרון נטו קטן אך חיובי בחלון הזה. הפעילו את אותם 6 כללים על אות עם תשואה נטו של −1.2 bps לעסקה, והדירוג יישמר, אבל ההון בסוף התקופה יהיה נמוך מההון ההתחלתי בכל המקרים. גודל פוזיציה הוא מכפיל של משהו. עדיין צריך שיהיה משהו להכפיל.
שנית, ליעד תנודתיות יש כשל אמיתי ומתועד היטב: הוא מקטין חשיפה לקראת התחתית של מפולת מהירה ומגדיל אותה מחדש אחרי הקפיצה חזרה. בצורת V חדה, ערך נומינלי קבוע מנצח, לפעמים בפער גדול. הירידות במניות במרץ 2020 והמפולת בשוק הקריפטו באוגוסט 2024 פגעו שתיהן בגודל פוזיציה שמגיב לתנודתיות במהלך ההתאוששות. חלון ה־ETH בן 4 השנים שלי כולל במקרה יותר תקופות ממושכות של התקבצות תנודתיות ופחות תנודות חדות בצורת V, מה שמחמיא לשורות של התנודתיות ההפוכה. בחלון אחר חלק מסדר השורות מתהפך, ואם הייתי פותח בטבלה מ־2020, הטיעון שלי היה חלש יותר.
שלישית, כלל גודל הפוזיציה חשוף להתאמת יתר כמו כל דבר אחר. חצי Kelly על אומדנים מתגלגלים הוא הסימן לכך בטבלה שלי: הוא נראה מתוחכם, מבוסס תיאורטית, והפיק את המשיכה השנייה בגודלה, כי אומדן הממוצע המתגלגל של סדרת תשואות רועשת הוא חסר ערך, ו־Kelly רגיש אליו מאוד. כל כלל גודל פוזיציה שמקבל אומדן תשואה צפויה כקלט יורש את השגיאה באומדן, ומעצים אותה. כללים שמשתמשים רק באומדן שונות מתנהגים הרבה יותר טוב, כי שונות היא הרגע היחיד שאפשר באמת לאמוד מנתונים שעתיים של 4 שנים.
מה שהייתי לוקח מכל זה: כשמפתיעה אתכם תוצאה של בדיקת ביצועים, בדקו את מודול גודל הפוזיציה לפני שאתם מחפשים תחכום באות. וכשאתם מדווחים על Sharpe, הציגו לצדו את מסלול המינוף ואת פירוט העלויות, כי מספר שתלוי כל כך בהחלטה על גודל הפוזיציה אינו מאפיין של האות כלל.
← כל הפוסטים


