Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

等權配置何時勝過最佳化部位設定?

樣本期過短時,預期報酬難以可靠估計,等權配置反而更穩健。透過固定種子的 Python 模擬,觀察優勢如何出現並隨樣本增長收斂。

當樣本期過短、無法可靠估計預期報酬時,等權配置通常優於最佳化部位 sizing;而短樣本是常態,不是例外。最佳化模型只是把嚴謹的算術套用在一項幾乎沒有人能準確衡量的輸入上。1/N 投資組合採等權配置,完全不需要估計任何參數;這正是它在估計失準時仍能維持穩健的原因。

等權重真的能勝過最佳化嗎?

在一項特定條件下,答案是肯定的。先逐一拆解這些術語。等權重以 1/N 表示,將資金平均分配至 N 個部位,完全不需要任何預測。均值—變異數最佳化,則是求解各部位權重,使每單位估計變異數的預期報酬最高。Kelly criterion 則是求解各部位權重,以最大化長期複利成長;對彼此不相關的資產而言,其答案會簡化為:權重與各資產的預期超額報酬除以其變異數成正比。我們的 Kelly criterion 部位規模設定指南會詳細說明這項公式。

這兩種最佳化方法需要相同的輸入值:每項資產的預期報酬。這正是樣本最難估計的數值。波動率可從較短期間的資料中,以相當可用的精度估算;平均報酬則無法做到,兩者之間的差距在任何價格歷史中都足以辨識。下方圖表選取六檔廣泛持有的股票,分別計算其2015年至2024年的各個曆年資料,並呈現每檔股票年度最高與最低估計值相差多遠。每檔股票各計算兩次:一次是年化平均每日報酬,一次是年化波動率。

查詢十年年度估計:平均值的變動遠大於波動率
每個數據背後的精確 SQL 語法
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND date >= '2015-01-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
yearly AS
(
    SELECT
        ticker,
        toYear(date)                     AS yr,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM rets
    WHERE isFinite(ret)
    GROUP BY ticker, yr
    HAVING count() >= 200
)
SELECT
    ticker,
    round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
    round(max(vol_pct) - min(vol_pct), 1)   AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESC
Run this yourself

NVDA 而言,這十年間的年度平均報酬估計值相差 184.7 個百分點;相比之下,同一檔股票在相同期間的波動率估計值僅相差 28.6 個百分點。圖表中最穩定的股票 KO,其年度平均報酬估計值仍前後相差 23.9 個百分點。任何將去年度平均報酬交給最佳化模型、作為本年度預期報酬的策略,實際上都是把一個具有如此大波動範圍的數值輸入模型。

估計預期報酬需要多長的樣本期間?

估計平均報酬的標準誤,等於資產波動度除以樣本年數的平方根。這裡是以年數計算,而不是觀測值數量:以每小時頻率取樣相同的十二個月資料,並不比每日取樣提供更多資訊。將波動度為 20% 的資產代入公式,一年的歷史資料會得到每年 20 個百分點的標準誤。四年會將標準誤降至 10 個百分點。若要降至 1 個百分點,也就是在比較兩項真實平均報酬相差 2 個百分點的資產前所需的精確度,則需要四個世紀的資料。

波動度則是另一種情況。其估計精確度隨觀測值數量增加而改善,而不是取決於曆年期間,因此幾個月的每日資料,就足以將估計值控制在幾個百分點的誤差範圍內。下方圖表將某一指數基金 20 年的每日報酬切分為固定長度、彼此不重疊的區塊,在每個區塊內計算兩項估計值,並呈現這些估計值在不同區塊之間的分散程度。

