כל המאמרים
BacktestingWalk-Forward TestingPythonמדריך
·נכתב על ידי עדן מרגוליס

Walk-Forward Testing — מה זה ולמה עדיף על Backtesting רגיל

Walk-Forward Testing מוסבר: איך הטכניקה מדמה כיוונון אסטרטגיה מתמשך לאורך זמן, ולמה היא בודקת עמידות בפני Overfitting טוב יותר מבקטסט חד-פעמי.

Walk-Forward Testing היא טכניקת בדיקה שבה מכווננים אסטרטגיה על חלון זמן, בודקים אותה על החלון הבא (שלא נגעו בו בכיוונון), ואז מזיזים את שני החלונות קדימה וחוזרים על התהליך שוב ושוב. בניגוד ל-Out-of-Sample Testing הרגיל (חלוקה חד-פעמית לשתי תקופות), Walk-Forward מדמה איך אסטרטגיה הייתה מתפקדת בפועל אם הייתה מתעדכנת מחדש לאורך זמן — ונותן תמונה אמינה הרבה יותר לגבי עמידות מול Overfitting.


למה בקטסט חד-פעמי לא מספיק

בדיקת Out-of-Sample רגילה מחלקת את הנתונים פעם אחת: לדוגמה, מכווננים על 2019-2022 ובודקים על 2023-2024. הבעיה: זו עדיין רק בדיקה אחת. אם האסטרטגיה "הצליחה במקרה" להתאים לתקופת הבדיקה, לא נדע את זה מבדיקה בודדת. Walk-Forward פותר את זה על ידי חזרה על התהליך עשרות פעמים על חלונות זמן שונים.

איך Walk-Forward Testing עובד

חלון 1: כיוונון על ינואר 2019 - דצמבר 2020  |  בדיקה על ינואר-יוני 2021
חלון 2: כיוונון על יולי 2019 - יוני 2021    |  בדיקה על יולי-דצמבר 2021
חלון 3: כיוונון על ינואר 2020 - דצמבר 2021  |  בדיקה על ינואר-יוני 2022
...וכך הלאה, מזיזים את שני החלונות קדימה

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

window_size_months = 24
test_size_months = 6
step_months = 6

results = []
start = data.index.min()
while True:
    train_end = start + pd.DateOffset(months=window_size_months)
    test_end = train_end + pd.DateOffset(months=test_size_months)
    if test_end > data.index.max():
        break

    train_data = data[start:train_end]
    test_data = data[train_end:test_end]

    best_params = optimize_strategy(train_data)          # כיוונון על חלון האימון
    test_result = run_backtest(test_data, best_params)    # בדיקה עיוורת על החלון הבא
    results.append(test_result)

    start += pd.DateOffset(months=step_months)

מה בודקים בתוצאות

התוצאה הסופית של Walk-Forward Testing היא לא מספר בודד, אלא רצף של תוצאות — אחת לכל חלון. הדבר החשוב לבדוק הוא העקביות ביניהן, לא רק הממוצע:

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

מתי Walk-Forward Testing שווה את המאמץ

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

שאלות נפוצות

מה ההבדל בין Walk-Forward Testing ל-Out-of-Sample Testing רגיל?

Out-of-Sample הוא חלוקה חד-פעמית: מכווננים פעם אחת, בודקים פעם אחת. Walk-Forward חוזר על התהליך עשרות פעמים על חלונות זמן נעים, ונותן תמונה סטטיסטית עשירה יותר על עמידות האסטרטגיה לאורך זמן.

כמה חלונות צריך כדי שהתוצאה תהיה אמינה?

ככל שיותר, כך עדיף — לפחות 8-10 חלונות נחשב מינימום סביר לתמונה משמעותית. פחות מזה קרוב יותר לבדיקת Out-of-Sample רגילה.

האם Walk-Forward Testing מבטל את הסיכון ל-Overfitting?

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

האם צריך ספרייה מיוחדת כדי להריץ Walk-Forward Testing?

לא הכרחי — אפשר לממש אותו בלולאת Python בסיסית כמו בדוגמה למעלה. ספריות כמו vectorbt ו-backtrader כוללות תמיכה מובנית שחוסכת עבודת תשתית ברגע שהאסטרטגיה מורכבת יותר.

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

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

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