我從《Historical Returns on Stocks, Bonds and Bills: 1928-2022》調取了美國1928年-2022年的資產報酬,並分析S&P 500(includes dividends)在這段期間的滾動年化報酬率,需注意的是,這些數據並沒有扣除通貨膨脹,僅為名目報酬率。
滾動年化報酬率總圖表
以下是我將美國1928年-2022年間S&P 500(includes dividends)的滾動年化報酬率繪製成圖表,時間分別是5年、10年、15年、20年和30年。
「滾動年化報酬率」是一種衡量投資績效的方法,這種方法涉及到計算一個投資在特定時間範圍內(例如 5 年、10 年等)的平均年化收益率。
例如,5 年滾動年化報酬率就是在過去的每一個 5 年期間計算平均年化報酬率,然後將這些報酬率進行平均。
以上就是我們繪製的美國股市 S&P 500 指數的 5 年、10 年、15 年、20 年和 30 年滾動年化報酬率的柱狀圖。
5 年滾動年化報酬率
在 5 年滾動年化報酬率的圖表中,我們可以看到報酬率有較大的波動。這是因為 5 年是相對較短的時間範圍,市場的短期波動會對年化報酬率產生較大的影響。
隨著滾動期間的增加(例如 10 年、15 年、20 年和 30 年),年化報酬率的波動性逐漸降低。
這是因為隨著時間範圍的擴大,短期市場波動對年化報酬率的影響就越小,因此報酬率變得越來越穩定。
10 年滾動年化報酬率
15 年滾動年化報酬率
20 年滾動年化報酬率
30 年滾動年化報酬率
這些分析結果可以幫助我們理解長期投資的重要性,並認識到短期市場波動對長期投資回報的影響有限。
負報酬比率
年化報酬率為負的比率:
- 5年滾動期間:約6.59%
- 10年、15年、20年和30年滾動期間:0%(這些期間的年化報酬率都沒有為負的情況)
年化報酬率區間
年化報酬率的範圍:
- 5年滾動期間:約從 -8.42% 到 28.44%
- 10年滾動期間:約從 0.65% 到 21.56%
- 15年滾動期間:約從 3.68% 到 19.45%
- 20年滾動期間:約從 5.63% 到 18.38%
- 30年滾動期間:約從 10.71% 到 14.81%
我的觀察
從以上的圖表中,我覺得有三點值得分享與關注:
1、長期投資報酬的穩定性
從這五張圖的變化中,我覺得最棒的是「長期投資報酬的穩定性」。
在圖表中我逐漸增加持有的時間,由5年增加為30年,可以看到年化報酬的波動性逐漸降低,這證明了長期投資可以降低市場波動帶來的風險。
2、長期投資股市的勝率
超過5年以上的時間過後,年化報酬率便沒有出現負數,所以經驗告訴我們,持有股市的時間框架至少設定超過5年以上,虧損的可能性才能較低。
3、短期市場波動的影響會越來越低
例如在30年過後,年化報酬率已經穩定在 10.71% 到 14.81%這樣的區間,由於先前的累積,短期市場波動對於報酬的影響越來越低。
Python程式碼
滾動年化報酬率
# Ensure the data is sorted by year
df = df.sort_values(by='Year')
# Create a list of the rolling periods
rolling_periods = [5, 10, 15, 20, 30]
# Calculate the rolling annualized returns for each period
rolling_returns = {}
for period in rolling_periods:
# Calculate the rolling return
rolling_return = df['S&P 500 (includes dividends)'].rolling(period).mean()
rolling_returns[period] = rolling_return
# Convert the dictionary to a DataFrame
rolling_returns_df = pd.DataFrame(rolling_returns)
# Display the first few rows of the rolling returns DataFrame
rolling_returns_df.head()
繪製圖表
import matplotlib.pyplot as plt
# Create bar plots for each rolling period
for period in rolling_periods:
# Create a new figure
plt.figure(figsize=(10, 6))
# Create the bar plot
plt.bar(df['Year'], rolling_returns_df[period])
# Add title and labels
plt.title(f'S&P 500 {period}-Year Rolling Annualized Returns')
plt.xlabel('Year')
plt.ylabel('Annualized Return')
# Display the plot
plt.show()
計算負數的比率、年化報酬率的區間
# Calculate the percentage of negative annualized returns and the range of annualized returns for each rolling period
negative_returns_percentages = {}
returns_ranges = {}
for period in rolling_periods:
# Get the rolling returns for the current period
rolling_returns_current_period = rolling_returns_df[period].dropna()
# Calculate the percentage of negative returns
negative_returns_percentage = (rolling_returns_current_period < 0).mean() * 100
negative_returns_percentages[period] = negative_returns_percentage
# Calculate the range of returns
returns_range = (rolling_returns_current_period.min(), rolling_returns_current_period.max())
returns_ranges[period] = returns_range
# Convert the dictionaries to DataFrames
negative_returns_percentages_df = pd.DataFrame(list(negative_returns_percentages.items()), columns=['Period', 'Negative Returns Percentage'])
returns_ranges_df = pd.DataFrame(list(returns_ranges.items()), columns=['Period', 'Returns Range'])
# Display the DataFrames
negative_returns_percentages_df, returns_ranges_df
你好,我是蔡至誠PG,任職於《阿爾發證券投顧》投資事業處,《我畢業五年,用ETF賺到400萬》作者,《提早五年退休:PG 財經個人財務調配術》講師。