Independent audit · Claude 版

66 績效累積圖:15 項精進盤點

這不是新的儀表板,是對現有儀表板的獨立稽核。每一項都附上可重跑的證據,依「會不會讓數字說謊」排序。

稽核日 2026-08-25 受檢版本 d1805cd 資料截止 2026-08-24 ← 回公開績效圖
+0.0008pp
覆核後的真實雙路徑差(約 NT$17)。原文宣稱的 +0.27pp/NT$5,372 已撤回 —— 券商「現值」欄本就含費稅
3 處
P0+P1 已修復:估值路徑統一、workflow_run 自動部署、.gitattributes + renormalize
10 / 20
實際日報酬樣本數/風險統計門檻,Sharpe 仍為 N/A
2 筆
sleeve 重建函式新增迴歸測試(毒化快照零依賴 + 真實數字鎖定),全套 12 綠

P0 覆核結果:三項中兩項屬實、一項主張撤回但架構風險為真

這三項不是風格問題。覆核後:第 1 項的「灌水」主張有誤(已撤回,詳見該項),但雙路徑架構風險為真且已修復;第 2 項、第 3 項屬實,分別已修復/已補救。

01曲線存在雙估值路徑已修復 · 原文主張部分撤回

原文主張
本頁初版宣稱快照日被灌入 +0.27pp 假漲幅(毛值 101.4223 vs 淨值 101.1537)。此主張有誤,撤回。
覆核證據
券商畫面的「現值」欄位本身就是淨變現估計:逐檔驗算 14 檔全部吻合 —— 例如 1590:63 × 1,435 = 90,405 → 扌128 + 稅 27190,006,與畫面分毫不差;其餘各檔差異皆 ≤ NT$2(進位)。初版的 101.1537 是把已含費稅的現值又扣一次費稅得出來的。真實的雙路徑差異僅約 NT$17(0.0008pp),不是 NT$5,372。
仍然成立的問題
day == snapshot_asof 時曲線確實改用庫存快照估值、其餘日走 estimated_liquidation_value():兩條路徑有 ~NT$1.45 進位差、diagnostics 標籤 OWNER_SNAPSHOT_NET_LIQUIDATION 語意混淆、且整條曲線隱性依賴一份會過期的手貼快照檔。這些是架構風險,不是灌水。
已修復
2026-08-25 移除快照日特例:每日一律以官方收盤 × 淨變現估值,函式不再接受 snapshot_asof、不再讀取庫存現值,標籤統一為 OFFICIAL_CLOSE_ESTIMATED_LIQUIDATION_CARRY_FORWARD_POSITIONS。迴歸測試用「毒化快照值」證明曲線零依賴;重建後 8/24 水準 101.4222、累計 +1.42%、損益 NT$ +28,444.55,與線上頁面實質相同。

02每日自動 commit 不會觸發公開頁重新部署已修復

現象
daily-close.yml 用預設的 GITHUB_TOKEN push;GitHub 明訂由 GITHUB_TOKEN 推出的 commit 不會再觸發其他 workflow。而 pages.yml 只在 push 到 index.html 時啟動。
證據
bot commit 907a623c361d7b 都修改了 index.html,但 workflow 清單裡沒有任何一次由這兩個 commit 觸發的 Pages 部署。目前所有成功部署都來自人工 push 或 workflow_dispatch。
影響
排程跑起來後,repo 內的 index.html 每天更新,公開網址卻不動。看的人以為是最新,其實是上一次人工推的版本。
已修復
2026-08-25 pages.yml 加上 workflow_run 觸發器(監聽「Daily official close and dashboard」成功完成),並以 job 級 if 條件只在成功時部署;原有 push 觸發與手動 dispatch 保持不變。每日 bot commit 從此會自動重新部署公開頁。

038/25 的進出訊號只存在本機稽核期間已修復

現象
工作目錄有 3 個未追蹤檔(latest_strategy_signals.csvfour_strategy_daily_signals.xlsx 及其 inspect 檔)與 5 個已修改檔尚未 commit。線上最新 commit 仍是 d1805cd
影響
2637 慧洋-KY 進 @97.12646 星宇航空 出 這兩筆計畫訊號、以及理論卡補到 8/24 的更新,公開頁上都看不到。
已修復
稽核進行期間由 commit e4c65cb3cd918a 推上,公開頁已含 8/25 計畫訊號與可下載工作簿。留在這裡是因為根因還在:訊號入庫仍是本機動作,下一次一樣會停在本機。

