直播福利-经典策略1-成交量综合因子

林木茂盛林木茂盛··871 浏览

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

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"
}

评论 1

  • 139****1636
    139****1636

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

0 / 2000