小单资金流残差因子
由small_q创建,最终由small_q 被浏览 13 用户
小单资金流残差因子——一个用来捕捉"散户异常情绪"的信号。
听起来很高大上,但逻辑其实很朴素:
散户(小单)在疯狂买入或疯狂卖出一只股票,但这种行为又无法用股价本身的涨跌来解释——这就是一个值得关注的信号。
先聊聊背景:什么是资金流?
在 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
\