回应"AI 帮你 24 小时盯盘,普通人也能用上机构级风控武器"这个刚需场景。
🧭 先说清楚:逐层比对之后的判断
机构级风控拆开是四层:实时监控 → 异常检测 → 硬编码熔断线 → 压力测试。逐层核实 RiskGuard 现状:
- 硬编码熔断线——RiskGuard 自 v1.0 起就在做的事,且是唯一的立库使命(五轮对抗审查验证过)。
- 实时监控——核心机制(
RiskMonitor)已有,这版补上它的交付形态:每日体检。 - 压力测试——原语已在(
backtest模块),这版补上一键推演当前持仓的顺手入口。 - 异常检测——明确排除。统计/AI 判定"这次不一样"是数据科学能力,和本库"确定性、fail-closed、绝不模糊判断"的设计哲学是两种不同的产品。这一层交给外部 AI agent:agent 负责观察、判断、叙述,RiskGuard 只保证它拿到的事实是真的、以及在规则被触发时毫不犹豫地执行——这条线不能由 AI 决定。
🌙 新增:riskguard.reporting
from riskguard.reporting import build_digest, render_digest_text, run_stress_test, render_stress_text
# 每日体检:结构化摘要,交给 AI agent 去叙述、去推送提醒
report = build_digest(engine, portfolio)
report.to_dict()
# 压力测试:"如果集体跌 20%,我扛得住吗"——绝对只读,零副作用
result = run_stress_test(engine, portfolio, shock_pct=-0.20)CLI 同步支持多持仓输入:
$ riskguard digest --equity 95000 --position AAPL:80:190 --position TSLA:-40:250 --state-db risk.db
$ riskguard stress --equity 95000 --shock -0.20 --position AAPL:80:190 --position TSLA:-40:250压力测试的只读承诺很硬:不触发熔断、不写审计、不碰持久化——即便 --state-db 指向一个还不存在的文件,也不会在磁盘上留下任何新文件。
🛡️ 发布前对抗审查(1 critical + 1 high + 2 low)
新模块经一轮聚焦审查,逮到一个 critical:账户被冲击打穿仓(权益 ≤ 0,恰恰是压力测试最该报警的场景)时,position_breaches 会因为 Portfolio.weight() 的除零防御性默认值而漏报所有超限仓位——同一份结果里总敞口比例却正确显示 inf,两个字段自相矛盾,CLI 的退出码可能因此静默显示"一切正常"。已用新增的 weight_or_inf() 统一修复(不改动已被多轮验证过的 Portfolio.weight() 核心方法)。详见 CHANGELOG。
774 项测试全绿。
⚡ 升级
pip install -U "riskguard @ git+https://github.com/SilentFleetKK/riskguard.git"