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

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

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

讀者互動

登入會員可按讚與收藏。

分享到: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 有類似問題,歡迎在網站留言告知。

相關文章

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

📄
同一條買賣價差公式,美股跟著行情走,台股 0050 幾乎不動
每次下單,買價和賣價中間都隔著一道縫。成交的那一刻,這道縫就變成你付出去的成本,帳單上看不到它,它已經在成交價裡了。 歷史上每一天的縫有多寬,散戶查不到。2012 年 Corwin 與 Schultz 在《Journal of Finance》提出一個省事的替代做法:只用每天的最高價與最低價,就能把當天的買賣價差估出來。直覺是,一天之內的高低區間同時包含了真實的價格波動與買賣雙方的報價縫隙,把兩天…
→
📄
低波動 ETF 和高貝塔 ETF 最近變得同進同退了嗎?預先註冊的檢定沒有找到證據
市場上有一種說法:防守型的低波動股票和進攻型的高貝塔股票,原本一個漲、一個跌,最近卻開始「同步走強」,兩者的關係進入了新階段。 我們把這個說法做成事先註冊的檢定,用 SPLV(低波動 ETF)和 SPHB(高貝塔 ETF)的日報酬,看扣掉大盤之後,兩者的相關有沒有出現結構性的移動。兩項檢定都沒有找到證據。 先講結論 沒有找到證據顯示相關出現新階段。 主配對 185 個月(2011 年 5 月至 2…
→
📄
今晚八點半非農公布:台指期夜盤公布後那三十分鐘,過去九年多比平常的晚上動得兇多少?
今晚台灣時間八點半(美東早上八點半,夏令時間),美國公布非農就業數據。台指期的夜盤在這一刻前後,波動會比平常大多少、又能撐多久? 我們把過去的非農夜一個一個翻出來,量了公布後三個三十分鐘的窗。先講清楚:這是回看過去的描述,不是預測今晚的方向或大小,今晚這一次也沒有放進任何數字。 先講結論 公布後的第一個三十分鐘,台指期夜盤的波動明顯放大。 把公布前三十分鐘當分母,事件夜公布後的升幅,是對照夜同一時…
→