LSTM עבור סדרות זמן פיננסיות: ארכיטקטורה וולידציה

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

תחומי פיתוח AI

שאלות נפוצות

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

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1112

מדוע LSTM על סדרות זמן נכשל על נתונים אמיתיים

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

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

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

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

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

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

אפקט מדיד: מה משתנה באיכות התחזית

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

איכות לאורך האופק

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

החלפת משטר ופרשנות

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

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

אפשרויות למודל תחזית והמגבלות הטכניות שלהן

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

אפשרות מתי מתאימה מגבלות
רשתות רקורנטיות (LSTM) זיכרון ארוך לפי רצף: קוטבוציות תוך-יומיות, נפחים, זרמי פקודות נדרשת סדרה ארוכה והומוגנית; האימון איטי, תרומת המאפיינים מוסברת בקושי
Gradient boosting על מאפייני לאג אופקים קצרים, מאפיינים טבלאיים, היסטוריה מוגבלת אינו רואה את הסדר בתוך החלון; חלון הלאגים נקבע ידנית
מודלים סטטיסטיים לתחזית עונתיות ומגמה, מדגם קטן, נדרשת פרשנות הנחות לינאריות; קשרים לא-לינאריים הולכים לאיבוד
מודלים היברידיים לתחזית הסדרה מפורקת למגמה, עונתיות ושארית כיוונון כפול; שגיאות הבלוקים מצטברות
מודלי קשב לסדרות אופקים ארוכים, כמה סדרות תלויות זו בזו הרבה נתונים, רגישות לקנה מידה, יקרים יותר בתחזוקה

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

סדר העבודה: מביקורת נתונים ועד מסירת המודל

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

  1. ביקורת נתונים. בודקים ערכים חסרים, כפילויות, פערים בקוטבוציות, סופי שבוע וחגים, משטרי מסחר, פיצולים ואירועים תאגידיים. מתעדים מה מנקים ומה משחזרים — ומדוע.
  2. סכמת מאפיינים וחלון מחליק. קובעים את עומק ההיסטוריה ואת צעד החלון, את מערכת הלאגים, הנגזרים ומאפייני המשטר. את הנרמול מחשבים רק על קטע האימון, אחרת העתיד זולג אל העבר.
  3. הרכבה ואימון של LSTM. תצורה בסיסית עם רגולריזציה ועצירה מוקדמת — כנקודת ייחוס שמולה מושוות כל האפשרויות הבאות.
  4. כיוונון היפר-פרמטרים. מספר השכבות והבלוקים, גודל החלון, שיעור ה-dropout, קצב הלמידה. החיפוש מתבצע על קטע הוולידציה, וקטע הבדיקה לא נפתח עד הסוף.
  5. סכמת ולידציה הוגנת. חלון מחליק עם אימון על העבר ובדיקה על התקופה הבאה, בלי ערבוב. את המדדים מחשבים על פני כמה תקופות, ולא על אחת מוצלחת.
  6. בדיקת יציבות. הסטת תקופה, החלפת תנודתיות, מבחן עמידות בתנועות חדות. המודל חייב לנצח את התחזית הנאיבית, אחרת אין בו תועלת.
  7. מסירת המודל. משקלים, סכמת עיבוד מקדים, סקריפט הרצה ואימון מחדש, מדדים לפי תקופות, תיעוד לשחזור — כדי שהמודל יחיה אצלכם, ולא אצלנו.

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

ארטיפקטים ונהלים שנשארים אצל הלקוח

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

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

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

מקרה בוחן: תחזית ביקוש לפני ואחרי עיבוד מחדש של המודל

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

מה היה לפני עיבוד מחדש

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

מה שינו ומה יצא

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

  • שגיאה באופק של שמונה שבועות: 23% → 11%;
  • שיעור הפסגות שהוחמצו: 38% → 9%;
  • זינוקי שווא: פחות בשליש, המלאי העודף בפריטים שקטים הצטמצם;
  • הכנת התחזית: יומיים של עבודה ידנית → עשרים דקות חישוב.

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

מה עושים כשאין די נתונים לאימון LSTM

היסטוריה קצרה היא прежде всего חוסר איזון בין מספר הפרמטרים לנפח התצפיות: הרשת זוכרת את הרעש של קטע האימון ובקטע המוחזק מפסידה לסטטיסטיקה מחליקה פשוטה. לכן מתחילים לא מהארכיטקטורה, אלא מקו בסיס — אוטורגרסיה או מודל לינארי על תשואות.

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

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

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

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

ספקות טכניים: התאמת-יתר, סחיפה ותחזית מקוונת

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

כיצד אתם שולטים בהתאמת-יתר של המודל?

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

כיצד מנטרים סחיפת נתונים?

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

באיזו תדירות מאמנים מחדש את המודל?

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

מה קורה במצב של תחזית מקוונת?

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

נדון במשימה: נחזור עם הערכה ותוכנית עבודה

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

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

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