From 9b826c1845abbe99dc5e21c8e68702101eb8aeab Mon Sep 17 00:00:00 2001 From: liaozhaorun <1300336796@qq.com> Date: Mon, 2 Mar 2026 20:59:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(factors):=20=E5=9F=BA=E7=A1=80=E8=A1=8C?= =?UTF-8?q?=E6=83=85=E5=AD=97=E6=AE=B5=E9=BB=98=E8=AE=A4=E4=BB=8E=20pro=5F?= =?UTF-8?q?bar=20=E8=A1=A8=E8=8E=B7=E5=8F=96=20-=20=E4=BF=AE=E6=94=B9=20Sy?= =?UTF-8?q?mbol=20=E5=90=8D=E7=A7=B0=E4=B8=8E=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=AF=B9=E9=BD=90=EF=BC=9Avolume->vol,=20pct?= =?UTF-8?q?=5Fchange->pct=5Fchg=20-=20=E4=BF=AE=E6=94=B9=20ExecutionPlanne?= =?UTF-8?q?r.=5Finfer=5Fdata=5Fspecs=EF=BC=8C=E5=B0=86=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E8=A1=8C=E6=83=85=E5=AD=97=E6=AE=B5=E8=B7=AF=E7=94=B1=E5=88=B0?= =?UTF-8?q?=20pro=5Fbar=20=E8=A1=A8=20-=20=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E5=AD=97=E6=AE=B5=EF=BC=9Aopen,=20high,=20lo?= =?UTF-8?q?w,=20close,=20vol,=20amount,=20pre=5Fclose,=20change,=20pct=5Fc?= =?UTF-8?q?hg=20=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/factors/api.py | 8 +++---- src/factors/engine.py | 50 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/factors/api.py b/src/factors/api.py index a6c8693..068c4c6 100644 --- a/src/factors/api.py +++ b/src/factors/api.py @@ -27,8 +27,8 @@ high = Symbol("high") #: 最低价 low = Symbol("low") -#: 成交量 -volume = Symbol("volume") +#: 成交量(数据库字段名为 vol) +vol = Symbol("vol") #: 成交额 amount = Symbol("amount") @@ -39,8 +39,8 @@ pre_close = Symbol("pre_close") #: 涨跌额 change = Symbol("change") -#: 涨跌幅 -pct_change = Symbol("pct_change") +#: 涨跌幅(数据库字段名为 pct_chg) +pct_chg = Symbol("pct_chg") # ==================== 时间序列函数 (ts_*) ==================== diff --git a/src/factors/engine.py b/src/factors/engine.py index 7ea9f11..ce7ea21 100644 --- a/src/factors/engine.py +++ b/src/factors/engine.py @@ -409,6 +409,8 @@ class ExecutionPlanner: """从依赖推导数据规格。 根据表达式中的函数类型推断回看天数需求。 + 基础行情字段(open, high, low, close, vol, amount, pre_close, change, pct_chg) + 默认从 pro_bar 表获取。 Args: dependencies: 依赖的字段集合 @@ -421,16 +423,48 @@ class ExecutionPlanner: max_window = self._extract_max_window(expression) lookback_days = max(1, max_window) - # 假设所有字段都来自 daily 表 - columns = list(dependencies) + # 基础行情字段集合(这些字段从 pro_bar 表获取) + pro_bar_fields = { + "open", + "high", + "low", + "close", + "vol", + "amount", + "pre_close", + "change", + "pct_chg", + "turnover_rate", + "volume_ratio", + } - return [ - DataSpec( - table="daily", - columns=columns, - lookback_days=lookback_days, + # 将依赖分为 pro_bar 字段和其他字段 + pro_bar_deps = dependencies & pro_bar_fields + other_deps = dependencies - pro_bar_fields + + data_specs = [] + + # pro_bar 表的数据规格 + if pro_bar_deps: + data_specs.append( + DataSpec( + table="pro_bar", + columns=sorted(pro_bar_deps), + lookback_days=lookback_days, + ) ) - ] + + # 其他字段从 daily 表获取 + if other_deps: + data_specs.append( + DataSpec( + table="daily", + columns=sorted(other_deps), + lookback_days=lookback_days, + ) + ) + + return data_specs def _extract_max_window(self, node: Node) -> int: """从表达式中提取最大窗口大小。