על שולחן הניתוחים Uval Vered, פברואר 18, 2024מאי 14, 2024 בפוסט הזה אני אציג ניתוח בסיסי לשני אינדקסים מפורסמים, כאשר ישנן שתי מטרות: א) ריענון מושגים בסיסיים בסטטיסטיקה והשימוש בהם בקונטקסט הפיננסי.ב) הדגמת השימוש בפייתון ו-Jupyter notebook כבסיס לניתוח. במסגרת הניתוח נייבא את רמת המחירים היומית של המדדים ב10 השנים האחרונות, נבין מה הייתה התשואה השנתית והתשואה השנתית הממוצעת, מהיא השונות וסטיית התקן והשאלה עליה נרצה לענות היא “מה הקורלציה בין המדדים?” כלומר כמה דומה (או שונה) מתנהגים המדדים זה לזה. יש לכם הימור? לי כבר יש.. המושגים הסטטיסטיים עליהם נעבור: ממוצע אריתמטי, ממוצע גיאומטרי, שונות, סטיית תקן, שונות משותפת (כן כן – זה המונח העברי לCovariance) וקורלציה. ספריות פייתון בהן נשתמש: numpy, pandas, yfinance, matplotlib וכאמור כדי להקל על העבודה ועל הוזיואליזציה ממומלץ להשתמש בJupyer notebook מספר הערות חשובות לפני שנצא לדרך.1. הבלוג הזה לא יגדיר מושגים בסיסיים בשוק ההון. אני מניח שאתם מגיעים עם ידע בסיסי לכאן, ובמידה שלא יש מידע בשפע באינטרנט שמסביר שוב ושוב את אותם מושגי בסיס (למשל מה זה אינדקס). 2. אני מתעלם במודע מהצורך לבדוק את איכות הנתונים. אני משתמש כאן בAPI של Yahoo finance ולצורך ההדגמה איכות המידע שם מספקת אותי. כן חשוב לציין שמי שירצה ליישם את הדוגמאות כאן (וכמובן לפתח אותן) לצורך מחקר שיוכל להביא לאסטרטגיות השקעה ברות קיימא יצטרך לבחור Data set מספיק גדול (מבחינת שנים) ושאיכות המידע בו (שכמובן הולכת ונהיית טריקית ככל שחוזרים אחורה בזמן) מספקת. אז without further ado קופצים ראש למים (החמימים והנעימים והפשוטים להבנה, כן? מבטיח להחזיק לכם את היד). ראשית נביא את המידע מYahoo finance # Define the tickers tickers = ['^GSPC', '^NDX'] # Fetch data from Yahoo Finance data = yf.download(tickers, start="2013-12-31", end="2023-12-31")['Adj Close'] כעת אנחנו מחזיקים DataFrame עם מחיר הסגירה לכל הימים ב10 השנים שהחלו ב31 לדצמבר 2013 ונגמרו ב31 לדצמבר 2023. איך נראה המידע אתם שואלים? –> Ticker ^GSPC ^NDX Date 2013-12-31 1848.359985 3592.000000 2014-01-02 1831.979980 3563.570068 2014-01-03 1831.369995 3538.729980 2014-01-06 1826.770020 3526.959961 2014-01-07 1837.880005 3557.850098 ... ... ... 2023-12-22 4754.629883 16777.400391 2023-12-26 4774.750000 16878.460938 2023-12-27 4781.580078 16906.800781 2023-12-28 4783.350098 16898.470703 2023-12-29 4769.830078 16825.929688 [2517 rows x 2 columns] אני מציע רגע לפני שמתחילים להתעסק עם הדאטא, לעשות לעצמנו ויזואליזציה מהירה. זה ייתן לנו את היכולת לפתח תחושת בטן וציפייה לתוצאה הסופית. כאן פשוט נצייר את הגרפים של המדדים על ידי חיבור בקו בין כל data point שהיא פשוט מחיר הסגירה היומי. # Plotting S&P 500 data data['^GSPC'].plot(figsize=(10, 7)) plt.title('S&P 500 Index') plt.show() # Plotting Nasdaq 100 data data['^NDX'].plot(figsize=(10, 7)) plt.title('Nasdaq 100 Index')plt.show() יש לכם כבר תחושה מה הקורלציה בין המדדים? כיוון שהדאטא שלנו הוא כל מחירי הסגירה היומיים בעשור האחרון ואנו רוצים לעבור לדבר באופן שנתי, נרצה להחזיק בתשואות השנתיות # Calculate annual returns annual_returns = data.resample('Y').ffill().pct_change() התשואות השנתיות הן בעצם דגימת הדאטא שלנו במרווחים שנתיים. זה זמן טוב להזכיר שהאינדקס של הdf שלנו הוא datetime. לכן אנו דוגמים מחדש באופן שנתי. Ffill משלימה חוסרים על סמך הערך הקודם על מנת לא ליצור שרשור של ערכי NAN בחישוב אחוזים ו-pct_change.. טוב, מחשבת את האחוזים בין כל שני ערכים.זמן טוב לתזכורת – כשרוצים לחשב תשואה על נכס קרי בכמה עלה ערכו, ניקח את ערכו בסוף התקופה ונחלק בערכו בתחילת התקופה. נחסר מכך 1 ונקבל באחוזים את התשואה.סקרנים איך נראה הדאטא עכשיו? בבקשה.. Ticker ^GSPC ^NDX Date 2013-12-31 NaN NaN 2014-12-31 0.113906 0.179365 2015-12-31 -0.007266 0.084270 2016-12-31 0.095350 0.058858 2017-12-31 0.194200 0.315156 2018-12-31 -0.062373 -0.010389 2019-12-31 0.288781 0.379638 2020-12-31 0.162589 0.475802 2021-12-31 0.268927 0.266273 2022-12-31 -0.194428 -0.329675 2023-12-31 0.242305 0.538053 הגיע הזמן להתחיל בניתוח (מוזיקה דרמטית של האוס). נתחיל בלמצוא את הממוצע האריתמטי והממוצע הגיאומטרי לכל מדד בנפרד. הממוצעים עם שנתיים – כלומר מה עושה המדד בממוצע בשנה ב10 השנים המדוברת. על כן אנו כמובן מצפים שהתוצאה תהיה מספר יחיד. ממוצע אריתמטי (ממוצע חשבוני): הממוצע שאתם זוכרים שלימדה המורה דליה בכיתה ה’ בבית הספר. לא הרבה השתנה בגזרה הזו מאז שדליה הנחיתה עלינו את המכה הזו ועד היום, חוץ מזה שלמדנו להשתמש בסימנים מתמטיים פורמליים. בפשטות הממוצע האריתמטי הוא סכום כל האיברים חלקי מספר האיברים. סיגמא (האות היוונית שמאיימת עלינו) סה”כ אומרת “תסכמו את כל הxים מהראשון ועד הn. את זה אנחנו מחלקים בסך כל האיברים שהוא n ומקבלים את הממוצע.בפיננסים הממוצע האריתמטי מספר לנו מה נוכל לצפות שיקרה בעתיד על סמך תצפיות עבר. בטח דוד שלכם אמר באיזושהי ארוחת חג “המדד עושה 7% בממוצע”. נניח שהדוד קרא את הפוסט ובדק את הנתונים, הוא התכוון לומר “המדד עושה 7% בשנה בממוצע חשבוני בתקופת הזמן שבדקתי ולכן, משפחה יקרה, תוכלו לצפות שאותו דבר יקרה גם בשנה הבאה”. אל תכעסו על הדוד אם שנה הבאה המדד מתרסק ב25%. הוא לא טועה וגם לא הטעה אתכם. סה”כ נתן משהו לצפות לו. כנראה שאם אתם ודוד שלכם תגיעו ל120 אתם תבינו שהוא צדק אבל בטווח זמן קצר הערכים יהיו שונים (קרי תשואת המדד) ויתכנסו לממוצע לאורך זמן.הבעיה עם הממוצע החשבונאי היא שקל לעבוד עליו. קחו למשל את הדוגמה הבאה: כשהייתם בכיתה א’ היו בכיתה שלכם 4 ילדים. אתם בגובה 1.10 מ’. חבר שלכם שימי בגובה 1.12 מ’. חבר נוסף ג’ימי בגובה 1.09 מ’ וחבר שלישי בשם יאו מינג בגובה 2.29 מ’ (התפתח מוקדם..). ממוצע הגובה בכיתה (הדיי מופרעת שלכם) הוא 1.4 מ’. אבל אם היינו מגרילים ילד אקראי בכיתה א’ כנראה הגובה שלו היה סביב 1.12. כלומר ערך קיצון אחד משך את הממוצע לספק לנו תוצאה שמעוותת את תפיסת המציאות שלנו (ובעתיד נדבר על גודל המדגם הנדרש והתמודדות עם ערכי קיצון). ממוצע גיאומטרי (ממוצע הנדסי): הממוצע הגיאומטרי עבור n ערכים הוא מכפלת הערכים זה בזה והוצאת השורש הn-י מהתוצאה פאי (האות היוונית הגדולה שמאיימת עלינו) בעצם אומרת תכפילו את כל האיברים x.למה זה טוב? ממוצע גיאומטרי, על אף שלתחושתי התבוננות בנוסחה לא מעוררת שום אינטואיציה לגבי טיבו, מתאים מאוד לעבודה עם קבוצת ערכים שגדלות אקספוננציאלית, ובכלל זה עם Compounding.זמן טוב לתזכורת – ריבית דריבית (compounding) היא הקסם של עולם ההשקעות. הדוגמה הקלאסית והשחוקה היא שקניתם מניה שעלתה 100 ₪ והיא עלתה בשנה הראשונה ב10%. כעת שוויה 110 ₪. בשנה השניה עלתה ב10% וכעת שוויה (תופים, כפיים, מצנח רחיפה של רדבול נוחת לתוך הקהל) 121 ₪. כיוון ש10% מ110 הם יותר מ10% מ100. “Compound interest is the eighth wonder of the world. He who understood it, earn it…he who doesn’t, pays it.” בממוצע גיאומטרי נשתמש כדי לחשב את התשואה השנתית שלנו כאשר אנו מתחשבים בריבית דריבית.כדי להבין סופית את ההבדלים בין ממוצע אריתמטי לממוצע גיאומטרי בפיננסים נעשה דוגמא קצרה. נניח שהשקענו במדד כלשהו שב3 שנים האחרונות עשה 12%, -5%, 17%.ממוצע חשבוני: 8%.ממוצע גיאומטרי: 7.57% (דרך החישוב היא 1.12*0.95*1.17 בחזקת שליש).ולכן כשדוד שלנו שואל אותנו בשולחן האוכל “מה יעשה המדד שנה הבאה” נגיד לו בממוצע 8%. וכאשר ישאל אותנו ומה התשואה השנתית על תיק ההשקעות שלכם? נגיד לו 7.57%.בדיקת שפיות: רוצים להוכיח לעצמכם שאכן ממוצע גיאומטרי מתחשב בריבית דריבית? בואו נלך בכיוון ההפוך. נאמר שהערך ההתחלתי של התיק שלנו הוא 1. 1*1.0757^3=1.244=1.12*0.95*1.17 אז יאללה לקוד! # Calculate arithmetic mean arithmetic_mean = annual_returns.mean() # Calculate geometric mean geometric_mean = ((annual_returns + 1).prod() ** (1 / len(annual_returns))) - 1 והתוצאות –> annual arithmetc mean: Ticker^GSPC 0.110199^NDX 0.195735annual geometric mean: Ticker^GSPC 0.090006^NDX 0.150714 שונות (variance): שונות היא גודל שמטרתו לתת לנו תחושה כמה המידע מפוזר. דרך החישוב של השונות היא סכימת כלל ריבועי המרחקים של הנקודות (data points) מהממוצע וחלוקה במספר הנקודות. העלאה בריבוע של המרחק מהממוצע מבטיחה לנו שהערכים יהיו חיובים ואלו שמתחת לממוצע לאי בטלו את אלו שמעליו. חדי העין (המתמטית?) שבינכם בטח שמו לב שמתחת לצורה המפחידה של השונות מסתתר איך לא, ממוצע. למעשה שונות היא ממוצע ריבועי הסטיות מהממוצע (עושה שכל?) כלומר תבחרו data point אקראי, בכמה הוא יהיה רחוק מהממוצע? בממוצע, הוא יהיה רחוק *שונות* מהממוצע.כיוון שאנו מעלים את הסטייה (מרחק הנקודות) מהממוצע בריבוע, גם היחידות עולות בריבוע. למשל, השונות שאנו בודקים היא של התשואות השנתיות של המדדים. אז התוצאה שנקבל אומרת לנו “השונות של המחירים בריבוע היא __”. אבל מה זה מחירים בריבוע? לא יודע, אבל תשארו איתי, כי הנקודה הבאה הולך לסדר בדיוק את זה. סטיית תקן (standard deviation): היא מדד לפיזור הנקודות במרחב סביב הממוצע. למעשה אומרת לנו כמה רחב הפיזור. סטיית התקן היא פשוט הוצאת שורש ריבועי מהשונות. אמרנו ששונות נותנת יחידות בריבוע, אבל אין לנו כל כך מה לעשות עם זה. כן היינו רוצים ללמוד מהדאטא סט שלנו על פיזור התשואות השנתיות. לכן נחשב את סטיית התקן. סטיית תקן נמוכה משמע שהתשואות השנתיות שבין השנים דומות זו לזו, או יותר נכון שהתשואות השנתיות קרובות לממוצע. סטיית תקן גדול מלמדת שהמידע יותר מפוזר. דמיינו מדד שמשתולל, בשנה אחת נותן תשואה של 150% (הלוואי עלינו) ובשנה הבאה תשואה של -90% (שלא נדע) התשואה השנתית הממוצע היא 30, אבל התשואות השנתיות בכלל לא קרובות לממוצע ולכן סטיית התקן גדולה. בפיננסים סטיית תקן היא מדד לסיכון ובסיס להשוואה בין נכסים. בהינתן קבוצת נכסים בה נשקול השקעה, נשווה סטיות תקן ונשאל שתי שאלות: א’ האם הבטן שלנו יכול לעמוד ברכבת הרים כזו? ב’ האם אני יכול לקבל את אותה חשיפה (לסקטור למשל) בפחות סיכון. חזרה לקוד: # Calculate variance variance = annual_returns.var() # Calculate standard deviation std_deviation = annual_returns.std() והתוצאות –> variance: Ticker^GSPC 0.024550^NDX 0.066516standard deviation: Ticker^GSPC 0.156684^NDX 0.257908 עצירת ביניים. כפי שאמרנו קודם, זו פרקטיקה טובה לעצור every now and then ולעשות ויזואליזציה לתוצאות, ככה גם תהיה לנו בקרה טובה יותר, וגם נתחיל לפתח אינטואיציה למספרים. הנקודות הכחולות הן התשואות השנתיות, מה שקראתי לו data points. באדום הממוצע, שכפי שראינו לעיל עומד על 0.11 או בצורה נוחה יותר 11%. האם זו התשואה השנתית שעשו משקיעי הS&P 500 בעשור האחרון? ברור שלא! אנחנו יודע שהתשואה השנתית היא הממוצע הגיאומטרי, בירוק, שעומד על 0.09 או 9%. עדיין מרשים ביותר. רק כדי לסבר את האוזן, מי שהשקיע 10,000 ₪ ב31.12.2013 החזיק בסוף העשור ב- 23,673 ₪! נייס.השונות (או המרחק בריבוע הממוצע מהממוצע) היא 0.024. זה עושה שכל פעמיים, א’ כיוון שמעלים בריבוע מספרים קטנים מ-1 מה שמקטין עוד יותר את התוצאה. ב’ כיוון שפיזור הערכים מאוד קרוב לממוצע הערכים נעים בין 0.3 ל 0.2- כאשר הממוצע 0.11. כמובן שבאחוזים ובכסף ההבדל בין 0.3 (30%) ל 0.2- (20%-) הוא דרמטי.סטיית התקן היא 0.156 או 15.6% כלומר רוב התשואות השנתיות ינועו בין 15.6% ל 15.6%- סביב הממוצע. חשוב לומר – כשאני אומר השונות “נמוכה” סטיית התקן “גבוהה” ועוד סופרלטיביים שמעידים על גודל, זה כמובן -וכמו שאמר מיודענו אלברט- יחסי. בעולם שכולו מנוון וכל הערכים בו זהים זה לזה (טרום המפץ הגדול?) היו אומרים שהS&P500 בעשור האחרון הוא אובייקט שלא ניתן לשלוט בו. כנראה ביחס למניית AMC זה בין האובייקטים הרגועים בטבע. מה עוד ניתן ללמוד מהצצה מהירה בגרף? מתוך 10 שנים רק ב3 היו תשואות שליליות. רק תשואה שלילית אחת נפלה משמעותית מחוץ לסטיית התקן. כלומר היה עשור (שוב, יחסית) טוב למדד.רק שנתיים מתוך העשור נתנו תשואות שקרובות לממוצע (אפשר לומר שהמדד היה במוד של go big or go home)אם נכניס קצת ידע כללי לאנליזה נוכל לומר למשל שלמרות ש2020 הייתה שנת קורונה ביצועי המדד היו חזקים, וכך גם ב2021.שנת 2022 הייתה מפלה משמעותית (מחוץ לסטיית התקן) שהגיעה בעקבות אינפלציה גבוהה לא צפיה (יש שיגידו שכן, תשאלו את דניאל כהנמן מה דעתו עליהם), מה שיכול להעלות חשד על קשר בין סטיות משמעותיות כלפי מטה לאירועים אינפלציוניים בשוק.באופן דומה אפשר להסתכל על הגרף של הנאסדק (לא מצורף כאן, אך הקוד המצורף מייצר גם אותו). הקוד לייצור הגרפים: # Plotting for ticker in tickers: plt.figure(figsize=(10, 6)) plt.plot(annual_returns.index.year, annual_returns[ticker], marker='o', linestyle='', label='Annual Returns') plt.axhline(y=arithmetic_mean[ticker], color='r', linestyle='-', label='Arithmetic Mean') plt.axhline(y=geometric_mean[ticker], color='g', linestyle='--', label='Geometric Mean') plt.axhline(y=variance[ticker], color='b', linestyle='-.', label='Variance') plt.axhline(y=std_deviation[ticker], color='m', linestyle=':', label='Standard Deviation') plt.axhline(y=std_deviation[ticker]+arithmetic_mean[ticker], color='b', linestyle='-', label='Standard Deviation Above The Mean') plt.axhline(y=-std_deviation[ticker]+arithmetic_mean[ticker], color='b', linestyle='-', label='Standard Deviation Under The Mean') plt.title(f'Annual Returns and Statistics for {ticker}') plt.xlabel('Year') plt.ylabel('Returns') plt.legend() plt.grid(True) plt.show() עד כה עסקנו בכל מדד בנפרד. כל אחד ותכונותיו שלו. כעת נחזור לשאלה ממנה יצאנו (מישהו עדיין פה בכלל?) מה טיב הקשר (מה הקורלציה) בין המדדים. כלומר האם הם מתנהגים אותו דבר? כשאחד עולה השני עולה ולהפך, או שמא דווקא הפוכים, או בכלל לא קשורים? שונות משותפת (covariance): השונות המשותפת היא גודל מתמטי לא אינטואיטיבי כלל ומהווה אבן דרך לחישוב הקורלציה. כאשר השונות המשותפת חיובית זה אומר שיש קשר חיובי כלשהו בין המשתנים (כשאחד עולה השני עולה) ולהפך. כאשר השונות המשותפת היא 0 אזי הם אינם קשורים (כלומר מידע על ערכו של אחד לא יעזור לנו כלל להסיק מסקנה על ערכו של השני).שימו לב שלעשות שונות משותפת למשתנה עם עצמו זה פשוט לחשב את השונות שלו. קורלציה (מתאם, במקרה שלנו מתאם פירסון): סוף סוף, הארץ המובטחת (מובטחת למי? אומר לו י’). קורלציית פירסון היא מדד לקשר לינארי בין שני משתנים. הערכים האפשריים הם בין 1 ל1- כאשר מתאם של 1 מעיד על כך שהמשתנים זזים באותו כיוון באותו אופן בדיוק. מתאם של 1- מעיד שהמשתנים נעים בכיוונים שונים באותו אופן בדיוק. מתאם 0 מעיד שאין קשר בין המשתנים (או יותר נכון, אין קשר לינארי). גם בשונות משותפת וגם בקורלציה לינארית בין שני משתנים הקשר הוא סימטרי. כלומר הקורלציה של X לY זהה לקורלציה של Y לX. או במקרה שלנו הקורלציה של הS&P500 לNasdaq100 שווה בדיוק לקורלציה בין הNasdaq100 לS&P500. # Plot covariance matrix plt.figure(figsize=(8, 6)) plt.title('Covariance Matrix') plt.imshow(covariance, cmap='coolwarm', interpolation='nearest') plt.colorbar(label='Covariance') plt.xticks(ticks=np.arange(len(tickers)), labels=tickers) plt.yticks(ticks=np.arange(len(tickers)), labels=tickers) plt.show() # Plot correlation matrix plt.figure(figsize=(8, 6)) plt.title('Correlation Matrix') plt.imshow(correlation, cmap='coolwarm', interpolation='nearest') plt.colorbar(label='Correlation') plt.xticks(ticks=np.arange(len(tickers)), labels=tickers) plt.yticks(ticks=np.arange(len(tickers)), labels=tickers) plt.show() כמו שחשדנו. התאמה מלאה.אם אתם חדשים בשוק ההון, סביר שלא ניחשתם שיש התאמה מלאה, אל תרגישו לא נעים זה עניין של ניסיון.יש לזה מספר סיבותישנה חפיפה במניות הכבדות – אפל, מיקרוסופט,נבידיה, אלפאבת, אמזון וכו’. החפיפה הזו מתבטאת בחשיפה הגדולה של שני המדדים לסקטור הטכנולוגיה.באופן אופנתי, מי שמשקיע באחד כנראה משקיע גם בשני. בטח כשמדובר בבתי השקעות וקרנות פנסיה. אלו שני המדדים המבוקשים ביותר והם זוכים לתזרים גדול מהמשקיעים הפאסיביים בתצורה של כלים עוקבי מדד.באופן מעט יותר זניח, שני המדדים נהנים (אולי סובלים?) מאותה סביבה מאקרו-כלכלית, אותו מטבע ואותו רגולטור.לסיכומו של דבר, השלמנו את תרגיל הניתוח הבסיסי. לקחנו שני מדדי מניות מובילים (על אף שיכלנו לקחת כל נכס אחר במקומם) וביצענו ניתוח סטטיסטי בסיסי, תוך כדי שהסרנו חלודה (ובתקווה גם פחד) מהמונחים הללו.מקווה שהיה כייף ולא חופר -מידי-. מכאן אפשר להתחיל ולהתעסק בעיקר. statistics FinanceQuantStatistics
Hey there, You have done a fantastic job. I will certainly digg it and personally recommend to my friends. I’m confident they’ll be benefited from this site.