每當我掃描六個主要市場(台、港、中、日、韓、美)的股票日K檔,總會發現一個詭異現象── 只有台灣和美國的資料裡,偶爾會出現「1 月 1 日」的交易紀錄。
乍看之下彷彿跨年當天仍在開盤,實則不然。這只是資料時區與紀錄慣例交錯下的「跨年假象」。
🇹🇼 為什麼台灣會出現「1 月 1 日」交易?
Yahoo Finance 對台股的原始資料是以 UTC(世界標準時間)儲存。 台灣屬於 UTC+8,所以當台股在 2024 年 12 月 31 日下午 13:30(台北時間)收盤時, 在 UTC 時間軸上已是隔日凌晨。結果,當 Yahoo 將 UTC 時間自動轉成年月日時,這筆「12/31 的交易」就被誤標為「2025-01-01」。
也就是說:
檔案裡的 2025-01-01,實際是 2024-12-31 台北收盤。 這不是市場異常開市,而是資料時間的錯位。
在我的清理流程中,我會將時間統一轉換為 Asia/Taipei, 這樣所有「1/1 的假交易」就能回歸正確的日期。
🇺🇸 美國的情況則相反
美股的交易時間以紐約時間(UTC-5)為主,Yahoo 同樣以 UTC 儲存。 當美股在 12 月 31 日下午 16:00(紐約時間)收盤時, 在 UTC 上已是隔日凌晨,因此也可能被標成「1 月 1 日」。
換句話說:
美國資料中的「1/1」,實際是前一年的 12/31 收盤。 這是「時間軸在地球兩端交錯」的完美示範。
🇯🇵🇰🇷🇭🇰🇨🇳 為什麼其他亞洲市場沒有這個問題?
日本、韓國、香港與中國的 Yahoo Finance 資料伺服器本身就在當地時區運作。 這些市場的日K在產出時,時間戳已轉成 UTC+8 或 UTC+9, 即使跨年,也不會誤標成 1 月 1 日。
更重要的是:這四個市場在 1 月 1 日確實休市:
text
市場 | 休市日期 | 備註
------|--------------|------------------------
🇯🇵 日本 | 1/1–1/3 | 正月三賀日,連休三天
🇨🇳 中國 | 1/1 | 元旦假期,若遇週末順延補假
🇭🇰 香港 | 1/1 | 若 1/1 為週末,1/2 補假
🇰🇷 韓國 | 1/1 | 只放一天假,1/2 開市
因此,你在這些市場的 CSV 裡絕對找不到 1/1 的交易紀錄。
🧩 為何只有台灣會被誤解?
台灣的情況特別尷尬。 Yahoo Finance 的台股資料雖然來自台灣交易所, 但主伺服器卻設在美東,導致原始 JSON 訊息以 UTC 儲存。
許多使用者(甚至金融數據平台)在轉換時未加上 tz_convert('Asia/Taipei'),最終誤以為跨年當天市場開市。
在我的清理流程中,只要偵測到時間戳為 16:00:00+00:00(UTC 下午四點), 我就自動加上一天,把它轉回台北時間的隔日。 這樣所有跨年假象都能被統一糾正。
🧮 修正規則(Python 版)
python
df['日期'] = pd.to_datetime(df['日期'], utc=True)
mask = df['日期'].dt.hour == 16 # 亞洲市場收盤時段
df.loc[mask, '日期'] += pd.Timedelta(days=1)
df['日期'] = df['日期'].dt.tz_localize(None)
這段程式的邏輯是:
若日期時間為 UTC 下午四點(實際上是亞洲晚上或凌晨), 就加一天,再移除時區標記,變成本地日期。
🌏 結論:全球的 1/1 都在放假,只有資料在工作
text
市場 | 1/1 是否開市 | 資料中是否出現 1/1 | 原因
------|--------------|---------------------|-------------------------------
🇹🇼 台灣 | ❌ 休市 | ✅ 假1/1 (UTC錯位) | Yahoo 伺服器儲存為 UTC
🇺🇸 美國 | ❌ 休市 | ✅ 假1/1 (UTC錯位) | 紐約收盤時間對應 UTC 隔日
🇯🇵 日本 | ❌ 休市 | ❌ 無 | 資料為本地時區
🇰🇷 韓國 | ❌ 休市 | ❌ 無 | 資料為本地時區
🇭🇰 香港 | ❌ 休市 | ❌ 無 | 資料為本地時區
🇨🇳 中國 | ❌ 休市 | ❌ 無 | 資料為本地時區
🧠 小結:資料比市場更早跨年
這其實是一堂精彩的「資料清洗哲學課」── 金融市場可能在放假,但伺服器永遠沒在睡。 若未先理解時間軸與時區的差異, 即使最乾淨的數據,也可能在 1 月 1 日這天出現幻覺。











