精华帖子

小单资金流残差因子

由small_q创建,最终由small_q 被浏览 1 用户

小单资金流残差因子——一个用来捕捉"散户异常情绪"的信号。

听起来很高大上,但逻辑其实很朴素:

散户(小单)在疯狂买入或疯狂卖出一只股票,但这种行为又无法用股价本身的涨跌来解释——这就是一个值得关注的信号。

先聊聊背景:什么是资金流?

在 A 股,每一笔交易都可以按照挂单金额分为四类:

类型 挂单金额 代表谁
超大单 > 100 万 机构、大户
大单 20~100 万 中大户
中单 4~20 万 小机构、活跃散户
小单 < 4 万 普通散户

资金流向就是统计每类资金的净流入(买入 - 卖出)。

小单净流入多 → 散户在买;小单净流出多 → 散户在卖。


第一步:计算小单资金流强度

光看净流入金额不够用,因为不同股票体量差异很大。我们需要一个标准化的指标:

$\text{资金流强度} \ S_t = \frac{\sum_{近20日}(\text{小单买额} - \text{小单卖额})}{\sum_{近20日}|\text{小单买额} - \text{小单卖额}|}$

白话解释:

  • 分子:过去 20 天,散户总体是净买入还是净卖出(有方向)
  • 分母:过去 20 天,散户每天"动静"的绝对值之和(只看大小)
  • 结果:一个介于 -1 到 +1 之间的数字

举个例子:

  • $S_t = +0.8$:散户过去 20 天持续猛买,情绪很高涨
  • $S_t = -0.8$:散户过去 20 天持续在卖,情绪很悲观
  • $S_t \approx 0$:散户买卖相对均衡,没有明显倾向

第二步:为什么不直接用 $S_t$,还要多做一步?

这里有个关键问题:散户跟涨跟跌是很正常的行为

一只股票涨了 30%,散户跑去追买,$S_t$ 自然会很高——但这个高并不是因为散户有什么"独特判断",只是在跟着涨幅走而已。

如果直接用 $S_t$,你衡量的其实是"股票涨了多少",而不是"散户行为有多异常"。

解决方案:回归 + 取残差

在每一天,对全市场所有股票做一个截面回归:

$S_t = a + b \times \text{近20日涨跌幅} + \varepsilon_t$

  • 用涨跌幅解释资金流强度,把"正常跟涨跟跌"的部分去掉
  • 剩下的残差 $\varepsilon_t$,才是无法被涨跌幅解释的散户异常行为

这个 $\varepsilon_t$ 就是我们的最终因子。

类比理解:就像考试成绩和学习时间高度相关。如果一个学生花了很多时间学习却考了低分,这个"异常"才值得关注——残差因子就是在找这种"异常"。

代码实现

在 BigQuant 平台上,用 DAI SQL 几行就能搞定:

WITH base AS (
    SELECT
        date, instrument,
        -- 每日小单净资金流
        active_buy_amount_small - active_sell_amount_small AS net_small
    FROM cn_stock_prefactors
    WHERE st_status = 0 AND suspended = 0
),
intensity AS (
    SELECT date, instrument,
        -- 滚动20日资金流强度
        m_sum(net_small, 20) / m_sum(ABS(net_small), 20) AS small_st,
        -- 近20日涨跌幅
        close / m_lag(close, 20) - 1 AS ret20
    FROM base
)
SELECT date, instrument,
    -- 截面回归取残差 = 最终因子
    c_regr_residual(small_st, ret20) AS factor
FROM intensity

三个核心函数:

  • m_sum(x, 20):时间序列上向前滚动求 20 日之和
  • m_lag(close, 20):取 20 日前的收盘价
  • c_regr_residual(y, x):截面 OLS 回归,返回残差

https://bigquant.com/codesharev3/5a852c8e-8ea2-4ac3-b825-f11508e64735

\

{link}