Strasmore Research
למידה Matt Connorמאת Matt Connor

השערת השוק היעיל: שלוש צורות ומדידה על נתוני ארה"ב

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

השערת השוק היעיל (Efficient Market Hypothesis) טוענת שמחיר נייר ערך כבר מכיל את המידע הזמין עליו, כך שכל דפוס שנותר הוא קטן מדי וקצר מועד מכדי לסחור בו ברווח לאחר עלויות. יוג'ין פאמה ארגן את הרעיון לשלוש צורות במאמר סקירה משנת 1970: חלשה, חצי-חזקה וחזקה. כל צורה מציינת גוף מידע שונה שכבר נמצא בתוך המחיר, וכל אחת פוסלת דרך אחרת להרוויח כסף. דף זה מציין מה שלוש הצורות אוסרות, ולאחר מכן מודד את החלשה שבהן מול חמש שנים של מחירים יומיים בשמות מוכרים.

מהן שלוש הצורות של יעילות שוק?

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

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

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

צורה חלשה: האם התנועה של אתמול מנבאת את של היום?

המבחן הנקי ביותר של הצורה החלשה הוא המתאם בין התשואה של יום אחד לזו של היום הבא. נתון חיובי חזק יסמן מגמות שנמשכות. נתון שלילי חזק יסמן חזרות אמינות. כל אחד מהם יהיה סחיר. הפאנל שלהלן מודד מתאם אוטומטי בפיגור אחד (lag-one autocorrelation) של תשואות יומיות עבור שנים עשר שמות מוכרים בחמש השנים מיולי 2021 עד יוני 2026.

שאילתהמתאם אוטומטי מסדר ראשון של תשואות יומיות: שנים עשר שמות מוכרים, יולי 2021 עד יוני 2026
ה-SQL המדויק מאחורי כל מספר
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','AAPL','MSFT','KO','JNJ','XOM','JPM','WMT','NVDA','TSLA','PG','HD')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-07-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
returns AS (
    SELECT ticker, dt,
           close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM daily
),
paired AS (
    SELECT ticker, ret,
           lagInFrame(ret) OVER (PARTITION BY ticker ORDER BY dt) AS prev_ret
    FROM returns
    WHERE ret IS NOT NULL AND ret > -0.5 AND ret < 0.5
)
SELECT ticker,
       count() AS trading_days,
       round(corr(ret, prev_ret), 3) AS lag1_autocorrelation,
       round(abs(corr(ret, prev_ret)), 3) AS abs_autocorrelation
FROM paired
WHERE prev_ret IS NOT NULL
GROUP BY ticker
ORDER BY abs_autocorrelation DESC
Run this yourself

הקריאה הגדולה ביותר בערך מוחלט שייכת ל-WMT ב-0.057, והקטנה ביותר שייכת ל-KO ב--0.005. כל שם בקבוצה נוחת בתוך כמה מאיות של אפס על פני כ-1252 ימי מסחר כל אחד. מתאם בגודל כזה מסביר הרבה פחות מאחוז אחד מהשונות בתשואה של היום הבא. הסימנים מתחלפים בין שנים עשר השמות ללא דפוס ששורד בדיקה, וזו הצורה החלשה עושה בדיוק את מה שהיא אומרת שתעשה.

מה קורה לאחר תנועה יומית גדולה?

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

שאילתהמה קרה לאחר כל סוג יום: תוצאת היום הבא לפי תנועת היום הקודם, אותם שנים עשר שמות
ה-SQL המדויק מאחורי כל מספר
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','AAPL','MSFT','KO','JNJ','XOM','JPM','WMT','NVDA','TSLA','PG','HD')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-07-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
returns AS (
    SELECT ticker, dt,
           close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM daily
),
paired AS (
    SELECT ticker, ret * 100 AS ret_pct,
           lagInFrame(ret) OVER (PARTITION BY ticker ORDER BY dt) * 100 AS prev_pct
    FROM returns
    WHERE ret IS NOT NULL AND ret > -0.5 AND ret < 0.5
)
SELECT multiIf(prev_pct <= -3, '1. down 3% or more',
               prev_pct <= -1, '2. down 1 to 3%',
               prev_pct < 1,  '3. flat, within 1%',
               prev_pct < 3,  '4. up 1 to 3%',
               '5. up 3% or more') AS prior_day_move,
       count() AS observations,
       round(median(ret_pct), 3) AS next_day_median_pct,
       round(100 * countIf(ret_pct > 0) / count(), 1) AS next_day_up_share_pct
