Bullish vs Bearish Meaning: Market Dey Climb or Dey Fall
Bullish na market dey climb, bearish na market dey fall. Real SPY numbers: how many days dey close up, the longest streaks, and how rare 20% bear market be.
Bullish vs bearish meaning no hard at all: bullish na when person believe say market or one stock go climb, bearish na when person believe say e go fall. Market dey climb, na bull dey run things; market dey fall, na bear don enter. For this post we go pass the dictionary and put real numbers on top am, using SPY (the ETF wey dey follow the S&P 500, the 500 biggest companies for America), to show how common bearish day be and how rare true bear market be.
Wetin bullish and bearish mean?
When your padi talk say e dey bullish, e mean say e expect price to go up. Person wey dey bearish expect price to come down. You fit use the two words for anything: one stock, one sector, the whole market, even one single trading day. "Market bullish today" mean say prices climb well well; "analysts dey bearish on banks" mean say dem expect bank shares to fall.
The tori wey people dey tell about the names na about how the two animals dey fight. Bull dey use horn throw enemy go up, bear dey use paw slap enemy go down. Whether e true or na story, the picture dey help you remember: bull na up, bear na down.
One thing wey you must hold well: the words describe expectation or direction, dem no be prediction wey must come true. Person fit dey bullish and market still fall the next day. Wetin we fit measure na wetin the market actually do, and na that one the rest of this post dey show.
Bullish day vs bearish day: how many SPY days dey close up?
Make we start from the smallest unit, one trading day. Up day (bullish day) na day wey SPY close higher pass the close of the day before. Down day (bearish day) na day wey e close lower. If the close no change at all, we call am flat day. The panel below count every session for our SPY daily price history.
| label | sessions | share_pct | history_from | history_to |
|---|---|---|---|---|
| Up day | 3167 | 54.7 | Sep 2003 | Sep 2026 |
| Down day | 2609 | 45 | Sep 2003 | Sep 2026 |
| Flat day | 16 | 0.3 | Sep 2003 | Sep 2026 |
The exact SQL behind every number
WITH bars AS
(
SELECT
date,
toFloat64(any(close)) AS close_price
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND close > 0
GROUP BY date
),
moves AS
(
SELECT
date,
close_price,
lagInFrame(close_price, 1) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
FROM bars
),
totals AS
(
SELECT
countIf(close_price > prev_close) AS up_days,
countIf(close_price < prev_close) AS down_days,
countIf(close_price = prev_close) AS flat_days,
count() AS all_days,
formatDateTime(min(date), '%b %Y') AS history_from,
formatDateTime(max(date), '%b %Y') AS history_to
FROM moves
WHERE prev_close > 0
)
SELECT
label,
sessions,
round(100 * sessions / all_days, 1) AS share_pct,
history_from,
history_to
FROM totals
ARRAY JOIN
['Up day', 'Down day', 'Flat day'] AS label,
[up_days, down_days, flat_days] AS sessionsFrom Sep 2003 to Sep 2026, SPY record 3167 up days, na 54.7% of all sessions, against 2609 down days, na 45%. Flat days na only 16. So the honest answer to "how often market dey bearish?" na: almost every other day. Bearish day no be strange thing and e no mean say the world dey end. Na normal part of how market dey breathe. The small tilt towards up days na wetin dey add up over long time.
Even year wey market climb well get plenty bearish days
Plenty people imagine say bull year na year wey market dey climb every day, and bear year na year wey e dey fall every day. The data no gree with that picture. The panel below break every calendar year for SPY into the share of up days and down days, plus how far the price move from the last close of the year before to the last close of that year. E dey arranged from the worst year to the best year.
| year | up_day_pct | down_day_pct | year_move_pct |
|---|---|---|---|
| 2008 | 49.8 | 50.2 | -38.3 |
| 2022 | 43 | 56.6 | -19.5 |
| 2018 | 52.6 | 46.6 | -6.3 |
| 2015 | 48 | 52 | -0.8 |
| 2011 | 52.8 | 47.2 | -0.2 |
| 2005 | 54 | 44.8 | 3 |
| 2007 | 54.6 | 45 | 3.2 |
| 2004 | 55.6 | 43.3 | 8.6 |
| 2003 | 60.3 | 39.7 | 9.1 |
| 2016 | 54 | 45.6 | 9.6 |
| 2014 | 58.3 | 41.7 | 11.3 |
| 2026 | 51.4 | 48.6 | 11.7 |
| 2010 | 56.3 | 43.7 | 12.8 |
| 2012 | 55.2 | 44.4 | 13.5 |
| 2006 | 54.6 | 45.4 | 13.7 |
| 2020 | 57.7 | 42.3 | 16.2 |
| 2025 | 56.8 | 43.2 | 16.4 |
| 2017 | 56.2 | 43.4 | 19.4 |
| 2024 | 58.7 | 41.3 | 23.3 |
| 2009 | 54.8 | 45.2 | 23.5 |
The exact SQL behind every number
WITH bars AS
(
SELECT
date,
toFloat64(any(close)) AS close_price
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND close > 0
GROUP BY date
),
moves AS
(
SELECT
date,
close_price,
lagInFrame(close_price, 1) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
FROM bars
)
SELECT
toYear(date) AS year,
round(100 * countIf(close_price > prev_close) / count(), 1) AS up_day_pct,
round(100 * countIf(close_price < prev_close) / count(), 1) AS down_day_pct,
round(100 * (argMax(close_price, date) / argMin(prev_close, date) - 1), 1) AS year_move_pct
FROM moves
WHERE prev_close > 0
GROUP BY year
ORDER BY year_move_pct ASCThe worst year for the table na 2008: SPY move -38.3% that year, yet 49.8% of the sessions still close up. The year wey carry the biggest gain, 2013, climb 29.7%, and e still get 41.7% down days. Terrible year and wonderful year both get plenty red days; wetin separate dem na the size of the moves and a small shift for the share of up days. (The row for the current year na only the sessions wey don happen so far.)
How long SPY fit climb or fall without break?
Streak na when market close the same direction many days back to back. Winning streak na up day after up day; losing streak na down day after down day. Flat day dey break the streak for this count. The panel below show the five longest streaks for each direction, with the total move from the close before the streak start to the close on im last day.
| streak | direction | days | started | ended | move_pct |
|---|---|---|---|---|---|
| Up run, Feb 2010 | Up streak | 14 | Feb 26, 2010 | Mar 17, 2010 | 5.8 |
| Up run, May 2024 | Up streak | 10 | May 2, 2024 | May 15, 2024 | 5.9 |
| Up run, Apr 2025 | Up streak | 9 | Apr 22, 2025 | May 2, 2025 | 10.3 |
| Up run, Mar 2004 | Up streak | 9 | Mar 24, 2004 | Apr 5, 2004 | 5.3 |
| Up run, Nov 2006 | Up streak | 9 | Nov 10, 2006 | Nov 22, 2006 | 2 |
| Down run, Dec 2007 | Down streak | 8 | Dec 27, 2007 | Jan 8, 2008 | -7.1 |
| Down run, Dec 2018 | Down streak | 8 | Dec 13, 2018 | Dec 24, 2018 | -11.7 |
| Down run, Feb 2020 | Down streak | 7 | Feb 20, 2020 | Feb 28, 2020 | -12.4 |
| Down run, Jul 2011 | Down streak | 7 | Jul 25, 2011 | Aug 2, 2011 | -6.8 |
| Down run, Jun 2006 | Down streak | 7 | Jun 5, 2006 | Jun 13, 2006 | -5 |
The exact SQL behind every number
WITH bars AS
(
SELECT
date,
toFloat64(any(close)) AS close_price
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND close > 0
GROUP BY date
),
moves AS
(
SELECT
date,
close_price,
lagInFrame(close_price, 1) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
FROM bars
),
signs AS
(
SELECT
date,
close_price,
prev_close,
sign(close_price - prev_close) AS dir
FROM moves
WHERE prev_close > 0
),
flags AS
(
SELECT
date,
close_price,
prev_close,
dir,
if(dir != lagInFrame(dir, 1) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 1, 0) AS run_break
FROM signs
),
runs AS
(
SELECT
date,
close_price,
prev_close,
dir,
sum(run_break) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS run_id
FROM flags
),
run_stats AS
(
SELECT
run_id,
any(dir) AS run_dir,
count() AS days,
min(date) AS run_start,
max(date) AS run_end,
round(100 * (argMax(close_price, date) / argMin(prev_close, date) - 1), 1) AS move_pct
FROM runs
WHERE dir != 0
GROUP BY run_id
)
SELECT
concat(if(run_dir = 1, 'Up run, ', 'Down run, '), formatDateTime(run_start, '%b %Y')) AS streak,
if(run_dir = 1, 'Up streak', 'Down streak') AS direction,
days,
concat(formatDateTime(run_start, '%b '), toString(toDayOfMonth(run_start)), ', ', toString(toYear(run_start))) AS started,
concat(formatDateTime(run_end, '%b '), toString(toDayOfMonth(run_end)), ', ', toString(toYear(run_end))) AS ended,
move_pct
FROM run_stats
ORDER BY direction DESC, days DESC, streak ASC
LIMIT 5 BY directionThe longest winning streak for SPY na 14 sessions straight, from Feb 26, 2010 to Mar 17, 2010, and the whole run add 5.8% to the price. The longest losing streak na 8 sessions, from Dec 27, 2007 to Jan 8, 2008, with total move of -7.1%. Look the move_pct column well: two streaks fit get the same length and completely different size. Long streak no mean big move, and big move no need long streak. That na why traders wey sabi no dey count red days alone; dem dey look how far price don travel from the top, the thing we dey call maximum drawdown.
Bull market vs bear market: the 20% rule
Now the big words. Bear market na when the market fall 20% or more from im recent peak, the highest close before the fall. Bull market na the long climb between bear markets, and many people count say new one start when the market don rise 20% from the bottom. Fall wey pass 10% but no reach 20% na correction. These numbers na convention wey the financial press and Wall Street agree on, no be law of nature, but na the definition everybody dey use.
For this panel we take SPY closing prices only, we track the highest close so far, and we mark every time the price drop 20% or more below that top. We also count how many calendar days e take from top to bottom, and how many days from the bottom before SPY close above the old top again.
| peak | trough | decline_pct | days_top_to_bottom | new_high | days_bottom_to_new_high |
|---|---|---|---|---|---|
| Oct 2007 | Mar 2009 | -56.5 | 517 | Mar 2013 | 1466 |
| Feb 2020 | Mar 2020 | -34.1 | 33 | Aug 2020 | 148 |
| Jan 2022 | Oct 2022 | -25.4 | 282 | Jan 2024 | 464 |
| Sep 2018 | Dec 2018 | -20.2 | 95 | Apr 2019 | 126 |
The exact SQL behind every number
WITH bars AS
(
SELECT
date,
toFloat64(any(close)) AS close_price
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND close > 0
GROUP BY date
),
peaks AS
(
SELECT
date,
close_price,
max(close_price) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS peak
FROM bars
),
episodes AS
(
SELECT
date,
close_price,
peak,
close_price / peak - 1 AS drawdown,
sum(if(close_price >= peak, 1, 0)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS episode_id
FROM peaks
),
episode_stats AS
(
SELECT
episode_id,
min(date) AS peak_date,
argMin(date, drawdown) AS trough_date,
min(drawdown) AS worst_drawdown
FROM episodes
GROUP BY episode_id
),
with_next AS
(
SELECT
episode_id,
peak_date,
trough_date,
worst_drawdown,
leadInFrame(peak_date, 1) OVER (ORDER BY episode_id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS recovered_on
FROM episode_stats
)
SELECT
formatDateTime(peak_date, '%b %Y') AS peak,
formatDateTime(trough_date, '%b %Y') AS trough,
round(100 * worst_drawdown, 1) AS decline_pct,
dateDiff('day', peak_date, trough_date) AS days_top_to_bottom,
if(recovered_on > peak_date, formatDateTime(recovered_on, '%b %Y'), 'not yet') AS new_high,
if(recovered_on > peak_date, dateDiff('day', trough_date, recovered_on), NULL) AS days_bottom_to_new_high
FROM with_next
WHERE worst_drawdown <= -0.20
ORDER BY worst_drawdown ASCFor the whole history wey we get, SPY enter only 4 bear markets by this close-to-close rule. Put that number beside the 2609 bearish days from the first panel and the base rate go clear: bearish day na everyday thing, bear market na once-in-a-while thing. The deepest one top for Oct 2007 and bottom for Mar 2009, a fall of -56.5% over 517 calendar days. From that bottom e take another 1466 days before SPY close above the old top again, for Mar 2013. The smallest one for the list just manage cross the line at -20.2%, from a top for Sep 2018.
Note say SPY na ETF wey dey pay dividend, so im price fit land on the other side of the 20% line from the S&P 500 index for the same fall. If one newspaper call one fall bear market and another one call am correction, check whether dem use the index or the ETF, and whether na closing price or intraday low. How markets dey climb back from these falls get im own full post: how market dey recover from crash.
The fall wey almost reach 20%
The 20% line get one catch: fall fit stop just before am and miss the bear market name by small margin. The panel below use the same rule as the bear market panel, so e only count falls wey start from a fresh all-time closing high. E list every time SPY fall between 15% and 20% from such a top without crossing the line, the closest one first.
| peak | trough | decline_pct | days_top_to_bottom | new_high | days_bottom_to_new_high |
|---|---|---|---|---|---|
| Feb 2025 | Apr 2025 | -19 | 48 | Jun 2025 | 80 |
The exact SQL behind every number
WITH bars AS
(
SELECT
date,
toFloat64(any(close)) AS close_price
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND close > 0
GROUP BY date
),
peaks AS
(
SELECT
date,
close_price,
max(close_price) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS peak
FROM bars
),
episodes AS
(
SELECT
date,
close_price,
peak,
close_price / peak - 1 AS drawdown,
sum(if(close_price >= peak, 1, 0)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS episode_id
FROM peaks
),
episode_stats AS
(
SELECT
episode_id,
min(date) AS peak_date,
argMin(date, drawdown) AS trough_date,
min(drawdown) AS worst_drawdown
FROM episodes
GROUP BY episode_id
),
with_next AS
(
SELECT
episode_id,
peak_date,
trough_date,
worst_drawdown,
leadInFrame(peak_date, 1) OVER (ORDER BY episode_id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS recovered_on
FROM episode_stats
)
SELECT
formatDateTime(peak_date, '%b %Y') AS peak,
formatDateTime(trough_date, '%b %Y') AS trough,
round(100 * worst_drawdown, 1) AS decline_pct,
dateDiff('day', peak_date, trough_date) AS days_top_to_bottom,
if(recovered_on > peak_date, formatDateTime(recovered_on, '%b %Y'), 'not yet') AS new_high,
if(recovered_on > peak_date, dateDiff('day', trough_date, recovered_on), NULL) AS days_bottom_to_new_high
FROM with_next
WHERE worst_drawdown > -0.20
AND worst_drawdown <= -0.15
ORDER BY worst_drawdown ASCBy this rule SPY do am only 1 time for the whole history wey we get: a fall of -19%, from a top for Feb 2025 to a bottom for Apr 2025, and e still no earn the bear market name. The list short, and the rule explain am: a dip wey happen while SPY still dey below an old top no dey count as im own episode. The Oct 2007 top no see a new closing high until Mar 2013, so every sharp dip inside those years belong to that one long episode for this count. For person wey dey hold stocks inside a fall like this, 19% fall and 21% fall dey feel exactly the same. The label na for statistics and headlines; your portfolio dey feel every percent. Some of the sharpest up days for history happen inside falls like this too, and the missed the best days post go show you that side of the story.
Other words wey dey waka with bullish and bearish
- Sentiment: the general mood of the crowd. Bullish sentiment mean say most people expect climb, bearish sentiment mean say most people expect fall.
- Bearish signal: chart pattern wey some traders read as warning, like when short-term average cross below long-term average. Our death cross post test whether that warning hold water.
- Fear gauge: the VIX index, wey dey measure how much protection options traders dey pay for. Our high VIX level guide explain wetin the number mean.
- Bull trap and bear trap: short bounce inside a fall wey make people think say climb don start (bull trap), or short dip inside a climb wey make people think say fall don start (bear trap).
FAQ
Wetin be the difference between bullish and bearish?
Bullish mean say you expect price to climb; bearish mean say you expect price to fall. You fit use dem for one stock, one sector, the whole market, or one day. Bull na up, bear na down.
Wetin be bear market?
Bear market na fall of 20% or more from a recent peak, usually measured on closing prices. SPY don enter only 4 bear markets for the whole history wey we count here, while e get 2609 down days for the same period.
How long bear market dey last?
E dey vary well well. The deepest SPY bear market for our data take 517 calendar days from top to bottom, then another 1466 days from the bottom before the price close above the old top. The bear market panel above list each one.
If today na bearish day, e mean say bear market don start?
No. About 45% of all SPY sessions na down days, so red day na normal thing, even inside strong bull years. Bear market na when the fall from the top reach 20%, and that one dey happen once in many years.
Wetin be correction for stock market?
Correction na fall of 10% or more from a recent peak wey no reach 20%. The panel of falls between 15% and 20% above show the closest miss to the bear market line for our SPY history.
Every panel for this page carry the exact SQL under am, open any one to see how we count. If you wan check another ticker the same way, ask the question in plain English for the Strasmore terminal.