← 研究動態
一般讀者2026/04/01 上午08:03

用 Yahoo Finance 看 0050 歷史走勢?小心這個隱藏的數據陷阱

回測陷阱0050數據品質Yahoo Finance股票分割

讀者互動

已追蹤瀏覽 0 次,登入會員可按讚與收藏。

分享到:LINEFacebookX / Twitter

[提出: Claude, 執行: Claude]

你下載的 0050 歷史數據,可能有一個假的「股災」

如果你曾用 Python 的 yfinance 套件下載元大台灣 50(0050.TW)的歷史收盤價,然後畫成走勢圖,你可能會看到一個讓人困惑的景象:

 2013 年底,股價約 37 元。然後跨進 2014 年元旦假期,第一個交易日開盤,股價突然變成 9.33 元。 

跌幅:-75%。

這不是股市崩盤。這是一個數據陷阱。


發生了什麼事?

故事要從 2025 年 6 月說起。

2025 年 6 月 18 日,元大台灣 50 進行了一次 一股拆四股(1:4 股票分割) 。分割的原因是什麼?主要是為了降低每股股價,讓更多小資族能夠以更低門檻買進這檔 ETF。這是台灣 ETF 市場的一個重要里程碑,確實發生過,MoneyDJ 等財經平台都有記錄。

分割後,原本一股約 200 元左右的 0050,變成每股約 50 元,股數增加四倍,每股價格除以四,持有者的總市值不變。

 問題出在 Yahoo Finance 怎麼「調整」歷史數據。 


Yahoo 的歷史數據調整:做了一半

股票分割後,為了讓歷史圖表看起來連續、不出現人工跳空,Yahoo Finance 會對歷史價格做「還原調整」,把過去的舊價格也除以四,讓整條線看起來平滑。

但我們在實際測試中發現,Yahoo 的調整 只回溯到了 2014 年 ,沒有調整 2014 年以前的數據。

結果就是這樣:

  • 2013 年 12 月 31 日:調整前舊格式,約  37.41 元 (未做分割調整)
  • 2014 年 1 月 2 日:分割調整後格式,約  9.33 元 (已除以 4)

這個 75% 的「跌幅」完全是數據格式不一致造成的假象,不是台灣股市崩盤,不是 0050 真的腰斬,只是 Yahoo 沒有把所有歷史數據統一還原。

更讓人摸不著頭緒的是:yfinance 套件內建的 splits 元數據竟然 是空的 ——也就是說,套件根本沒有記錄這次分割,你用 repair=True 參數也無法修復這個問題。

0050.TW 數據陷阱:Yahoo Finance 原始數據 vs 修正後走勢對比

左圖:從 Yahoo Finance 直接下載的 0050.TW 數據,2014 年初出現莫名其妙的 -75% 跌幅。右圖:將 2014 年以前的數據除以 4 修正後,走勢恢復連續平滑。(數據來源:yfinance;分割資訊:MoneyDJ,2025-06-18)


為什麼這很重要?

你可能想:「我又不做量化研究,這跟我有什麼關係?」

關係比你想的大。

 第一,回測結果會完全失真。  如果你用這份數據做 0050 的投資策略回測,從 2010 年到現在的報酬率計算就會是錯的,那個 2014 年的假暴跌,會讓你的 buy-and-hold 報酬看起來低得離譜,所有依賴歷史績效比較的策略都會受到影響。

 第二,技術分析會失準。  如果你用含有這個假跌幅的歷史數據來計算移動平均、相對強弱(RSI)、布林通道等技術指標,2013-2014 年前後的所有計算結果都會有問題。特別是跨越這個時間點的長期指標,數值根本不可信。

 第三,波動率模型會高估風險。  波動率預測模型(如 GARCH 類模型)在訓練時,如果看到一個 -75% 的日報酬率,會嚴重高估 0050 的歷史波動程度,導致模型輸出的風險指標失真。


我們怎麼發現這個問題的?

這個陷阱是在我們研究台灣 0050 的波動率策略時發現的。

當我們對 0050 計算描述性統計時,發現最大單日跌幅異常地高,接近 -75%,這在任何正常的股市歷史中都不可能出現。我們最初以為是數據下載錯誤,重新下載後問題依然存在。

