אינטגרציית Backtrader: היכן נבדלים בדיקת העבר והמסחר החי
הפער בין בדיקת עבר למסחר כמעט אינו נובע משגיאה בלוגיקת האסטרטגיה. האסטרטגיה רואה את סגירת הנר, מקבלת החלטה, ובבדיקה מקבלת מיד ביצוע באותו מחיר. בחשבון חי יש השהיה בין האות לבין שליחת הפקודה, ובין השליחה למילוי — תנועת שוק שלא הייתה בהיסטוריה.
המקור השני — הנתונים. נר היסטורי ממצה את המרווח לארבעה מספרים: פתיחה, שיא, שפל, סגירה. לפיהם אי אפשר לקבוע אם עמדה פקודה ברמה והיה אחריה נפח אמיתי. הבדיקה רואה את העסקה כמבוצעת בנגיעת מחיר, והמסחר החי משאיר אותה לא מבוצעת: לפניכם עברה פקודת לימיט גדולה.
השלישי — מודל המילוי. כברירת מחדל הפקודה נסגרת כולה במחיר אחד, בעוד שספר הפקודות האמיתי מפצל אותה לחלקים, והמחיר הממוצע שונה ממחיר האות. זו ההחלקה: במכשירים נזילים היא בלתי מורגשת, ובמכשירים דקים היא הופכת עקומת רווח חלקה לעקומת הפסד.
כל עוד שלושת הגורמים חבויים בהנחות ברירת מחדל, התוצאה על ההיסטוריה אינה אומרת דבר על התוצאה בחשבון. האינטגרציה עם Backtrader חשובה בדיוק כאן: אותו קוד רץ גם על היסטוריה וגם במסחר חי, וההחלקה, העמלה וכללי ביצוע הפקודות מוגדרים במפורש ונבדקים על אותם נתונים. נפרט כיצד זה נסגר.
מה משתנה בתוצאות לאחר העברת האסטרטגיה למסלול חי
ריצות בקרה על אותו חתך נתונים נותנות תוצאה זהה — לא «בערך דומה», אלא מתכנסת עד לעסקה בודדת. זה הדבר הראשון שמשתנה לאחר אינטגרציה נכונה: סדר עיבוד הנרות, מודל הביצוע ומקור הציטוטים מקובעים, ולכן ריצה חוזרת אינה מביאה הפתעות.
השהיית הביצוע מפסיקה להיות הנחה. הפקודה במסלול חי עוברת דרך מתאם הברוקר, מאושרת לא באופן מיידי ויכולה להתבצע בחלקים — מודל הביצוע מתחשב בכך, ושיעור העסקאות הנדחות יורד מחמישה-עשרה עד עשרים אחוזים למקרים בודדים.
יציבות האסטרטגיה נבדקת במשטרי שוק שונים — מגמה, טווח צד, תנודתיות גבוהה — ובתקופות סמוכות שלא השתתפו בכיול. אם הפרמטרים הותאמו לקטע היסטוריה אחד, בשאר הקטעים הירידה גדלה פי כמה; לאחר הבדיקה רואים אילו הגדרות מחזיקות מעמד ואילו רק הולבשו על הנתונים.
יכולת השחזור של התוצאות נשענת על השוואה: יומן העסקאות מהמסלול החי וזה מהמסלול הנבדק מותאמים לפי זמן כניסה ויציאה. פער מדדים מעל שני אחוזים חוסם את היציאה לאוויר — זה סימן לשגיאה באינטגרציה, ולא ל«שוק אחר».
את האינטגרציה אנו מובילים על Backtrader: אותו קוד אסטרטגיה עובד גם על היסטוריה וגם במסלול חי, ולכן הפער מוסבר על ידי מודל הביצוע ולא על ידי לוגיקה שונה. בפלט — מספרים שאפשר לעמוד מאחוריהם: כמה פקודות לא הגיעו, כיצד האסטרטגיה מתנהגת בשינוי משטר, והאם ריצות הבקרה תואמות.
מצבי חיבור: ארכיון נתונים, בדיקת זרימה, חשבון חי
אותה אסטרטגיה על Backtrader רצה בשלושה מצבים: ריצה על ארכיון, בדיקת זרימה על ציטוטים חיים ועבודה בחשבון חי. בדיוק בגלל זה בוחרים מסלול כזה — אין צורך לשכתב את הלוגיקה במעבר מבדיקת השערה לפקודות אמיתיות.
אבל קוד זהה אינו אומר התנהגות זהה: בכל מצב משתנים מקור הנתונים, רגע שליחת הפקודה ומודל הביצוע שלה, והבדלים אלה בדיוק יוצרים פערים בתוצאות.
| מצב | מתי מתאים | מגבלות |
|---|---|---|
| ארכיון נתונים | מעבר על השערות, אופטימיזציית פרמטרים, ריצה על היסטוריה ארוכה | אין השהיות וביצועים חלקיים: הפקודה נסגרת במחיר הנר — אידיאליזציה שלא קיימת בזירה |
| בדיקת זרימה | בדיקת לוגיקה על זרם חי ללא סיכון: הציטוטים מגיעים בזמן אמת, והפקודות אינן יוצאות החוצה | השהיות והחלקה הן מודליות בלבד, והפער מול הביצוע האמיתי נשאר |
| חשבון חי | פקודות אמיתיות ואישורים מהזירה | סירובים, פקודות נדחות, ניתוקי תקשורת; נדרשים אידמפוטנטיות של פקודות ושחזור פוזיציה לאחר אתחול מחדש |
אנו מריצים את האסטרטגיה דרך כל שלושת המצבים על אותה קבוצת מכשירים ואותה תקופה ומשווים עקומות תשואה. אם תוצאות בדיקת הזרימה והחשבון החי נבדלות מתוצאת הארכיון יותר ממה שמאפשרת לוגיקת האסטרטגיה, הסיבה כמעט תמיד במודל הביצוע — מתקנים אותו לפני שכספים אמיתיים נכנסים למסלול. בנפרד אנו בודקים ניתוק חיבור ותקינות שחזור מצב הפוזיציה על אותו קוד.
סדר העבודות: מביקורת אסטרטגיה ועד מסירת המערכת
את סדר השלבים מקבעים לפני תחילת העבודה: הוא סוגר את הסיכון המרכזי — פער בין תוצאות בדיקת העבר למסחר בחשבון אמיתי. הסיבה בדרך כלל אינה בלוגיקת האסטרטגיה, אלא בהבדל בנתונים, בעמלות, בהחלקה וברגע ביצוע הפקודה בבדיקה ובמסלול העבודה.
- ביקורת אסטרטגיה ונתונים. מנתחים את לוגיקת הכניסות והיציאות, בודקים את הסדרות ההיסטוריות לחסרים, כפילויות והטיית מבט קדימה, ומסכמים מדדי יעד.
- תרשים המערכת. מגדירים את הרכב הרכיבים, זרימות הנתונים, נקודות הכשל והתנהגות בעת ניתוק תקשורת — לפני כתיבת הקוד.
- הכנת הסביבה. בונים סביבה מבודדת עם תלויות מקובעות, כך שריצה בסטנד אחר תיתן את אותה תוצאה.
- ריצות בקרה. מריצים את האסטרטגיה על קטע היסטורי ובמקביל על חשבון בדיקה, ומשווים עסקאות, זמן כניסה ומדדים מסכמים.
- קבלה. משווים את התוצאה לסטיות שהוסכמו בביקורת; פערים מנתחים לפני המסירה, לא אחרי ההרצה.
- מסירת המערכת. מוסרים קונפיגורציות Backtrader, תרשימים, נהלי הפעלה ושחזור, תיעוד והרשאות.
- הדרכה ותמיכה. מראים כיצד לשנות פרמטרים, לקרוא דוחות ולעצור את המערכת כסדרה, ונשארים בקשר לאירועים.
כל שלב מסתיים בארטיפקט שניתן לבדוק: דוח נתונים, תרשים, קונפיגורציה, פרוטוקול ריצות, טופס קבלה חתום.
קונפיגורציות, יומנים ונהלים שנשארים אצלכם
אנו מוסרים לא אוסף סקריפטים, אלא מסלול מסחר בר-שחזור: אותן קונפיגורציות, אותם נתונים, אותם יומני ריצה שעליהם התקבלו המספרים בדוח. הצוות שלכם פורס אותו בצד שלו ומקבל תוצאות תואמות — בלי גישה לסביבה שלנו ובלי מכתבי הבהרה. להלן מה בדיוק מקובע במסירה.
- קונפיגורציות של אסטרטגיות ומקורות נתונים: טווחי זמן, הרכב מכשירים, עמלות ומודל החלקה, פרמטרי סיכון. קובץ אחד — ריצה אחת, בלי תיקונים «מהזיכרון».
- תרשים המערכת: אילו רכיבים משתתפים, היכן נשמרים הנתונים, כיצד מופרדים טכנית ריצת הבדיקה וההפעלה בייצור, ובאיזו נקודה מתכנסים אותות הברוקר.
- יומני ריצה: רשומות גולמיות לכל עסקה, עקומת הון, סיכום ירידות ותשואה. כל מספר בדוח ניתן לפרוש עד לעסקה מסוימת.
- נהלים: מה לעשות בעת פער בין תוצאת הבדיקה לתוצאת הייצור, כיצד עוצרים את האסטרטגיה, כיצד חוזרים לקונפיגורציה קודמת, ולמי נשלחת התראה.
- כללי גישה: היכן נשמרים מפתחות ופרטי חשבון, מי משתמש בהם, כיצד מתבצעת רוטציה, ומה מגביל את מסלול הייצור במצב חירום.
- הוראות לצוות: הפעלה ועצירה, הוספת מכשיר או אסטרטגיה חדשים, עדכון נתונים היסטוריים, קריאת יומנים.
- צ'ק-ליסט קבלה: מערכת בדיקות שהצד שלכם מריץ בעצמו ומאשר שחזור על הנתונים שלו.
התיעוד מתעדכן יחד עם הקוד — כשמשתנה לוגיקת הכניסות או מודל העלויות, אנו מכניסים את השינויים לנהלים, ומכאן והלאה תעשו זאת אתם לפי הסדר המתואר. תארו את המשימה — נחזור עם הערכה ותוכנית מסירה.
מקרה בוחן: כיצד צמצמנו את הפער בין הבדיקה למסחר
הלקוח — צוות למסחר אלגוריתמי. האסטרטגיה על נתונים היסטוריים הראתה צמיחה יציבה, אבל בחשבון אמיתי התוצאה הייתה שונה עד כדי כך שהיה צריך לקבל החלטות מחדש.
השורש לא היה בלוגיקת האסטרטגיה, אלא במערכת: ריצת הבדיקה והביצוע בייצור חיו במימושים שונים, ולכן הפער הצטבר עוד לפני העסקה הראשונה.
מה היה לפני האינטגרציה
מדידות לפני העבודה: התשואה המסכמת של הבדיקה והמסחר האמיתי נבדלו ב-30–40%, ובתקופות מסוימות סימן התוצאה התהפך. הסיבות — ביצוע פקודות אידאלי, היעדר החלקה, סט נתונים היסטוריים שונה ולוגיקת אותות כפולה בשני מקומות.
מה נבנה מחדש במערכת
צמצמנו את הבדיקה והמסחר לליבה אחת לחישוב אותות על Backtrader, הוספנו מודל ביצוע עם השהיה והחלקה, הבאנו את זרם הציטוטים והאירועים התאגידיים למקור אחיד, והפעלנו תיעוד ביומן של כל החלטה עם הפרמטרים בכניסה.
לאחר מכן הפער במדדים המסכמים הצטמצם ל-4–6%, ושיעור העסקאות עם סטייה בלתי מוסברת — מ-18% ל-1–2%. ריצת היסטוריה שנתית הואצה פי שניים הודות למטמון נתונים, והעברת אסטרטגיה למצב ייצור אורכת שעות במקום ימים.
במה נבדלת ריצה על היסטוריה ממסחר בחשבון חי?
ריצה היסטורית וחשבון חי הם שני מצבי ביצוע שונים של אותה אסטרטגיה. במסלול הבדיקה הנר כבר סגור, ומחיר העסקה ידוע מראש; בחשבון חי ההחלטה מתקבלת לפי נתונים חלקיים, ובין האות לאישור עובר זמן. מכאן גם המקור המרכזי לפערים — השהיות בביצוע.
נסכם את ההבדלים בשלושה צירים: נתונים, ביצוע ובקרת פוזיציה.
| מה משווים | ריצה היסטורית | חשבון חי |
|---|---|---|
| נתונים | נרות סגורים, היסטוריה בלי חסרים | זרם מחירים עם הפסקות ועיכוב בפרסום |
| ביצוע | מיידי לפי מחיר הנר | הפקודה בתור, מילוי חלקי, החלקה |
| מצב הפוזיציה | מיומן העסקאות | השוואה לדוח הברוקר, ייתכנו פערים |
| שחזוריות | מלאה, הריצה משוחזרת | תלויה ברגע ובנזילות השוק |
הבדלי המצבים נבדקים על קוד אחד: Backtrader מריץ את אותה אסטרטגיה גם על היסטוריה וגם בחשבון חי — משתנים מקור הנתונים וממשק הברוקר, והלוגיקה נשארת. זה מסיר את הסיכון המרכזי: פער בין מה שנבדק לבין מה שבאמת סוחר.
בנפרד יש בקרת מצב: לאחר ניתוק תקשורת או פקודה נדחית, הפוזיציה בחשבון עלולה לסטות מהיומן המקומי. לכן למערכת מוסיפים השוואה לדוח הברוקר, הגנה מכפילויות בשליחה חוזרת של פקודות ויומן לניתוח אירועים. ככל שהשהיות מלאכותיות ומילויים חלקיים מופיעים מוקדם יותר במסלול הבדיקה, כך פחות הפתעות בחשבון החי.
ספקות טכניים שכדאי להסיר לפני ההתחלה
חלק מהשאלות חוזרות כמעט בכל אינטגרציה עם Backtrader — הן עוסקות בשאלה היכן נגמרת העקומה היפה בגרף ומתחילה התנהגות שמשתחזרת בחשבון אמיתי. להלן תשובות לאלה שצפות לרוב בשלב ההערכה.
כיצד נכנסים לחישוב עמלות והחלקה?
העמלה מוגדרת על ידי מודל הברוקר ומחויבת בנפרד על כל עסקה, ולא מנוכה פעם אחת מהעקומה המסכמת. ההחלקה מתוארת כשיעור ממחיר הביצוע או כצעד קבוע: הפקודה נסגרת במחיר הנר הבא, ולא בסגירת נר האות.
בגלל זה אסטרטגיות עם עסקאות תכופות מאבדות חלק ניכר מהתוצאה — וזה נראה לפני ההפעלה, לא אחרי השבועות הראשונים של מסחר.
יש לנו מקור נתונים משלנו — אפשר לחבר אותו?
כן. זרם ציטוטים משלכם מתואר כמקור עם התאמה לפורמט אחיד: אזור זמן, מרווחים חסרים, התאמה לפיצולי מניות ודיבידנדים. זו לא פורמליות — קרעים בהיסטוריה וכפילויות של נרות נותנים אותות כניסה שגויים ותשואה מנופחת בדוח.
כיצד להבין שהאסטרטגיה יציבה ולא הולבשה על ההיסטוריה?
הריצה מתבצעת לא על קטע אחד, אלא על כמה משטרי שוק: מגמה, טווח צד, תנועות חדות ללא המשך. בודקים כיצד מתנהגים הירידה ושיעור העסקאות הרווחיות כשמזיזים את תקופת הבדיקה. אם המדדים מחזיקים מעמד — הלוגיקה ניתנת להעברה לחשבון אמיתי; אם היא מתפוררת, הצוואר הצר נמצא בשלב הבדיקות.
אינטגרציה עם Backtrader: נדון במערכת שלכם ונחזור עם הערכה
כדי שהאינטגרציה עם Backtrader תישען על תנאים אמיתיים ולא על הנחות, אנו זקוקים למבט פנימה אל מערכת המסחר שלכם: כיצד מופעלות כעת האסטרטגיות, מאין מגיעים הנתונים ולאן הולכות הפקודות. ככל שהנתונים הראשוניים מלאים יותר, כך יהיו פחות הנחות בתוכנית העבודה והמועדים יהיו מדויקים יותר. סט הפתיחה מהצוות שלכם הוא בדרך כלל כזה:
- מאגר קוד עם אסטרטגיות וכללי ההפעלה שלהן — מה כבר אוטומטי ומה נעשה ביד;
- ייצוא נתונים היסטוריים: טווח זמן, עומק, התחשבות בעמלות, בהחלקה ובאירועים תאגידיים;
- רשימת ברוקרים וזירות שבהן נדרש מסחר בזמן אמת, עם דרכי גישה ומגבלות;
- דרישות סיכון: הגבלת פוזיציה, הפסד יומי, התנהגות בעת ניתוק תקשורת ושליחה חוזרת של פקודה;
- תיאור התשתית: היכן תמוקם המערכת, אילו מגבלות רשת, הרשאות ולוח זמנים יש;
- אחראי מצדכם שמאשר את לוגיקת האסטרטגיות ומקבל את תוצאות ההשוואה;
- דוגמה ייחוסית: עסקה או תקופה שבהן החישוב צריך להתאים עד לדיוק מלא.
הדיון אורך פגישה עניינית אחת: מנתחים את מערכת המסחר, מסירים נקודות לא ברורות ומקבעים את גבולות העבודה. לאחר מכן אנו חוזרים עם הערכת המשימה ותוכנית עבודה — שלבים, מועדים ונקודות קבלה שבהן רואים תוצאה בכל צעד. תארו את המשימה — נחזור עם חישוב.







