2. 需求分析:因子评分接口的功能需求、非功能需求、接口契约定义
因子评分接口是量化策略从研究走向实盘的关键桥梁。需求分析阶段需要明确接口做什么(功能需求)、做到什么程度(非功能需求),以及如何约定交互(接口契约)。本章从这三个维度展开,为后续的架构设计与编码实现奠定基础。
2.1 功能需求
功能需求描述接口必须提供的业务能力。因子评分接口的核心职责是:接收一组因子数据,输出每个标的的综合评分及排序。具体功能点如下:
| 功能编号 | 功能名称 | 详细描述 | 优先级 |
|---|---|---|---|
| F-01 | 单标的评分 | 输入单个标的的因子向量,返回该标的的综合评分及分项得分 | P0 |
| F-02 | 批量评分 | 输入多个标的的因子矩阵,返回所有标的的评分列表,支持按评分降序排列 | P0 |
| F-03 | 因子权重配置 | 支持通过参数动态调整各因子的权重,无需重新部署服务 | P1 |
| F-04 | 评分截断与归一化 | 对原始评分进行 Z-score 或 Min-Max 归一化,并支持上下限截断 | P1 |
| F-05 | 异常因子检测 | 识别并标记缺失值、极端值或逻辑异常的因子输入,返回警告码 | P2 |
| F-06 | 评分历史缓存 | 对相同输入在 TTL 内直接返回缓存结果,避免重复计算 | P2 |
关键决策:P0 功能必须在 MVP 版本中实现;P1 功能在第一个迭代周期内完成;P2 功能作为性能优化和健壮性增强项,在后续版本中按需加入。
2.2 非功能需求
非功能需求定义了接口的质量属性。对于低延迟评分接口,延迟和吞吐量是最核心的约束条件。
2.2.1 延迟需求
延迟指从请求发出到收到完整响应的时间间隔。量化交易场景下,延迟直接影响策略的时效性和收益。
| 场景 | P99 延迟上限 | P50 延迟目标 | 说明 |
|---|---|---|---|
| 单标的评分 | 5 ms | 1 ms | 高频调仓场景,要求亚毫秒级响应 |
| 批量评分(100 标的) | 20 ms | 8 ms | 中频扫描场景,批量计算需并行优化 |
| 批量评分(1000 标的) | 100 ms | 40 ms | 全市场扫描场景,需考虑内存与 CPU 平衡 |
延迟测量要点:P99 延迟比平均值更能反映尾部风险。建议在压测时使用
hdrhistogram 或 latency_tracker 库记录完整百分位分布,而非仅依赖平均值。
2.2.2 吞吐量需求
吞吐量指单位时间内接口能处理的请求数量。高吞吐量意味着系统能支撑更大的策略规模和更密集的调用频率。
| 指标 | 目标值 | 约束条件 |
|---|---|---|
| 单机 QPS(单标的) | ≥ 50,000 | 4 核 8G 实例,无缓存命中 |
| 单机 QPS(批量 100 标的) | ≥ 5,000 | 4 核 8G 实例,并行计算 |
| 集群总吞吐 | ≥ 200,000 QPS | 水平扩展至 8 节点,负载均衡 |
| 长尾请求占比 | ≤ 1% 超过 2× P99 | 需配置超时熔断与降级策略 |
2.3 接口契约定义
接口契约是前后端、服务间协作的法律文件。本接口采用 RESTful 风格,使用 JSON 作为数据交换格式,通过 OpenAPI 3.0 规范进行描述。
2.3.1 核心端点
POST /api/v1/factor/score
Content-Type: application/json
Accept: application/json
2.3.2 请求体结构
{
"symbols": ["600519.SH", "000858.SZ", "601318.SH"],
"factors": {
"pe_ttm": [25.3, 18.7, 12.1],
"roe": [0.21, 0.15, 0.18],
"momentum_20d": [0.035, -0.012, 0.028]
},
"weights": {
"pe_ttm": 0.3,
"roe": 0.4,
"momentum_20d": 0.3
},
"options": {
"normalize": "zscore",
"clip_min": -3.0,
"clip_max": 3.0,
"use_cache": true
}
}
2.3.3 响应体结构
{
"code": 0,
"message": "success",
"data": {
"scores": [
{
"symbol": "600519.SH",
"total_score": 0.872,
"sub_scores": {
"pe_ttm": 0.65,
"roe": 0.92,
"momentum_20d": 0.78
},
"rank": 1,
"warnings": []
},
{
"symbol": "000858.SZ",
"total_score": 0.534,
"sub_scores": {
"pe_ttm": 0.42,
"roe": 0.55,
"momentum_20d": 0.61
},
"rank": 2,
"warnings": ["factor_pe_ttm_outlier"]
}
],
"meta": {
"computation_time_ms": 2.3,
"cache_hit": false,
"normalized": true
}
}
}
2.3.4 错误码定义
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 0 | 成功 | — |
| 40001 | 请求参数缺失 | 检查必填字段是否完整 |
| 40002 | 因子维度不匹配 | 确保 symbols 与 factors 长度一致 |
| 40003 | 权重之和不为 1 | 归一化权重或调整输入 |
| 50001 | 内部计算异常 | 重试或联系运维 |
| 50002 | 超时熔断 | 降低请求频率或拆分批次 |
2.4 需求分析总结:接口调用流程
下图展示了从客户端发起请求到最终返回评分的完整流程,涵盖了功能需求与非功能需求的落地位置。
契约变更管理:接口契约一旦发布,应遵循向后兼容原则。如需新增字段,使用
optional 标记;如需废弃字段,先标记 deprecated 并保留至少两个版本周期。建议在响应头中加入 X-API-Version: 1.0 以便客户端识别。
2.5 需求优先级矩阵
综合功能需求与非功能需求,按业务价值和实现成本两个维度进行优先级排序,指导迭代计划。
迭代建议:第一轮迭代聚焦高价值/低成本区域(F-01、F-02、延迟与吞吐量基础实现);第二轮迭代处理高价值/高成本需求(F-03、F-04);第三轮及以后根据实际运行数据决定是否投入低价值象限的需求。