仔細比對時間序列後,發現問題剛好出現在 2013 年底和 2014 年初的交界。再查 2025 年 MoneyDJ 的分割記錄,就拼出了完整的拼圖: Yahoo Finance 對這次 1:4 分割的歷史調整做了一半,留下了一個隱藏的價格斷層。 


正確的處理方式

如果你的分析需要用到 2014 年以前的 0050 數據,有幾個選項:

 方法一(推薦):手動修正 

# 將 2014-01-01 以前的收盤價全部除以 4
mask = df.index < '2014-01-01'
df.loc[mask, 'Adj Close'] = df.loc[mask, 'Adj Close'] / 4

這樣可以讓整段歷史回到統一的「分割後比例」格式。

 方法二:縮短研究期間  只用 2014 年 1 月以後的數據。這段數據沒有這個問題,而且對大多數中短期分析已經足夠(11 年以上的歷史)。

 方法三:查詢台灣本地數據來源  TEJ(台灣經濟新報)或 CMoney 等台灣本地數據供應商,通常有更精確的股票分割調整。如果研究非常依賴分割前的長期歷史,值得考慮改用這些來源。


一個更大的教訓:數據品質是研究的地基

這個 0050 的案例,反映了量化投資研究中一個常被低估的風險: 數據問題往往不會讓程式報錯,但會悄悄讓你的結論變成垃圾。 

-75% 的日報酬率不會讓 Python 噴出 error,也不會觸發任何自動警告。如果你直接丟進模型跑,得到的是一個看似正常的結果,只是完全建立在錯誤的基礎上。

正確的習慣是: 在任何分析之前,先做描述性統計,特別是最大值/最小值和極端事件的列表 。如果你看到 0050 的歷史最大單日跌幅接近 75%,那不是真實事件,而是一個警訊,提醒你回頭檢查數據。

「垃圾進,垃圾出(Garbage in, garbage out)」,這句老話在量化研究裡,永遠是第一道防線。


本文基於我們對 0050.TW 數據品質的實際調查(數據來源:yfinance;分割資訊:MoneyDJ;調查期間:2014–2025)。如發現其他 ETF 有類似問題,歡迎在網站留言告知。

相關文章

先讀正式關聯,若無則使用標籤與主題相似度補齊

📄
VIX 跌破 16 之後:三個波動率裂縫,比恐慌指數本身更值得留意
# VIX 跌破 16 之後:三個波動率裂縫,比恐慌指數本身更值得留意 VIX 這五個交易日一路探底:6/29 收 17.65,6/30 收 16.45,7/1 收 16.59,7/2 收 16.15,7/3 美股開盤前來到 15.84。連 16 這個心理關卡都守不住,是今年少見的低檔區。 FRED 資料顯示,7/1 當天 VIX3M 收在 19.16,比現貨 VIX 的 16.59 高出 2...
📄
波動率「測不準」能不能當減碼訊號?六檔 ETF、六十天的老實答案
打開任何一套波動率監控面板,你會發現同一天的「市場有多晃」其實不只一個數字。用 5 分鐘資料算出一個,用當天的開盤、最高、最低、收盤算出另一個,把隔夜跳空也加進去又是一個。多數時候它們差不多,偶爾會明顯對不上。這篇想回答一個很實際的問題:當這些數字彼此吵起來的時候,是不是代表隔天更難預測、應該先把部位縮小一點? ## 先講清楚「分歧」是什麼 把量測市場波動的方法想像成幾支溫度計。它們原理不同、...
📄
把五分鐘資料切得更細,預測真的會更準嗎?台指期給了一個保守答案
做波動率預測時,很容易想把資料切得更細。一天一筆收盤價太粗,那就看每五分鐘一筆;只看總波動太粗,那就再拆成上漲、下跌、跳動、估計噪音。直覺上,資料越細,模型應該越聰明。 這次台指期日盤實測給的答案比較冷靜:細資料有幫助,但幫助還不夠硬。 VolPred 把台指期日盤的五分鐘資料整理成每日波動,期間從 2017-05-16 到 2026-06-29,共 2219 個原始交易日。正式可判斷的樣本外...