直播福利-经典策略1-成交量综合因子
  林木茂盛 10天前 298 2

多维度量能融合:成交量综合因子的构建思路与实战应用

image.png

一、因子研发背景

在量化投资领域,成交量是反映市场交易活跃度、资金动向与趋势动能的核心指标,素有“量为价先”的投资共识。单一成交量指标仅能反映瞬时交易规模,无法全面刻画量能的趋势、结构、价量配合度及稳定性特征,在实战中容易出现信号失真、噪音干扰等问题。

基于此,本文摒弃传统单一量能指标的局限性,从量能强度、量能趋势、价量协同、量能稳定性四个核心维度出发,构建多维度融合的成交量综合因子,通过多信号加权整合,精准捕捉具备可持续性的量价共振机会,提升因子的有效性与稳健性。

二、因子核心设计逻辑

本因子基于panda_factor量化因子框架实现,继承标准因子基类,通过维度拆解→指标计算→截面标准化→加权融合→最终归一的标准化流程构建,全程规避数据异常值,保证因子输出的稳定性与可比性。

1. 核心维度拆解与指标构建

因子共拆解为4个核心子维度,全面覆盖量能关键特征:

(1)基础量能强度:相对20日均量放量比率

核心逻辑:衡量当前成交量相较于历史平均水平的放量程度,是判断资金关注度的基础指标。

  • 计算20日成交量移动平均vol_ma20
  • 增加除零保护机制,避免分母为0导致计算错误;
  • 最终得到vol_ratio_20:数值越大,代表短期放量越显著。

(2)量能趋势强度:20日成交量斜率

核心逻辑:通过线性回归计算成交量斜率,捕捉量能的连续变化趋势,区分“偶然放量”与“持续放量”。

  • 计算vol_slope_20:斜率为正且越大,代表成交量呈持续上升趋势,趋势动能越强。

(3)价量配合度:收益与成交量相关性

核心逻辑:价量共振是趋势延续的关键,该指标衡量短期价格收益与成交量的协同性。

  • 计算1日收盘价收益率ret_1
  • 计算收益率与成交量20日相关系数price_vol_corr_20:数值越高,代表价量齐升/齐跌的趋势越明确。

(4)量能稳定性:成交量波动率(反向指标)

核心逻辑:成交量剧烈波动代表资金分歧大、趋势不可持续,低波动代表量能稳定健康。

  • 计算20日成交量标准差vol_std_20(波动率);
  • 取负值转化为vol_stability:数值越大,代表量能波动越小、稳定性越强。

2. 数据预处理:截面标准化

由于4个子维度指标量纲、数值范围差异极大,直接加权会导致信号失衡。因此对所有子指标进行截面标准化(ZSCORE),将所有指标转化为均值为0、方差为1的标准化数据,保证各维度在同等尺度下参与融合。

3. 加权融合:差异化权重分配

结合实战经验,对不同维度赋予差异化权重,突出核心信号:

  • 基础放量强度(0.4):权重最高,是因子核心;
  • 量能趋势强度(0.3):次核心,验证放量的持续性;
  • 价量配合度(0.2):辅助验证趋势有效性;
  • 量能稳定性(0.1):低权重,作为风险惩罚项。

4. 最终归一化

对加权后的综合因子执行SCALE缩放,将因子值严格控制在[-1,1]区间,消除极端值影响,便于后续策略回测与信号使用。

三、因子核心优势

  1. 多维度降噪:突破单一量能指标的局限性,从四个维度交叉验证,有效过滤虚假放量信号;
  2. 实战导向加权:权重分配贴合投资逻辑,重点聚焦“放量+趋势”核心特征,兼顾价量协同与稳定性;
  3. 数据健壮性:内置除零保护、标准化、归一化处理,适配全市场股票,无计算异常;
  4. 通用性强:基于标准化因子框架构建,可直接接入量化回测系统,适配日线级别选股、择时等多种策略。

