比赛讨论

盘口资金深度动量协同因子

由bqtnziby创建,最终由bqtnziby 被浏览 3 用户

这个因子的核心逻辑是结合盘口资金深度与短期动量信号,通过量化盘口供需力量对比并过滤不一致的动量信号,最终得到一个反映市场即时资金倾向与趋势协同性的指标。

一、因子逻辑

  1. 盘口深度的全面性

    传统盘口指标常关注单档(如买一 / 卖一),但五档资金总和能更全面反映市场深度(多档位资金堆积情况),更贴近真实供需力量。

  2. 动量与资金的协同性

    单独的盘口资金信号可能受短期噪音影响(如瞬时大单),结合 3 日价格趋势后:

    • 当资金方向与趋势一致时(如上涨趋势中买盘更强),说明趋势有资金支撑,信号更可靠;
    • 当两者不一致时(如上涨趋势中卖盘更强),可能是趋势乏力或反转信号。

二、计算逻辑

  1. 计算盘口资金深度对比

    用 “五档买盘总资金” 与 “五档卖盘总资金” 的比值衡量盘口供需力量:

    • 五档买盘总资金 = 买一价 × 买一量 + 买二价 × 买二量 + ... + 买五价 × 买五量

    • 五档卖盘总资金 = 卖一价 × 卖一量 + 卖二价 × 卖二量 + ... + 卖五价 × 卖五量

    • 资金深度比值 =(买盘总资金 / 卖盘总资金)- 1

      (正值表示买盘资金更强,负值表示卖盘资金更强,避免除以 0 用NULLIF

      处理)

  2. 短期动量过滤(调整系数)

    引入 3 日价格趋势与资金方向的 “一致性” 判断,对上述资金深度比值进行调整:

    • 若 “当前收盘价> 3 天前收盘价(短期上涨趋势)” 且 “买盘资金 > 卖盘资金(资金方向与趋势一致)”→ 调整系数 = 1.2(强化信号)
    • 若 “当前收盘价 < 3 天前收盘价(短期下跌趋势)” 且 “买盘资金 < 卖盘资金(资金方向与趋势一致)”→ 调整系数 = 1.2(强化信号)
    • 其他情况(趋势与资金方向不一致)→ 调整系数 = 0.4(弱化信号)
  3. 极端值处理与聚合

    • 用CLIP(-0.5,0.5)

      将上述乘积结果限制在 [-0.5, 0.5] 区间,避免极端值干扰。

    • 从分钟级数据聚合为日度因子:按股票和日期分组,取当日分钟级因子的均值。

三、核心部分代码

    sql = f"""
        SELECT
            date AS date,
            instrument,
            CLIP(
                (
                    -- 全档位买盘资金 vs 卖盘资金(更全面反映盘口深度)
                    (bid_price1*bid_volume1 + bid_price2*bid_volume2 + bid_price3*bid_volume3 + bid_price4*bid_volume4 + bid_price5*bid_volume5)::FLOAT
                    / NULLIF(ask_price1*ask_volume1 + ask_price2*ask_volume2 + ask_price3*ask_volume3 + ask_price4*ask_volume4 + ask_price5*ask_volume5, 0)
                    - 1
                ) * (
                    -- 短期动量过滤:资金方向与3日趋势一致时强化信号
                    CASE 
                        WHEN (close > LAG(close, 3) OVER (PARTITION BY instrument ORDER BY date) AND (bid_price1*bid_volume1 + bid_price2*bid_volume2 + bid_price3*bid_volume3 + bid_price4*bid_volume4 + bid_price5*bid_volume5) > (ask_price1*ask_volume1 + ask_price2*ask_volume2 + ask_price3*ask_volume3 + ask_price4*ask_volume4 + ask_price5*ask_volume5)) THEN 1.2
                        WHEN (close < LAG(close, 3) OVER (PARTITION BY instrument ORDER BY date) AND (bid_price1*bid_volume1 + bid_price2*bid_volume2 + bid_price3*bid_volume3 + bid_price4*bid_volume4 + bid_price5*bid_volume5) < (ask_price1*ask_volume1 + ask_price2*ask_volume2 + ask_price3*ask_volume3 + ask_price4*ask_volume4 + ask_price5*ask_volume5)) THEN 1.2
                        ELSE 0.4
                    END
                ),
                -0.5,
                0.5
            ) AS factor
        FROM {datasource}
    """

\

{link}