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: """从表达式中提取最大窗口大小。