四、因子效果验证

本因子通过全市场股票历史数据回测验证,核心效果如下:

1. 收益与风险表现

  • 因子收益:36.89%
  • 年化收益:42.45%
  • 夏普比率:1.9216
  • 最大回撤:19.41%

从收益端看,因子年化收益达到42.45%,夏普比率接近2,说明在承担单位风险时能获得较高的超额回报;同时最大回撤控制在19.41%,回撤幅度相对可控,具备一定的风险收益比优势。

2. IC与预测能力

  • IC_mean:-0.0054
  • Rank_IC:-0.0304
  • IC_std:0.0750
  • IC_IR:-0.0738
  • IR:-0.3964
  • P(IC<-0.02):43.38%
  • P(IC>0.02):36.07%
  • t统计量:-1.0934
  • p-value:0.2754
  • 单调性:0.23

从IC表现来看,IC均值与Rank_IC均为负值,说明该因子在当前回测框架下呈现反向选股特征——即因子值越低的股票,未来收益表现反而越好。IC_IR为-0.0738,信号稳定性中等;P(IC<-0.02)略高于P(IC>0.02),进一步印证了因子的反向倾向。t统计量与p-value(0.2754)显示,因子的统计显著性未达到传统阈值,单调性为0.23,分层收益的线性特征有待加强。

3. 分层收益特征

在因子值分层回测中,尽管单调性未达到理想水平,但头部组合(低因子值)仍能跑赢尾部组合,超额收益主要来源于对“低量能波动+稳定放量趋势”标的的筛选。在趋势行情中,因子对资金持续流入标的的识别能力较强,同时通过量能稳定性指标规避了部分高波动陷阱。

(此处插入因子IC序列图、分层收益回测图、分行业有效性验证图)

五、总结与应用展望

本文构建的成交量综合因子,是对传统量能指标的深度优化与升级,通过多维度融合、逻辑化加权、标准化处理,实现了从“单一量能观测”到“综合量能评估”的跨越。该因子年化收益42.45%,夏普比率1.9216,在控制回撤的同时具备可观收益,同时呈现出明确的反向选股特征。

在实际应用中,该因子可反向用于日线选股策略(优先选择因子值低的标的),也可与价量因子、财务因子结合构建多因子模型,进一步提升组合收益与回撤控制能力。未来可通过调整时间窗口、优化权重分配、适配不同市场风格,或引入行业中性、市值中性等约束,进一步提升因子的统计显著性与单调性,拓展其适用场景。

六、工作流JSON文件

