פיתוח מערכת grid search לאופטימיזציה של פרמטרים של אסטרטגיה

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

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1376
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1350
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    798
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1088
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1034
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1130

מדוע grid search על היסטוריה נותן יציבות מדומה

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

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

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

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

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

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

אופטימיזרים כמו scikit-learn אינם יוצרים את השגיאה הזו, אלא פשוט מבצעים אותה נאמנה: סריקה היא סריקה, והחיפוש עצמו אינו מבחין בין חוקיות לצירוף מקרים. יציבות מחוץ למדגם מובטחת על ידי הליך ולידציה, שפיזית אינו מאפשר לאסטרטגיה לראות את העתיד. נפרק כיצד זה נסגר.

מה נותן כיוונון הגדרות אסטרטגיה מבוקר

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

בחירה לפי יציבות במקום מרדף אחר מקסימום

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

תוצאה מחוץ למדגם כמסנן חובה

כל קומבינציה נבדקת על נתונים שלא השתתפו בכיוונון: חלונות מחליקים (sliding windows), חלוקה לפי סגמנטים של השוק. הפער בין הכיוונון לבדיקה הופך למספר — נראית החלקה של הגדרות שתוצאתן נפלה, ועד כמה עמוק. מועמדים שנכשלו מחוץ למדגם אינם מגיעים למעגל המסחר.

מקבול החישובים מקצר את מחזור הסריקה

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

שינוי בסוג הכשלים

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

אופטימיזציה של פרמטרים: סריקת רשת מול חיפוש בייסיאני

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

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

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

אפשרות מתי מתאים מגבלות
סריקת רשת מלאה 2–3 פרמטרים, נדרשת מפה מלאה של יציבות ומשוחזרות הקומבינציות גדלות באופן מולטיפליקטיבי; על 5+ צירים אינו נכנס בזמן סביר
חיפוש אקראי פרמטרים רבים, חלקם משפיעים חלש על התוצאה אין הבטחה לכיסוי; התוצאה תלויה בזרע המחולל ובנפח המדגם
אופטימיזציה בייסיאנית פונקציית מטרה חלקה, הרצה יקרה, עד 10–15 פרמטרים רגישה לרעש ולחריגות; על נוף לא רציף מפסידה לסריקה
חיפוש אדפטיבי עם פסילה טווחים רחבים, יש צורך לצמצם את מספר ההרצות דורש קריטריון פסילה תקין, אחרת אובדות קונפיגורציות יציבות נדירות

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

שלבי הטמעת קונבייר לכיוונון הגדרות

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

  1. ביקורת נתונים. בודקים את ההיסטוריה לגבי קרעים, חסרים, כפילויות ו-survivorship bias של כלים, משווים משטרי מסחר ואירועים תאגידיים. בלי זה אופטימיזציית grid search של פרמטרים מותאמת לארטיפקטים של הסדרה, ולא להתנהגות השוק.
  2. סכימת בדיקה. מחלקים את ההיסטוריה לחלונות עוקבים, קובעים איסור על הצצה קדימה ומשאירים תקופה נדחית שאינה משתתפת בכיוונון. את הסכימה מתאמים לפני החישובים, ולא אחריהם.
  3. הגדרת החישובים. מגדירים את הרשת: אילו פרמטרים סורקים, באיזה צעד ובאילו גבולות, היכן מחשבים וכיצד מפזרים את הנפח. מיד מוסיפים עלויות — עמלה, סליפג', עלות גלגול פוזיציה.
  4. בקרת תוצאה. מסתכלים לא על הנקודה הטובה של הרשת, אלא על היציבות: כיצד מתנהגות קומבינציות שכנות, כיצד משתנים ה-drawdown ופרופיט-פקטור על החלונות. פסגה בודדת בלי מישור אינה נכנסת לעבודה.

כיצד מתקבלת התוצאה

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

סט חומרים והגדרות שנשאר אצלכם

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

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

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

מקרה בוחן: כיצד קיצרנו את סריקת ההגדרות והסרנו את ההתאמה היתרה

מה היה

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

מה שינינו

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

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

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

זמן מחזור הכיוונון ירד מיותר מיממה ל-40 דקות: פסילה מוקדמת ומקבול הסירו חישובי סרק. הצוות בודק עשרות השערות ביום במקום אחת.

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

במה נבדלת סריקת רשת מלאה מחיפוש בייסיאני?

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

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

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

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

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

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

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

ספקות טכניים שכדאי להסיר לפני ההתחלה

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

כיצד להבחין בין הגדרה עובדת לבין התאמה להיסטוריה?

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

יש לנו היסטוריה קצרה מהנדרש. זה קריטי?

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

האם ניתן לחשב מחדש את ההגדרות אוטומטית?

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

איזה מדד איכות לקחת כבסיס?

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

מה לעשות בעת שינוי משטר שוק?

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

ספרו לנו על המשימה — נחזור עם הערכה ותוכנית עבודה

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

כדאי לצרף לפנייה:

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

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

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