Strasmore Research
חקירות Matt Connorמאת Matt Connor

האם כלל ״מכור במאי והתרחק״ באמת עובד?

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

“מכור במאי והתרחק מהשוק” הוא כלל העונתיות המוכר ביותר בשוק המניות: למכור בסוף אפריל, להחזיק מזומן לאורך הקיץ ולרכוש מחדש בסוף אוקטובר. לפי מחירי קרנות העוקבות אחר S&P 500, מהנעילה האחרונה של אפריל 2005 ועד לנעילה האחרונה של אפריל 2026, התשואה הממוצעת במחצית השנה מנובמבר עד אפריל אכן גבוהה מזו שבמחצית השנה ממאי עד אוקטובר. הפער קיים, אך הוא קטן מכפי שהפתגם מרמז. גם במחצית הקיץ נרשמת בממוצע עלייה, וזה המקום שבו הכלל אינו מתפקד כתוכנית השקעה.

מה קובע הכלל, וכיצד בודקים אותו

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

כדי לבדוק את הכלל נדרשים שני דברים שהאמרה עצמה אינה מספקת: סדרת מחירים וחלון זמן מוגדר. כל הנתונים להלן מבוססים על SPY, קרן הסל הוותיקה ביותר העוקבת אחר S&P 500, ומתומחרים לפי נתוני דקה בשעות המסחר הרגילות שבטבלת global_markets.delayed_stocks_minute_aggs, החל מסגירת יום המסחר האחרון של אפריל 2005 ועד סגירת יום המסחר האחרון של אפריל 2026. תשואת חודש כאן היא המחיר האחרון בשעות המסחר הרגילות ביחס למחיר החודש הקודם, ללא דיבידנדים. הדיבידנדים מקבלים סעיף נפרד בהמשך, והסבר על אופן מדידת התשואות החודשיות מפרט מדוע להבחנה זו יש השפעה על התוצאה.

האם האסטרטגיה “למכור במאי ולהתרחק מהשוק” עובדת? הנתונים מ-2005 עד 2026

שאילתהעוקב S&P 500: מאי עד אוקטובר לעומת נובמבר עד אפריל, עונה אחר עונה
ה-SQL המדויק מאחורי כל מספר
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
)
SELECT toYear(apr_m.month_start) AS year,
       round(100 * (toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) - 1), 2) AS may_oct_pct,
       round(100 * (toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) - 1), 2) AS nov_apr_pct
FROM monthly AS apr_m
INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)
INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)
WHERE toMonth(apr_m.month_start) = 4
ORDER BY year
Run this yourself

כל נקודה מצמידה קיץ אחד לחורף שבא אחריו. התרשים כולל 21 זוגות מלאים, החל בקיץ של 2005 ומסתיים בחורף שהסתיים באפריל 2026.

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

האם פער הקיץ נחלש מאז 2015?

הממוצעים הם למעשה מה שהאמרה טוענת, והתקופה היא הבסיס שעליו נשענים הממוצעים האלה. פיצול התקופה ב־2015 יוצר שני חצאים באורך דומה, שחושבו באותה שיטה.

שאילתההפער העונתי לפי תקופה: תשואות ממוצעות לחצי שנה והפער ביניהן
ה-SQL המדויק מאחורי כל מספר
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
pairs AS (
    SELECT toYear(apr_m.month_start) AS season_year,
           toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) - 1 AS may_oct,
           toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) - 1 AS nov_apr
    FROM monthly AS apr_m
    INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)
    INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)
    WHERE toMonth(apr_m.month_start) = 4
),
tagged AS (
    SELECT may_oct,
           nov_apr,
           arrayJoin(['All seasons 2005-2025',
                      if(season_year <= 2014, 'First half 2005-2014', 'Second half 2015-2025')]) AS era
    FROM pairs
)
SELECT era,
       count() AS season_count,
       round(100 * avg(may_oct), 2) AS avg_may_oct_pct,
       round(100 * avg(nov_apr), 2) AS avg_nov_apr_pct,
       round(100 * (avg(nov_apr) - avg(may_oct)), 2) AS winter_minus_summer_pct,
       countIf(may_oct > 0) AS summers_positive
FROM tagged
GROUP BY era
ORDER BY era
Run this yourself

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

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

האם מדובר באמת באפקט של אוגוסט וספטמבר?

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

שאילתהתשואה חודשית ממוצעת של עוקב S&P 500, מאי 2005 עד אפריל 2026
ה-SQL המדויק מאחורי כל מספר
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
month_returns AS (
    SELECT m1.month_start AS month_start,
           100 * (toFloat64(m1.month_close) / toFloat64(m0.month_close) - 1) AS ret_pct
    FROM monthly AS m1
    INNER JOIN monthly AS m0 ON m0.month_start = addMonths(m1.month_start, -1)
)
SELECT formatDateTime(month_start, '%b') AS label,
       count() AS readings,
       round(avg(ret_pct), 2) AS avg_return_pct,
       round(quantileDeterministic(0.5)(ret_pct, cityHash64(month_start)), 2) AS median_return_pct,
       countIf(ret_pct > 0) AS positive_readings
FROM month_returns
GROUP BY label
ORDER BY min(toMonth(month_start))
Run this yourself

החולשה מרוכזת בספטמבר. התשואה הממוצעת בו הייתה -0.75%, והוא הסתיים בעלייה ב־12 מתוך 21 השנים, עם חציון של 0.38%. התשואה הממוצעת באוגוסט הייתה 0.28%. יולי, הנמצא באמצע התקופה שבה המשקיע נמנע ממכירה, הניב בממוצע 2.63%, ואוקטובר, החודש האחרון לפני שהכלל מבצע רכישה מחדש, הניב בממוצע 0.97%.

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

