בדיקה מועילה של בדיקה היסטורית לא קשורה למציאת פרמטר טוב יותר: עוצרים את התהליך באמצע, משחזרים אותו ומשלימים את אותה הרצה. עם קלט זהה וסימולטור ביצוע מבוקר, ההחלטות, ההוראות וההון העצמי אמורים להיות זהים לאלה שבהרצה רציפה.
אם הם אינם זהים, מצאתם בעיה בניהול המצב. האסטרטגיה תלויה במשהו שלא שמרתם או שאינכם יכולים לשחזר. התלות הזאת חשובה כשממשיכים הרצות מחקר, מחליפים עובדים או פורסים קוד חדש בשירות מסחר מדומה.
אני אוהב את הבדיקה הזאת כי התשובה הצפויה בה ברורה במיוחד. אין ויכוח על כך שהשוק השתנה. שתי ההרצות מקבלות את אותו שוק.
הנה שלוש דרכים שגויות לבצע הפעלה מחדש. המספרים להמחשה; כל אחת מהתקלות האלה עלולה להתרחש גם במערכת דטרמיניסטית לחלוטין.
1. טוענים מחדש כמה נרות ומניחים שהאינדיקטורים מוכנים
נניח שאסטרטגיה משתמשת בממוצע נע מעריכי עם תקופה של 100. העדכון שלו הוא:
alpha = 2 / 101
ema_next = alpha * close + (1 - alpha) * ema_previous
התהליך הרציף ממשיך לצבור את ערך ה-EMA. התהליך שהופעל מחדש מושך 100 נרות, מאתחל את ה-EMA לפי שער הסגירה הראשון ומניח שאינדיקטור לתקופה של 100 זקוק ל-100 תצפיות.
ההנחה הזאת מבלבלת בין פרמטר ההחלקה של האינדיקטור לבין חלון זיכרון סופי. EMA ממשיך לשאת תרומה דועכת ממצב האתחול שלו. אם ההפרש בין ערכי ה-EMA של שתי גרסאות בתחילת הדרך הוא 10 יחידות מחיר, אותם מחירים בהמשך יצמצמו את ההפרש כך:
| עדכונים מאז האתחול | ההפרש שנותר | חלק יחסי מהשגיאה ההתחלתית |
|---|---|---|
| 100 | 1.353 | 13.53% |
| 250 | 0.0674 | 0.674% |
| 500 | 0.000454 | 0.00454% |
החישוב הוא 10 * (99 / 101)^k. משיכה של 100 נרות נותנת לכם רק 99 עדכונים, אם התצפית הראשונה משמשת לאתחול.
הנזק מתגלה בדרך כלל סמוך לגבול החלטה. בהרצה אחת המחיר מעל ה-EMA, ובאחרת הוא מתחתיו. הבדל מספרי קטן יוצר עסקה נוספת שלמה. משם, גם תקופות הצינון, המזומן הזמין וההחלטות הבאות עלולים לסטות.
שמרו את המצב הרקורסיבי של האינדיקטור, את מצב האתחול שלו ואת האירוע האחרון שעובד. לחלופין, הפעילו מחדש מהתחלה ידועה. חימום ארוך יותר עשוי לתת קירוב סביר, אבל בחרו את אורכו לפי סף שגיאה מפורש ובדקו אם השגיאה הזאת יכולה לשנות החלטות. „פי 5 מהתקופה” הוא כלל אצבע, לא הוכחה.
וגם האינדיקטורים אינם כל ההיסטוריה. אחוזון מתגלגל זקוק לחלון שלו. מודל מקוון עשוי להזדקק למצב האופטימייזר שלו. כלל שממתין 3 נרות אחרי הפסד צריך לזכור את ההפסד ואת המונה.
2. שומרים פוזיציות ושוכחים את ההוראות שעדיין בטיפול
יעד הפוזיציה שלכם הוא 10 יחידות. הוראת קנייה ל-10 התמלאה בחלקה: 4 יחידות, ונותרו 6 פתוחות. אתם שומרים נקודת ביקורת עם פוזיציה של 4, מפעילים מחדש ושולחים הוראת קנייה נוספת ל-6 היחידות החסרות.
אם גם היתרה המקורית וגם ההוראה החלופית יתמלאו, יהיו בבעלותכם 16 יחידות.
בגרסת הבדיקה ההיסטורית, הבאג הזה נשאר לעיתים קרובות חבוי כי הפעלה מחדש של מנוע המילוי מוחקת בשקט את ההוראות הפעילות. במסחר מדומה, הסימולטור או השירות החיצוני עשויים להשאיר אותן בתוקף. אותו קוד שחזור יוצר אז חשיפה שונה, בהתאם לרכיב ששרד.
| בעת ההפעלה מחדש | המצב בפועל | מה ששחזור שמתחשב בפוזיציה בלבד רואה |
|---|---|---|
| פוזיציית יעד | 10 | 10 |
| פוזיציה שמולאה | 4 | 4 |
| כמות קנייה פתוחה | 6 | 0 |
| כמות נוספת שנדרשת | 0 | 6 |
הנזק מתבטא בפרץ בלתי מוסבר של הוראות מיד לאחר השחזור. לפעמים החשיפה מוכפלת. לפעמים הפוזיציה נסגרת אף שהוראת ההגנה שלה עדיין פעילה, והיא עלולה לפתוח פוזיציה חדשה בהמשך.
נקודת ביקורת צריכה לכלול גם את זהות ההוראה ואת מצב מחזור החיים שלה, לצד הפוזיציות. לפני יצירת פעולות חדשות, השחזור חייב להתאים את הרשומות האלה למערכת הביצוע. כשלא ידוע מה עלה בגורלה של הוראה, צריך לברר; ההנחה ש„לא נשמר אישור” פירושה „ההוראה לא נשלחה” היא הדרך שבה נוצרים כפל הוראות.
מזהי הוראה יציבים מצד הלקוח עוזרים לברר מה קרה. הם מונעים כפילויות רק אם המערכת המקבלת אוכפת בפועל את כללי הייחודיות או האידמפוטנטיות הנדרשים. שמרו גם את מזהי הביצועים שכבר עובדו, כדי שמילוי שמופיע שוב בהרצה חוזרת לא יגדיל את הפוזיציה פעמיים.
יש לי חיבה למסך הסטטוס המשעמם של ההוראות. ביום של הפעלה מחדש, השורות הקטנות שבו הופכות פתאום לממשק המעניין ביותר בבניין.
3. משחזרים את הפוזיציה ומתחילים ספר רווח והפסד חדש
נבחן דוגמה של מסחר ספוט ללא מינוף וללא עמלות. מתחילים עם $10,000 במזומן, קונים 10 יחידות במחיר $100 ושומרים נקודת ביקורת כשהמחיר המסומן מגיע ל-$110.
המצב הנכון הוא $9,000 במזומן ועוד פוזיציה בשווי $1,100: הון עצמי של $10,100. אם בשחזור מחזירים את 10 היחידות אבל מאפסים את המזומן ל-$10,000 המקוריים, המערכת מדווחת על $11,100. יצרתם $1,000 יש מאין בהפעלה מחדש של תהליך.
גרסאות אחרות פחות דרמטיות. השחזור משמר את ההון העצמי אבל מאפס את מחיר הכניסה ל-$110. ההון העצמי הכולל עשוי להישאר נכון, בזמן שהחלוקה בין רווח ממומש ללא ממומש משתנה. אם הוראת עצירת הפסד או תנאי יציאה מתייחסים למחיר הכניסה, קיצור הדרך החשבונאי משנה עכשיו את התנהגות המסחר.
או שהמערכת שוכחת את שיא ההון העצמי הקודם. נניח שההון העצמי הגיע לשיא של $10,600 לפני שירד ל-$10,100. הירידה מהשיא היא כ-4.72%. אם מאפסים את השיא בעת השחזור, האסטרטגיה פתאום חושבת שהירידה שלה היא אפס. כל בקרת סיכון שמבוססת על ירידה מהשיא אופסה כעת ללא הרשאה.
לכן הנזק יכול להתבטא בקפיצה או בנפילה חדה בהון העצמי, בירידה חשודה בשיעור המשיכה מהשיא, או בכלל סיכון שמפסיק לפעול אחרי פריסה. שמרו את ספר החשבונות ואת המצב של האסטרטגיה שתלוי בחישובים החשבונאיים שלה: תנועות מזומן, פוזיציות, בסיס עלות רלוונטי, חיובים שנצברו וזיכרון בקרת הסיכון. התאימו את ההון העצמי ששוחזר לספר החשבונות באותו מועד תמחור.
נקודת ביקורת זקוקה לגבול עקבי. שמירת המזומן אחרי מילוי ושמירת כמות הפוזיציה מלפני אותו מילוי יוצרות מצב שמעולם לא התקיים. שמרו יחד את כל המצב הקשור, או תעדו רצף אירועים עמיד שממנו אפשר לבנות אותו מחדש. שמרו יחד איתו את סמן האירועים, כדי שהשחזור לא ידלג על המילוי ולא יחיל אותו פעמיים.
במתקן המחקר, הייתי משאיר בדיקה שמריצה הרצת ייחוס רציפה אחת, ואז מפעילה מחדש הרצה שנייה בנקודות בעייתיות במכוון: במהלך אתחול האינדיקטור, אחרי מילוי חלקי, וכשמגבלת סיכון פעילה. השתמשו באותו סדר אירועים ושמרו כל מצב אקראי של הסימולטור. השוו את ההחלטה הראשונה אחרי השחזור, את רשומות ההוראות והמילויים ואת מסלול ההון העצמי. יתרה סופית תואמת לבדה עלולה להסתיר שגיאות שמקזזות זו את זו.
במקרה של קריסה אחרי שליחת הוראה ולפני קבלת אישור, המתקן צריך לשמור גם את מצב שירות הביצוע באופן בלתי תלוי בתהליך האסטרטגיה. אחרת הוא מוחק את אי-הוודאות שאתם מנסים לבדוק.
המפרט של אסטרטגיה כולל את מה שהיא זוכרת. הפכו את הזיכרון הזה למפורש מספיק, כך שתוכלו לעצור את התהליך באמצע הרצה חוזרת ולהראות בדיוק איך הוא חוזר לפעול.
← כל הפוסטים


