投資理財統計數據

美國股市的名目滾動年化報酬率(1928-2022)

我從《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 財經個人財務調配術》講師。

Back to top button