מה העלות בפועל של המעבר

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

שאילתהצמיחת דולר אחד: החזקה לאורך כל השנה לעומת החזקה רק מנובמבר עד אפריל
ה-SQL המדויק מאחורי כל מספר
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
pairs AS (
    SELECT toYear(apr_m.month_start) + 1 AS year,
           toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) AS summer_ratio,
           toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) AS winter_ratio
    FROM monthly AS apr_m
    INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)
    INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)
    WHERE toMonth(apr_m.month_start) = 4
)
SELECT year,
       round(exp(sum(log(summer_ratio * winter_ratio)) OVER (ORDER BY year)), 2) AS buy_and_hold_growth,
       round(exp(sum(log(winter_ratio)) OVER (ORDER BY year)), 2) AS winter_only_growth
FROM pairs
ORDER BY year
Run this yourself

דולר שהושקע לאורך כל עונה, מסוף אפריל 2005 ועד סוף אפריל 2026, צמח ל־$6.21. אותו דולר שהושקע בשוק רק מנובמבר עד אפריל, ונשאר ללא השקעה בשאר הזמן, צמח ל־$3.14. שתי הסדרות מציגות את המחיר בלבד, ללא ניכוי כלשהו, ולכן הן מציגות את אסטרטגיית המעבר באור חיובי מדי. אלה הגורמים שהתרשים אינו כולל.

  • שתי עסקאות בכל שנה, בכל אחת מ־21 העונות. כיום רוב הברוקרים אינם גובים עמלה על ביצוע העסקה. אולם מרווח הקנייה-מכירה שמשולם בכל עסקת הלוך-ושוב אינו חינמי.
  • מס. בחשבון חייב במס, המכירה באפריל מממשת את הרווח שנצבר מאז נובמבר. תקופת החזקה מנובמבר עד אפריל קצרה משנה מעצם הגדרתה, ולכן עבור נישום אמריקאי הרווח ממוסה בשיעורי המס על רווחי הון קצרי-טווח.
  • מזומן שאינו מושקע. הסדרה המתייחסת להשקעה בחורף בלבד מייחסת למזומן שנשאר בצד תשואה אפסית. משקיע בפועל היה מפקיד אותו באפיק כלשהו, והיכן להפקיד מזומן שאינו מושקע סוקר את המכשירים שבהם משתמשים לכך.
  • דיבידנדים, שמוצגים בניכוי בפרק הבא.
שאילתהחלוקות SPY לפי חודש ללא דיבידנד: בתוך חלון מאי עד אוקטובר לעומת מחוצה לו
ה-SQL המדויק מאחורי כל מספר
SELECT toYear(ex_dividend_date) AS year,
       round(sumIf(cash_amount, toMonth(ex_dividend_date) >= 5 AND toMonth(ex_dividend_date) <= 10), 3) AS may_oct_dividends_usd,
       round(sumIf(cash_amount, toMonth(ex_dividend_date) < 5 OR toMonth(ex_dividend_date) > 10), 3) AS nov_apr_dividends_usd
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
  AND cash_amount > 0
  AND ex_dividend_date >= toDate('2005-01-01')
  AND ex_dividend_date <= toDate('2025-12-31')
GROUP BY year
ORDER BY year
Run this yourself

תאריכי האקס-דיבידנד של SPY חלים במרץ, ביוני, בספטמבר ובדצמבר, ולכן שניים מתוך ארבעת התאריכים חלים במהלך ששת החודשים שבהם המשקיע נשאר מחוץ לשוק. ב־2025, חלוקות בסך $3.592 למניה נשאו תאריך אקס-דיבידנד בין מאי לאוקטובר, לעומת $3.689 בששת החודשים האחרים. שתי העמודות עוקבות זו אחר זו לאורך התרשים כולו. הימנעות מהשוק במשך מחצית השנה מוותרת מדי שנה על כמחצית מהכנסות הקרן, נוסף על השפעת ביצועי המחיר בחודשים האלה. תאריך האקס-דיבידנד הוא נקודת החיתוך הקובעת מי יקבל את התשלום.

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

מדוע כלל לוח שנה מפורסם ראוי לספקנות

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

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

שאלות נפוצות

האם האסטרטגיה sell in May and go away עדיין עובדת?

במחירי SPY מאפריל 2005 עד אפריל 2026, התשואה הממוצעת מנובמבר עד אפריל הייתה 6.06%, לעומת 3.88% ממאי עד אוקטובר. לכן הפער העונתי נשמר במדגם המלא. גם במחצית הקיץ נרשמה בממוצע עלייה, כאשר 16 מתוך 21 הקיצים הסתיימו ברמה גבוהה מזו שבה התחילו.

אילו חודשים חלשים בפועל?

בחלון הזמן הזה החולשה מתרכזת בספטמבר. התשואה הממוצעת בחודש הייתה -0.75%, והוא הסתיים בעלייה ב-12 מתוך 21 השנים. יולי, חודש נוסף שהכלל אינו כולל, הניב תשואה ממוצעת של 2.63% באותה תקופה.

האם מכירה במאי עדיפה על קנייה והחזקה?

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

מה קורה לדיבידנדים אם מוכרים במאי?

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

האם דפוס עונתי זהה לתחזית?

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


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

#seasonality#backtesting#sp-500#market-history#quant