4. 决策链路建模:节点定义、链路拓扑、状态传递与风险聚合
在流式决策链路中,VaR 归因的精度取决于底层链路模型的结构化程度。本章将链路拆解为四个核心建模要素:节点定义、链路拓扑、状态传递与风险聚合。只有将这四层逐一建模,才能将宏观的 VaR 数字归因到具体的决策环节。
4.1 节点定义:决策链路的原子单元
每个节点代表一个可观测、可归因的决策或计算步骤。节点定义需包含三类属性:
| 属性类别 | 字段示例 | 说明 |
|---|---|---|
| 标识属性 | node_id, node_type, timestamp | 全局唯一 ID,区分输入/处理/输出节点 |
| 状态属性 | position, cash, volatility | 节点执行时的快照数据,用于后续传递 |
| 风险属性 | delta, gamma, VaR_contrib | 该节点对整体 VaR 的边际贡献 |
实践要点:节点粒度不宜过细(如每笔逐笔成交)或过粗(如整个交易日汇总)。推荐以“一次策略信号触发 + 一次执行反馈”作为最小原子单元。
4.2 链路拓扑:从线性链到有向无环图
决策链路并非简单的线性链条,而是包含分支、合并与反馈的有向无环图(DAG)。拓扑结构决定了风险传播的路径与速度。
三种基础拓扑模式:
- 串行链(Pipeline):信号 → 风控校验 → 执行 → 结算,风险逐级累积。
- 并行分支(Fan-out):同一信号同时触发多个子策略,风险分散但需聚合。
- 条件合并(Merge):多个前置节点结果经逻辑判断后汇入单一后置节点,风险路径存在条件依赖。
4.3 状态传递:风险因子的流动与变换
状态传递定义了风险因子如何在节点间流动。每个节点接收上游状态,经过本地变换后输出新状态。传递过程需满足守恒性与可追溯性。
常见陷阱:状态传递中容易丢失“路径依赖”信息。例如,同一笔资金经过不同顺序的风控节点,其风险暴露可能不同。必须在状态结构中保留完整的路径指纹(path fingerprint)。
状态传递的数学表达:
# 状态传递函数示例(Python 伪代码)
def state_transition(upstream_state, node_params):
"""
upstream_state: dict, 包含 position, pnl, var_contrib 等
node_params: dict, 包含该节点的权重、阈值、变换矩阵
return: dict, 更新后的下游状态
"""
new_position = upstream_state['position'] * node_params['weight']
new_var_contrib = upstream_state['var_contrib'] + node_params['local_var']
return {
'position': new_position,
'pnl': upstream_state['pnl'] + node_params['expected_pnl'],
'var_contrib': new_var_contrib,
'path_fingerprint': upstream_state['path_fingerprint'] + [node_params['node_id']]
}
4.4 风险聚合:从节点贡献到整体 VaR
风险聚合是将所有节点的 VaR 贡献合并为整体 VaR 的过程。聚合方式取决于节点间的相关性假设。
| 聚合方法 | 适用场景 | 计算公式 |
|---|---|---|
| 线性加总 | 节点间完全独立(ρ=0) | VaR_total = Σ VaR_i |
| 平方根法则 | 节点间完全相关(ρ=1) | VaR_total = √(Σ VaR_i²) |
| 协方差矩阵法 | 节点间存在部分相关性 | VaR_total = √(wᵀ Σ w) |
归因关键:在流式场景中,风险聚合不是一次性计算,而是随着每个新节点加入而增量更新。使用增量协方差更新算法(如 Welford 在线算法)可以避免全量重算,将单步聚合复杂度从 O(n²) 降至 O(n)。
4.5 建模验证:链路完整性与一致性检查
完成建模后,必须通过以下检查确保链路模型可用:
- 节点可达性:每个节点至少有一条路径从输入可达,且至少有一条路径通向输出。
- 状态守恒:所有节点的 VaR 贡献之和等于整体 VaR(在无相关性假设下)。
- 无环检查:使用拓扑排序验证 DAG 中不存在循环依赖。
- 增量一致性:逐个添加节点后的聚合结果与全量重算结果一致(误差 < 1e-8)。
工程建议:在链路建模阶段就引入单元测试,为每个节点编写独立的输入/输出测试用例。这不仅能验证建模正确性,还能在后续迭代中快速定位回归问题。