超越价格的维度:一次基本面风控的价值验证之旅
引言
趋势跟踪告诉你市场要去哪里,均值回归告诉你价格是否合理,动态仓位帮你决定持有多少。但有一个问题,它们都回答不了:这个资产本身还健康吗?
均线向上、动量正常、突破有效——技术面一切正常。但与此同时,公司的 ROE 在下滑、负债率在攀升、营收增速在放缓。等到价格真正反映这些变化时,你已经在高位满仓扛了一轮回撤。这种"技术面正确但风险已经累积"的阶段,是让组合受伤最深、也最难提前感知的。
这就是原语引擎需要第三个维度的原因。趋势和回归是投资世界的两大基本力,而基本面分析为它们提供了"地基"和"安全垫"——三个正交维度一起,构成了一个几乎可以表达所有系统化投资策略的三维坐标系。
原语引擎新增了五个基本面指标(ROE、PE_TTM、营收同比、经营现金流、资产负债率)。它们不是拿来选股的,而是用来判断"是否允许暴露"和"允许暴露多少"。通过原语的组合能力,这五个基础指标可以衍生出质量过滤、风险告警、多因子动态仓位等更丰富的复合信号。
本文用一次严格的 A/B 对照实验来检验这个维度的实际价值:针对美股 AAPL 和 A 股贵州茅台,构建纯技术基线和基本面增强版本,在同口径下直接回答——在同一趋势框架下,引入基本面之后,能否优化风险暴露路径(回撤、波动、可执行性)?
结果既有惊喜也有意外:美股组实现了收益和风控的同步改善,A 股组则走出了一条截然不同的路径。
问题本质:技术信号的盲区
趋势策略擅长什么
EMA 趋势策略的逻辑非常清楚:
- 快速均线在慢速均线上方 → 持有
- 快速均线跌破慢速均线 → 退出
它擅长回答两个问题:价格方向是否偏多?趋势结构是否延续?
这套逻辑在趋势明确的阶段表现出色——大涨跟上,大跌躲开,简单有效。
趋势策略不擅长什么
但它有两个天然盲区:
- 当前风险质量是否在恶化? 价格可能还在涨,但公司的盈利能力、现金流、杠杆水平已经在变差
- 这次参与应该是多大仓位? 纯技术策略只有"全进"和"全出"两种状态,没有中间地带
现实中最危险的阶段,往往就是"价格趋势还在,但资产质量已经开始恶化"。技术信号在这个阶段会继续给出买入信号,策略会继续暴露在市场风险中。
等到价格终于反映基本面的恶化,回撤已经发生了。
解决思路:从二元问题到三元问题
所以这次增强的核心不是"多几个指标",而是把策略从二元决策升级为三元决策:
- 要不要参与?(技术趋势判断)
- 允不允许参与?(基本面质量检查)
- 参与多少?(动态仓位调节)
原语引擎提供了五个基本面指标来支撑这个框架:
| 指标 | 含义 | 典型用法 |
|---|---|---|
| ROE | 净资产收益率 | 盈利能力过滤(如 ROE > 10) |
| PE_TTM | 滚动市盈率 | 估值约束与仓位映射 |
| RevenueYoY | 营收同比 | 增长质量判断 |
| OperatingCashflow | 经营现金流 | 利润质量验证 |
| DebtRatio | 资产负债率 | 杠杆风险告警与仓位调节 |
五个原子指标,无限的组合可能
看到这里,你可能会想:“只有五个指标,是不是太少了?”
这正是理解原语引擎威力的关键。我们提供的不是一个大而全、包罗万象的指标库,而是五个最核心、最通用的“原子指标”。就像乐高积木一样,最基础的砖块,反而能组合出最丰富的世界。通过与其他原语(如 Add, Multiply, And, Or, LinearScaleWeight)的自由组合,你可以轻松创造出远超这五个指标本身的复杂“分子”:
- 构建复合“质量分”:你可以将 ROE、负债率、营收增速等通过
Add和Multiply原语组合,并赋予不同权重,创造出一个你自己的、独一无二的“综合质量评分”指标。 - 创建“估值-增长”匹配度因子:例如,你可以创建一个信号,仅在
PE_TTM < 20且RevenueYoY > 15时触发,实现一个简化的PEG思想(低估值-高成长匹配)。 - 建立多维风险预警系统:使用
Or原语,你可以定义一个“一票否决”的风险信号:只要DebtRatio > 80或者OperatingCashflow < 0或者RevenueYoY < -10中任何一个条件成立,就触发风险警报。
因此,这五个指标只是一个起点,它们赋予你的是创造新指标的能力。本文接下来的实验,就将展示如何用最基础的组合方式,实现强大的风险控制效果。
这五个指标不是拿来"选股"的——在原语引擎的设计哲学里,选股在外部完成,引擎内部只负责风险衡量和策略执行。基本面指标的价值是充当"慢变量",和技术面的"快变量"形成分工:
快变量(价格/趋势/波动) → 决定何时进出
慢变量(ROE/PE/营收/现金流/负债) → 决定是否允许参与、参与多大仓位
实验设计:同口径、同起点、不留解释余地
一个重要的前提:这不是一个高收益策略
在深入数据之前,必须明确本次实验的核心目的。我们选用的 EMA 双均线策略是一个非常基础的趋势跟踪模型,它本身并未经过优化,在某些市场(尤其是长期牛市)中,其表现可能远不如简单的“买入并持有”。
这恰恰是实验设计的关键:我们选择这样一个简单、甚至有些“平庸”的基线,不是为了追求绝对的高收益,而是为了创造一个纯净的“实验室环境”。在这个环境中,我们可以清晰地衡量和分离出——仅仅增加基本面风控这一个维度,到底能带来多大的改善?
因此,在解读后续结果时,请将重点放在增强版(V1, V3)相对于其基线版(V0, V2)的变化上,而不是策略本身的绝对收益数字。我们关注的是风险和收益指标的改善幅度。
为什么要严格控制对照条件
在策略讨论中,最常见的伪对照是"参数换了、标的换了、时间也换了"。这样的对比什么都证明不了。
为了让结论干净,本次实验统一控制以下条件:
| 参数 | 设置 |
|---|---|
| 回测起点 | 2020-01-02 |
| 统计日期 | 2026-02-09 |
| 回测窗口(日历天) | 2230 天 |
| 资金策略 | RebalancingCapitalStrategy(再平衡策略) |
| 评估指标 | 净值、CAGR、最大回撤、年化波动率、Sharpe、Calmar、交易次数、胜率 |
每组 A/B 对照使用同一只标的、同一个 EMA 参数组、同一段时间窗,唯一区别是是否启用基本面层。
除了常规的收益和风险指标,本文还关注两个"可执行性指标":
- 信号触发次数(按回测 bar 统计):买入/卖出条件分别出现了多少次
- 平均目标仓位:策略整体暴露有多激进
因为策略能否长期执行,不只取决于收益数字,也取决于你每天需要承受的心理压力。
四个版本的定义
| 版本 | 标的 | 类型 | EMA 参数 | 核心思路 |
|---|---|---|---|---|
| V0 | AAPL | 技术基线 | EMA(50)/EMA(200) | 趋势择时 + 固定仓位 0.45 |
| V1 | AAPL | 基本面增强 | EMA(50)/EMA(200) | 趋势 + 质量过滤 + 负债率动态仓位 |
| V2 | 贵州茅台 | 技术基线 | EMA(40)/EMA(120) | 趋势择时 + 固定仓位 0.35 |
| V3 | 贵州茅台 | 基本面增强 | EMA(40)/EMA(120) | 趋势 + 质量过滤 + PE/营收双因子动态仓位 |
两组实验分别回答两件不同的事:
- 美股组(V0 vs V1):基本面过滤能否做到"收益和风控同步改善"?
- A 股组(V2 vs V3):在高波动、高回撤的市场中,基本面条件能否显著压缩风险?
策略逻辑:一步步看懂原语如何搭建
V0 / V2:技术基线
基线策略的逻辑是趋势跟随的最简形式:
- 快速 EMA 在慢速 EMA 上方 → 给出固定目标仓位(V0 为 0.45,V2 为 0.35)
- 快速 EMA 跌破慢速 EMA → 目标仓位归零
这是通过 ConditionalWeight 原语实现的:当输入信号 trend_up 为真时输出固定权重,为假时输出 0。它非常简单、可解释,是衡量后续改进效果的完美“标尺”。
缺点:只看价格,不看质量。对“风险提前恶化”几乎没有感知能力。仓位要么是固定值,要么是零——没有中间地带。
V1:美股基本面增强(AAPL)
V1 在基线上增加了两层能力,我们来看看这是如何用原语一步步搭建的:
第一层:用 And 和 Or 原语构建“基本面安全门”
我们不再只依赖趋势。一个买入决策需要同时满足“趋势向上”和“基本面健康”两个条件。
- 定义健康门槛:我们使用多个
Constant原语定义出每个基本面指标的“及格线”,例如roe_min(10),debt_max(80) 等。 - 进行逻辑判断:通过一系列
GreaterThan和LessThan原语,我们将实时的基本面指标(如roe_metric)与这些“及格线”进行比较,生成一系列布尔值(true/false)的是非信号,如roe_ok,debt_ok。 - 组合所有条件:最后,我们用一个
And原语将所有这些是非信号(包括趋势信号trend_up)“串”在一起,形成一个最终的risk_gate信号。只有当所有条件都为true时,这个risk_gate才会输出true。 - 升级卖出条件:卖出条件也相应升级。我们用一个
Or原语组合trend_down和fundamental_fail(risk_gate的反向信号,通过Not原语生成),这意味着趋势转下或者基本面恶化,都会触发卖出。
第二层:用 LinearScaleWeight 和 Multiply 原语实现动态仓位
即使条件通过,给多少仓位也需要动态调节。V1 使用 LinearScaleWeight 原语,将负债率这个“慢变量”与目标仓位进行挂钩:
min_indicator: 20.0 (负债率20%) →min_weight: 1.0 (仓位权重1.0)max_indicator: 80.0 (负债率80%) →max_weight: 0.45 (仓位权重0.45)
最终目标仓位:我们用 Multiply 原语,将 risk_gate 的布尔输出(在计算中会自动转为 1 或 0)与 debt_scaled_weight 的输出相乘。这样,当 risk_gate 关闭时,任何仓位权重都会被乘以 0,实现一键清仓或减仓。
这个搭建过程完美体现了原语的价值:将复杂的风控逻辑拆解为“判断→组合→映射→计算”等一系列简单、可重用的步骤。
为什么 V1 用负债率做仓位映射,而不是 PE? 因为当前上游数据对美股 pe_ttm 历史点返回 None/NaN(这是为了避免把当前快照估值回填历史造成前视偏差),所以美股组合中 PE_TTM 只作为监控输出,不参与仓位计算。
V3:A 股基本面增强(贵州茅台)
V3 的思路更偏防守,其原语搭建的层次也更深。
第一层:更严格的质量门控 (quality_regime)
与 V1 类似,V3 同样使用 Constant, GreaterThan, LessThan, And 等原语搭建了一个“质量健康”门控。但阈值更严格,并且加入了 PE 估值判断(A 股有完整的 PE 历史数据):
- ROE > 12, PE_TTM < 45, 负债率 < 20, 营收同比 > 5, 经营现金流 > 0
第二层:多因子动态仓位 (Multiply)
V3 的仓位由两个因子共同决定,这是通过组合两个 LinearScaleWeight 原语实现的:
- PE 估值映射:使用一个
LinearScaleWeight,将 PE_TTM 10-55 的区间映射到仓位权重 0.8-0.2(估值越高仓位越低)。 - 营收增长映射:使用另一个
LinearScaleWeight,将营收同比 -10% 到 20% 的区间映射到仓位权重 0.3-0.7(增速越高仓位越高)。
最终目标仓位通过一个 Multiply 原语计算得出:买入条件 × PE 权重 × 营收权重。
这种乘法叠加的效果是:任何一个因子偏弱,整体仓位都会被显著压低。如果两个因子同时偏弱,仓位会被压得非常低,实现了深度的防守效果。
第三层:多重卖出触发器 (Or)
V3 的卖出条件也更激进。通过一个 Or 原语,V3 组合了四个独立的卖出触发源:
- 趋势转下 (
trend_down) - 质量门控失败 (
quality_fail) - 估值过度泡沫化 (
valuation_risk: PE_TTM > 55) - 杠杆超出安全边际 (
debt_risk_signal: 负债率 > 21)
这种多重独立的风险出口,构建了一个层次更深、响应更灵敏的防守体系。
策略配置:可直接复用的原语配置
以下配置均为实际回测使用的完整 trade_strategy 部分。你可以在创建原语策略时直接复用。
基本面输入配置(V1/V3 通用)
无论哪种增强模式,都需要先在策略定义中启用 fundamental_inputs:
{
"fundamental_inputs": {
"metrics": ["roe", "pe_ttm", "revenue_yoy", "operating_cashflow", "debt_ratio"],
"frequency": "daily",
"point_in_time": true,
"max_staleness_days": 120,
"include_metadata": false
}
}
关键参数说明:
point_in_time: true:只使用当时已披露的财报数据,防止回测前视偏差max_staleness_days: 120:允许数据最多滞后 120 天(覆盖一个季报周期)- 当前基本面指标仅面向个股(CN/US stock),不建议直接用于 ETF
V0 美股技术基线(AAPL)
{
"trade_strategy": {
"indicators": [
{ "id": "ema_fast", "type": "EMA", "params": { "period": 50, "column": "Close" } },
{ "id": "ema_slow", "type": "EMA", "params": { "period": 200, "column": "Close" } }
],
"signals": [
{
"id": "trend_up",
"type": "GreaterThan",
"inputs": [{ "ref": "ema_fast" }, { "ref": "ema_slow" }]
},
{
"id": "trend_down",
"type": "LessThan",
"inputs": [{ "ref": "ema_fast" }, { "ref": "ema_slow" }]
},
{
"id": "target_weight_signal",
"type": "ConditionalWeight",
"inputs": [{ "ref": "trend_up" }],
"params": { "true_weight": 0.45, "false_weight": 0.0 }
}
],
"outputs": {
"buy_signal": "trend_up",
"sell_signal": "trend_down",
"target_weight": "target_weight_signal"
}
}
}
配置解读:纯趋势策略,EMA(50) 在 EMA(200) 上方时给固定仓位 0.45,否则为 0。没有任何基本面参与。
V1 美股基本面增强(AAPL)
{
"fundamental_inputs": {
"metrics": ["roe", "pe_ttm", "revenue_yoy", "operating_cashflow", "debt_ratio"],
"frequency": "daily",
"point_in_time": true,
"max_staleness_days": 120,
"include_metadata": false
},
"trade_strategy": {
"indicators": [
{ "id": "ema_fast", "type": "EMA", "params": { "period": 50, "column": "Close" } },
{ "id": "ema_slow", "type": "EMA", "params": { "period": 200, "column": "Close" } },
{ "id": "roe_metric", "type": "ROE" },
{ "id": "pe_metric", "type": "PE_TTM" },
{ "id": "debt_metric", "type": "DebtRatio" },
{ "id": "revenue_metric", "type": "RevenueYoY" },
{ "id": "cashflow_metric", "type": "OperatingCashflow" },
{ "id": "roe_min", "type": "Constant", "params": { "value": 10.0 } },
{ "id": "debt_max", "type": "Constant", "params": { "value": 80.0 } },
{ "id": "revenue_min", "type": "Constant", "params": { "value": -5.0 } },
{ "id": "cashflow_min", "type": "Constant", "params": { "value": 0.0 } }
],
"signals": [
{
"id": "trend_up",
"type": "GreaterThan",
"inputs": [{ "ref": "ema_fast" }, { "ref": "ema_slow" }]
},
{
"id": "trend_down",
"type": "LessThan",
"inputs": [{ "ref": "ema_fast" }, { "ref": "ema_slow" }]
},
{
"id": "roe_ok",
"type": "GreaterThan",
"inputs": [{ "ref": "roe_metric" }, { "ref": "roe_min" }]
},
{
"id": "debt_ok",
"type": "LessThan",
"inputs": [{ "ref": "debt_metric" }, { "ref": "debt_max" }]
},
{
"id": "revenue_ok",
"type": "GreaterThan",
"inputs": [{ "ref": "revenue_metric" }, { "ref": "revenue_min" }]
},
{
"id": "cashflow_ok",
"type": "GreaterThan",
"inputs": [{ "ref": "cashflow_metric" }, { "ref": "cashflow_min" }]
},
{
"id": "risk_gate",
"type": "And",
"inputs": [
{ "ref": "trend_up" },
{ "ref": "roe_ok" },
{ "ref": "debt_ok" },
{ "ref": "revenue_ok" },
{ "ref": "cashflow_ok" }
]
},
{
"id": "fundamental_fail",
"type": "Not",
"inputs": [{ "ref": "risk_gate" }]
},
{
"id": "buy_condition",
"type": "And",
"inputs": [{ "ref": "trend_up" }, { "ref": "risk_gate" }]
},
{
"id": "sell_condition",
"type": "Or",
"inputs": [{ "ref": "trend_down" }, { "ref": "fundamental_fail" }]
},
{
"id": "debt_scaled_weight",
"type": "LinearScaleWeight",
"inputs": [{ "ref": "debt_metric" }],
"params": {
"min_indicator": 20.0,
"max_indicator": 80.0,
"min_weight": 1.0,
"max_weight": 0.45,
"clip": true
}
},
{
"id": "target_weight_signal",
"type": "Multiply",
"inputs": [{ "ref": "debt_scaled_weight" }, { "ref": "buy_condition" }]
}
],
"outputs": {
"buy_signal": "buy_condition",
"sell_signal": "sell_condition",
"target_weight": "target_weight_signal",
"indicators": [
{ "id": "roe_metric", "output_name": "roe" },
{ "id": "pe_metric", "output_name": "pe_ttm" },
{ "id": "revenue_metric", "output_name": "revenue_yoy" },
{ "id": "cashflow_metric", "output_name": "operating_cashflow" },
{ "id": "debt_metric", "output_name": "debt_ratio" },
{ "id": "risk_gate", "output_name": "fundamental_gate" },
{ "id": "buy_condition", "output_name": "buy_condition" },
{ "id": "sell_condition", "output_name": "sell_condition" }
]
}
}
}
配置解读:
- 门控:
risk_gate用And组合五个条件(趋势 + ROE + 负债 + 营收 + 现金流),全部达标才放行 - 卖出:趋势转下
Or门控失败——基本面恶化也会触发卖出 - 仓位:
debt_scaled_weight把负债率 20%-80% 线性映射到仓位 1.0-0.45(杠杆越高仓位越低) - 监控:
outputs.indicators输出了所有基本面字段和决策中间量,方便做信号归因与排查
V3 A 股基本面增强(贵州茅台)
{
"fundamental_inputs": {
"metrics": ["roe", "pe_ttm", "revenue_yoy", "operating_cashflow", "debt_ratio"],
"frequency": "daily",
"point_in_time": true,
"max_staleness_days": 120,
"include_metadata": false
},
"trade_strategy": {
"indicators": [
{ "id": "ema_fast", "type": "EMA", "params": { "period": 40, "column": "Close" } },
{ "id": "ema_slow", "type": "EMA", "params": { "period": 120, "column": "Close" } },
{ "id": "roe_metric", "type": "ROE" },
{ "id": "pe_metric", "type": "PE_TTM" },
{ "id": "revenue_metric", "type": "RevenueYoY" },
{ "id": "cashflow_metric", "type": "OperatingCashflow" },
{ "id": "debt_metric", "type": "DebtRatio" },
{ "id": "roe_min", "type": "Constant", "params": { "value": 12.0 } },
{ "id": "pe_max", "type": "Constant", "params": { "value": 45.0 } },
{ "id": "pe_risk", "type": "Constant", "params": { "value": 55.0 } },
{ "id": "debt_max", "type": "Constant", "params": { "value": 20.0 } },
{ "id": "debt_risk", "type": "Constant", "params": { "value": 21.0 } },
{ "id": "revenue_min", "type": "Constant", "params": { "value": 5.0 } },
{ "id": "cashflow_min", "type": "Constant", "params": { "value": 0.0 } }
],
"signals": [
{
"id": "trend_up",
"type": "GreaterThan",
"inputs": [{ "ref": "ema_fast" }, { "ref": "ema_slow" }]
},
{
"id": "trend_down",
"type": "LessThan",
"inputs": [{ "ref": "ema_fast" }, { "ref": "ema_slow" }]
},
{
"id": "roe_ok",
"type": "GreaterThan",
"inputs": [{ "ref": "roe_metric" }, { "ref": "roe_min" }]
},
{
"id": "pe_ok",
"type": "LessThan",
"inputs": [{ "ref": "pe_metric" }, { "ref": "pe_max" }]
},
{
"id": "debt_ok",
"type": "LessThan",
"inputs": [{ "ref": "debt_metric" }, { "ref": "debt_max" }]
},
{
"id": "revenue_ok",
"type": "GreaterThan",
"inputs": [{ "ref": "revenue_metric" }, { "ref": "revenue_min" }]
},
{
"id": "cashflow_ok",
"type": "GreaterThan",
"inputs": [{ "ref": "cashflow_metric" }, { "ref": "cashflow_min" }]
},
{
"id": "quality_regime",
"type": "And",
"inputs": [
{ "ref": "roe_ok" },
{ "ref": "pe_ok" },
{ "ref": "debt_ok" },
{ "ref": "revenue_ok" },
{ "ref": "cashflow_ok" }
]
},
{
"id": "quality_fail",
"type": "Not",
"inputs": [{ "ref": "quality_regime" }]
},
{
"id": "valuation_risk",
"type": "GreaterThan",
"inputs": [{ "ref": "pe_metric" }, { "ref": "pe_risk" }]
},
{
"id": "debt_risk_signal",
"type": "GreaterThan",
"inputs": [{ "ref": "debt_metric" }, { "ref": "debt_risk" }]
},
{
"id": "buy_condition",
"type": "And",
"inputs": [{ "ref": "trend_up" }, { "ref": "quality_regime" }]
},
{
"id": "sell_condition",
"type": "Or",
"inputs": [
{ "ref": "trend_down" },
{ "ref": "valuation_risk" },
{ "ref": "debt_risk_signal" },
{ "ref": "quality_fail" }
]
},
{
"id": "pe_scaled_weight",
"type": "LinearScaleWeight",
"inputs": [{ "ref": "pe_metric" }],
"params": {
"min_indicator": 10.0,
"max_indicator": 55.0,
"min_weight": 0.8,
"max_weight": 0.2,
"clip": true
}
},
{
"id": "revenue_scaled_weight",
"type": "LinearScaleWeight",
"inputs": [{ "ref": "revenue_metric" }],
"params": {
"min_indicator": -10.0,
"max_indicator": 20.0,
"min_weight": 0.3,
"max_weight": 0.7,
"clip": true
}
},
{
"id": "target_weight_signal",
"type": "Multiply",
"inputs": [
{ "ref": "buy_condition" },
{ "ref": "pe_scaled_weight" },
{ "ref": "revenue_scaled_weight" }
]
}
],
"outputs": {
"buy_signal": "buy_condition",
"sell_signal": "sell_condition",
"target_weight": "target_weight_signal",
"indicators": [
{ "id": "roe_metric", "output_name": "roe" },
{ "id": "pe_metric", "output_name": "pe_ttm" },
{ "id": "revenue_metric", "output_name": "revenue_yoy" },
{ "id": "cashflow_metric", "output_name": "operating_cashflow" },
{ "id": "debt_metric", "output_name": "debt_ratio" },
{ "id": "quality_regime", "output_name": "quality_regime" },
{ "id": "valuation_risk", "output_name": "valuation_risk" },
{ "id": "buy_condition", "output_name": "buy_condition" },
{ "id": "sell_condition", "output_name": "sell_condition" }
]
}
}
}
配置解读:
- 门控:
quality_regime用五个条件(ROE/PE/负债/营收/现金流)定义"质量健康状态" - 卖出:四重触发——趋势转下、估值泡沫化(PE > 55)、杠杆超标(负债率 > 21)、质量失败
- 仓位:PE 权重(PE 10-55 → 0.8-0.2) × 营收权重(营收 -10%~20% → 0.3-0.7) × 买入条件
- 效果:任何一个因子偏弱,整体仓位都会被乘法压低;两个因子同时偏弱,仓位会被压得非常低
V1 和 V3 的关键设计差异
| 维度 | V1(AAPL) | V3(贵州茅台) |
|---|---|---|
| 门控严格度 | ROE > 10, 负债 < 80 | ROE > 12, PE < 45, 负债 < 20 |
| 仓位映射因子 | 负债率(单因子) | PE + 营收增速(双因子) |
| 卖出触发源 | 2 个(趋势 + 门控失败) | 4 个(趋势 + PE泡沫 + 负债超标 + 门控失败) |
| PE 用法 | 仅监控输出(美股 PE 历史为 NaN) | 估值阈值过滤 + 仓位映射(A 股 PE 数据完整) |
| 整体风格 | 均衡型增强 | 防守型增强 |
回测结果:四版本表现对比
重要提示:这篇文章不是“高收益策略评选”,而是“风险暴露优化验证”。这些策略的绝对收益可能并不理想,甚至可能为负;本次 A/B 测试要看的是,在同一个趋势策略基础上,加入基本面风控后,回撤、波动率、夏普比率等风险指标是否得到相对改善。这也是我们选择不展示净值走势图的原因:绝对收益曲线会分散注意力,掩盖本文核心。如果你只关注绝对收益最大化,这篇可以先跳过;如果你关心风险控制,请聚焦 V1 vs V0、V3 vs V2 的变化。
数据来源:本地回测结果快照(统计日期:2026-02-09)。
| 版本 | 净值 | 年化收益率 | 最大回撤 | 回撤持续天数 | 年化波动率 | Sharpe | Calmar | 交易次数* | 胜率 |
|---|---|---|---|---|---|---|---|---|---|
| V0 AAPL 技术基线 | 1.0160 | 0.26% | -16.94% | 238 | 6.68% | -0.096 | 0.015 | 4 | 25.00% |
| V1 AAPL 基本面增强 | 1.1410 | 2.18% | -5.78% | 49 | 3.95% | 0.326 | 0.378 | 4 | 50.00% |
| V2 茅台技术基线 | 0.9359 | -1.08% | -33.05% | 1689 | 7.22% | -0.148 | -0.033 | 10 | 10.00% |
| V3 茅台基本面增强 | 0.9024 | -1.67% | -10.08% | 984 | 2.02% | -1.044 | -0.166 | 7 | 14.29% |
* 交易次数按“交易回合”统计(一次完整的进出场计为一回合),不是订单条数。
数字已经摆在这里了。下面一组一组拆。
深度分析:美股组——进攻和防守可以同时改善
V1 相对 V0 的改善
| 指标 | V0 基线 | V1 增强 | 变化 |
|---|---|---|---|
| 年化收益率 | 0.26% | 2.18% | +1.92 个百分点 |
| 最大回撤 | -16.94% | -5.78% | 回撤降幅 65.88% |
| 年化波动率 | 6.68% | 3.95% | 波动降幅 40.87% |
| 回撤持续天数 | 238 | 49 | 缩短 189 天 |
| Sharpe | -0.096 | 0.326 | 从负转正 |
| Calmar | 0.015 | 0.378 | 提升 25 倍 |
| 胜率 | 25.00% | 50.00% | 翻倍 |
这组结果是典型的"进攻和防守同时改善"——收益更高、回撤更小、波动更低、恢复更快。
为什么能做到?
因为 V1 的 risk_gate 拦截了那些"趋势还在但质量已经恶化"的时段。V0 在这些时段照常给出 0.45 的固定仓位;V1 则直接拒绝入场,或者通过负债率映射压低仓位。
同时,sell_condition 包含了 fundamental_fail,意味着即使价格趋势没有明确转下,只要基本面门控失败,V1 也会主动退出——这比等待 EMA 死叉要提前得多。
在本文样本、参数和时间窗下,如果四个版本里只选一个“综合最均衡”的,V1 更优先。
深度分析:A 股组——一条完全不同的优化路径
V3 相对 V2 的改善
| 指标 | V2 基线 | V3 增强 | 变化 |
|---|---|---|---|
| 年化收益率 | -1.08% | -1.67% | 下降 0.59 个百分点 |
| 最大回撤 | -33.05% | -10.08% | 回撤降幅 69.50% |
| 年化波动率 | 7.22% | 2.02% | 波动降幅 72.02% |
| 回撤持续天数 | 1689 | 984 | 缩短 705 天 |
A 股组的结果和美股组截然不同。V3 的收益率比 V2 还低了 0.59 个百分点——年化收益是变差了的。
但看风险指标:最大回撤从 33% 压到 10%,波动率从 7.2% 压到 2%。
这两个数字意味着什么?
- -33% 的回撤:10 万本金跌到 6.7 万,需要从谷底涨 49% 才能回本。如果回撤持续 1689 天(超过 4 年半),绝大多数人在前两年就会放弃
- -10% 的回撤:10 万本金跌到 9 万,需要涨 11% 就能回本。心理压力完全不在一个量级
为什么 V3 的风险压缩这么极端?
看 V3 的设计就能理解:五维质量门控(阈值都很严格)+ PE/营收双因子仓位映射 + 四重卖出触发。对茅台这样的标的,一旦 PE 高于 45 或者营收增速低于 5%,门控就会关闭;即使门控打开,PE 如果偏高(比如 40),PE 权重也只有约 0.33,再乘以营收权重,最终仓位会被压得很低。
V3 走的是一条典型的"波动率转化"路径:用收益空间换取风险质量的大幅改善。
这不是每个人都需要的优化方向,但对于"先求不死、再求盈利"的投资者来说,这恰恰是最有价值的改善。
可执行性分析:为什么有些策略指标还行,但你拿不住
除了收益和回撤,策略能否长期执行还取决于“行为负担”——你实际成交了几次、信号有多少天处于开启状态、平均仓位有多重。
| 版本 | 成交买入次数 | 成交卖出次数 | 买入信号为真天数(2020后) | 卖出信号为真天数(2020后) | 平均目标仓位(2020后) |
|---|---|---|---|---|---|
| V0 AAPL 基线 | 4 | 3 | 1241 | 293 | 0.1866 |
| V1 AAPL 增强 | 4 | 3 | 556 | 978 | 0.0817 |
| V2 茅台基线 | 10 | 10 | 768 | 713 | 0.1699 |
| V3 茅台增强 | 7 | 7 | 195 | 1286 | 0.0401 |
口径说明:成交次数按实际成交记录统计;“信号为真天数”和“平均目标仓位”统一按 2020-01-02 及之后的回测窗口统计。
这组数字揭示了更深层的差异:
V1 比 V0 明显更克制:成交次数几乎一样(都是 4 买 3 卖),但买入信号为真天数从 1241 天降到 556 天,平均目标仓位从 18.66% 降到 8.17%。这说明 V1 不是靠“高频交易”改善结果,而是靠“更少暴露、按质量暴露”改善风险收益比。
V3 是极度防守型配置:成交次数从 V2 的 10 买 10 卖降到 7 买 7 卖;买入信号为真天数从 768 天降到 195 天,平均目标仓位仅 4.01%。这意味着 V3 在回测窗口内绝大多数时段都处于低仓位或空仓状态。
这也解释了为什么 V3 能把回撤从 33% 压到 10%——大部分时间它根本没有暴露在市场风险中。
代价是收益空间被严格限制。但对于 A 股这种波动大、回撤深的市场,"先活着"可能比"多赚一点"更重要。
如何选择:按你的风险目标直接决定
目标 A:收益和风险都要改善
更适合 V1(AAPL 基本面增强)
- 收益提升 + 回撤下降 + 波动下降,同时成立
- Sharpe 从负转正,Calmar 提升 25 倍
- 是四个版本中综合最均衡的
目标 B:优先降低回撤与波动
更适合 V3(茅台基本面增强)
- 最大回撤降幅近 70%,波动率降幅超过 72%
- 适合防守优先、风险承受能力有限的配置
- 需要接受收益空间的收缩
目标 C:只追求收益数字,不愿用收益换风控
- A 股场景可偏向 V2
- 但要理解:-33% 的最大回撤和长达 4.5 年的回撤持续期,意味着实际执行中很可能提前退出
一个简单的判断标准:如果你在回测的最大回撤处,能否坚持不动?如果答案是"不确定",那你需要的不是收益最高的版本,而是回撤最小的版本。
常见误区
误区 1:把基本面当成"选股器"
基本面组件在原语引擎中的定位是风险约束,不是全市场排名。它回答的是"这个标的当前是否健康、该给多大仓位",不是"哪只股票会涨"。
选股在外部完成,风控在引擎内部——这是原语引擎的设计边界。
误区 2:只看年化收益率
V2 的年化 -1.08% 看起来比 V3 的 -1.67% "好"。但 V2 的最大回撤是 -33%,持续 1689 天。一个持续 4 年半的 33% 回撤,大多数人根本拿不住。
策略的真实收益 = 理论收益 × 执行成功率。一个理论收益更高但你扛不住回撤的策略,实际收益可能是零。
误区 3:不区分"收益型优化"和"防守型优化"
V1 和 V3 都是基本面增强,但优化目标完全不同:
- V1 是均衡型:收益和风控同步改善
- V3 是防守型:大幅压缩风险,代价是收益空间收窄
把它们混为一谈,会导致错误的预期。
误区 4:忽略回撤持续时间
同样是最大回撤 -15%,持续 2 个月和持续 2 年,对执行体验完全是两回事。回撤持续时间直接决定了你在"水下"煎熬多久——这是净值曲线上看不到、但实盘中感受最深的维度。
误区 5:在 ETF 上直接用基本面指标
当前五个基本面指标的语义是"单公司财务口径",不是 ETF 成分聚合口径。在 ETF 上启用这些指标,常见现象是字段长期为 NaN,门控会失真。
实战复现:如何在平台上跑这套对照实验
建议按以下顺序操作,不要一步到位做太多版本:
- 先建技术基线版本(V0 或 V2):只用 EMA 趋势信号 +
ConditionalWeight固定仓位,确认基线跑通 - 复制出增强版本(V1 或 V3):在同标的、同时间窗下,增加
fundamental_inputs和基本面层信号 - 严格保持其他条件一致:起始资金、手续费、回测区间、EMA 参数不变,只改变基本面层逻辑
- 对照六个核心指标:年化收益率、最大回撤、回撤持续时间、波动率、Sharpe、Calmar
- 用信号分析归因:验证基本面层确实在工作(门控覆盖率、仓位分布、字段覆盖率)
- 最后再调阈值:先看结构性改善是否存在,再做参数微调
需要注意的数据约束:
- 基本面指标当前仅面向个股,不建议直接用于 ETF
- 美股
PE_TTM历史点为NaN(避免前视偏差),适合做监控输出,不建议做估值阈值过滤 - 务必保持
point_in_time: true,否则回测会使用未来数据,结果不可信 - 建议开启
reset_signal_state_at_start: true,避免切片起点前的历史状态干扰回测
结论:三维坐标系的最后一个维度
回到开头的框架:原语引擎以趋势、回归、基本面三个正交维度,构建了一个投资策略的三维坐标系。
在基本面维度加入之前,引擎已经能回答"市场要去哪里"(趋势)和"价格是否合理"(回归)。但它回答不了"这个资产本身是否健康"——而这恰恰是让策略在"价格看起来没问题"的阶段避免踩坑的关键。
这次四版本对照实验的核心结论很明确:这不是一场“谁收益最高”的比赛,而是一场“风险暴露能否被优化”的验证。基本面维度落地后的第一次实证检验,就是回答这个问题:
美股组证明了:在合适的市场和标的上,基本面过滤能做到收益和风控的同步改善。AAPL 的 V1 策略用 risk_gate + debt_scaled_weight 实现了回撤降幅 66%、收益提升 1.9 个百分点的结果——不需要任何取舍。
A 股组证明了:在波动更大、回撤更深的市场中,基本面层的核心价值是风险压缩。茅台的 V3 策略用五维门控 + 双因子仓位 + 四重卖出触发,把回撤从 33% 压到 10%、波动率从 7.2% 压到 2%。收益没有更好,但风险路径变得完全不同。这不是失败,而是另一种成功。
两组结果加在一起,指向同一个结论:
基本面增强的本质价值不是"让策略赚更多钱",而是让策略从二维决策(价格方向 + 价格位置)升级为三维决策(价格方向 + 价格位置 + 资产健康度)。这个升级在不同市场上会表现为不同形态——有时是全面提升,有时是风险转化——但底层逻辑是一致的。
而且,这五个基本面指标只是"原子级"的起点。通过原语的组合能力——逻辑门控(And/Or/Not)、线性映射(LinearScaleWeight)、乘法叠加(Multiply)——它们可以衍生出"质量健康状态"、"风险告警信号"、"多因子动态仓位"等更丰富的复合指标。五个原子,组合出的策略空间远大于五。
当三个维度齐备、组合方式充分,剩下的问题就回到了投资本身:
- 我到底优化了哪一层?
- 这个优化换来了什么——收益提升,还是更稳的风险路径?
- 这个结果是否匹配我的风险偏好和执行能力?
如果答案清楚,策略就不再是一段漂亮的回测曲线,而是一套你能理解、能接受、能长期执行的系统。