Trading System אריאל עייש תקציר מטרת פרויקט זה הנה לנתח ביצועי אלגוריתמי למידה שונים. בעבודתי אשווה בין שתי גישות, עצי החלטה ו - (SVM) Support Vector Machine כאשר אלו ישמשו לחיזוי מגמות עתידיות במחיר ניירות הערך על סמך נתונים יומיים היסטוריים. במהלך הדפים הבאים אנסה להראות את החולשות וחזקות של כל אחת מהגישות. עצי החלטה. מבוא מבנה החלטה דמוי עץ כאשר בכל צומת נבחן מאפיין מתוך רשימת מאפיינים והעלים בעלי תיוג מבין אפשרויות ההחלטה. בהינתן מופע המתאים לעץ, מתחילים משורש העץ. בכל צומת בוחנים את הערך של המופע במאפיין הנוכחי ומתקדמים בכיוון הבן שמתאים לערך זה. במידה והצומת הנוכחי הנו עלה נקבעת ההחלטה להיות התיוג של עלה זה. למידת עץ החלטה הנה התהליך של יצירת עץ מסוג זה על סמך מספר מוגבל של דוגמאות, סט האימון, כך שיהיה יעיל וכללי מספיק שיאפשר מתן תיוג נכון לדוגמאות שלא הופיעו במהלך הלימוד, סט הבדיקה. האופן בו בונים את עץ ההחלטה הוא על ידי בחירת המאפיין האידיאלי, על סמך פונקציית דירוג שנקבעת מראש, ובאופן רקורסיבי בונים עץ החלטה עבור כל אחד מהערכים האפשריים לאותו מאפיין. בכל תת עץ קבוצת האימון הנה תת קבוצה של הקבוצה ברמה הקודמת כאשר כל הדוגמאות בעלות אותו ערך עבור המאפיין שעל פיו פיצלנו את העץ. במקרים בהם לא נותרו מאפיינים או שקבוצת האימון הנה ריקה נקבע את הצומת הנוכחי להיות עלה עם תיוג המתאים לרוב הדוגמאות ברמה הקודמת. בעבודה זו עשיתי שימוש בפונקציית חלוקה ידועה Gain"."Information.Support Vector Machine (SVM) מודל למידה המנתח מידע ומזהה תבניות אשר משתמשים בו לסיווג ורגרסיה. בהינתן סט דוגמאות אימון המתויגות כשייכות לאחת מבין שתי קבוצות אלגוריתם SVM יוצר מודל אשר מסווג דוגמאות חדשות לאחת מבין הקבוצות. אופן הייצוג של הנקודות הנו נקודות במרחב ועל ה SVM למצוא רווח רחב ככל שניתן המפריד בין נקודות אלו. נקודה חדשה מסווגת לאחת מבין הקטגוריות על סמך הצד ביחס לרווח בה היא נמצאת. בצורתו הבסיסית, ללא שימוש במיפויים של הנקודות לממדים גבוהים, SVM מבצע סיווג לינארי. האופן בו הסיווג מתבצע הנו חישוב Hyperplane המפריד את הנקודות מהקטגוריות השונות במרחב, במידה ולא קיימת הפרדה לינארית יש צורך במיפוי של המרחב הסופי בו נמצאות הנקודות למרחב גבוה יותר ולעיתים אינסופי. סכמה זו ידוע בשם.Kernel-trick
רקע תיאור הבעיה כיום כמות המוצרים הפיננסיים להשקעה )מניות, אופציות וכו'( הנה עצומה והמשתמש העצמאי, אשר מנהל תיק השעות פרטי שלא דרך סוכן, נאלץ להשקיע כמות זמן מרובה על מנת לזהות הזדמנויות להשקעה אשר בעלות פוטנציאל לרווח. נדבך משמעותי מזמן זה מושקע במעבר ידני באמצעות התוכנות הסטנדרטיות המציגות מידע היסטורי עבור כל ניירות הערך ואינן מבצעות דירוג כלשהו על סמך מאפיינים טכניים. הבעיה בגישה זו הנה העובדה כי לא פעם משקיע מפספס הזדמנויות רווחיות להשקה עקב העובדה כי אלו "אבדו" באוקיינוס המידע המוצג לפניו ללא כל ניתוח מקדים. בפרויקט זה אתרכז רק בשערי מניות ואנסה למצוא את המועמדות, אלו הצפויות לעליית מחיר של לפחות 2% במהלך החודש הקרוב, מתוך רשימת כל המניות תוך שימוש באינדיקטורים של ניתוח טכני אשר יוסברו בהמשך. מבנה הנתונים על מנת לאמן את אלגוריתמי הלמידה נזקקתי לכמות גדולה של מידע היסטורי עבור מספר גדול של מניות. בחרתי להשתמש בנתונים היסטוריים יומיים של המניות המשתייכות למדד S&P 500 ומדד ה- Nasdaq על פני 01 השנים האחרונות )במידה וזה קיים שכן קיימות מניות אשר אינן סחירות פרק זמן כה ארוך(. מספר המניות שהתקבל הנו 845 )קיימות מניות המשתייכות לשני המדדים(. המידע הגולמי בו השתמשתי הנו שערי פתיחה, סגירה, גבוה יומי, נמוך יומי עבור כל יום מסחר. ייצוג הבעיה תיאור המימוש עבור כל יום )ציטוט( ביצעתי מיפוי של המידע הגולמי עד לנקודת זמן זו לכדי מספר מאפיינים הנגזרים מאינדיקטורים ידועים לניתוח טכני. כמו כן ניתן תיוג חיובי לערכי המאפיינים המתקבלים האם במהלך החודש שבא לאחר מכן ערך המניה רשם שער סגירה הגדול מאחוז מסוים על פי הגדרת המשתמש מהשער סגירה של היום הנוכחי ושלילי אחרת. במהלך האימון על האלגוריתם הלומד לבנות מודל אשר בהינתן ערכים של המאפיינים הנ"ל לנקודת זמן חדשה יוכל לקבוע האם קיים יום במהלך החודש הקרוב בו שער הסגירה יהיה גבוה בלפחות 2% מהשער סגירה של היום המתאים לנקודה המתקבלת. האינדיקטורים בהם עשיתי שימוש להגדרת המאפיינים: ממוצע נע רגיל: ממוצע של שערי המניה בימים האחרונים, בדרך כלל ממוצע זה מחושב לפי שערי הסגירה של המניה. כלי זה מאפשר לזהות את כיוון המגמה של מניות. אם שער המניה נמצא מעל הממוצע, המניה במגמת עליה ואם שער המניה מתחת לממוצע הנע, המניה במגמת ירידה שכן זהו שקלול של שערי המניה בימים האחרונים. בעבודה זו השתמשתי בממוצעים נעים של 22 ו- 25 הימים האחרונים. ממוצע נע אקספוננציאלי: דומה לממוצע נע רגיל תוך מתן משקל רב יותר לימי המסחר האחרונים שכן אלו "רלוונטיים יותר" מאשר ימי המסחר שקדמו להם. המשקל הניתן לעבר יורד בצורה אקספוננציאלית.
קו תמיכה והתנגדות: קווים על הגרף הנוצרים במחירים שבהם הקונים או המוכרים מאבדים תנופה במומנטום. קו תמיכה רמת מחירים שאנו מצפים שתבלום ירידה במחיר, כלומר, אם המחיר של נייר ערך ירד יש סיכוי טוב שייבלם בקו התמיכה. קו התנגדות בדומה לקו תמיכה רק שמצפים שתבלום עלייה במחיר. קו תמיכה שנפרץ הופך לקו התנגדות ולהיפך. (ADX) :Average Directional Index מודד את עוצמת המגמה. תוך שימוש באינדיקטורים המרכיבים את אינדיקטור זה (+DI,-DI) ניתן לקבל אינדיקציה על עוצמת כיוון המגמה. אופן החישוב והסבר מעמיק מצורף קישורים. (RSI) :Relative Strength Index אינדיקטור אשר תפקידו לנתר עוצמה וחולשה של מחירי הסגירה של מניה בזמן הנוכחי או היסטורי על סמך שערי סגירה לאחרונה. אינדיקטור זה אומד את המהירות ועוצמה של תנועת מחירים )מומנטום(. אופן החישוב והספר מעמיק מצורף בקישורים (TSI) :True Strength Index אינדיקטור האומד הן את כיוון המגמה והן מצבים של עודף מכירות או עודף קניות. מצב זה מאותת על שינויים קיצוניים בהפרש בין מחירי הסגירה של ימים עוקבים דבר המצביע על סטייה מאיזון במסחר של מניה. אופן החישוב והסבר מעמיק מצורף קישורים. אדגיש כי בכל אחד ממודלי הלמידה )עץ החלטה ו- )SVM עשיתי שימוש שונה באינדיקטורים ואפרט על כך במימוש הספציפי לכל מודל. קבוצת אימון מול קבוצת בדיקה את מאגר המידע הגולמי )נתונים היסטוריים( עבור כל מנייה פיצלתי לשתיים. חלק ראשון שימש לאימון אלגוריתמי הלמידה ואילו החלק השני, החודש האחרון )"עתיד"(, שימש לבדיקה. על ידי חלוקה זו ניתן היה לאמת האם המניות אשר סומנו על ידי האלגוריתם כמועמדות לרווח אכן היו כאלה. חשוב להדגיש כי באופן חלוקה זו קיימת הנחה סמויה כי החלטת האלגוריתם אינה משפיעה על השוק, כלומר, נפחי המסחר המתבצעים על פי החלטות האלגוריתם אינן משפיעות על האיזון בשוק בכלל ועל שערי המניות בפרט. מימוש עץ החלטה המימוש אותו בחרתי הנו זה המופיע בשקופיות הקורס תוך שימוש בהיוריסטיקה Information Gain על מנת לבחור את המאפיין האידיאלי שעל פיו יבוצע הפיצול בכל צומת. על מנת למנוע מצב של over-fitting הגבלתי את מספר הערכים האפשריים עבור כל מאפיין להיות כ- 2 או 3 ערכים. המאפיינים שעל פיהם נבנה עץ ההחלטה: הפרש בין מממוצע נע 52 לשער נוכחי: ערך בינארי המורה האם הממוצע גבוה מהערך או לא. כאשר הממוצע נמוך מהערך המשמעות היא שהמגמה היא עלייה. הפרש בין ממוצע נע 52 לממוצע נע 25: ערך בינארי המורה האם הממוצע הנע 22 גבוה מהשני. בשילוב עם הפרמטר הקודם יכול לאותת על סיום מגמת עליה. ממוצע נע אקספוננציאלי 52 של אחוז השינוי: ערך בינארי המורה האם הממוצע הנע האקספוננציאלי של אחוז השינוי בשערי הסגירה על פני 22 הציטוטים האחרונים הנו חיובי. יכול להצביע על תקופה בה מרבית הימים היו עם שינוי חיובי עם מתן משקל גדול יותר להיסטוריה הקרובה על פני הרחוקה.
:ADX ערך בינארי הקובע האם הציטוט הנוכחי הנו בעל כיוון חיובי עם עוצמה העוברת את הסף שנקבע על ידי המשתמש. :RSI שלושה ערכים אפשריים המצביעים האם המניה נמכרת במחיר גבוהה ביחס לשערוך על פי השוק, מחיר המשקף את שוויה או במחיר נמוך דבר אשר יכול להצביע על שינוי צפוי כך שיאזן למצב שיווי משקל..RSI במקום TSI תוך שימוש בנוסחת החישוב של,RSI בדומה ל- :TSI מימוש SVM עקב העובדה כי הבעיה אינה פרידה לינארית לא קיים Hyperplane המסוגל להפריד בצורה מושלמת בין דוגמאות חיוביות )דוגמאות אשר באו לפני עליה בערך המניה של האחוז שנקבע( לשליליות בחרתי להשתמש במודל ה- SVM Soft אשר פותר את בעיית ה- margin המקסימלי בדומה ל- SVM Hard תוך התמודדות עם דוגמאות חריגות. האלגוריתם אותו מימשתי בפרויקט זה הנו Soft-SVM" "Stochastic Gradient Descent for המובא להלן: Figure 1 SGD for Soft-SVM algorith. Taken from Machine Learning: Foundations and Algorithms by Shai Ben-David and Shai Shalev-Shwartz המאפיינים המייצגים נקודה במרחב אותו אנו מנסים לחלק: הפרש בין ממוצע נע 52 לשער נוכחי הפרש בין ממוצע נע 25 לשער נוכחי הפרש בין ממוצע נע 52 לממוצע נע 25 ערך ממוצע נע אקספוננציאלי 52 של אחוז השינוי עוצמת מגמת ADX היחס בין כיוון חיובי לשלילי של אינדיקטור ADX ערך אינדיקטור RSI ערך אינדיקטור TSI
מדד להצלחה ניתוח ביצועי הגישות מטרת פרויקט זה הנה לזהות מניות אשר צפויות לרשום עליה במחיר הסגירה במסגרת זמן עתידית מתוך רשימה ארוכה של מניות. אחת הדרכים לאמת כי זה עומד במטרתו היא לבדוק כי אכן המניות אשר סומנו כפוטנציאליות רושמות עלייה. מסגרת הזמן בה בחרתי לבחון את הביצועים הנה של חודש ואחוז העלייה המינימלי הנו 2%. קביעה זו הנה שרירותית וישנם צירופים של מסגרות זמן ועלייה מינימלית נוספים אשר יכלו לתת אינדיקציה לגבי הביצועים. בחרתי בצירוף דרישות זה שכן נראות סבירות עבור משקיע ממוצע לטווחי זמן קצרים בינוניים. ניתוח עץ החלטה על מנת לבחון את התנהגות המודל, בדקתי את ביצועיו עבור ערכים שונים של הפרמטר "[%] Increase,"Price הקובע את אחוז העלייה המינימלי במחיר הסגירה במהלך החודש הקרוב כך שהציטוט הנוכחי יקבל תיוג חיובי, תוך מתן תשומת לב לאחוז השגיאה על קבוצת הבדיקה )False-Positive( וכן מספר המועמדים המוחזרים על ידי האלגוריתם. בחרתי להשתמש בשגיאת בדיקה False-Positive מתוך הרעיון כי למשקיע אשר בוחן את המניות שהתקבלו חשוב שאלו אכן בעלות פוטנציאל גבוה לרווח גם אם ישנן מניות נוספות אשר לא זוהו על ידי האלגוריתם ונדחו. להלן התוצאות המתקבלות: Test Error[%] 35 30 25 20 15 10 5 0 Decision Tree Test Error 0 2 4 6 8 10 Minimal Percent Change 600 500 400 300 200 100 0 Number of candidates
נשים לב שעבור אחוז עלייה מינימלי של עד 3% האלגוריתם מחזיר את כל המניות ברשימה בתור מועמדות. עובדה זו נובעת מהעובדה כי מרבית הדוגמאות המשמשות לאימון מתויגות עם תיוג חיובי שייכות לקבוצת הדוגמאות המציינות עלייה באחוז מינימלי במהלך החודש הקרוב. אבחנה זו מראה לנו כי במרבית המקרים בסיכוי גבוה מובטח לנו שבמהלך החודש הקרוב מיום ההשקעה צפוי לנו רווח ריאלי של 3%~. נשים לב כי מלבד אחוז מינימלי של 6%, עבור אחוזי עלייה הגדולים מ- 3% שגיאת הבדיקה הנה גדולה מאשר השגיאה המתקבלת מהשקעה בכל המניות המופיעות ברשימה. דבר זה אם כן מאכזב שכן המשמעות היא כי האלגוריתם מפספס דווקא את המניות הצפויות להניב רווח. הנקודה היחידה בה ביצועי האלגוריתם הנם טובים מאשר בחירה "טיפשה" של כל המניות הנה עבור אחוז עלייה מינימלי של 6% שזו גם הנקודה המיטבית של האלגוריתם. בנקודה זו אחוז השגיאה על קבוצת הבדיקה הנה 18%~ ומספר המועמדים הנו 22. זוהי אכן תוצאה מסבירת פנים שכן כעת על המשקיע לבחון מספר הקטן משמעותית מהמספר הראשוני )845( מתוך רשימת מניות אשר בעלות סיכוי לעלייה מינימלית של 2%. נקודה מעניינת נוספת שניתן לראות מהתוצאות הנה העובדה כי עבור אחוז עלייה מינימלי של 5.8% ומעלה לא מוחזרת אף מועמדת. אבחנה זו מראה כי עץ ההחלטה מוביל בכמעט כל המסלולים להחלטה שלילית משמע רוב גדול של הדוגמאות הנצפות במהלך האימון היו בעלות תיוג שלילי דבר המצביע כי נדיר לצפות בעלייה חודשית באחוזים אלו. ניתוח SVM חרף ניסיונותיי הרבים לא הצלחתי להגיע למצב בו המניות המוחזרות על ידי האלגוריתם הנם פוטנציאליות לרווח. אנסה להסביר את התובנות שהגעתי אליהן במהלך הניסיונות. תחילה נסתכל על אחוז השגיאה כפונקציה של אחוז עלייה מינימלי כפי שעשינו בחלק הקודם. 40 30 SVM Test Error Test Error[%] 20 10 0 0 2 4 6 8 10 Minimal percent change אכן ניתן לראות כי באף אחד מהמקרים אין עדיפות ממשית לפלט האלגוריתם על פני בחירה שרירותית מתוך רשימת המניות. על מנת שנוכל להבין את האופן בו האלגוריתם בוחר את המועמדות ומדוע אלו אינן באמת פוטנציאליות לרווח נסתכל על היחסים בין שגיאת האימון, מספר הדוגמאות המתויגות חיובית על סמך מבט לעתיד ומספר הדוגמאות אשר תויגו חיובית על ידי המסווג המתקבל לאחר ריצת.Soft-SVM
לשם כך נסתכל בגרף הבא: 120 Train Error 100 80 Percent 60 Percent of examples that were labeled "True" Percent of examples that were classified "True" by SVM 40 20 0 0 1 2 3 4 5 6 7 8 9 10 Minimal percent change נשים לב כי בתחום [1,4] למעלה מ- 99% מהדוגמאות מתויגות על ידי המסווג כחיוביות בעוד שלכל היותר 51% אכן תויגו כחיוביות באמת. כמו כן בתחום [6,9.5] פחות מ- 1.18% מהדוגמאות מתויגות כחיוביות בעוד שלפחות 28% מהן אכן תויגו כחיוביות באמת. מעובדות אלו עולה ההשערה כי האלגוריתם מתקשה להפריד בין הדוגמאות החיוביות לשליליות. על מנת למזער את השגיאה המסווג מפריד בין הקבוצות כך שמספר הדוגמאות שיסווגו בניגוד לתיוג האמתי שלהם הנו מינימלי. נסתכל על התחומים שציינו קודם. בתחומים אלו הסיווגים של המסווג הנם רוב מוחלט לשליליים או חיוביים דבר הנובע מהעובדה כי הדוגמאות השליליות והחיוביות מפוזרות במרחב בצורה כזו שכל מישור העובר דרך הדוגמאות יגרור כי מספר הדוגמאות שיתויגו בניגוד לאמת יהיה גדול מאשר לתייג את כולם על פי התיוג הנפוץ. הפרט המעניין ביותר שניתן להבחין בו הגרף הנ"ל הנו שבנקודה של עלייה מינימלית השווה ל- 2 על אף העובדה כי 25%~ מהדוגמאות תויגו כאמת המסווג סיווג רק 22%~ מהם כחיוביות. עובדה זו בנוסף לאבחנות הקודמות מעלות את הסברה כי האינדיקטורים אשר השתמשנו בהם על מנת לייצג ציטוטים יוצרת הפרדה כלשהי במרחב ה- 8 ממדי אם כי אינה לינארית ועל כן יש לשקול שימוש בפונקציות מיפוי (kernel) למרחב גבוה יותר במהלך אימון ה- SVM אשר בו כן תהיה הפרדה לינארית. הרחבה זו איננה טריוויאלית ואינה בתחום פרויקט זה.
מסקנות מהחלק הקודם ניתן לראות כי עץ החלטה הניב תוצאות טובות יותר מ-.SVM דבר זה אינו מפתיע שכן לא מובטח כי קיימת הפרדה לינארית אשר יכולה לתייג נכונה ציטוטים המצביעים על עליה עתידית במחיר כפי שמתחייב עבור אימון.SVM מנגד עץ החלטה הינו עשיר יותר באופן בו ניתן לקשר בין מאפיינים שונים ועל כן יכול לתאר אוסף ערכי אינדיקטורים המצביעים על מגמה צפויה. העובדה כי אכן הצלחנו להשיג תוצאות הטובות יותר מבחירה שרירותית מתוך רשימת המניות מראה שלא מן הנמנע כי ניתוח טכני אכן מהווה כלי חיזוי בעל בסיס. בעוד תוצאות המסווג המתקבל על ידי Soft-SVM היו מאכזבות עומדת בעינה השאלה האם ניתן לבצע הפרדה על סמך המאפיינים הנגזרים מהאינדיקטורים שהוגדו בפרויקט במרחבים בעלי ממד גבוה יותר או על ידי שימוש במודלים לא ליניאריים כגון רשתות נוירונים וכדומה. ייתכן ועל ידי כך נוכל להגיע לשיפור בשגיאת False-Positive הגדול מ- 9% אשר השגנו באמצעות עץ החלטה.
ממשק המשתמש נספחים על מנת לאפשר סקירה ויזואלית של המניות וטיב האינדיקטורים הוספתי לפרויקט ממשק משתמש אשר מספק שליטה מלאה הן על מודל הלמידה המבוקש והן על הפרמטרים עבור האינדיקטורים. רשימת מניות לבחירה אינדיקטורים להצגה על הגרף פרמטרי אינדיקטורי בורר מודל למידה סרגל אינפורמציה על ידי סימון האופציה points" "Show true ניתן לראות את הנקודות אשר יקבלו תיוג חיובי על סמך הפרמטר [%] Increase.Price פרמטר זה קובע את האחוז המינימלי של עליה במהלך החודש הקרוב על מנת שהציטוט הנוכחי יחשב כחיובי. חלק מהתפריטים הנם סגורים עם עליית התוכנה. לחיצה על סימן ה- "+" תגרום לפתיחתם. עקב כמות המניות במאגר וזמן הקריאה של קובץ הנתונים ייתכן וידרשו מספר שניות עד להופעת החלון. על ידי סימון אזור באמצעות העכבר כאשר הלחצן השמאלי לחוץ ניתן למקד את התצוגה לאזור שנבחר. לאחר בחירת אזור למיקוד ניתן לגלול את התצוגה על ידי הזזת העכבר בזמן שהגלגלת לחוצה. לחיצה חוזרת על המניה מרשימת המניות תאפס את המיקוד.
אופן הרצה הרצת קובץ makefile על ידי הקשת make בטרמינל. הרצת הקובץ TradeSystem שנוצר בתהליך הקומפילציה. בחירת מודל הלמידה ולחיצה על Start Learning יש להמתין עד להופעת אינדיקציה בסרגל האינפורמציה על שגיאת הבדיקה ומספר המניות שנמצאו כמועמדות )תהליך הלמידה לוקח כמספר שניות(..0.2.3.4 הפס האדום מסמן את ההפרדה בין החלק שהשתתף באימון והחלק ששימש לבדיקה. חישוב אינדיקטור :ADX קישורים http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_dire _ctional חישוב :RSI http://stockcharts.com/help/doku.php?id=chart_school:technical_indicators:relative_streng th_in חישוב :TSI http://stockcharts.com/help/doku.php?id=chart_school:technical_indicators:true_strength_ index