Чи працює правило «Продай у травні» для S&P 500
Правило «Продай у травні» перевірено на двох десятиліттях сезонності S&P 500. Який літній розрив і скільки на практиці коштує сезонне перемикання.
«Sell in May and go away» — найвідоміше календарне правило на фондовому ринку: продати наприкінці квітня, зберігати кошти в грошовій формі впродовж літа й знову купити наприкінці жовтня. Якщо вимірювати динаміку цін ETF, що відстежує S&P 500, від закриття торгів в останній день квітня 2005 року до закриття торгів в останній день квітня 2026 року, то середня дохідність періоду з листопада до квітня справді вища, ніж у періоду з травня до жовтня. Розрив є, але він менший, ніж випливає з цього вислову. У літньому півріччі ціни також у середньому зростають. Саме тому це правило не працює як повноцінний інвестиційний план.
Що стверджує правило і як його перевірити
Цей вислів походить від давньої лондонської звички залишати місто після весняних скачок і повертатися восени. У сучасній формі, яку можна перевірити, це правило перемикання між двома датами. Ви утримуєте широкий фондовий індекс від останнього торгового дня жовтня до останнього торгового дня квітня. Протягом інших шести місяців позиції немає.
Для перевірки потрібні дві речі, яких саме правило не містить: ціновий ряд і чітко визначений період. Усі наведені нижче показники розраховано на основі SPY — найстарішого ETF на S&P 500 — за хвилинними барами регулярної торгової сесії з таблиці global_markets.delayed_stocks_minute_aggs, від закриття останнього торгового дня квітня 2005 року до закриття останнього торгового дня квітня 2026 року. У цій статті місячна дохідність — це зміна останньої ціни регулярної сесії місяця відносно останньої ціни попереднього місяця, без урахування дивідендів. Дивідендам присвячено окремий розділ нижче, а в матеріалі як вимірюється місячна дохідність пояснюється, чому це розмежування змінює результат.
Чи працює стратегія «продай у травні й іди»? Результати за 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
)
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Кожна точка поєднує одне літо з наступною зимою. На графіку показано 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За всі 21 сезонів середній результат із травня до жовтня становив 3.88%, а з листопада до квітня — 6.06%. Різниця становила 2.18 процентного пункта. Саме ця різниця є всією підставою для правила. Подивімося на літній стовпчик: 16 таких літніх періодів завершилися вище за рівень початку. Отже, середній період без інвестицій пропускав зростання, а не уникав збитків.
Два відрізки відрізняються. У ранньому періоді різниця становила 4.84 пункта, а в пізнішому — -0.24. У популярних переказах часто наводять розрив, не називаючи років, які за ним стоять. Але саме роки є головним аргументом. Будь-яка сезонна статистика — це твердження про один історичний період, а вибір цього періоду залежить від того, хто її повторює.
Чи справді йдеться про ефект серпня та вересня?
Шість місяців — надто грубий інтервал. Розподіл календаря за місяцями дає змогу перевірити, чи є літній період рівномірно слабким, чи весь результат визначає лише одна його частина.
Точний 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))Слабкість припадає на вересень. У середньому він показав -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Один долар, інвестований протягом усього року від кінця квітня 2005, до кінця квітня 2026 зріс до $6.21. Той самий долар, інвестований у ринок лише з листопада до квітня, а решту часу не задіяний, зріс до $3.14. Обидві лінії відображають лише динаміку ціни, без вирахування будь-яких витрат. Це завищує результат стратегії перемикання. Ось що графік не враховує.
- Дві угоди щороку в кожному з 21 сезонів. У більшості брокерів комісія за угоду тепер нульова. Але спред bid-ask під час кожного циклу купівлі та продажу нікуди не зникає.
- Податки. На оподатковуваному рахунку продаж у квітні фіксує весь прибуток, накопичений із листопада. Період утримання з листопада до квітня за визначенням менший за рік, тому для платника податків у США прибуток оподатковується за ставками для короткострокового приросту капіталу.
- Вільні грошові кошти. Лінія для інвестицій лише взимку передбачає нульовий дохід на кошти, які залишаються поза ринком. Насправді інвестор розмістив би їх, а в матеріалі де розміщувати вільні грошові кошти розглянуто відповідні інструменти.
- Дивіденди, вплив яких враховано на наступній панелі.
Точний 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Дати ex-dividend для SPY припадають на березень, червень, вересень і грудень, тому дві з чотирьох дат входять до шестимісячного періоду, коли інвестор не володіє фондом. У 2025 на одну акцію припало $3.592 distributions із датою ex-dividend у період із травня до жовтня, проти $3.689 в інші шість місяців. Два стовпці рухаються майже синхронно на всьому графіку. Відмова від інвестицій на половину календарного року означає втрату приблизно половини доходу фонду щороку, незалежно від того, як змінюється ціна в ці місяці. Дата ex-dividend визначає, хто отримає виплату.
Є ще одна витрата, яка не відображається окремим рядком. Дохідність індексу формується окремими кластерами, а пропуск найкращих торгових днів показує, як кілька пропущених сесій впливають на довгостроковий баланс. Шість місяців поза ринком щороку — це багато пропущених сесій. Та сама арифметика лежить в основі усереднення вартості долара як дисципліни, що робить акцент на часі перебування на ринку, а не на виборі моменту для входу й виходу.
Чому відоме календарне правило заслуговує на скептицизм
Дванадцять місяців дають 4 095 непорожніх варіантів вибору підмножини, у яку можна інвестувати. Якщо перевірити всі ці варіанти на одному ціновому ряді, один із них неминуче виглядатиме вражаюче. Це властивість самого пошуку.
У Sell in May є одна важлива перевага перед правилом, виявленим минулого тижня: воно стало відомим задовго до початку цієї вибірки. Тому роки, наведені на цій сторінці, є позавибірковим тестом, а не результатом підгонки. Тест показує помірний розрив, зосереджений в одному місяці, і стосується правила перемикання, яке за цей самий період поступається стратегії купівлі та утримання. Упередження з огляду в майбутнє пояснює, як backtest непомітно отримує відповідь заздалегідь. Календарні правила є хрестоматійним прикладом: місяці обирають уже після того, як відомі результати.
Поширені запитання
Чи працює досі правило «продай у травні та йди з ринку»?
Для цін SPY у період із квітня 2005 року до квітня 2026 року середня дохідність за період із листопада до квітня становила 6.06% проти 3.88% за період із травня до жовтня. Отже, сезонний розрив зберігається на всій вибірці. У літньому півріччі середня дохідність також була позитивною: 16 із 21 літніх періодів завершилися зростанням порівняно з початковим рівнем.
Які місяці насправді є слабкими?
У цьому часовому проміжку слабкість зосереджена у вересні: середня дохідність становила -0.75%, а зростання було зафіксовано у 12 із 21 років. У липні, який також не охоплює ця стратегія, середня дохідність за той самий період становила 2.63%.
Чи перевершує продаж у травні стратегію купівлі та утримання?
Ні, не на цій вибірці. Один долар, безперервно інвестований із кінця квітня 2005, зріс до $6.21 станом на квітень 2026. Для стратегії переходу лише на зимовий період цей показник становив $3.14. Порівняння не враховує торгові витрати, податки та дивіденди.
Що відбувається з дивідендами, якщо продати в травні?
Ex-dividend dates фонду не призупиняються на літній період. Дві з чотирьох квартальних ex-dividend dates SPY припадають на період із травня до жовтня. Інвестор, який не володіє фондом на ex-dividend date, не отримує відповідну виплату.
Чи є сезонна закономірність прогнозом?
Ні. Історична середня за 21 сезонними періодами описує результати за визначений часовий проміжок. Окремі роки значно відхиляються від цієї середньої, як показано на першому графіку. Сам часовий проміжок також є результатом вибору.
Кожна панель у цьому матеріалі є збереженим запитом із прикріпленим SQL. Змініть тикер, пересуньте часовий проміжок і перевірте, чи зберігається сезонний розрив на терміналі Strasmore.