4. 信用风险识别:交易对手违约风险、结算风险、抵押品管理
信用风险,说白了就是「对方不认账」的风险。
我做做市商这些年,见过太多因为信用风险爆仓的案例。技术指标再漂亮,策略回测再完美,一旦交易对手违约,一切都归零。今天咱们就聊聊这块硬骨头怎么啃。
4.1 交易对手违约风险
这是最直接的信用风险。你开了一笔做市单,结果对方破产了,或者干脆不履行合约义务。嗯,我早期在币圈做市时就踩过这个坑。
核心要点:交易对手违约风险 = 敞口金额 × 违约概率 × 损失率
我个人习惯把交易对手分成三个等级:
- 顶级对手:大型交易所、清算所、银行。违约概率极低,但一旦出事就是系统性风险。
- 中等对手:中小型做市商、对冲基金。需要持续监控其资本充足率。
- 高风险对手:新成立的量化团队、个人大户。必须严格限制敞口。
我在项目中遇到过一家小型做市商,平时合作挺正常。突然有一天,他们的报价开始异常——价差收窄到不合理,成交量却暴增。我当时就觉得不对劲,立刻把敞口降到了最低。结果第二天,那家做市商就爆雷了。嗯,直觉有时候比模型还管用。
4.2 结算风险
结算风险,也叫「赫斯塔特风险」。你想想看,你这边把资产转出去了,对方那边迟迟不到账。这中间的时间差,就是风险敞口。
为什么会这样?因为不同市场的结算周期不一样:
| 市场类型 | 结算周期 | 风险等级 |
|---|---|---|
| 股票市场 | T+1 或 T+2 | 中等 |
| 外汇市场 | T+2 | 高 |
| 加密货币 | 实时或数分钟 | 低(但不可逆) |
| 衍生品市场 | 每日或每周 | 极高 |
我曾经在跨境结算上吃过亏。一笔外汇做市单,我这边美元已经划出去了,对方那边的欧元迟迟不到。整整拖了3天,期间汇率波动了2%。虽然最后到账了,但利润全被汇率吃掉了。从那以后,我强制要求所有跨境结算必须使用CLS银行(持续联系结算银行)。
避坑指南:我曾经犯过一个低级错误——在结算窗口期同时开了多笔大额订单。结果资金被锁死,无法应对突发行情。现在我的系统里有个硬性规则:结算窗口前30分钟,自动暂停所有新开仓操作。
4.3 抵押品管理
抵押品管理,说白了就是「你要我跟你做交易,先交点保证金」。但这里面的门道可不少。
我个人习惯把抵押品管理拆成三个维度:
- 抵押品质量:现金最好,国债次之,股票再次之。垃圾币?抱歉,我不收。
- 抵押品折扣率:也叫haircut。波动越大的资产,折扣率越高。
- 抵押品再平衡:市场波动时,抵押品价值会变化,需要动态调整。
下面是我常用的抵押品折扣率计算逻辑:
def calculate_haircut(asset_type, volatility, liquidity):
"""
计算抵押品折扣率
asset_type: 'cash', 'bond', 'equity', 'crypto'
volatility: 年化波动率
liquidity: 流动性评分 (0-1)
"""
base_haircut = {
'cash': 0.0,
'bond': 0.05,
'equity': 0.15,
'crypto': 0.30
}
# 波动率调整
vol_adjustment = min(volatility * 0.5, 0.20)
# 流动性调整
liq_adjustment = (1 - liquidity) * 0.10
total_haircut = base_haircut[asset_type] + vol_adjustment + liq_adjustment
return min(total_haircut, 0.50) # 最大折扣率不超过50%
嗯,这里要注意一点:抵押品管理不是静态的。市场剧烈波动时,抵押品价值可能瞬间蒸发。我经历过2020年3月的流动性危机,当时很多债券的折扣率一夜之间从5%飙到了30%。
警告:永远不要接受单一类型的抵押品。我曾经见过一个做市商,只接受比特币作为抵押品。结果比特币一天跌了40%,他的抵押品池直接爆了。分散化不是口号,是生存法则。
4.4 信用风险量化模型
光靠感觉不行,得量化。我常用的信用风险模型有三个:
- Credit VaR:在给定置信水平下,信用损失的最大可能值。
- Expected Loss:预期损失 = 违约概率 × 违约损失率 × 敞口。
- Credit Spread:信用利差模型,通过市场定价反推违约概率。
下面是我在项目中实际使用的信用风险监控仪表盘逻辑:
class CreditRiskMonitor:
def __init__(self, counterparties):
self.counterparties = counterparties
self.risk_limits = {}
def calculate_exposure(self, counterparty_id):
"""计算当前敞口"""
# 获取所有未平仓头寸
positions = self.get_open_positions(counterparty_id)
# 计算净敞口
net_exposure = sum(p.mark_to_market for p in positions)
# 考虑抵押品
collateral = self.get_collateral(counterparty_id)
return max(0, net_exposure - collateral)
def check_risk_limits(self, counterparty_id):
"""检查是否超过风险限额"""
exposure = self.calculate_exposure(counterparty_id)
limit = self.risk_limits[counterparty_id]
if exposure > limit * 0.8:
self.send_alert(f"警告:{counterparty_id} 敞口已达限额的80%")
if exposure > limit:
self.block_new_trades(counterparty_id)
self.send_alert(f"紧急:{counterparty_id} 已超限额,暂停交易")
核心原则:信用风险管理不是事后补救,而是事前预防。我每天开盘前第一件事,就是检查所有交易对手的信用敞口。这个习惯救了我好几次。
4.5 实战中的避坑指南
最后,分享几个我踩过的坑:
- 别信「大而不倒」:雷曼兄弟倒之前,谁敢信?我现在的原则是,任何单一交易对手的敞口不超过总资本的5%。
- 抵押品要实时盯:别等到收盘才检查抵押品。我系统里每5分钟自动扫描一次抵押品价值,低于阈值立刻触发追加通知。
- 结算窗口要留缓冲:别卡着最后时间点结算。我一般提前2小时完成所有结算操作,留足处理异常的时间。
- 信用风险是动态的:今天安全的对手,明天可能就出问题。我每周更新一次所有交易对手的信用评分。
信用风险这东西,平时看着不起眼,一旦出事就是致命的。做市商的核心竞争力,不只是策略有多牛,更是风控有多严。嗯,这话我反复跟团队强调过。