recovery_path_2007
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-02, from did-stocks-take-25-years-to-recover.
| month_start | month_label | price_pct | total_return_pct |
|---|---|---|---|
| 2007-10-01 | Oct 2007 | 0 | 0 |
| 2007-11-01 | Nov 2007 | -3.9 | -3.9 |
| 2007-12-01 | Dec 2007 | -5.5 | -5 |
| 2008-01-01 | Jan 2008 | -11.2 | -10.7 |
| 2008-02-01 | Feb 2008 | -13.5 | -13 |
| 2008-03-01 | Mar 2008 | -14.7 | -13.8 |
| 2008-04-01 | Apr 2008 | -10.6 | -9.7 |
| 2008-05-01 | May 2008 | -9.2 | -8.3 |
| 2008-06-01 | Jun 2008 | -17.2 | -16 |
| 2008-07-01 | Jul 2008 | -18 | -16.7 |
| 2008-08-01 | Aug 2008 | -16.7 | -15.5 |
| 2008-09-01 | Sep 2008 | -25 | -23.4 |
| 2008-10-01 | Oct 2008 | -37.4 | -36.1 |
| 2008-11-01 | Nov 2008 | -41.7 | -40.5 |
| 2008-12-01 | Dec 2008 | -41.6 | -39.9 |
| 2009-01-01 | Jan 2009 | -46.4 | -44.9 |
| 2009-02-01 | Feb 2009 | -52.2 | -50.8 |
| 2009-03-01 | Mar 2009 | -48.6 | -46.7 |
| 2009-04-01 | Apr 2009 | -43.5 | -41.4 |
| 2009-05-01 | May 2009 | -40.2 | -38 |
| 2009-06-01 | Jun 2009 | -40.5 | -38 |
| 2009-07-01 | Jul 2009 | -36.1 | -33.4 |
| 2009-08-01 | Aug 2009 | -33.7 | -30.9 |
| 2009-09-01 | Sep 2009 | -31.7 | -28.5 |
| 2009-10-01 | Oct 2009 | -33 | -29.9 |
| 2009-11-01 | Nov 2009 | -28.9 | -25.5 |
| 2009-12-01 | Dec 2009 | -27.9 | -24.1 |
| 2010-01-01 | Jan 2010 | -30.6 | -26.9 |
| 2010-02-01 | Feb 2010 | -28.4 | -24.6 |
| 2010-03-01 | Mar 2010 | -24.3 | -20 |
| 2010-04-01 | Apr 2010 | -23.2 | -18.8 |
| 2010-05-01 | May 2010 | -29.3 | -25.2 |
| 2010-06-01 | Jun 2010 | -33.3 | -29.1 |
| 2010-07-01 | Jul 2010 | -28.7 | -24.2 |
| 2010-08-01 | Aug 2010 | -31.9 | -27.6 |
| 2010-09-01 | Sep 2010 | -26.2 | -21.2 |
| 2010-10-01 | Oct 2010 | -23.4 | -18.2 |
| 2010-11-01 | Nov 2010 | -23.4 | -18.2 |
| 2010-12-01 | Dec 2010 | -18.7 | -12.7 |
| 2011-01-01 | Jan 2011 | -16.8 | -10.6 |
| 2011-02-01 | Feb 2011 | -13.9 | -7.5 |
| 2011-03-01 | Mar 2011 | -14.3 | -7.5 |
| 2011-04-01 | Apr 2011 | -11.8 | -4.9 |
| 2011-05-01 | May 2011 | -12.8 | -5.9 |
| 2011-06-01 | Jun 2011 | -14.7 | -7.5 |
| 2011-07-01 | Jul 2011 | -16.4 | -9.4 |
| 2011-08-01 | Aug 2011 | -21 | -14.3 |
| 2011-09-01 | Sep 2011 | -26.8 | -20.3 |
| 2011-10-01 | Oct 2011 | -18.8 | -11.6 |
| 2011-11-01 | Nov 2011 | -19.2 | -12 |
| 2011-12-01 | Dec 2011 | -18.8 | -11 |
| 2012-01-01 | Jan 2012 | -15.1 | -6.9 |
| 2012-02-01 | Feb 2012 | -11.4 | -2.9 |
| 2012-03-01 | Mar 2012 | -8.9 | 0.3 |
| 2012-04-01 | Apr 2012 | -9.6 | -0.4 |
| 2012-05-01 | May 2012 | -15 | -6.4 |
| 2012-06-01 | Jun 2012 | -12 | -2.6 |
| 2012-07-01 | Jul 2012 | -11 | -1.4 |
| 2012-08-01 | Aug 2012 | -8.7 | 1 |
| 2012-09-01 | Sep 2012 | -6.9 | 3.6 |
| 2012-10-01 | Oct 2012 | -8.6 | 1.7 |
| 2012-11-01 | Nov 2012 | -8.1 | 2.3 |
| 2012-12-01 | Dec 2012 | -7.9 | 3.2 |
| 2013-01-01 | Jan 2013 | -3.2 | 8.5 |
| 2013-02-01 | Feb 2013 | -2 | 9.9 |
| 2013-03-01 | Mar 2013 | 1.3 | 14 |
| 2013-04-01 | Apr 2013 | 3.3 | 16.2 |
| 2013-05-01 | May 2013 | 5.7 | 19 |
| 2013-06-01 | Jun 2013 | 3.7 | 17.4 |
| 2013-07-01 | Jul 2013 | 9.1 | 23.4 |
| 2013-08-01 | Aug 2013 | 5.8 | 19.7 |
| 2013-09-01 | Sep 2013 | 8.6 | 23.5 |
| 2013-10-01 | Oct 2013 | 13.7 | 29.3 |
| 2013-11-01 | Nov 2013 | 17 | 33.1 |
| 2013-12-01 | Dec 2013 | 19.4 | 36.5 |
- Rows × columns
- 75 × 4
- Period covered
- to
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
month_start |
date | 2007-10-01 to 2013-12-01 | |
month_label |
text | 75 distinct values (Apr 2008, Apr 2009, Apr 2010…) | |
price_pct |
number | -52.2 to 19.4 | percent |
total_return_pct |
number | -50.8 to 36.5 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH monthly AS
(
SELECT
toStartOfMonth(date) AS month,
argMax(toFloat64(close), date) AS month_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2007-10-01'
AND date < '2014-01-01'
GROUP BY month
),
div_cash AS
(
SELECT
ex_dividend_date AS ex_date,
max(toFloat64(cash_amount)) AS cash
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
AND ex_dividend_date >= '2007-11-01'
AND ex_dividend_date < '2014-01-01'
AND cash_amount > 0
GROUP BY ex_dividend_date
),
div_log AS
(
SELECT
toStartOfMonth(c.ex_date) AS month,
sum(log(1 + c.cash / p.close_on_ex)) AS log_factor
FROM div_cash AS c
INNER JOIN
(
SELECT
date AS date,
toFloat64(close) AS close_on_ex
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2007-11-01'
AND date < '2014-01-01'
) AS p ON p.date = c.ex_date
GROUP BY month
),
path AS
(
SELECT
m.month AS month,
m.month_close AS month_close,
ifNull(d.log_factor, 0) AS log_factor
FROM monthly AS m
LEFT JOIN div_log AS d ON d.month = m.month
)
SELECT
toString(month) AS month_start,
formatDateTime(month, '%b %Y') AS month_label,
round(100 * (month_close
/ first_value(month_close) OVER (ORDER BY month) - 1), 1) AS price_pct,
round(100 * (month_close * exp(sum(log_factor) OVER (ORDER BY month))
/ first_value(month_close) OVER (ORDER BY month) - 1), 1) AS total_return_pct
FROM path
ORDER BY month
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.