查詢平均值與波動率估計值隨樣本長度的分散程度
每個數據背後的精確 SQL 語法
WITH prices AS
(
    SELECT
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= '2005-01-01'
      AND date <  '2025-01-01'
    GROUP BY date
),
rets AS
(
    SELECT
        date,
        c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
numbered AS
(
    SELECT
        ret,
        row_number() OVER (ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
),
sweep AS
(
    SELECT
        arrayJoin([21, 63, 126, 252, 504]) AS n,
        i,
        ret
    FROM numbered
),
blocks AS
(
    SELECT
        n,
        intDiv(i - 1, n)                 AS blk,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM sweep
    GROUP BY n, blk
    HAVING count() = n
)
SELECT
    concat(toString(n), ' sessions') AS sample_length,
    round(stddevPop(mean_pct), 1)    AS mean_estimate_spread_pct,
    round(stddevPop(vol_pct), 1)     AS vol_estimate_spread_pct,
    count()                          AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASC
Run this yourself

在區塊長度為 21 sessions 時,平均報酬估計值的分散範圍為 53.7 個百分點;相同區塊所估得的波動度則為 10.9 個百分點。將區塊延長至 504 sessions 後,平均報酬估計值的分散範圍縮小至 10.6 個百分點。這種縮小幅度遵循平方根關係:誤差每減半一次,所需資料量就會增加四倍。

可自行執行的含種子模擬

這些內容仍不足以證明估計誤差大到足以讓1/N勝過最佳化配置。以下模擬可以證明這一點。執行這份程式只需要安裝 Python,其他都不需要:不需要資料檔、不需要下載資料,也不需要第三方套件。程式會根據你選定的參數自行產生報酬,因此真實答案已知,也能據此評估兩種配置。

  1. 匯入兩個模組 import randomimport statistics,再加上 from math import log。在下一行使用 random.seed(20260816) 設定隨機種子。
  2. 定義五項資產。其真實年化預期報酬率分別為5%、6%、7%、8%與9%,真實年化波動率均為20%,且彼此不相關。使用 mu_d = mu_a / 252sd_d = sd_a / (252 ** 0.5) 轉換為日頻步長。
  3. [60, 125, 250, 500, 1000, 2500, 5000] 的掃描範圍中選取樣本長度 T。
  4. 使用 random.gauss(mu_d, sd_d) 為每項資產產生 T 個日報酬。這組抽樣結果就是經理人能看到的全部歷史資料。
  5. 使用 statistics.mean 估計各資產的平均報酬,並使用 statistics.stdev 估計波動率。最佳化器只知道這兩項估計值。
  6. 建立等權重投資組合,將五項資產的權重各設為0.2。這個投資組合完全不使用任何估計值。
  7. 建立最佳化投資組合。先將各項原始權重設為 mu_hat / (sd_hat ** 2),再以所有原始權重絕對值的總和除以每一項權重,讓兩個投資組合具有相同的總曝險。
  8. 根據真實參數,為每項資產產生一段2520個交易日的新樣本外報酬路徑。兩種配置都沒有看過這段資料。
  9. 使用該路徑評估兩種配置,評分為 log(1 + r) 的平均值,其中 r 是當日五項資產報酬的加權總和。
  10. 對每個 T 重複執行步驟4至9,共進行2000次獨立試驗,並記錄等權重配置跑贏最佳化權重的試驗占比。

按照 T 從短到長讀取掃描結果。在較短的樣本長度下,等權重配置在絕大多數試驗中勝出。隨著 T 增加,這個占比持續下降;在較長的樣本長度下,最佳化權重則在多數試驗中勝出。兩者會在中間某處交叉。交叉點會隨隨機種子及真實平均報酬率之間的差距而變動。但方向不變:資料越多,越有利於最佳化器;資料越少,越有利於1/N。若要重現結果,修改 random.seed(20260816) 內的整數,再次執行掃描。

為何最佳化器會放大錯誤的平均值估計

先看估計值如何進入權重公式。估計平均值位於分子,估計變異數位於分母。平均值估計翻倍,權重就會翻倍。變異數估計降低四分之一,權重就會上升三分之一。在幸運的樣本中,兩項誤差往往朝同一方向發展:一段良好報酬會推高測得的平均值,也常在同一段期間壓低測得的變異數。最佳化器因此把該資產判定為群組中的突出者,並據此配置較大權重。到了樣本外期間,它又只是群組中的普通成員。等權重策略從未看到那段幸運樣本。

這項模擬呈現的是這個問題較溫和的版本。五項彼此不相關的資產會形成對角共變異數矩陣,不需要進行矩陣求逆。實際投資組合彼此相關;當樣本數僅略多於資產數時,樣本共變異數矩陣會接近奇異矩陣。進行矩陣求逆會把輸入值中的微小誤差放大成極大的權重。這正是最佳化器可能對單一資產建立數倍於資本的多頭部位,同時對其高度相近的替代資產建立抵銷性空頭部位的原因。我們關於投資組合集中風險的說明,涵蓋了這類權重在回撤期間造成的影響。

輸入值也不是固定不變的。下圖追蹤某 broad index fund 與一家大型必需消費品公司的滾動一年日均報酬率。數據按年化處理,並以每月頻率取樣。

查詢滾動一年平均報酬率,最佳化器會採用的數值
每個數據背後的精確 SQL 語法
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'KO')
      AND date >= '2015-10-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
trailing AS
(
    SELECT
        ticker,
        date,
        avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
        row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
)
SELECT
    toString(toStartOfMonth(date))                     AS month,
    round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
    round(avgIf(trailing_mean_pct, ticker = 'KO'), 1)  AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
  AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASC
Run this yourself

這兩條線上的每一個點,都是某個最佳化器在該日期可能接受為預期報酬的數值。SPY 的第一個月度讀值為 17.7%,最後一個讀值為 25.8%,中間共有 96 個讀值。KO 則從 -0.4% 開始,涵蓋相同期間。逐月使用這組序列的權重配置方法,會承受其中每一次波動。

半 Kelly 與收縮能解決問題嗎?

它們只能降低問題的影響。實務上有四種修正方式,而每一種都會犧牲部分理論最適解,換取對估計值較低的敏感度。

  • 半 Kelly 將每個權重減半。Kelly 成長曲線在峰值附近相對平坦,但在峰值下方則較陡。因此,持有半數部位只會放棄理論成長率中的一小部分,卻能大幅降低高估優勢所造成的損失。波動度目標對分母採取相同的做法,根據短樣本能提供的唯一輸入來決定部位規模。
  • 收縮會將每個估計平均報酬拉向各估計值的橫斷面平均值;樣本越小,收縮幅度越大。若將收縮推至極限,每項資產的預期報酬都會相同;在波動度相同的情況下,最佳化器自然會得到等權重。等權重就是完全收縮後的投資組合。
  • 限制條件包括不得放空及設定單一部位上限,用來限制某個幸運估計值將單一權重推得過高。這是損害控制,而不是改善估計值。
  • 完全捨棄預期報酬後,剩下最小變異數與風險平價策略;兩者只使用共變異數,而這正是樣本實際能夠提供的輸入。

這四種方法都無法憑空製造樣本中不存在的資訊。它們改變的是投資組合有多少部位曝險於你可能並不具備的資訊。

最佳化開始發揮價值

這種交叉會朝兩個方向發生。當 T 相對於真實平均值之間的差距變得足夠大時,最佳化配置會超越等權重配置,並持續保持領先;而差距越大,交叉越早發生。只要輸入值是資料能提供的資訊,最佳化通常也是適當工具:共變異數與避險比率的估計,往往比預期報酬更精確。

等權重配置也有自身的代價。它忽略你確實掌握的資訊;在投資標的數量較少的集合中,其集中程度也可能不亞於任何最佳化方法。應將等權重配置視為基準,任何候選權重都必須在權重從未看過的資料上擊敗這項基準。以同一個樣本估計權重並評分,屬於回測中的前視偏誤換了一種形式,而且每次都會美化最佳化方法的表現。若要取得圍繞已測得優勢的合理區間,而非單一點估計,自助法信賴區間是標準工具。

常見問答

等權重真的能勝過平均—變異數最佳化嗎?

簡短答案是,在短樣本中經常可以。最佳化模型需要估計每項資產的預期報酬,而該估計值的標準誤,大致等於資產波動率除以樣本年數的平方根。只要這項誤差仍大於資產之間的真實差異,最佳化模型排序的就是雜訊。等權重不需要估計,因此也沒有估錯的問題。

估計預期報酬需要多少筆觀測值?

所需觀測值比幾乎所有人想像的都多。對波動率為 20% 的資產而言,一年的日資料會留下接近每年 20 個百分點的標準誤;若要將誤差減半,日曆期間必須延長四倍。在同一年內增加盤中觀測值並沒有幫助。相較之下,波動率只需幾個月的資料便可估計使用。

半 Kelly 只是較小的押注嗎?

它是在有利條件下採取較小的押注。Kelly 成長曲線在峰值附近相當平坦,因此將部位減半,只會放棄理論成長率的一小部分,卻大致能將路徑波動率減半,並降低高估優勢所造成的成本。

什麼是 1/N 投資組合?

這是將資本等比例配置於 N 個部位,並依排程重新平衡的投資組合。它不需要預測報酬,也不需要估計共變異數,因此成為所有需要這些資料的配置方法之標準基準。

圖表的建立方式

三個圖表都讀取每日收盤價,並計算簡單的收盤至收盤報酬;重複列則合併為每個 ticker 每個日期的一筆收盤價。平均值乘以 252 個交易日後年化;波動率則以每日標準差乘以 252 的平方根後年化。年度圖表僅保留至少有 200 個交易日的日曆年。區塊圖表使用不重疊區塊,並捨棄各種長度下最後不足完整期間的區塊;其 window count 欄位顯示每種長度產生的區塊數量。所有計算均未納入股息,因此這些是價格報酬,股息支付者的平均值水準會因此被低估。圖表重點在於估計值的分散程度,而非其水準。


本頁每個圖表下方都附有完整且未經改動的 SQL,模擬也附有隨機種子。若要針對自己的股票名單執行相同的估計穩定性檢查,請在 Strasmore terminal 以自然語言提出要求。

#quant#position sizing#portfolio construction#estimation error#kelly