S&P 500 Annual Returns Histogram¶
© 2025 Marek Ozana
Histogram of S&P 500 annual returns since 100 years back.
Out[8]:
In [9]:
Copied!
# Get historical S&P 500 annual price returns
from polars_bloomberg import BQuery
bin_names: list = [
"< -50",
"-50 to -40",
"-40 to -30",
"-30 to -20",
"-20 to -10",
"-10 to 0",
"0 to 10",
"10 to 20",
"20 to 30",
"30 to 40",
"40 to 50",
"> 50",
]
bins = list(range(-50, 60, 10))
query = f"""
let(
#rets = dropna(pct_diff(px_last(dates=range(-100Y, 0Y), per=Y)));
#bins = bins(#rets, {bins}, bin_names={bin_names});
)
get(#rets, #bins)
for(['SPX Index'])
"""
with BQuery() as bq:
df = bq.bql(query).combine()
df.head(3)
# Get historical S&P 500 annual price returns
from polars_bloomberg import BQuery
bin_names: list = [
"< -50",
"-50 to -40",
"-40 to -30",
"-30 to -20",
"-20 to -10",
"-10 to 0",
"0 to 10",
"10 to 20",
"20 to 30",
"30 to 40",
"40 to 50",
"> 50",
]
bins = list(range(-50, 60, 10))
query = f"""
let(
#rets = dropna(pct_diff(px_last(dates=range(-100Y, 0Y), per=Y)));
#bins = bins(#rets, {bins}, bin_names={bin_names});
)
get(#rets, #bins)
for(['SPX Index'])
"""
with BQuery() as bq:
df = bq.bql(query).combine()
df.head(3)
Out[9]:
shape: (3, 4)
| ID | #rets | DATE | #bins |
|---|---|---|---|
| str | f64 | date | str |
| "SPX Index" | 37.88222 | 1928-12-31 | "30 to 40" |
| "SPX Index" | -11.909651 | 1929-12-31 | "-20 to -10" |
| "SPX Index" | -28.484848 | 1930-12-31 | "-30 to -20" |