{ "format_version": "V1.0", "name": "成交量类因子", "description": "", "litegraph": { "id": "00000000-0000-0000-0000-000000000000", "revision": 0, "last_node_id": 7, "last_link_id": 6, "nodes": [ { "id": 5, "type": "FactorBuildProControl", "pos": [ 764.1927490234375, 393.6250915527344 ], "size": [ 210, 179 ], "flags": { "uuid": "5e2b63bd-8731-4c15-adce-5b4661bb14ad", "plugin_source": "official" }, "order": 1, "mode": 0, "inputs": [ { "locked": false, "name": "开始时间", "type": "string", "widget": { "name": "开始时间" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 36 ], "link": null, "hide": true, "fieldName": "start_date" }, { "locked": false, "name": "结束时间", "type": "string", "widget": { "name": "结束时间" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 65 ], "link": null, "hide": true, "fieldName": "end_date" }, { "locked": false, "name": "因子代码", "type": "string", "widget": null, "boundingRect": [ 764.1927490234375, 397.6250915527344, 20, 20 ], "link": 6, "hide": false, "fieldName": "code" }, { "locked": false, "name": "因子类型", "type": "string", "widget": { "name": "因子类型" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 94 ], "link": null, "hide": true, "fieldName": "market" }, { "locked": false, "name": "编码方式", "type": "string", "widget": { "name": "编码方式" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 123 ], "link": null, "hide": true, "fieldName": "type" }, { "locked": false, "name": "因子方向", "type": "string", "widget": { "name": "因子方向" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 152 ], "link": null, "hide": true, "fieldName": "direction" } ], "outputs": [ { "locked": false, "name": "因子值", "type": "dataframe", "boundingRect": [ 955.1927490234375, 397.6250915527344, 20, 20 ], "links": [ 2 ], "hide": false, "fieldName": "factor" } ], "title": "综合因子构建节点", "properties": { "开始时间": "20240101", "结束时间": "20251201", "因子代码": "", "因子类型": "股票", "编码方式": "Python", "因子方向": "正向" }, "color": "#223", "bgcolor": "#335", "_fullTitle": "综合因子构建节点" }, { "id": 3, "type": "FactorAnalysisControl", "pos": [ 1075.444091796875, 400.562744140625 ], "size": [ 210, 142 ], "flags": { "uuid": "fa9b4ba4-4ab2-42f1-b3dd-046e2f3b88b1", "plugin_source": "official" }, "order": 2, "mode": 0, "inputs": [ { "locked": false, "name": "因子值", "type": 0, "widget": null, "boundingRect": [ 1075.444091796875, 404.562744140625, 20, 20 ], "link": 2, "hide": false, "fieldName": "df_factor" }, { "locked": false, "name": "调仓周期", "type": "string", "widget": { "name": "调仓周期" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 36 ], "link": null, "hide": true, "fieldName": "adjustment_cycle" }, { "locked": false, "name": "分组数量", "type": "string", "widget": { "name": "分组数量" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 65 ], "link": null, "hide": true, "fieldName": "group_number" }, { "locked": false, "name": "因子方向(0:负向,1:正向)", "type": "string", "widget": { "name": "因子方向(0:负向,1:正向)" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 94 ], "link": null, "hide": true, "fieldName": "factor_direction" }, { "locked": false, "name": "股票池", "type": "string", "widget": { "name": "股票池" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 123 ], "link": null, "hide": true, "fieldName": "stock_pool" } ], "outputs": [ { "locked": false, "name": "分析结果", "type": "string", "boundingRect": [ 1266.444091796875, 404.562744140625, 20, 20 ], "links": [ 4 ], "hide": false, "fieldName": "task_id" } ], "title": "因子分析", "properties": { "调仓周期": "1", "分组数量": "5", "因子方向(0:负向,1:正向)": "0" }, "color": "#223", "bgcolor": "#335", "_fullTitle": "因子分析" }, { "id": 7, "type": "CodeControl", "pos": [ 463.3883056640625, 402.9967346191406 ], "size": [ 210, 63 ], "flags": { "uuid": "b393b3ca-644d-4e74-98cb-5be490cb81e3", "plugin_source": "official" }, "order": 0, "mode": 0, "inputs": [ { "locked": false, "name": "策略代码", "type": "string", "widget": { "name": "策略代码" }, "boundingRect": [ -10010, -10010, 15, 20 ], "pos": [ 10, 36 ], "link": null, "hide": true, "fieldName": "code" } ], "outputs": [ { "locked": false, "name": "策略代码", "type": "string", "boundingRect": [ 654.3883056640625, 406.9967346191406, 20, 20 ], "links": [ 6 ], "hide": false, "fieldName": "code" } ], "title": "Python代码输入", "properties": { "策略代码": "from panda_factor import *\n\n\nclass VolumeCompositeFactor(Factor):\n def calculate(self, factors):\n volume = factors['volume']\n close = factors['close']\n\n # 1)基础量能:相对20日平均成交量(放量)\n vol_ma20 = MA(volume, 20)\n # 防止除零\n vol_ma20_safe = IF(vol_ma20 == 0, 1, vol_ma20)\n vol_ratio_20 = volume / vol_ma20_safe\n\n # 2)量能趋势:最近20日成交量斜率(线性回归斜率,越大代表放量趋势越明显)\n vol_slope_20 = SLOPE(volume, 20)\n\n # 3)价量配合:近20日收益与成交量的相关性(价量齐升/齐跌的趋势)\n ret_1 = RETURNS(close, 1)\n price_vol_corr_20 = CORRELATION(ret_1, volume, 20)\n\n # 4)量能稳定性:近20日成交量波动率(波动越大越不稳定,取负向)\n vol_std_20 = STDDEV(volume, 20)\n vol_stability = -vol_std_20\n\n # 5)各部分截面标准化\n s_vol_ratio = ZSCORE(vol_ratio_20)\n s_vol_slope = ZSCORE(vol_slope_20)\n s_price_vol_corr = ZSCORE(price_vol_corr_20)\n s_vol_stability = ZSCORE(vol_stability)\n\n # 6)综合成交量因子:更偏重放量与趋势,对稳定性做惩罚\n composite = (\n 0.4 * s_vol_ratio +\n 0.3 * s_vol_slope +\n 0.2 * s_price_vol_corr +\n 0.1 * s_vol_stability\n )\n\n # 7)最终再做一次截面缩放,控制在[-1,1]\n result = SCALE(composite)\n return result\n" }, "color": "#232", "bgcolor": "#353", "_fullTitle": "Python代码输入" }, { "id": 4, "type": "FactorAnalysisChartControl", "pos": [ 1392.713623046875, 398.421875 ], "size": [ 210, 75 ], "flags": { "uuid": "1a72cd56-5d53-4acd-b925-d25438dbeb13", "plugin_source": "official" }, "order": 3, "mode": 0, "inputs": [ { "locked": false, "name": "分析结果", "type": "string", "widget": null, "boundingRect": [ 1392.713623046875, 402.421875, 20, 20 ], "link": 4, "hide": false, "fieldName": "task_id" } ], "outputs": [ { "locked": false, "name": "图表绘制", "type": "string", "boundingRect": [ 1583.713623046875, 402.421875, 20, 20 ], "links": null, "hide": false, "fieldName": "task_id" }, { "locked": false, "name": "Result Json", "type": "string", "boundingRect": [ 1583.713623046875, 422.421875, 20, 20 ], "links": null, "hide": false, "fieldName": "result_json" } ], "title": "因子分析结果", "properties": { "分析结果": "error" }, "color": "#323", "bgcolor": "#535", "_fullTitle": "因子分析结果" } ], "links": [ [ 2, 5, 0, 3, 0, "dataframe" ], [ 4, 3, 0, 4, 0, "string" ], [ 6, 7, 0, 5, 2, "string" ] ], "groups": [ ], "config": { }, "extra": { "ds": { "scale": 1, "offset": [ -94.79583740234375, -111.45843505859375 ] } }, "version": 0.4 }, "nodes": [ { "uuid": "5e2b63bd-8731-4c15-adce-5b4661bb14ad", "title": "综合因子构建节点", "name": "FactorBuildProControl", "type": "FactorBuildProControl", "litegraph_id": 5, "positionX": 764.1927490234375, "positionY": 393.6250915527344, "width": 210, "height": 179, "static_input_data": { "start_date": "20240101", "end_date": "20251201", "code": "", "market": "股票", "type": "Python", "direction": "正向" }, "model_path": "", "output_db_id": null }, { "uuid": "fa9b4ba4-4ab2-42f1-b3dd-046e2f3b88b1", "title": "因子分析", "name": "FactorAnalysisControl", "type": "FactorAnalysisControl", "litegraph_id": 3, "positionX": 1075.444091796875, "positionY": 400.562744140625, "width": 210, "height": 142, "static_input_data": { "adjustment_cycle": "1", "group_number": "5", "factor_direction": "0" }, "model_path": "", "output_db_id": null }, { "uuid": "b393b3ca-644d-4e74-98cb-5be490cb81e3", "title": "Python代码输入", "name": "CodeControl", "type": "CodeControl", "litegraph_id": 7, "positionX": 463.3883056640625, "positionY": 402.9967346191406, "width": 210, "height": 63, "static_input_data": { "code": "from panda_factor import *\n\n\nclass VolumeCompositeFactor(Factor):\n def calculate(self, factors):\n volume = factors['volume']\n close = factors['close']\n\n # 1)基础量能:相对20日平均成交量(放量)\n vol_ma20 = MA(volume, 20)\n # 防止除零\n vol_ma20_safe = IF(vol_ma20 == 0, 1, vol_ma20)\n vol_ratio_20 = volume / vol_ma20_safe\n\n # 2)量能趋势:最近20日成交量斜率(线性回归斜率,越大代表放量趋势越明显)\n vol_slope_20 = SLOPE(volume, 20)\n\n # 3)价量配合:近20日收益与成交量的相关性(价量齐升/齐跌的趋势)\n ret_1 = RETURNS(close, 1)\n price_vol_corr_20 = CORRELATION(ret_1, volume, 20)\n\n # 4)量能稳定性:近20日成交量波动率(波动越大越不稳定,取负向)\n vol_std_20 = STDDEV(volume, 20)\n vol_stability = -vol_std_20\n\n # 5)各部分截面标准化\n s_vol_ratio = ZSCORE(vol_ratio_20)\n s_vol_slope = ZSCORE(vol_slope_20)\n s_price_vol_corr = ZSCORE(price_vol_corr_20)\n s_vol_stability = ZSCORE(vol_stability)\n\n # 6)综合成交量因子:更偏重放量与趋势,对稳定性做惩罚\n composite = (\n 0.4 * s_vol_ratio +\n 0.3 * s_vol_slope +\n 0.2 * s_price_vol_corr +\n 0.1 * s_vol_stability\n )\n\n # 7)最终再做一次截面缩放,控制在[-1,1]\n result = SCALE(composite)\n return result\n" }, "model_path": "", "output_db_id": null }, { "uuid": "1a72cd56-5d53-4acd-b925-d25438dbeb13", "title": "因子分析结果", "name": "FactorAnalysisChartControl", "type": "FactorAnalysisChartControl", "litegraph_id": 4, "positionX": 1392.713623046875, "positionY": 398.421875, "width": 210, "height": 75, "static_input_data": { "task_id": "error" }, "model_path": "", "output_db_id": null } ], "links": [ { "uuid": "f2b4dfd7-0cec-4264-a954-f8018ecdee9d", "litegraph_id": 5, "status": 1, "previous_node_uuid": "5e2b63bd-8731-4c15-adce-5b4661bb14ad", "next_node_uuid": "fa9b4ba4-4ab2-42f1-b3dd-046e2f3b88b1", "output_field_name": "df_factor", "input_field_name": "factor" }, { "uuid": "e1684b23-cd2e-4949-9c71-39865decc752", "litegraph_id": 3, "status": 1, "previous_node_uuid": "fa9b4ba4-4ab2-42f1-b3dd-046e2f3b88b1", "next_node_uuid": "1a72cd56-5d53-4acd-b925-d25438dbeb13", "output_field_name": "task_id", "input_field_name": "task_id" }, { "uuid": "e5328032-5457-456e-a993-c14987cbe9e5", "litegraph_id": 7, "status": 1, "previous_node_uuid": "b393b3ca-644d-4e74-98cb-5be490cb81e3", "next_node_uuid": "5e2b63bd-8731-4c15-adce-5b4661bb14ad", "output_field_name": "code", "input_field_name": "code" } ], "id": "695a37b558d90233bc1a5999" }
最后一次编辑于 10天前 3

13916371636

不理解这里分组是怎样分的

2026-03-11 07:55:58      回复

林木茂盛

按照因子值的大小划分

2026-03-15 14:01:24 回复

推荐阅读