因子用字段表示 · 可表示性对照
哪些因子能用我们的 32 个 T×C 字段 + 算子 拼出来,哪些不能(需要 L1 逐笔)。✅算例数字来自真实数据 000001.sz 20240102 前5个10s窗口。
判断一个因子能否用字段表示,看它的「选择」和「度量」落不落在我们的轴上:
因子 = 算子组合( normalize( reduce( filter(逐笔) ) ) ) 我们的字段已经把 filter∈{成交/撤单 × 大/小单 × 买/卖}、reduce∈{额/量/笔/HHI} 预聚合好了。
✅ 若因子的选择条件只用到这三个轴、度量是这四种 → 用算子(sub/div/ts_*/cs_*)组合字段即可。
❌ 若 filter 需要每笔的价格/时间/链路等聚合时已丢失的信息(如 price>close) → 字段拼不出,需 L1。
因子 = 算子组合( normalize( reduce( filter(逐笔) ) ) ) 我们的字段已经把 filter∈{成交/撤单 × 大/小单 × 买/卖}、reduce∈{额/量/笔/HHI} 预聚合好了。
✅ 若因子的选择条件只用到这三个轴、度量是这四种 → 用算子(sub/div/ts_*/cs_*)组合字段即可。
❌ 若 filter 需要每笔的价格/时间/链路等聚合时已丢失的信息(如 price>close) → 字段拼不出,需 L1。
✅ 能用字段表示(算子组合 + 真实算例)
从里往外读算子;每个都给出用我们字段名写的表达式。
✅大单净主买额占比对应「大单净主买」/字典 c3 净主买
大单主动买额占比 − 大单主动卖额占比,刻画主力净流入
sub( TRD_BIG_BUY_AMT , TRD_BIG_SELL_AMT )
BIG_BUY_AMT=
BIG_SELL_AMT=
→ sub=
第1窗 0.0377−0.026=+0.0116(大单净买);第2窗 0−0.1006=−0.1006(大单净卖)。
0.0377 0 0 0 0BIG_SELL_AMT=
0.026 0.1006 0 0 0→ sub=
0.0116 -0.1006 0 0 0第1窗 0.0377−0.026=+0.0116(大单净买);第2窗 0−0.1006=−0.1006(大单净卖)。
✅主动买卖不平衡度对应字典 c4_alpha30 主动买卖不平衡
(主买额−主卖额)/(主买额+主卖额),∈[−1,1]
div( sub(buy,sell) , add(buy,sell) ) 其中 buy=add(BIG_BUY_AMT,SML_BUY_AMT)
buy额占比=
sell额占比=
→ imb=
第1窗(0.227−0.773)/(0.227+0.773)=−0.546,明显主动卖压。
0.2268 0.2019 0.2694 0.2759 0.4109sell额占比=
0.7732 0.7981 0.7306 0.7241 0.5891→ imb=
-0.5464 -0.5962 -0.4613 -0.4482 -0.1782第1窗(0.227−0.773)/(0.227+0.773)=−0.546,明显主动卖压。
✅大单成交额占比大单活跃度
大单(买+卖)成交额占总成交额,刻画大单参与度
add( TRD_BIG_BUY_AMT , TRD_BIG_SELL_AMT )
→=
第2窗 0+0.1006=0.1006,该10s大单占成交额约10%。
0.0637 0.1006 0 0 0第2窗 0+0.1006=0.1006,该10s大单占成交额约10%。
✅大单买入价格集中度对应字典「集中度C」
大单主买成交额在不同价位上的 HHI,越高越扎堆一个价
TRD_BIG_BUY_HHI (直接就是一个字段)
→=
第1窗=1.0(大单买全在一个价位);后几窗无大单买→空值·。
1 · · · ·第1窗=1.0(大单买全在一个价位);后几窗无大单买→空值·。
✅撤买额占比撤单行为类
撤单池中买方撤单额占比,反映买盘试盘/抽单
add( CXL_BIG_BUY_AMT , CXL_SML_BUY_AMT )
→=
第1窗 0.657,开盘撤买很重。
0.6571 0.0062 0.3374 0.2428 0.3827第1窗 0.657,开盘撤买很重。
✅大单净主买趋势对应字典「趋势」系列
过去 k 根(如6根=1分钟)大单净主买的回归斜率,看主力是否持续加仓
ts_slope( sub(TRD_BIG_BUY_AMT,TRD_BIG_SELL_AMT) , 6 )
先 sub 得净主买序列,再 ts_slope 取斜率。正=主力持续加码。(需多窗口序列,此处仅示表达式)
✅相对主力净流入(全市场)对应字典「相对R」口径
把个股的大单净主买,在每个时刻放到全市场横向排名
cs_rank( sub(TRD_BIG_BUY_AMT,TRD_BIG_SELL_AMT) )
sub 得净主买 → cs_rank 截面排名∈[0,1]。需全市场截面,单股无法演示。
✅大单净主买变化对应字典「变化」系列
本窗比上一窗的大单净主买变化(动量/反转)
ts_delta( sub(TRD_BIG_BUY_AMT,TRD_BIG_SELL_AMT) , 1 )
净主买=
主力从净买转净卖,变化−0.11。
0.0116 -0.1006 0 0 0 → ts_delta(,1) → 第2窗 −0.1006−0.0116=−0.1122主力从净买转净卖,变化−0.11。
❌ 不能用字段表示(需要 L1 逐笔)
共同点:filter 引用了「每笔价格/时间/链路」——这些在聚合成 32 字段时已丢失,任何算子都补不回。
❌HCVOL 买入浮亏占比
Σ volume_buy·𝕀(price_buy > close) / total_volume
为什么不行需要对每一笔买单单独比较「它的成交价 vs 窗口close」。我们的字段在聚合成 VOL/AMT 时,已经把每笔的价格丢了——只留了买单总量占比,无法事后区分哪些买在 close 之上。HHI 留的是「扎不扎堆」,也不是「在 close 上方还是下方」。
需要L1 事件流(每笔的 price) + 窗口广播量 win.close,filter:
dir=买 且 price>win.close❌VWAP 上方成交占比
Σ volume·𝕀(price > vwap) / total_volume
为什么不行同理,需逐笔比较 price 与窗口 VWAP。聚合后价格信息已丢失。
需要L1 + win.vwap,filter:
price>win.vwap❌大单冲击力(Kyle λ)
Δprice / 签名成交量 的回归斜率
为什么不行需要把逐笔价格变动与逐笔签名成交量配对回归。我们只有10s聚合的占比,拿不到笔级的价格序列和单笔冲击。
需要L1(price,qty,dir 笔级序列) 上回归
❌挂单存活时长
委托从挂出到成交/撤单的平均时间
为什么不行需要把每笔成交/撤单链接回它的原始委托、算时间差。我们的字段是窗口聚合量,没有「这笔成交对应哪个委托、那个委托何时挂的」这种笔级链路。
需要L1-ext(passive_order_ts) 或回 L0 join Order 表
❌尾盘最后5分钟大单净买
限定 14:52–14:57 的大单净主买
为什么不行这个其实能近似——若字段按时段切了(早/午/尾盘)就能取尾盘列;但精确到「最后5分钟」且任意时间边界,需逐笔的精确时间戳。
需要时段固定→可用字段;任意时间窗→L1(ts_ms) filter
判断法则(速查)
- 选择条件只涉及 {成交/撤单, 大/小单, 买/卖}?→ 落在轴上,继续。否则❌(如「price>close」是第4个轴:价格位置)。
- 度量是 {金额, 股数, 笔数, 价格HHI} 之一?→ 是则✅。
- 跨时间/跨股票的加工(变化、趋势、标准差、排名、相关)?→ 全部由时序/截面算子解决,不影响可表示性。
- 命中❌时,缺的几乎总是「每笔相对某参考价/时刻的位置」——这要 L1 事件流 + 窗口广播量(close/vwap/分位)现算。
一句话:轴上的选择 + 四种度量 + 任意算子 = 可表示;需要笔级价格/时间/链路 = 不可表示,得回 L1。这也是为什么要建 L1 事件流缓存——让「价格位置」这类新轴随时能加。
✅算例实跑自 32字段(000001.sz 20240102) · 算子定义见「算子库说明」 · ❌项见「L1事件流缓存」设计