FROM paired
WHERE prev_pct IS NOT NULL
GROUP BY prior_day_move
ORDER BY prior_day_move
Run this yourself

הדלי התחתון, מושבים שהגיעו לאחר תנועה של 1. down 3% or more, אחריו הגיע יום עולה 52.9% מהזמן על פני 664 תצפיות. הדלי העליון, לאחר תנועה של 5. up 3% or more, אחריו הגיע יום עולה 53.9% מהזמן. הדלי האמצעי הרגיל, 3. flat, within 1%, הגיע ב-53.1%. כל חמשת הדליים יושבים בתוך כמה נקודות מהטלת מטבע, והתשואה החציונית של היום הבא בכל דלי היא שבריר של אחוז אחד: 0.175% לאחר הירידות החדות ביותר, 0.186% לאחר העליות החדות ביותר.

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

צורה חצי-חזקה: מה מראה תיעוד הבחירה

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

שאילתההמדד מול השמות שבתוכו: שנים קלנדריות 2021 עד 2025, סל של 34 שמות גדולים
ה-SQL המדויק מאחורי כל מספר
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','JPM','XOM','JNJ','WMT','PG','KO','PEP','HD','MRK','LLY','COST','CVX','ORCL','CSCO','INTC','VZ','MCD','NKE','DIS','CAT','HON','TXN','AMD','NFLX','MO','LMT','UNH')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2025-12-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
per_year AS (
    SELECT ticker, toYear(dt) AS yr,
           argMin(close_px, dt) AS first_px,
           argMax(close_px, dt) AS last_px
    FROM daily
    GROUP BY ticker, yr
),
perf AS (
    SELECT yr, ticker, (last_px / first_px - 1) * 100 AS ret_pct FROM per_year
),
bench AS (
    SELECT yr, ret_pct AS index_pct FROM perf WHERE ticker = 'SPY'
)
SELECT toString(perf.yr) AS year,
       round(any(bench.index_pct), 1) AS index_return_pct,
       round(median(perf.ret_pct), 1) AS median_stock_return_pct,
       countIf(perf.ticker != 'SPY') AS stocks_measured,
       round(100 * countIf(perf.ticker != 'SPY' AND perf.ret_pct > bench.index_pct)
             / countIf(perf.ticker != 'SPY'), 1) AS pct_beating_index
FROM perf
INNER JOIN bench ON perf.yr = bench.yr
GROUP BY perf.yr
ORDER BY perf.yr
Run this yourself

על פני 5 שנות קלנדריות שנמדדו, פחות ממחצית מ-34 השמות ניצחו את המדד בארבע מהן. החלק נע מ-32.4% ב-2024 עד 58.8% ב-2022, השנה היחידה בירידה בחלון, כאשר המדד השיב -20% מול שם חציוני ב--13.3%. ב-2024 המדד השיב 24% בעוד השם החציוני בסל השיב 12.7%.

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

הפרדוקס שבמרכז

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

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

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

מה ההשערה אומרת לקורא

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

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

ההשערה גם נותנת סטנדרט לשפוט טענות על אסטרטגיות. כל דפוס שנראה רווחי על הנייר חייב לפנות עלויות מסחר, מיסים והטיית ההישרדות (survivorship bias) המובנית בבקסטיסט לפני שהוא נחשב ליתרון. רובם לא עוברים רף זה. אלה שכן נוטים להיות קטנים, והם נוטים להתכווץ ככל שמגיע יותר הון.

שאלות נפוצות

מהן שלוש הצורות של השערת השוק היעיל?

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

האם השערת השוק היעיל אומרת שמחירי המניות תמיד צודקים?

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

מי הגה את השערת השוק היעיל?

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

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

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

האם מישהו יכול לנצח את השוק?

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


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

#efficient market hypothesis#market efficiency#emh#investing theory#market data