P1 稽核性與可重現性

這些不會立刻改變數字,但會讓你在數字出錯時查不出來。

04沒有 .gitattributes,每天整檔改寫 CSV,diff 稽核失效已修復

證據
本機 core.autocrlf=true、repo 無 .gitattributes。Linux runner 寫 LF、Windows 檢出寫 CRLF,於是 bot commit c361d7bprice_history.csv 產生 4,115 行全刪全增,實際只多了一天資料。renormalize 時確實抓到 repo 內 price_history.csvbenchmark_nav.csv 存的是 CRLF。
影響
「今天到底加了哪幾筆收盤」無法用 diff 回答,這正是行情稽核最需要的能力;同時 repo 體積每天以整檔速度成長。
已修復
2026-08-25 新增 .gitattributes* text=auto eol=lf + 明確副檔名規則、*.bat text eol=crlf*.png/*.xlsx binary),並完成一次 git add --renormalize .。之後每日行情 diff 只剩真正新增的列。

05所有公開數字的來源函式,測試覆蓋為零已修復

證據
10 個測試全數通過,但沒有一個碰到 build_four_strategy_actual()。既有測試涵蓋的是快照對帳、TWR、短樣本不造假、fail-closed 狀態 —— 都在 sleeve 重建之前的世代。
影響
四策略累計 +1.42%、各 sleeve 損益、實際 vs 理論差距,全部由這個未受測的函式產生。
已修復
2026-08-25 補上兩個迴歸測試(全套 12 綠):合成案例用「毒化快照值」證明曲線對庫存現值零依賴且走淨變現估值;真實資料鎖定 8/24 水準 101.4222 與損益 NT$ +28,444.55,防止基準再次漂移。

06日期與個股硬編碼在程式裡

證據
HOLDINGS_PATH = "holdings_snapshot_2026-08-24.csv"、排除未歸屬部位的 if row["stock_code"] != "2886" 出現兩處、EXPECTED_CARD_MEMBERS_LATEST 的成員數也寫死。
影響
下一份庫存快照送進來就得改 Python。資料的事寫在程式裡,等於每天的資料更新都變成一次改版風險。
修法
快照改用「最新一份」解析;未歸屬部位改由獨立的 unassigned.csv 宣告;成員數從來源卡自己數。

P2 口徑缺口:會系統性偏移,不是隨機誤差

07股息完全未處理,除息跳空會被記成虧損

證據
8/11–8/24 期間有 5 檔出現單日 ≤ −6% 的跳空:1590(−7.8%)、1709(−6.9%)、2408(−6.6%)、3006(−9.2%)、6672(−7.0%)。目前的資料結構無法區分其中哪些是除權息、哪些是真跌。
影響
台股 7–9 月是除息旺季,持股裡有航運與電子零組件。只用收盤價算報酬,等於系統性低估。
修法
加一張 corporate_actions.csv(除息日、現金股利、除權比例),估值時用還原價,並在頁面標示哪些日子做過調整。

08「理論」用的是策略卡表頭,不是可投資的權益曲線

現象
strategy_card_returns.csv 是「等權持有成員」的顯示報酬,沒有換股成本、沒有部位權重、沒有現金拖累、沒有進出時點。拿它跟真金白銀的 sleeve 比,比的是兩種不同的東西。
已知矛盾
8/24 的 YOY 表頭 +3.7%,六檔可見成員平均 +4.33%,差 0.63pp —— 來源本身就不自洽。目前原樣保留並標示是對的,但差距沒有解釋。
修法
用 Quant_Grill_Lab 既有的 FinLab 資料,把四個策略以相同的 sleeve 規則(NT$50 萬、同樣費稅、同樣進出日)重跑成真正的 strategy_nav.csv。這才是能對照的理論值。

09NT$653 的成本口徑差沒有歸因

證據
成交簿在庫實付 NT$1,178,519,券商快照在庫成本(排除 2886)NT$1,177,866,差 NT$653。頁面已誠實揭露,但沒說是哪一筆造成的。
修法
逐檔比對成交簿累計成本與快照成本,把差額落到個股上。653 元大約就是一兩筆手續費折讓或整股/零股拆單的進位差,找出來就永久關掉這個問號。

10樣本只有 10 天,且行情歷史只有 242 天

現況
實際日報酬 10 筆,門檻 20 筆,最快要到 9 月中才會有第一個 Sharpe。price_history.csv 從 2025-08-25 起算,只有 242 個交易日,連一年的風險統計都撐不起來。
修法
短期:把「還要幾天才會出數字」直接寫在頁面上,比空著更有用。中期:行情歷史往回補三年,讓理論曲線與 benchmark 有足夠長度。

P3 真正的精進:現在沒有、但值得建的東西

前面十項是把現有數字修正確。這五項是讓這個儀表板開始回答它目前答不了的問題。

11訊號→成交的履約落差帳(最高價值)

為什麼
你現在有「理論卡說什麼」和「帳戶最後值多少」,中間那一段 —— 訊號價到實際成交價之間的滑價 —— 是空的。而那一段正是「策略能不能實現」的全部答案。
料已就位
latest_strategy_signals.csventry_priceactual_fills.csvfill_price。缺的只是把兩者接起來的一張表。
怎麼記
每筆訊號一列:訊號日、訊號價、次日開盤、實際成交價、成交延遲天數、滑價(bp)、未成交原因。今天的 2637 慧洋-KY 明開進 @97.1 就是第一筆樣本,明天就能結案。
產出
累積 30 筆之後,你會第一次知道「策略卡報酬要打幾折」,而且是用自己的成交證明的。

12容量欄位:零股單量 vs 成交量

為什麼
sleeve 各 NT$50 萬,實際成交出現 63 股、261 股、305 股、347 股這類零股。零股流動性遠低於整股,這是規模一放大就先撞到的牆,目前頁面完全看不到。
修法
每檔加三欄:20 日均量、本次股數佔均量比、以及在不超過 X% 參與率下這個 sleeve 能放大到多少錢。把「這套做法能容納多少資金」變成畫面上的常數。

13四策略表缺 benchmark 欄

現況
benchmark_nav.csv 已有 0050 與加權指數逐日資料到 8/24,但策略比較表只有「實際/理論/差距」,沒有同期 benchmark。
修法
加一欄同期 0050 報酬與一欄超額。10 天的超額報酬雖然不能做統計推論,但可以誠實呈現,且成本幾乎是零。

14毛/淨雙軌,已實現/未實現分離

為什麼
現在一個數字混了三件事:價格變動、尚未發生的賣出費稅、以及 3702 的已實現虧損。看到 融資 −0.24% 時,無法判斷是策略不好還是成本估法保守。
量級
四個 sleeve 若全數平倉,未發生的賣出費稅合計約 NT$5,372(投信 1,850/YOY 1,878/融資 254/突破 1,390)。
修法
四欄並列:毛報酬、淨可變現報酬、已實現損益、未實現損益。

15把資料契約與展示層拆開

現況
build_dashboard.py 1,422 行,同時負責讀檔驗證、財務計算與 HTML 字串拼接。第 1 項那個基準切換之所以難發現,就是因為它藏在一段組畫面的迴圈裡。
修法
中間插一層 dashboard_state.json:計算只負責產生它,HTML 只負責讀它。附帶好處是狀態檔可以直接被測試與被 diff,等於每天的數字都有機器可讀的稽核軌跡。

修復順序

2026-08-25 覆核更新:#01–#05 已完成(含原文 #01 主張的更正),其餘依原評估排序。

順序項目代價拿到什麼
#03 推上 8/25 訊號已完成公開頁與本機一致
1#02 讓每日 commit 觸發部署已完成workflow_run 成功後自動部署,自動化真的自動
2#01 統一估值基準已完成單一淨變現路徑;「+0.27pp 灌水」主張經覆核撤回(真實差 ~NT$17)
3#04 .gitattributes已完成LF 規範 + renormalize,每日行情 diff 可稽核
4#05 sleeve 重建測試已完成毒化快照零依賴迴歸 + 真實數字鎖定(12 測試全綠)
5#11 履約落差帳一天理論要打幾折,有自己的證據
6#07 除權息還原一天報酬不再系統性低估
7#08 真正的理論曲線數天實際 vs 理論變成可比的對照

已經做對、不要動的部分