核心對帳邏輯:一場 Transaction Flow 與 Position Snapshot 的實戰
Day 23 教育訓練課程
G1234 代表的是「動態的交易行為」。它記錄了系統中每一筆資金或資產的進出軌跡。
.csv 交易明細檔或 .txt 傳票紀錄。類比: 就像你銀行存摺裡,每一筆提款和存款的紀錄。
ABC123 代表的是「靜態的結果切片」。它反映了在特定時間點(通常是日終 EOD),資產的最終狀態。
.pdf 餘額表或庫存文字檔。類比: 就像你銀行存摺翻到最後一頁,本子下方印著的「目前總餘額」。
在複雜的金融系統環境中,前台交易(明細)與後台結算(庫存)往往由不同模組甚至不同主機處理。資料不一致是必然面臨的風險。
Cross-Join 校驗的本質,在於驗證「動態」推導出的結果,是否等於「靜態」的現況。
如果等式不成立,代表發生 Out of Balance (帳務不平),需要觸發異常警報。
在進行運算前,必須先透過自動化工具讀取各式異質報表,將文字檔轉換為結構化數據。
G1234 是明細,同一個帳戶一天內可能有多次申購與贖回。必須先執行 GROUP BY 運算。
SELECT
帳號, ISIN_Code,
SUM(CASE WHEN 交易碼 = '申購' THEN 單位數 ELSE 0 END) AS 總買入,
SUM(CASE WHEN 交易碼 = '贖回' THEN -單位數 ELSE 0 END) AS 總賣出
FROM G1234_明細流
WHERE 交易日 = '今日'
GROUP BY 帳號, ISIN_Code;
產出結果:該帳戶本日的「淨異動量 (Net Change)」。
將「聚合後的 G1234」與「昨日/今日 ABC123」進行 Left Join / Full Outer Join。
| Hash Key (帳號_資產) | (A) 昨餘額 | (B) 淨異動 | (C) 今餘額 | Diff (A+B-C) | 狀態 |
|---|---|---|---|---|---|
| 8801_US_APPL | 1,000 | +500 | 1,500 | 0 | MATCH |
| 8801_TW_2330 | 5,000 | -2,000 | 3,000 | 0 | MATCH |
| 8802_US_TSLA | 200 | 0 | 250 | -50 | ERROR |
當 Diff ≠ 0 時,程式不應只是報錯,而應具備基本的錯誤特徵辨識能力。
許多海外基金或債券,其申贖交易日 (T) 與實際撥轉入庫日 (T+N) 存在時間差。這會破壞 昨餘 + 異動 = 今餘 的等式。
針對 G1234 的明細,依照「交割日 (Value Date)」進行打標。
交割日大於今日的交易,放入 「在途庫存 (Transit Position)」 運算池,不立刻計入本日 ABC123 校驗。
修正後公式:今餘額 = 昨餘額 + T日到期之在途明細
實務上操作手冊常提到:必須考慮「手續費拆分」與「改帳」等異常流程。
運用 VBA、Python 或 RPA 工具,將繁瑣的對帳流程自動化。
連續三天,某特定系列資產的 ABC123 庫存總量未增加,但 G1234 顯示每日有大量申購。
Cross-Join 後發現 Diff 呈現線性擴大。
上游主機在寫入該系列資產時,遺漏了特定的 ISIN Code 前綴,導致批次更新庫存時找不到對應帳號,直接跳過 (Skip) 且未亮紅燈。
建構健全的對帳演算法,應具備以下精神:
沒有完美的交易系統,只有嚴謹的對帳演算法。
掌握 G1234 與 ABC123 的邏輯,就是掌握資產安全的最後防線。
開放現場提問