── 一次真實的資料偵錯實戰紀錄
一、故事的起點:一筆「詭異的 +113%」
某天,我在檢查台股週K報酬分布時,發現一筆極度誇張的紀錄: 8476.TW(台境)在 2023 年第一週的週K漲幅竟高達 +113%。
我原以為是興櫃或除牌後復牌的特殊行情,但越看越不對勁。 台境並不是那種會一週翻倍的股票。 於是我開始懷疑:是不是 Yahoo Finance 的資料錯位了?二、一步步追查:日K、週K、月K、年K 全面交叉比對
我把四個檔案都交給 AI:
- 8476.TW_台境_.csv(日K)
- 8476.TW_台境__week.csv(週K)
- 8476.TW_台境__month.csv(月K)
- 8476.TW_台境__year.csv(年K)
接著我用提問方式,請 AI 幫我對照週期內的開盤、收盤、報酬,看看那週到底發生了什麼。
AI 先指出:「這週K報酬是因為前一週收盤價在 25 元,下一週開盤價變成 51 元,導致漲幅超過 100%。」 我一開始以為是跳空漲停,但 AI 接著提醒我:
「如果是除權除息或面額變動造成的錯位,股價會『隔天又回到原價』。」
這句話讓我瞬間醒悟。
三、驗證假說:掃描日K,果然「隔天恢復原價」
我請 AI 檢查台境 2022 年底至 2023 年初的日K, 結果真的發現價位在 25↔50 間反覆震盪:
text
日期 收盤 前日變動(%) 次日變動(%)
2022-12-26 25.31 −50% +100%
2022-12-29 25.45 −50% +100%
AI 結論:這不是暴漲,而是除權錯位。 Yahoo Finance 把舊面額與新面額價混在一起,造成鏡像跳動。
四、更驚人的發現:全檔案共有 130 筆類似錯位
AI 幫我掃描整份日K檔案,結果找到整整 130 組「隔天恢復原價」的錯誤模式:
text
日期(異常日) 前日收盤 當日收盤 次日收盤 前日變動(%) 次日變動(%)
2021-04-12 18.73 9.32 18.55 −50.25 +99.01
2024-06-24 60.29 30.15 61.76 −50.00 +104.88
這些價差絕不可能是真實交易結果,而是資料錯位導致的「虛假暴漲」。
五、AI 的優勢:比人工快、比肉眼準
若用人工檢查,即使有 Excel 或簡單程式,也很難在幾萬筆資料中找到這種對稱跳動。 AI 只花幾秒就完成:
text
方法 每市場耗時 可檢測樣本數 是否可產出清單 精準度
人工 + Excel 約 1 小時 1 檔 ❌ 低
傳統程式 ±50% 篩選 約 10 分鐘 幾百檔 △ 中
AI 自動 pattern 偵測 約 30 秒 數千檔 ✅ 自動清單 ✅ 高
這段比較不只是效率差異,更是「資料品質管理」的分水嶺。
六、我請 AI 幫我寫了一個「鏡像跳動偵測器」
為了避免這種錯誤再次發生,我讓 AI 幫我寫了一個自動化函數, 專門在日K層偵測「隔天恢復原價」的 pattern:
python
# ------------- 偵測:隔天恢復原價(ping-pong pattern) -------------
def detect_pingpong_patterns(day_df: pd.DataFrame, price_col='收盤', threshold=0.4) -> pd.DataFrame:
"""
偵測「隔天恢復原價」異常(如 50→25→50):
前一日變動與次日變動皆大於門檻,且方向相反。
回傳包含日期與前/當/次日收盤、變動百分比的 DataFrame(可能為空)
"""
df = day_df.sort_values('日期').reset_index(drop=True).copy()
if price_col not in df.columns:
return pd.DataFrame(columns=['日期(異常日)','前日收盤','當日收盤','次日收盤','前日變動(%)','次日變動(%)'])
df['pct_change'] = df[price_col].pct_change()
rows = []
for i in range(1, len(df)-1):
prev_change = df.loc[i, 'pct_change']
next_change = df.loc[i+1, 'pct_change']
if pd.notna(prev_change) and pd.notna(next_change):
if abs(prev_change) > threshold and abs(next_change) > threshold and prev_change * next_change < 0:
rows.append({
'日期(異常日)': df.loc[i, '日期'],
'前日收盤': df.loc[i-1, price_col],
'當日收盤': df.loc[i, price_col],
'次日收盤': df.loc[i+1, price_col],
'前日變動(%)': round(prev_change * 100, 2),
'次日變動(%)': round(next_change * 100, 2),
})
return pd.DataFrame(rows)
七、為什麼這段程式碼要放在「日K → 週/月/年K」之前?
因為這是錯價進入系統的「唯一入口」。 只要日K層不先攔截,錯誤的報酬會一路傳導到週/月/年K檔,讓統計結果全面失真。
AI 幫我整合成一個流程:
- 每檔股票在轉換前先執行 detect_pingpong_patterns()
- 若發現錯位,整檔略過、不寫入週/月/年K
- 同時輸出 QA 清單(如 _qa/skip_pingpong.csv),方便人工覆核
這樣系統就能在日K階段就自動清除假報酬來源。
八、結論:AI 讓資料清洗變成日常,而非奇蹟
這次的「台境事件」是一個非常真實的例子—— 若不是我一開始懷疑、一步步詢問、讓 AI 幫我比對與驗證, 這筆錯價會一路混進所有週K統計,讓整體報酬分布偏斜。
沒有 AI,這樣的錯誤幾乎不可能在第一時間被找出; 有了 AI,它不僅能幫我找到錯誤,還能生成清單、加進主程式、在轉檔時自動排除。
如今,台境的錯價成了我書中「資料品質章節」最生動的例子—— 它讓我可以大聲說出那句話:
「AI 不是讓我們更聰明,而是讓我們更乾淨地看見真實的市場。」
── 一次真實的資料偵錯實戰紀錄
在這次轉檔過程中,AI 自動偵測出 32 檔股票命中「隔天恢復原價」的鏡像跳動錯位,其中台境(8476.TW)高達 79 筆,是最極端的案例。這份 QA 清單不僅是資料清洗的成果,也成為後續策略分析的基礎。
🧩 Shard 1/2:2000 檔
⏭️ 1432.TW_大魯閣.csv: [SKIP_PINGPONG] 命中疑似除權錯位 2 筆
⏭️ 1475.TW_業旺.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 1529.TW_樂事綠能.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 2028.TW_威致.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 2348.TW_海悅.csv: [SKIP_PINGPONG] 命中疑似除權錯位 3 筆
⏭️ 2496.TW_卓越.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 2537.TW_聯上發.csv: [SKIP_PINGPONG] 命中疑似除權錯位 2 筆
⏭️ 2539.TW_櫻花建.csv: [SKIP_PINGPONG] 命中疑似除權錯位 2 筆
⏭️ 2724.TWO_藝舍-KY.csv: [SKIP_PINGPONG] 命中疑似除權錯位 2 筆
⏭️ 2754.TWO_亞洲藏壽司.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3004.TW_豐達科.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3046.TW_建碁.csv: [SKIP_PINGPONG] 命中疑似除權錯位 4 筆
⏭️ 3086.TWO_華義.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3092.TW_鴻碩.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3095.TWO_及成.csv: [SKIP_PINGPONG] 命中疑似除權錯位 2 筆
⏭️ 3219.TWO_倚強科.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3530.TW_晶相光.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3537.TWO_堡達.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 3585.TWO_聯致.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 4192.TWO_杏國.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 4419.TWO_皇家美食.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 5364.TWO_力麗店.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 5432.TWO_新門.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 6130.TWO_上亞科技.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 6219.TWO_富旺.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 6236.TWO_中湛.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 6272.TWO_驊陞.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 6294.TWO_智基.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 6588.TWO_東典光電.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
🧩 Shard 2/2:483 檔
⏭️ 8066.TWO_來思達.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⏭️ 8476.TW_台境_.csv: [SKIP_PINGPONG] 命中疑似除權錯位 79 筆
⏭️ 9902.TW_台火.csv: [SKIP_PINGPONG] 命中疑似除權錯位 1 筆
⚠️ 日K_轉週月年K_差異報告.csv: 缺必要欄位(日期/開/高/低/收):日K_轉週月年K_差異報告.csv
⚠️ 重複ID_來源檔名清單.csv: 缺必要欄位(日期/開/高/低/收):重複ID_來源檔名清單.csv
🧹 已輸出略過名單:/content/drive/MyDrive/各國股票檔案/tw-share/_qa/skip_pingpong.csv(32 檔)
📤 已將本機暫存 Parquet 搬到 Google Drive
📊 六國 Ping-Pong 異常掃描總覽(threshold = 0.4)
延續上面所述,我們將六個市場的掃描結果進行橫向比較,從掃描規模、異常數量到異常率,幫助大家更直觀理解各市場的資料特性。
markdown
| 市場 | 掃描檔案數 (Files) | 掃描列數 (Rows) | 異常事件數 (PingPong) | 異常股票數 (Stocks) | 異常率 (事件/列數) |
|-------------|---------------------|------------------|------------------------|----------------------|---------------------|
| us-share 🇺🇸 | 8,124 | 13,045,340 | 12,038 | 1,158 | ≈0.0923% |
| jp-share 🇯🇵 | 4,178 | 4,367,174 | 433 | 45 | ≈0.0099% |
| tw-share 🇹🇼 | 2,483 | 6,471,417 | 169 | 32 | ≈0.0026% |
| kr-share 🇰🇷 | 2,713 | 4,194,140 | 100 | 62 | ≈0.0024% |
| hk-share 🇭🇰 | 1,895 | 2,131,592 | 40 | 38 | ≈0.0019% |
| cn-share 🇨🇳 | 5,160 | 13,288,813 | 3 | 3 | ≈0.00002% |
🧠 分析與觀察
1️⃣ 美股:異常密度極高,清洗成本最大
- 異常事件數高達 12,038 筆,占總列數的 0.0923%
- 異常股票數達 1,158 檔,占掃描檔案的 14.25%
👉 美股的異常不只是量多,而且分布廣,幾乎每 7 檔就有 1 檔出現 ±40% 的極端跳動。這種情況通常與拆股、股利調整、資料合併或回溯錯誤有關,清洗難度極高。
2️⃣ 日股、台股、韓股:異常率低但精準
- 日股異常率 ≈0.0099%,台股 ≈0.0026%,韓股 ≈0.0024%
- 雖然異常事件不多,但每筆都可能是高確信度錯誤
👉 這三個市場的異常事件較少,卻非常適合做 QA 教學或錯誤樣式整理。尤其台股的 169 筆事件中,有 79 筆集中在單一股票《8476.TW 台境》,形成極端個案。
⚠️ 台股特例:8476.TW《台境》異常爆量
雖然台股整體異常率不高,但有一檔股票非常誇張——8476.TW《台境》,單獨就出現了 79 次 Ping-Pong 異常,而且每次都是 ±100% 的跳動。
這種集中式錯誤幾乎可以確定是資料錯誤(例如價格欄位錯置、回溯調整失敗或供應商格式混亂),會直接污染該股票的周、月、年漲幅統計,必須手動剔除。
👉 雖然整體異常機率低,對大盤或整體分布圖影響不大,但像《台境》這種極端個案,還是會造成局部分析失真。
3️⃣ 港股:異常率略低但分布平均
- 異常率 ≈0.0019%,異常股票數 38 檔
- 平均每檔股票約出現 1 次異常,分布相對均勻
👉 港股的異常事件雖然不多,但不像台股那樣集中在單一股票,反而呈現「低量、廣分布」的特性,適合做系統性掃描。
4️⃣ 陸股:異常率極低,幾乎無需清洗
- 掃描列數高達 1,328 萬,卻僅出現 3 筆異常
- 異常率僅 ≈0.00002%,幾乎可忽略
👉 陸股的 ±10% 漲跌幅限制,加上資料格式標準化與供應商 QC 機制,使得 Ping-Pong 異常極少。這種結果非常適合當作對照組,用來凸顯其他市場的資料風險。
📌 整體觀察:異常率 ≠ 清洗難度
markdown
| 市場 | 異常率高低 | 清洗挑戰 | 備註 |
|-------------|------------|-----------|--------------------------|
| 美股 🇺🇸 | 高 | 極高 | 拆股、回溯錯誤多 |
| 日股 🇯🇵 | 中 | 中 | 除權息處理差異 |
| 台股 🇹🇼 | 低 | 局部高 | 台境集中爆量 |
| 韓股 🇰🇷 | 低 | 穩定 | 分布均勻 |
| 港股 🇭🇰 | 低 | 穩定 | 廣分布型異常 |
| 陸股 🇨🇳 | 極低 | 幾乎無需清洗 | 可當對照組 |












