LabHub
学习 学习路径 课程

资本市场与清结算

T+2 对账与卡授权、请款的核查

在 LabHub 中继续学习

目标

读取休市日表,按营业日重新计算 T+2 结算日并找出日期错误的成交;从四个方向核对成交账簿和结算账簿;按原因拆分未结算项并计算金额;完整解释银行卡授权与清算之间的差异,并找出重复扣款。

为什么重要

证券的 T+2 与银行卡的授权、清算属于不同领域,但结构相同:一件事情被分成两个事件,中间存在持续状态;如果不监控该状态,就会造成资金损失。本练习将分别完整走一遍这两种结构。

本练习强制执行的四点都是实际现场规则。将休市日作为数据维护——如果硬编码,每次指定临时节假日都需要部署;一旦部署延迟,当周就会发生事故。对账要逐笔、双向进行——只比较总额时,两个方向的差异会互相抵消。按原因拆分未结算项——合并统计后无法确定负责部门,最终无人处理。通过幂等键查找重复扣款——使用授权编号永远找不到。

本次事件如下。结算团队反馈 9 月第二周的未结算余额是平时的三倍,同一周还集中出现了某家商户的重复扣款投诉。基准日期为 2026-09-16。

营业日计算规则如下。从成交日的次日开始逐日向前,只有既不是星期六或星期日,也不在 holidays 表中的日期才计为营业日,第二个营业日即为结算日。休市日必须从 holidays 表读取——如果硬编码,就完全错过了本练习的重点。

步骤

  1. 创建 /root/cap/settle,原样运行答案中的生成器,生成 /root/cap/settle/settle.db/root/cap/settle/auth.jsonl/root/cap/settle/capture.jsonl
  2. 读取 holidays 表,按营业日重新计算 T+2。在 /root/cap/settle/calendar.txt 中写入 trades=holidays=bad_settle_date=settle_on_nonbusiness=;在 /root/cap/settle/baddate.csv 中写入 trade_id,trade_date,recorded_settle_date,correct_settle_date
  3. 核对 tradessettlements。在 /root/cap/settle/recon.txt 中写八行:trades=settlements=amount_matched=amount_mismatch=amount_mismatch_total=missing_settlement=orphan_settlement=orphan_amount=;在 /root/cap/settle/amountdiff.csv 中写入 trade_id,trade_amount,settled_amount,diff
  4. 找出结算日在 2026-09-16 之前但尚未完成结算的成交,在 /root/cap/settle/fails.csv 中按 trade_id,settle_date,amount,settlement_status 写入,并在 /root/cap/settle/fails.txt 中写入 fail_count=fail_amount=no_record=pending=failed=。如果完全没有结算记录,状态写为 none
  5. /root/cap/settle/auth.txt 中写八行:auths=captures=approved=voided=declined=full_capture=partial_capture=no_capture=
  6. /root/cap/settle/orphan.csv 中按 auth_id,merchant,amount,ts 写入没有清算记录的 approved 授权,并在 /root/cap/settle/orphan.txt 中写入 no_capture_count=no_capture_amount=partial_count=partial_remaining_amount=
  7. idempotency_key 分组,找出包含至少两笔授权的键,在 /root/cap/settle/dupcharge.csv 中按 idempotency_key,auth_ids,charged_amount 写入,并在 /root/cap/settle/dupcharge.txt 中写入 dup_keys=double_charged_amount=auth_ids 使用竖线(|)连接。
  8. /root/cap/settle/report.md 中编写报告。需要 ## 무슨 일이 있었나## 결제일 계산## 대사 결과## 미결제## 카드 승인과 매입## 무엇을 고쳐야 하나 六个章节。

参考

创建成交、结算账簿和银行卡日志

创建 /root/cap/settle,原样运行答案中的生成器,生成 /root/cap/settle/settle.db/root/cap/settle/auth.jsonl/root/cap/settle/capture.jsonl

原样运行生成器后,会创建一个 sqlite 数据库和两个 JSONL 文件。更改随机种子会导致结果与评分值不符。

按营业日 T+2 验证结算日

读取 holidays 表,按营业日重新计算 T+2。在 /root/cap/settle/calendar.txt 中写入 trades=holidays=bad_settle_date=settle_on_nonbusiness=;在 /root/cap/settle/baddate.csv 中写入 trade_id,trade_date,recorded_settle_date,correct_settle_date

不要在代码中硬编码休市日,应从 holidays 表读取。跳过周末和休市日,计数两个营业日即可。

双向核对成交账簿和结算账簿

核对 tradessettlements。在 /root/cap/settle/recon.txt 中写八行:trades=settlements=amount_matched=amount_mismatch=amount_mismatch_total=missing_settlement=orphan_settlement=orphan_amount=;在 /root/cap/settle/amountdiff.csv 中写入 trade_id,trade_amount,settled_amount,diff

分别统计四个方向。只比较笔数总计时,两个方向的差异会互相抵消。

按原因拆分未结算项

找出结算日在 2026-09-16 之前但尚未完成结算的成交,在 /root/cap/settle/fails.csv 中按 trade_id,settle_date,amount,settlement_status 写入,并在 /root/cap/settle/fails.txt 中写入 fail_count=fail_amount=no_record=pending=failed=。如果完全没有结算记录,状态写为 none

基准日期为 2026-09-16。只处理结算日在该日期之前的成交;完全没有结算记录的交易也属于未结算。

按原因解释授权与清算的差异

/root/cap/settle/auth.txt 中写八行:auths=captures=approved=voided=declined=full_capture=partial_capture=no_capture=

计算每笔授权对应的清算金额合计,并分为三类——合计为 0 表示没有清算;低于授权金额表示部分清算;等于或高于授权金额表示全额清算。

计算无清算授权与部分清算余额

/root/cap/settle/orphan.csv 中按 auth_id,merchant,amount,ts 写入没有清算记录的 approved 授权,并在 /root/cap/settle/orphan.txt 中写入 no_capture_count=no_capture_amount=partial_count=partial_remaining_amount=

已撤销或被拒绝的授权不应包含在这里。仅处理 status 为 approved 但没有清算记录的授权。

通过幂等键查找重复扣款

idempotency_key 分组,找出包含至少两笔授权的键,在 /root/cap/settle/dupcharge.csv 中按 idempotency_key,auth_ids,charged_amount 写入,并在 /root/cap/settle/dupcharge.txt 中写入 dup_keys=double_charged_amount=auth_ids 使用竖线(|)连接。

按 auth_id 分组不会得到任何结果。按 idempotency_key 分组,查找包含至少两笔授权的键。重复扣款金额是第二笔及之后授权对应的清算金额。

编写结算对账报告

/root/cap/settle/report.md 中编写报告。需要 ## 무슨 일이 있었나## 결제일 계산## 대사 결과## 미결제## 카드 승인과 매입## 무엇을 고쳐야 하나 六个章节。

需要六个章节。对账章节必须包含两个方向的数字;措施章节必须提及营业日计算和幂等键。