存活者偏差是你只看得到活下來的那些,倒下的已經從名單上消失了。我們拿今天的標普 500 成分股,假裝 2015 年初就等權重買下去抱到現在,總報酬 +462%。同樣等權重、可是成分股會跟著指數換的 RSP,實際只有 +226%。年化差 5.28 個百分點,其中 3.69 個來自「倒下的沒被算進去」,其餘來自「後來才入選的被當成一開始就買了」。更麻煩的是想修正也修不了。
下面直接回答這幾題
存活者偏差是什麼
二戰的時候,盟軍統計返航飛機的彈孔分布,想知道該補強哪裡。彈孔最多的是機翼,於是有人主張加強機翼。統計學家沃德(Abraham Wald)指出這個推論整個反了,因為那些被打中引擎的飛機根本沒能飛回來,所以在他手上那份資料裡,引擎中彈的樣本數其實是零。
投資裡的版本長得一模一樣。你打開任何一份「過去十年報酬」的統計,裡面列出來的公司全部都是今天還在的,而下市的、被併購的、被踢出指數的那些,不會出現在你查得到的任何一份名單上。
那這個偏誤實際上有多大?大家都知道它存在,可是很少有人真的把它量出來過,所以我們自己量了一次。
BOS 回測:只差在名單怎麼來的
做法很簡單。拿今天的標普 500 成分股,假裝 2015 年 1 月 2 日就等權重買下去、中間什麼都不管地一路抱到 2026 年 9 月 11 日,前後共 11.7 年。對照組是 RSP,它是等權重的標普 500 指數 ETF,成分股會跟著指數換,所以沒有這個偏誤。
三條線跑出來是這樣。今天的名單全部算進去(459 檔有完整報價),年化 15.92%;只留「2015 年當時就已經在指數裡」的那些(315 檔),年化 14.33%;RSP 的實際報酬,年化 10.64%。
差距要分成兩層看,因為它們是兩個不同的錯。
第一層是純粹的存活者偏差,值 3.69 個百分點。315 檔那一版只用了「當時在、今天也還在」的公司,等於把 2015 年在指數裡、後來被剔除的那些整批刪掉。光是這樣,年化就從 10.64% 變成 14.33%。
第二層是「事後才知道誰會入選」,兩者合計 5.28 個百分點。把今天的名單全部算進去,等於連 2015 年還不夠格、後來因為變強才被納入指數的公司,都被當成你 2015 年就買了。這是另一種偷看未來,跟未來函數是同一類毛病。
換成總報酬更直觀:用今天的名單是 +462%,實際只有 +226%。
名單換得比你以為的快
為什麼差這麼多?因為名單換血的速度超乎多數人的想像。
今天的標普 500 有 503 檔,其中 188 檔是 2015 年之後才被加進來的。同一段期間,被剔除過的代號有 250 個。
所以拿今天的名單去回測 2015 年,等於兩件事同時發生。被剔除的那 240 家沒有被算進去,而後來才加入的那 188 家卻被當成你一開始就持有,兩個方向都讓報酬看起來更漂亮,而且它們會互相加成,這就是為什麼上面那個差距會大到讓人不太敢相信。
想把消失的補回來,也補不齊
知道有這個偏誤之後,直覺的修法是把被剔除的那些公司補回來、整份資料重算一次,聽起來沒什麼難的,可是我們實際去試的時候,發現根本補不齊。
2015 年以來被剔除的 250 個代號,只有 38.4% 還查得到價格,61.6% 完全查不到。查不到的包括 Covidien、Safeway、PetSmart、Family Dollar 這些當年在名單上、規模都不小的公司。
這件事本身就是存活者偏差最麻煩的地方。消失的東西連在資料庫裡也跟著消失了,你甚至沒辦法知道自己漏掉了什麼。所以那個「補回來重算」的修法,聽起來合理,多數人實際上做不到。
換一個起點,幅度差不多
一個起點可能是巧合,所以我們把同一套做法往前推到 2010 年再跑一次,期間 16.7 年。
只留當時就在指數裡的 266 檔,年化 15.45%。今天的名單全部 419 檔,年化 17.28%。RSP 的實際報酬是年化 12.38%。
換算下來,純存活者偏差是 3.07 個百分點,加上事後入選合計 4.91 個百分點,跟 2015 年那一組的 3.69 與 5.28 相當接近,方向完全一樣。
要留意的是這個單位是年化。抱得越久,它累積起來的差距越大。2010 年那一組,用今天的名單算出來的總報酬是 +1329%,實際上是 +601%。
看到別人的回測,可以先問三個問題
不用會寫程式也能問。
第一,那份名單是什麼時候的?如果對方說「我測了標普 500 的成分股」,關鍵在他用的是哪一年的名單。用今天的名單測過去,上面那幾個數字就是他多出來的部分。
第二,下市或被併購的公司怎麼處理?答得出「用最後一個交易日的價格出場」是及格的。答不出來,或者說「那些資料找不到所以沒算」,那個回測的報酬就是被灌過水的。
第三,結果有沒有跟一個不會作弊的基準比?像我們這篇用 RSP,它的成分股會跟著指數換。基準線一擺出來,灌水的幅度自己就現形了。站上另有兩篇同一類的毛病可以一起看,過度擬合講的是參數在事後挑過,未來函數講的是時間軸接錯。
這次回測要先講清楚的事
第一,再平衡的方式不完全一樣。我們的組合用每日等權重,RSP 是每季再平衡,這個差異值 1.74 個百分點,而且方向對我們不利,因為我們的做法比完全不動還少賺,所以它不會是上面那個差距的來源。實際的偏誤如果改用完全不動的版本去算,只會更大。
第二,成本一律設 0。可是 RSP 的報酬已經扣掉它自己的內扣費用。這一點對我們的組合有利,所以實際的偏誤會比量到的再大一點點,結論的方向是安全的。
第三,只有 459 檔有完整報價。今天的 503 檔裡,有 44 檔在 2015 年還沒上市或查不到價格,那些只能排除。被排除的多半是近年才上市的公司,如果它們也能算進來,偏誤只會更大。
第四,加入日期取的是資料源給的欄位。被剔除又被加回來的公司,這個欄位可能只記最近一次,會讓「當時就在指數裡」的那份名單偏小。這同樣讓我們算出來的偏誤偏保守。
常見問題
存活者偏差是什麼?
你只看得到活下來的樣本,倒下的那些已經從名單上消失了,於是統計出來的結果比實際好。投資裡最常見的形式是拿今天還在的公司名單去回測過去。我們實測的規模是年化 5.28 個百分點,總報酬 +462% 對上實際的 +226%。
為什麼拿今天的成分股回測會高估?
因為同時犯了兩個錯。第一,2015 年在指數裡、後來被剔除的 240 家沒有被算進去。第二,2015 年還不夠格、後來才被納入的 188 家,卻被當成你一開始就買了。前者值 3.69 個百分點,兩者合計 5.28 個百分點。
那把下市的公司補回來不就好了?
理論上對,實際上補不齊。2015 年以來被剔除的 250 個代號,只有 38.4% 還查得到價格。Covidien、Safeway、PetSmart、Family Dollar 這些當年的成分股,在常見的資料源裡完全查不到。消失的東西連在資料庫裡也消失了。
買指數 ETF 也會有這個問題嗎?
不會。指數 ETF 持有的是當下的成分股,公司被剔除的時候它會跟著賣掉,虧損實實在在反映在淨值上。有問題的是「用今天的名單去推算過去」這個動作,不是持有指數本身。這篇的對照組 RSP 就是這樣運作的。
這個偏誤只有美股才有嗎?
任何有成分股汰換的市場都有,台股也一樣,差在資料取得的難度。美股的成分股異動紀錄公開而且完整,我們才能把它量出來,而資料越難取得的市場,這個偏誤就越不容易被發現,也就越危險。
怎麼判斷一份回測有沒有這個問題?
問三件事,名單是哪一年的、下市的公司怎麼處理、有沒有跟一個會汰換成分股的基準比。這三題裡第二題最關鍵,如果對方答不出來,或者回答「那些資料找不到所以沒算進去」,那份回測的報酬就是被灌過水的,差距大概就是這篇量到的規模。
這次回測有什麼限制?
有四個,而且四個都讓我們算出來的偏誤偏小。再平衡方式跟 RSP 不完全一樣,值 1.74 個百分點,方向對我們不利。成本設 0,可是 RSP 的報酬已經扣過內扣費用。今天的 503 檔裡只有 459 檔在 2015 年就有報價。加入日期用的是資料源的欄位,被剔除又加回來的公司可能只記最近一次。
延伸閱讀

回測賺翻了實盤卻不行?
量化交易是什麼?
做多和做空差在哪?


