合并主线缺值语义与因子键优化记录
This commit is contained in:
@@ -6126,7 +6126,7 @@ impl PlatformExprStrategy {
|
||||
if Self::is_reserved_scope_name(identifier.as_str())
|
||||
|| self.prelude_declared_identifiers.contains(identifier)
|
||||
|| (!self.stock_extra_factor_identifiers.contains(identifier)
|
||||
&& !item.extra_factors.contains_key(identifier)
|
||||
&& !item.extra_factors.contains_key(identifier.as_str())
|
||||
&& !day.available_factor_names.contains(identifier)
|
||||
&& !day.available_text_factor_names.contains(identifier))
|
||||
{
|
||||
@@ -6137,7 +6137,7 @@ impl PlatformExprStrategy {
|
||||
} else {
|
||||
let value = item
|
||||
.extra_factors
|
||||
.get(identifier)
|
||||
.get(identifier.as_str())
|
||||
.copied()
|
||||
.unwrap_or(f64::NAN);
|
||||
scope.push_dynamic(identifier.clone(), Dynamic::from(value));
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# 表达式缺失值与执行参数验收
|
||||
|
||||
## 根因
|
||||
|
||||
原数值执行器把 NaN 比较结果直接变成 false,外层 NOT 因而可能变成 true。
|
||||
`min(NaN, value)` 还会返回另一个有效值,使缺失因子参与筛选。下单标量继续经过
|
||||
`max`、`clamp` 或整数转换时,也可能把无效输入变成零仓位或零数量。
|
||||
|
||||
## 执行合同
|
||||
|
||||
数值 VM 使用带类型的 Missing 值,数值缺失及非有限运算结果不再提前变为布尔 false。
|
||||
|
||||
| 表达式 | 结果 |
|
||||
| --- | --- |
|
||||
| NOT unknown | unknown |
|
||||
| false AND unknown | false |
|
||||
| true AND unknown | unknown |
|
||||
| true OR unknown | true |
|
||||
| false OR unknown | unknown |
|
||||
|
||||
最终布尔筛选只接受 true;显式 `if`/`iff` 与 CASE WHEN 一样,只在条件确认为 true 时取真分支。
|
||||
显式 `nz` 保留策略自己声明的缺失值替代含义,框架不会自行填零。
|
||||
短路仍不读取未使用分支。非法 clamp 范围返回错误,不允许使进程 panic。
|
||||
|
||||
Rhai 的逻辑运算不能承载可空布尔,因此动态脚本遇到未知数值比较时明确报错,不能
|
||||
返回错误的命中;缺失 map 属性同样报错。已关闭会绕过自定义比较保护的 Fast Operators。
|
||||
有限浮点比较仍使用现有 epsilon 口径,混合整数/浮点比较也受保护。
|
||||
[Rhai 运算符文档](https://rhai.rs/book/rust/operators.html)说明了该分派边界。
|
||||
|
||||
下单数量、目标仓位、投入比例和筛选边界必须返回有限数值,否则记录
|
||||
`missing_numeric_result`,包含表达式、证券、决策日和执行日。只有排名评估保留
|
||||
独立的缺失值诊断路径;没有把数据源的缺行改写为价格或交易事实。
|
||||
|
||||
## 代码与测试
|
||||
|
||||
- `fda2e70`:VM 三值逻辑及动态数值保护。
|
||||
- `ea58ab2`:显式关闭 Rhai 快运算符,补齐缺失 map 保护。
|
||||
- `e3f1028`:执行标量必须有限,排名与执行参数分离。
|
||||
- 177 引擎:585 项通过、8 项跳过。
|
||||
- Runner:360 项通过、3 项跳过。
|
||||
- 交易工作区链接 e3f1028:510 项通过、8 项跳过。
|
||||
|
||||
首次回归曾发现 Rhai 快路径仍绕过保护,修复后重新完整测试,未将失败候选部署。
|
||||
|
||||
## 真实回放
|
||||
|
||||
使用已保存的原始 strategy spec、初始资金、日期、基准、频率及全部执行配置,
|
||||
通过独立 runner 真正重新执行。固定为服务实际使用的16个逻辑CPU、Rayon8线程、Tokio16线程。
|
||||
|
||||
- 五年日线:2021-08-23 至 2026-08-28,1,000万元,25,408笔成交。
|
||||
- 分钟样本:2025-01-02 至 2025-11-17,100万元,156笔成交。
|
||||
- 10次回放的 canonical 与 result-store 均等于各自同 frozen bundle 基准。
|
||||
- 包含 e3f1028 的最终回放为 `five-year-strict-1`、`minute-strict-1`。
|
||||
|
||||
完整证据:`/Users/boris/WorkSpace/fidc-backtest-service/docs/evidence/numeric-condition-replay-20260909.json`。
|
||||
日线源行6,918,227;分钟样本仅636行,不能用其亚秒耗时宣传全部分钟策略的性能。
|
||||
|
||||
## 边界
|
||||
|
||||
该候选尚未部署到常驻回测或交易服务。此验证证明两种已有策略在有效冻结数据下结果不变,
|
||||
不证明所有策略、所有原始财务公告/vintage、全部缺失数据原因或真实券商交易均已验收。
|
||||
Rhai 未提供与数值 VM 完全相同的 nullable 表达式能力,目前选择明确拒绝,不能称为所有
|
||||
动态语言表达式都已支持三值逻辑。完整 typed Base Panel 与对象分配优化仍待完成。
|
||||
Reference in New Issue
Block a user