מדוע בדיקת עבר רב-טיימפריימית נשברת בנתונים אמיתיים
הסיבה הנפוצה ביותר — הטיימפריים הבכיר נקרא ככזה שכבר נסגר. האסטרטגיה מקבלת החלטה לפי נר H4, אבל באותו רגע הנר עדיין נוצר, וחלק מהתנועה שעליה "האות פעל" הופיע רק אחרי הכניסה. בעבר, לוגיקה כזו נותנת עקומה עולה וחלקה, בסביבת העבודה — כניסות במחיר שלא היה קיים באותו רגע.
המקור השני — אי-התאמה בין טיימפריימים. גבולות הנרות של הסדרה הבכירה והצעירה אינם חופפים: סשנים שונים, סופי שבוע, פערים בשערי מסחר, מעברים לשעון קיץ.
יישור לפי תווית הפתיחה או הצבת הערך הידוע האחרון גוררים לחישוב נתונים מהעתיד, ונר אחד מוסט משנה לא רק את הכניסה אלא גם את כל האינדיקטורים התלויים.
השלישי — התאמת יתר להיסטוריה. ככל שמריצים יותר שילובי פרמטרים על קטע אחד, כך עולה הסיכוי שהתוצאה הטובה ביותר היא מקריות: על כך כתב בהרחבה לופס דה פראדו.
בטיימפריים בכיר יש מעט עסקאות, וקונפיגורציה "רווחית" נשענת לעיתים קרובות על עשר כניסות שלא שורדות מעבר לקטע נתונים אחר.
הקבוצה הרביעית — שגיאות בהרצת אסטרטגיות בביצוע ובנתונים: רגע הפעולה בתוך הנר, עמלות והחלקה, פערים בשערי מסחר, אי-התאמה בין מקור מחירים היסטורי למקור בזמן אמת לפי זמן הגעה. נפרט כיצד זה נסגר: מיישור קפדני של סדרות ואיסור על נרות לא סגורים ועד בדיקת יציבות הקונפיגורציה מחוץ למדגם.
האפקט של חישוב מתואם על פני מספר טיימפריימים
כל עוד האסטרטגיה מקבלת החלטות לפי טיימפריים אחד, החישוב שקוף: זרם נרות אחד, ציר זמן אחד. אבל ברגע שמוסיפים אישור מטיימפריים בכיר, מופיע מקור לאי-התאמות — הנר הנמוך מספיק להיסגר כמה פעמים בתוך נר בכיר אחד, והכניסה יכולה להישען על נתונים שעדיין לא היו ברגע החישוב.
אנחנו בונים בדיקת עבר רב-טיימפריימית בליבת אירועים אחת (בבסיס — Backtrader והרחבות משלנו), ולכן עקביות האותות נבדקת בהרצה משחזרת על היסטוריה, ולא בעין.
ציור מחדש של אינדיקטורים נסגר במצב של נרות מאושרים: ערכי הטיימפריים הבכיר מחושבים מחדש רק ברגע הסגירה שלו, הנרות הנמוכים מיושרים לגבול הבכיר, והנר הבכיר שלא נסגר מוחרג מחלון החישוב. זה מסיר סוג של כשלים שבדוחות נראה כעקומת תשואה חלקה וסוטה מהעסקאות בפועל.
זמן הרצת האסטרטגיה משתנה באופן לא ליניארי. הסדרות הבכירות נצברות פעם אחת ונשמרות במטמון, האסטרטגיה פונה לפרוסות מוכנות ולא מחשבת אותן מחדש בכל צעד: הרצה על שלושה טיימפריימים יקרה מהרצה בודדת בכ-20–40%, ולא פי שלושה.
שיעור הכניסות הכוזבות יורד בזכות מסנן: אות מהטיימפריים הנמוך מתקבל רק כשכיוון הטיימפריים הבכיר תואם. לפי ההרצות שלנו, כלל כזה חותך 30–50% מהכניסות נגד המגמה הבכירה — אבל הוא גם חותך חלק מהעסקאות הרווחיות, ולכן סף האישור נבחר לפי מדדים, ולא מופעל "ליתר ביטחון".
פורמטי הרצה של בדיקת עבר רב-טיימפריימית: היסטוריה, זרם, היברידי
מצב ההרצה קובע כיצד האסטרטגיה מקבלת נרות של טיימפריימים נמוכים ובכירים ובאיזה רגע הם נעשים גלויים. בחישוב אצווה ארכיון שערי המסחר נטען במלואו, הסדרות הבכירות נצברות מראש, והלולאה עוברת על המערך כולו. זו הגרסה המהירה ביותר על היסטוריה ארוכה, אבל דווקא כאן לרוב דולף מידע מהעתיד.
חישוב זורם מזרים אירועים ברצף, נר אחר נר: הטיימפריים הבכיר נסגר רק כשהנר הנמוך האחרון בתוכו נסגר. הצצה לעתיד נעלמת, אבל יש לכך מחיר משלה — יש לשמור את מצב האינדיקטורים ולשחזר אותו נכון במעבר בין סדרות.
| וריאנט | מתי מתאים | מגבלות |
|---|---|---|
| חישוב אצווה | איתור באגים בכללי כניסה, בדיקת השערות על היסטוריה ארוכה, הרצה על סט כלים | צריכת זיכרון גדלה עם מספר הטיימפריימים; יש לבדוק ידנית סנכרון סגירות |
| חישוב זורם | בדיקה סופית של אסטרטגיה שבה סדר האירועים חייב להיות מהימן | איטי באופן ניכר; קשה יותר לשחזר הרצה תקולה ולנפות את לוגיקת המעבר |
| סכימה היברידית | מצב עבודה של בדיקת עבר רב-טיימפריימית: הסדרה הנמוכה זורמת, הבכירות מחושבות באופן אינקרמנטלי | דורש כלל מפורש מתי הטיימפריים הבכיר נחשב לזמין |
הסכימה ההיברידית היא בדרך כלל גם מצב העבודה העיקרי: הסדרה הנמוכה מעובדת בזרימה, הבכירות מחושבות מחדש ברגע הסגירה, ולכן ההרצה לא נתקעת בנפח הזיכרון ולא מאבדת את מהימנות הסדר.
חישוב האצווה נשאר לבדיקות מהירות, והזורם — להצלבה של קטעים שנויים במחלוקת על קטע קצר שבו הפער בתוצאות נראה מיד.
שלבי הטמעה: מביקורת נתונים ועד מסירת המערך
בדיקת עבר רב-טיימפריימית נשברת לא בלוגיקת האסטרטגיה אלא בנתונים: נרות בכירים נבנים מנרות נמוכים, ושגיאה בבנייה הזו נותנת עקומת תשואה יפה אך שקרית. לכן את ההטמעה מתחילים בביקורת המקור, ולא בקוד, ורק אחריה קובעים את כללי החישוב.
- ביקורת נתונים היסטוריים — בודקים שלמות סדרות לפי כלים וטיימפריימים, מחפשים חסרים, כפילויות ופערים, ומצליבים מחירי סגירה עם מקור בלתי תלוי.
- סכימת בנייה מחדש של נרות — מתארים כללי צבירה: גבולות המרווח הבכיר, רגע סגירת הנר, התנהגות בקטעים חסרים ואנומליים.
- הגדרת המערך — פורסים סביבת חישוב, מנהלים גרסאות של מערכי נתונים וקונפיגורציות, ומפרידים בין אחסון ההיסטוריה לחלק החישובי.
- בדיקת יציבות — מריצים כללים על תקופות ותת-מדגמים שונים, ובנפרד בודקים הצצה לעתיד ואי-התאמה בין ההיסטוריה לזרם המקוון.
- קבלת החישובים — מצליבים דוגמאות בקרה ומדגם עסקאות שנבדק ידנית, קובעים סטיות מותרות וסף שמעליו התוצאה נחשבת לא מהימנה.
- מסירת המערך — מוסרים תיעוד, נהלי עדכון נתונים והרשאות, ומלמדים את הצוות לחזור על החישוב בלי המעורבות שלנו.
עיקרון מרכזי: כללי הצבירה והבדיקה חיים במקום אחד עבור ההיסטוריה והזמן אמת. אחרת התוצאות בהיסטוריה ובעבודה יהיו שונות, ולא ייווצר אמון במערכת.
מה מועבר לידיים שלכם: קונפיגורציות, סכימות ונהלים
מסירה היא לא ארכיון עם קוד, אלא סט תוצרים שלפיהם הצוות שלכם יריץ בעצמו את הבדיקה, ישנה פרמטרים ויקבל את אותה תוצאה. להלן מה שנשאר במאגר הקוד ובבסיס הידע הפנימי שלכם; כל סעיף נבדק בקבלה.
- קונפיגורציות הרצה — פרופיל נפרד לכל תרחיש: הרכב טיימפריימים, כלל דגימה מחדש של מרווחים בכירים מהנמוכים, חלון סנכרון, עמלות והחלקה. משתנות בעריכת קובץ אחד, בלי התערבות בקוד.
- סכימת נתונים — מקור הנרות, אזורי זמן, רגע סגירת הנר, טיפול בחסרים ובאירועים תאגידיים, וכן רשימת בדיקה לוולידציה על כפילויות ופערים בהיסטוריה.
- פרוסת היסטוריה לדוגמה — מערך נתונים קבוע שמריץ מחדש עד העסקה האחרונה: לפיו מצליבים תוצאה אחרי כל שינוי.
- נהלי הרצה — סדר השלבים: הכנת נתונים, חימום אינדיקטורים, הרצה, איסוף מדדים, ניתוח פערים; עם סימונים היכן החישוב נתקע במשאבים.
- מדיניות הרשאות — תפקידים וזכויות לשינוי קונפיגורציות, מפתחות לנתוני שוק לקריאה בלבד, יומן שינויים בפרמטרים עם מחבר וסיבה.
- תבניות דוחות — מדדים לפי הרצה, כולל שיעור עסקאות שבהן כניסה בטיימפריים נמוך אושרה על ידי הבכיר, וניתוח פערים בין המרווחים.
- תיעוד — תיאור מודל הנתונים והסכמות לגבי זמן סגירת הנר, הוראה "איך מוסיפים טיימפריים חדש", יומן שינויי מתודולוגיה.
- תוכנית מסירה — סקירה עם המהנדסים שלכם ורשימת שאלות פתוחות שנסגור אחרי המסירה.
מקרה בוחן: הסרנו אי-התאמה של אותות בטיימפריימים שונים
הלקוח הגיע עם מערך שבו האסטרטגיה בהיסטוריה נתנה עקומה חלקה, ובנתונים חיים — עסקאות שלא הופיעו בדוח. הניתוח הראה אי-התאמה של אותות: האישור הגיע מהטיימפריים הבכיר, והכניסה בוצעה לפי הנמוך, וחלק מהנרות ברגע ההחלטה עדיין לא היו סגורים.
בבדיקת עבר רב-טיימפריימית זו מלכודת אופיינית — הסדרות מודבקות במעבר אחד, רגע סגירת הנר לא נלקח בחשבון, והתוצאה נראית משכנעת יותר ממה שהיא.
מה היה בקלט
הרצה של רשת פרמטרים אחת ארכה כשלוש שעות, ולכן השערות נבדקו בחבילות בלילות. שיעור העסקאות שבהן אות הטיימפריים הבכיר סתר את הכניסה בפועל הגיע ל-6.4% — לאורך מרחק של מאות עסקאות זה אכל את היתרון של האסטרטגיה. הכיסוי הוגבל לשני טיימפריימים: הוספת שלישי הכפילה את זמן ההרצה ושברה את השחזוריות.
מה שינו
החישוב פוצל ללוחות שנה עצמאיים של טיימפריימים, וההחלטות התקבלו אך ורק לפי עובדת סגירת הנר — האות נכנס לביצוע עם השהיה דטרמיניסטית מפורשת. אגרגטים של סדרות בכירות מחושבים פעם אחת ונשמרים במטמון, ולכן הוספת טיימפריים אינה מחשבת מחדש את כל ההיסטוריה.
את הליבה השארנו על Backtrader: הספרייה נותנת מודל אירועים, אבל סנכרון הסדרות וסדר הביצוע היה צריך לבנות ידנית.
מה קרה בסוף
שיעור אי-ההתאמות ירד ל-0.2% — אלו עסקאות בגבול חסרים בנתונים, הן מסומנות ומנותחות בנפרד. הרצה מלאה אורכת 22 דקות, וברשת עכשיו ארבעה טיימפריימים במקום שניים.
הרצה חוזרת על אותם נתונים משחזרת תוצאה עד העסקה האחרונה, וגרסת קונפיגורציית החישוב נשמרת יחד עם הדוח — חזרה לגרסה קודמת אורכת דקות.
מערך העבודה כעת אחד: בדיקות ומסחר חי קוראים את אותם כללי סגירת נר, ולכן פערים ביניהם הפסיקו להיות הנורמה.
במה שונה בנייה מחדש של נרות מחישוב זורם?
ההבדל הוא מתי נוצר ערך הנר. בנייה מחדש של נרות פורשת מחדש את זרם העסקאות הראשוני לאגרגטים בכל הרצה: משתנה טיימפריים, כלל סגירת הנר או מסנן חריגים — וכל ההיסטוריה מחושבת מחדש, ומניבה תוצאה משחזרת.
חישוב זורם מחזיק את האגרגט באופן אינקרמנטלי: המצב מתעדכן עם הגעת הנתונים, בלי מעבר חוזר על ההיסטוריה.
בנייה מחדש של נרות משלמת על דיוק החישוב בהשהיית נתונים — עד שהסדרה לא נפרסת ונצברת, בדיקת עבר רב-טיימפריימית לא מתחילה, ובהיסטוריה עמוקה זו השהיה מורגשת. חישוב זורם מגיב כמעט מיד, אבל מצבו חי בזיכרון: בקריסת ערוץ או בהפעלה מחדש יש לשחזר את המצבר, אחרת הנר "יזוז".
| גישה | מתי מתאימה | מגבלות |
|---|---|---|
| בנייה מחדש של נרות | מחקר, שינוי לוגיקה, הצלבה ושחזוריות של הרצות | השהיית נתונים בהתחלה, גדלה עם עומק ההיסטוריה |
| חישוב זורם | זמן אמת, הרצות ארוכות, עדכון אינקרמנטלי | דיוק החישוב תלוי בשחזור המצב אחרי תקלה |
סכימת העבודה — היברידית: את ההיסטוריה מוסרים לבנייה מחדש של נרות, את ה"זנב" החי מחשבים בזרימה, ואחרי סגירת הסשן מצליבים את הזנב עם חישוב מלא מחדש. פער אפילו בנר אחד במפגש — הסימן הראשון לכך שהמצבר איבד מצב, ודיוק החישוב בקטע הזה כבר לא מובטח.
ספקות טכניים נפוצים לפני תחילת העבודה
ספקות לפני התחלה הם בדרך כלל הנדסיים: האם ההיסטוריה תספיק, האם התוצאה לא תתגלה כהתאמת יתר לעבר, האם לא נתקע במערך כשמתווספים טיימפריימים חדשים. נפרט ארבע שאלות שלעיתים קרובות מכריעות אם להתקדם.
איך אתם בודקים את איכות הנתונים ההיסטוריים?
מצליבים את המקור עם מקור בלתי תלוי, מחפשים חסרים, כפילויות ופערים בסשנים, ומביאים נרות לאזור זמן אחיד. בבדיקת עבר רב-טיימפריימית קריטי היישור: הטיימפריים הבכיר נבנה רק מנרות נמוכים סגורים, אחרת לחישוב דולף העתיד. נתונים עם חורים וצבירה שגויה נותנים עקומה יפה בהיסטוריה ותוצאה אפסית בשוק חי.
איך לוודא שהתוצאה לא הותאמה יתר לעבר?
מחלקים את ההיסטוריה לתקופות: כיוונון באחת, בדיקה על נתונים שהאסטרטגיה לא ראתה. בודקים יציבות פרמטרים — אם התוצאה מחזיקה רק בטווח ערכים צר, אומרים על כך לפני העלאה לעבודה, ולא אחרי העסקאות הראשונות.
מה יקרה אם נוסיף טיימפריים או כלי חדש?
האסטרטגיה מתארת כללים, לא סט נרות מסוים: טיימפריימים, כלים ומקורות מתחברים בהגדרה. סדרה חדשה מתווספת בלי לשכתב את הלוגיקה והבדיקות — המערך בנוי לגידול במספר הטיימפריימים והכלים.
אפשר לבדוק את האסטרטגיה בחשבון דמו?
כן. אותו קוד אסטרטגיה רץ על זרם חי במצב דמו, והאותות מוצלבים עם החישוב על ההיסטוריה. כך רואים פער בגלל השהיות, עמלות והחלקה — המודל מפסיק להיות מנותק מהשוק.
נדון במשימה ונחזור עם תוכנית עבודה
כדי שהדיון במשימה יהיה ענייני, כדאי לאסוף את הנתונים שמגדירים את הארכיטקטורה: איך נשמרים ומסונכרנים נתונים של טיימפריימים שונים, היכן צווארי הבקבוק במהירות ומה נחשב לתוצאה תקינה. עבור מערכת בדיקת עבר עם תמיכה ברב-טיימפריימים זה ליבת הפתרון העתידי.
- רשימת כלים וטיימפריימים שצריך לכסות — מדקות ועד ימים, עם ציון סדרות בכירות שמשפיעות על ההחלטות.
- מקור ועומק שערי מסחר: נתוני טיק או נרות, האם יש חסרים ופערים, וכיצד לשחזר אותם.
- לוגיקת אסטרטגיה: באיזה טיימפריים מתקבלת החלטה ובאיזה מאושר האות, והיכן מותר פער בזמן.
- כיצד מדובבים עלויות — עמלה, החלקה, השהיית ביצוע הזמנה.
- מה נחשב לתוצאה: סט מדדים, צורות דוחות, ייצוא לניתוח המשך.
- מצב עבודה: הרצות בודדות או סריקת פרמטרים, כמה זמן מותר להמתין לתוצאה אחת.
- מגבלות תשתית והרשאות: היכן ממקמים את המערכת ומי הבעלים של הנתונים ההיסטוריים.
מצדנו, התשובה הראשונה — מסמך עבודה, לא מכתב כוונות. בו תהיה תוכנית עבודה לפי שלבים, הערכת זמנים לכל שלב, הרכב צוות עם תפקידים (ארכיטקט, מהנדס נתונים, מפתח ליבת חישוב, בודק) ורשימת סיכונים עם האופן שבו אנחנו סוגרים אותם.
אם במהלך הניתוח יתברר שחלק מהמשימה נפתר בפשטות, נאמר זאת ישירות. תארו את המשימה — נחזור עם הערכה ותוכנית.







