כל המאמרים
BacktestingLook-ahead BiasPythonמדריך
·נכתב על ידי עדן מרגוליס

מה זה Look-ahead Bias וכיצד נמנעים ממנו

Look-ahead Bias מוסבר: איך אסטרטגיית Backtesting 'מרמה' בטעות בעזרת מידע מהעתיד, דוגמאות קוד לשגיאה הנפוצה, ואיך למנוע אותה.

Look-ahead Bias היא שגיאה ב-Backtesting שבה האסטרטגיה משתמשת, בטעות, במידע שלא היה זמין בפועל באותו רגע בזמן. הדוגמה הקלאסית: שימוש במחיר הסגירה של אותו יום כדי לקבל החלטת קנייה שאמורה להתבצע במהלך אותו יום, לפני שהוא הסתיים. Look-ahead Bias מנפחת את תוצאות ה-Backtesting באופן לא ריאלי — ולעיתים היא הסיבה המרכזית לכך שאסטרטגיה נראית "מצוינת" בבדיקה ונכשלת לגמרי במסחר חי.


איך זה קורה בפועל

Look-ahead Bias לרוב לא מכוונת — היא נובעת מטעות תכנותית עדינה שקל לפספס. הדוגמה הנפוצה ביותר:

# שגוי - Look-ahead Bias
df["signal"] = df["close"] > df["ma20"]  # משתמש במחיר הסגירה של היום כדי "לסחור" באותו יום

# תקין - האיתות נבדק על נתוני היום הקודם, הביצוע קורה למחרת
df["signal"] = df["close"].shift(1) > df["ma20"].shift(1)
df["execution_price"] = df["open"]  # ביצוע לפי מחיר הפתיחה של היום הבא

בגרסה הראשונה, הבוט "יודע" מה מחיר הסגירה יהיה עוד לפני שהיום הסתיים — דבר שאף אלגוריתם לא יכול לדעת בזמן אמת. בגרסה השנייה, ההחלטה מתקבלת על בסיס נתונים מהיום הקודם (שכבר ידועים במלואם), והביצוע קורה למחרת בפתיחה.

מקורות נפוצים נוספים ל-Look-ahead Bias

  • נתונים מתוקנים רטרואקטיבית — דוחות כספיים או מדדים כלכליים שמתפרסמים ראשונית ואז מתוקנים מאוחר יותר. שימוש בגרסה המתוקנת ב-Backtesting מניח ידע שלא היה קיים במקור.
  • אינדיקטורים שמחושבים על "חלון מלא" — פונקציות שמחשבות ממוצע נע או נורמליזציה על כל הדאטהסט בבת אחת, במקום רק על הנתונים עד לאותה נקודת זמן.
  • סינון מניות לפי מדד עתידי — למשל בחירת מניות "שהיו הכי רווחיות ב-2024" כדי לבדוק אסטרטגיה על 2023 — האסטרטגיה כבר "יודעת" איזה מניות הצליחו.

למה זו הבעיה הכי מסוכנת ב-Backtesting

בניגוד לשגיאות תכנות רגילות שגורמות לקוד לקרוס או להראות תוצאה גרועה בבירור, Look-ahead Bias עושה בדיוק ההפך: היא גורמת לאסטרטגיה להיראות טובה יותר ממה שהיא באמת. זה מסוכן במיוחד כי אין שום סימן אזהרה ברור — התוצאות נראות אמינות ומעודדות, אבל מבוססות על מידע שלעולם לא יהיה זמין בזמן אמת.

איך לבדוק אם יש Look-ahead Bias בקוד

שאלה שכדאי לשאול על כל שורת קוד שמקבלת החלטת מסחר: "האם המידע הזה היה זמין בפועל ברגע שהחלטתי לפעול, או שהוא מגיע מאוחר יותר?" בדיקה מעשית: הריצו את הבקטסט תוך "קיצוץ" הנתונים בכל נקודת זמן לרק מה שהיה ידוע עד אז (Walk-Forward-style), ובדקו אם התוצאות משתנות משמעותית מבדיקה על כל הדאטה בבת אחת.

שאלות נפוצות

האם Look-ahead Bias קורה רק בטעויות קוד?

בעיקר כן — זו כמעט תמיד שגיאה עדינה בקוד, לא כוונה. אבל היא שכיחה במיוחד אצל מתחילים ובקוד שנכתב מהר בלי בדיקה קפדנית של סדר הפעולות בזמן.

איך זה קשור ל-Overfitting?

הם נפרדים אך לעיתים מופיעים יחד. Overfitting הוא כיוונון יתר של פרמטרים לנתוני העבר. Look-ahead Bias הוא שימוש במידע שלא היה זמין בכלל. שניהם מנפחים תוצאות Backtesting, אבל מסיבות שונות ודורשים בדיקות שונות.

איך בודקים שהתיקון עבד?

השוו את תוצאות הבקטסט לפני ואחרי התיקון (הוספת .shift(1) וביצוע לפי מחיר פתיחה במקום סגירה). ירידה משמעותית בתוצאות אחרי התיקון היא סימן שהיה Look-ahead Bias משמעותי בגרסה המקורית.

האם ספריות Backtesting מוכנות כמו backtrader פותרות את הבעיה אוטומטית?

הן מקטינות את הסיכון כי הן אוכפות מבנה שבו איתותים מחושבים על ברים שכבר נסגרו, אך לא מבטלות אותה לחלוטין — עדיין אפשר ליצור Look-ahead Bias דרך שימוש שגוי בנתונים חיצוניים (כמו דוחות כספיים מתוקנים). מודעות לבעיה חשובה גם כשמשתמשים בכלים מוכנים.

רוצה לבנות בוט כזה בעצמך?

שיחה קצרה של 20 דקות.

דברו איתנו חינם