יש שאלה שכל backtest מתחמק ממנה: האם אותו קוד בדיוק, מוזן בשוק חי, היה עושה את אותו הדבר? אי אפשר לענות עליה בעוד בקטסטים. אפשר לענות עליה רק בהרצת האסטרטגיה מול נתונים חיים עם סמנטיקת ביצוע אמיתית, ואז לבדוק — עסקה אחר עסקה — ששני העולמות מסכימים. אנחנו עושים את הבדיקה הזאת כל יום, אוטומטית, והיא מוצאת יותר באגים מכל דבר אחר בפלטפורמה.
יום ראשון: לבנות את המראה
כל אסטרטגיה שקודמה רצה בצומת חי ומבודד משלה, וצורכת זרמים אמיתיים מהבורסה: ציטוטים חיים לביצוע, מרווחים אמיתיים, שעות מסחר אמיתיות. אין state משותף בין אסטרטגיות (את זה למדנו בדרך הקשה — צומת משותף אפשר לשאילתות פוזיציה של אסטרטגיה אחת לדלוף לתוך אחרת). כל ביצוע נרשם יחד עם ערך הסיגנל שהוליד אותו.
כל בוקר: ריפליי והשוואה
ג'וב יומי לוקח את חלון הנייר של כל אסטרטגיה, מריץ את הקוד הזהה דרך מנוע הבקטסט על אותה תקופה מול נתוני הקטלוג, ומתאים ביצועים אחד-לאחד: אותו צד, אותה סבילות חותמת זמן, אותו גודל. הפלט הוא לא קורלציה ולא תחושת בטן. הוא טבלה: מותאם, נייר-בלבד, ריפליי-בלבד. אסטרטגיה בריאה יושבת על 54 מתוך 55 מותאמים. אסטרטגיה חולה אומרת לכם בדיוק איזו עסקה סטתה ומתי.
מה נשבר, לפי סדר השבירה
- ביצועים בזמן חימום. הצומת החי הזין היסטוריה כדי לחמם אינדיקטורים — ואסטרטגיות עם מטפלי בר מותאמים אישית סחרו עליה בשמחה. הבקטסטים מעולם לא ראו את כניסות הרפאים האלה. התיקון היה שומר בשכבת ההגשה, לא תיקון באסטרטגיה, כי אחרת כל אסטרטגיה יורשת את הבאג.
- חימום סדרתי של רגליים מרובות. אסטרטגיה חתך-רוחבית חיממה מכשיר אחד בכל פעם; כל רגל ראתה אחיות ריקות והעוגן מעולם לא אותחל. בחי היא לא סחרה כלום; בריפליי היא סחרה מצוין. אפס עסקאות מותאמות — אבל רק ההשוואה אמרה את זה בקול.
- לולאות קריסה של דיוק טיק. טיקי aggTrade חיים מגיעים בדיוק שונה מזה שמכשיר הסנדבוקס ציפה לו. הצומת נכנס ללולאת קריסה על assertion שהבקטסט לעולם לא היה יכול להפעיל, כי ברי הקטלוג כבר מנורמלים.
- שכחת אתחול. אתחולי תהליך הפעילו מחדש לוגיקת כניסה על פוזיציות שכבר היו קיימות — באסטרטגיית איזון מחדש, אתחול הפך בשקט לאיזון מחדש. במסחר חי זו לא הערת שוליים על התאמה; זה דגל אדום עם כסף עליו.
שימו לב לתבנית: אף אחד מאלה אינו באג סיגנל. כולם באגים בגבול הביצוע — חימום, state, דיוק, אתחולים. זו בדיוק מחלקת הכשלים שבקטסטים עיוורים אליה מבנית, כי מנוע הבקטסט הוא גבול הביצוע בתוך בקטסט.
האסימטריות שאנחנו שומרים בכוונה
שני העולמות אינם זהים, וזה מכוון. הבקטסט גובה חצי-מרווח ממודל בתוספת השפעת שורש ריבועי בתוך ה-PnL; הנייר משלם את המרווח האמיתי בתוך מחיר הביצוע וללא מודל השפעה. הוספת המרווח הממודל לנייר (או האמיתי לבקטסטים) הייתה סופרת פעמיים. התאמה פירושה אותן החלטות, אותם ביצועים בתוך סבילות — לא PnL זהה ביט-לביט. לדעת אילו הבדלים עקרוניים ואילו הם באגים — זה רוב המשמעת.
Backtest הוא השערה. מסחר נייר הוא הניסוי. התאמת ריפליי היא מחברת המעבדה שתופסת אתכם משלים את עצמכם.
אם אתם מריצים אסטרטגיות ואינכם משווים התנהגות חיה מול התנהגות בריפליי באופן קבוע, יש לכם מחלקת באגים שמעולם לא ראיתם. אנחנו מוצאים אחד כזה בערך כל שבועיים, וכל אחד מהם היה בלתי נראה מתוך הבקטסט.
← כל הפוסטים
