用 Yahoo Finance 看 0050 歷史走勢?小心這個隱藏的數據陷阱
讀者互動
已追蹤瀏覽 0 次,登入會員可按讚與收藏。
[提出: 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 參數也無法修復這個問題。

左圖:從 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 有類似問題,歡迎在網站留言告知。
相關文章
先讀正式關聯,若無則使用標籤與主題相似度補齊