QMT之WorldQuant 量化因子库实战(下):经典量价因子的 2 大进阶扩展与 Python 实现
前言
在上一篇《WorldQuant 量化因子库深度解析:101 Alphas 经典量价因子原理与 Python 实现》中,我们完整拆解了 WorldQuant 101 Alphas 中经典的量价背离因子,从底层逻辑到 Python 实现做了全流程讲解。而在量化实战中,单一基础因子往往很难适配复杂多变的市场环境,对基础因子做合理的扩展与优化,才是提升策略收益、降低回撤的核心关键。
本篇我们书接上回,针对基础量价相关因子,分享 2 个在 A 股实战中验证有效、行业内高频使用的因子扩展方案,从公式思路、底层逻辑到 Python 代码实现、实战价值做全维度拆解,帮助大家掌握量价因子的进阶优化方法,快速搭建属于自己的 Alpha 因子体系。
本文适合人群:
- 已入门量化投资,想要进阶因子优化的开发者
- 对 WorldQuant 101 Alphas 因子库感兴趣的从业者
- 专注 A 股量价策略、短线交易的投资者
- 想要丰富多因子模型 Alpha 来源的量化爱好者
注:本文代码复用了上篇实现的
correlation滚动相关系数核心函数,未看过上篇的读者可先回顾基础函数实现,保证本文代码可直接复用运行。
一、量价因子的扩展核心逻辑
基础的量价因子-correlation(open, volume, 10),核心是通过单时间窗口的开盘价与成交量相关性,捕捉量价背离的拐点信号。但在 A 股实战中,这个基础版本存在两个可优化的核心方向:
- 周期维度:仅用单一 10 日窗口,无法捕捉市场中「短期异动、中期趋势分化」的结构性机会,而这恰恰是 A 股题材轮动、事件驱动行情中的核心盈利来源。
- 价格维度:仅用开盘价计算相关性,无法反映价格的真实涨跌动能 —— 真正推动趋势形成的,不是开盘价的绝对高低,而是标的连续的收益累积效应。
本文分享的两个进阶扩展因子,正是分别从多周期结构差异和收益动能匹配两个核心维度,对基础因子做升级优化,大幅提升因子在 A 股市场的实战有效性。
二、扩展 1:短中期量价结构差因子(短强长弱型)
这是量化实战中最常用的因子升级方法,通过长短期两个时间窗口的相关性差值,精准捕捉市场中「短期资金异动」的机会点,尤其适配 A 股节奏快、题材轮动频繁的市场特征。
2.1 因子公式与核心思路
因子核心公式如下:
Alpha=correlation(open,volume,5)−correlation(open,volume,20)
公式参数说明:
correlation(open, volume, 5):短期 5 日窗口,开盘价与成交量的滚动皮尔逊相关系数correlation(open, volume, 20):中期 20 日窗口,开盘价与成交量的滚动皮尔逊相关系数- 核心逻辑:通过短期与中期的相关性差值,刻画量价结构的周期分化
2.2 因子的直观含义与底层逻辑
这个因子的核心是捕捉 **「短期量价共振,中期量价背离 / 弱相关」** 的特殊量价结构,这种结构通常对应三类典型的市场场景:
- 题材刺激、事件驱动:标的突发利好消息,短期资金集中进场,形成短期量价共振,但中期趋势尚未形成统一预期;
- 情绪加速阶段:标的进入主升浪前的资金预热,短期成交量快速放大,价格与成交量形成强同步;
- 资金短期集中介入:主力资金短期建仓,形成短期量价同步,但中期持仓结构尚未发生根本变化。
这种短长周期的量价结构分化,往往预示着标的即将迎来短期趋势性行情,是短线策略中非常有效的先行信号。
2.3 因子的 Python 完整实现
基于上篇的基础函数,我们可以极简实现这个短中期量价结构差因子,代码具备完善的兼容性,可直接接入各类行情数据源:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 中文显示设置
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False
# 复用上篇的滚动相关系数核心函数
def correlation(x, y, d):
"""
计算两个时间序列的滚动皮尔逊相关系数(rolling correlation)
参数:
x: pd.Series 或 np.array,第一个时间序列
y: pd.Series 或 np.array,第二个时间序列
d: int,滚动计算的时间窗口大小,单位:天
返回:
pd.Series,每一天对应的过去d天的相关系数
"""
x_series = pd.Series(x)
y_series = pd.Series(y)
if len(x_series) != len(y_series):
raise ValueError("输入的两个时间序列x和y长度必须相同!")
return x_series.rolling(window=d).corr(y_series)
# 短中期量价结构差因子实现
def correlation_short_long(df, short_window=5, long_window=20):
"""
计算短中期量价结构差因子
参数:
df: pd.DataFrame,必须包含open(开盘价)、volume(成交量)列
short_window: int,短期滚动窗口,默认5天
long_window: int,中期滚动窗口,默认20天
返回:
pd.Series,短中期量价结构差因子值
"""
df = df.copy()
# 计算短期、中期量价相关系数
corr_short = correlation(df['open'], df['volume'], short_window)
corr_long = correlation(df['open'], df['volume'], long_window)
# 计算差值得到最终因子
return corr_short - corr_long
2.4 因子使用示例与可视化解读
我们通过模拟行情数据,演示因子的调用与可视化效果,实际使用时替换为真实行情数据即可:
# ---------------------- 1. 模拟生成行情数据(替换为你的真实数据源即可) ----------------------
date_range = pd.date_range(start='2025-01-01', end='2025-10-31', freq='B')
np.random.seed(888)
# 模拟开盘价和成交量数据
open_price = np.cumsum(np.random.randn(len(date_range)) * 0.6) + 25
volume = np.random.randint(low=20000, high=800000, size=len(date_range))
# 构建行情DataFrame
df = pd.DataFrame({
'open': open_price,
'volume': volume
}, index=date_range)
# ---------------------- 2. 计算短中期量价结构差因子 ----------------------
df['alpha_short_long'] = correlation_short_long(df, short_window=5, long_window=20)
# ---------------------- 3. 因子与股价可视化 ----------------------
fig, ax1 = plt.subplots(figsize=(16, 8), dpi=100)
# 左轴:股票开盘价走势
ax1.set_xlabel('日期', fontsize=12)
ax1.set_ylabel('股票开盘价', fontsize=12, color='#d62728')
line1 = ax1.plot(df.index, df['open'], color='#d62728', linewidth=2, label='开盘价')
ax1.tick_params(axis='y', labelcolor='#d62728')
ax1.grid(True, alpha=0.3)
# 右轴:短中期量价结构差因子
ax2 = ax1.twinx()
ax2.set_ylabel('短中期量价结构差因子', fontsize=12, color='#2ca02c')
line2 = ax2.plot(df.index, df['alpha_short_long'], color='#2ca02c', linewidth=1.5, linestyle='--', label='Alpha因子')
ax2.axhline(y=0, color='black', linestyle='-', alpha=0.5)
ax2.tick_params(axis='y', labelcolor='#2ca02c')
# 合并图例与图表设置
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left', fontsize=12)
plt.title('短中期量价结构差因子与股价走势对比', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()
从因子可视化结果中可以清晰看到:当因子值出现显著正向峰值时,意味着标的短期量价共振显著强于中期,往往对应着短期资金集中介入,后续股价大概率会出现阶段性的趋势行情,完美适配 A 股短线题材交易的核心需求。
三、扩展 2:基于收益的量价动能因子
如果说第一个扩展是从「周期维度」优化,那第二个扩展就是从「价格本质」升级 —— 把基础公式中的开盘价,替换为标的的涨跌幅收益率,直接升级为行业内高频使用的量价动能因子,能更敏锐地判断趋势的健康度与可持续性。
3.1 因子公式与核心升级思路
因子核心公式如下:
Alpha=correlation(returns,volume,10)
公式核心升级点:
- 将基础公式中的
open开盘价,替换为returns标的日涨跌幅收益率 - 保留 10 日核心计算窗口,无需取反,因子值的正负直接对应趋势的健康度
- 核心逻辑:通过收益率与成交量的相关性,直接刻画价格涨跌动能与成交量的匹配度
3.2 因子的直观含义与趋势解读
这个因子的核心是判断趋势的质量与可持续性,通过量能与涨跌的匹配度,区分「健康趋势」与「虚假趋势」:
- 因子值为正(正相关):当标的「上涨的时候放量、下跌的时候缩量」,收益率与成交量呈现正相关。这种结构说明:上涨有成交量配合,资金做多意愿强烈;下跌时成交量萎缩,抛压不足,是健康的上涨趋势,后续延续性极强。
- 因子值为负(负相关):当标的「上涨不放量、下跌却放量」,收益率与成交量呈现负相关。这种结构说明:上涨没有资金认可,量能无法支撑价格涨幅;下跌时恐慌盘涌出,抛压极大,是质量极差的趋势,极易出现反转和大幅回撤。
3.3 因子的 Python 完整实现
该因子的实现同样极简,基于基础相关系数函数,仅需新增收益率计算环节,即可完成因子开发:
def correlation_return_volume(df, window=10):
"""
计算基于收益的量价动能因子
参数:
df: pd.DataFrame,必须包含close(收盘价)、volume(成交量)列
window: int,滚动计算的时间窗口,默认10天
返回:
pd.Series,量价动能因子值
"""
df = df.copy()
# 计算标的日涨跌幅收益率
daily_return = df['close'].pct_change()
# 计算收益率与成交量的滚动相关系数,得到最终动能因子
return correlation(daily_return, df['volume'], window)
3.4 因子使用示例与可视化解读
同样通过模拟行情数据,演示因子的调用与可视化效果:
# ---------------------- 1. 模拟生成行情数据(替换为你的真实数据源即可) ----------------------
date_range = pd.date_range(start='2025-01-01', end='2025-10-31', freq='B')
np.random.seed(999)
# 模拟收盘价和成交量数据
close_price = np.cumsum(np.random.randn(len(date_range)) * 0.4) + 30
volume = np.random.randint(low=50000, high=1000000, size=len(date_range))
# 构建行情DataFrame
df = pd.DataFrame({
'close': close_price,
'volume': volume
}, index=date_range)
# ---------------------- 2. 计算基于收益的量价动能因子 ----------------------
df['alpha_return'] = correlation_return_volume(df, window=10)
# ---------------------- 3. 因子与股价可视化 ----------------------
fig, ax1 = plt.subplots(figsize=(16, 8), dpi=100)
# 左轴:股票收盘价走势
ax1.set_xlabel('日期', fontsize=12)
ax1.set_ylabel('股票收盘价', fontsize=12, color='#ff7f0e')
line1 = ax1.plot(df.index, df['close'], color='#ff7f0e', linewidth=2, label='收盘价')
ax1.tick_params(axis='y', labelcolor='#ff7f0e')
ax1.grid(True, alpha=0.3)
# 右轴:量价动能因子
ax2 = ax1.twinx()
ax2.set_ylabel('量价动能因子', fontsize=12, color='#9467bd')
line2 = ax2.plot(df.index, df['alpha_return'], color='#9467bd', linewidth=1.5, linestyle='--', label='Alpha因子')
ax2.axhline(y=0, color='black', linestyle='-', alpha=0.5)
ax2.tick_params(axis='y', labelcolor='#9467bd')
# 合并图例与图表设置
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left', fontsize=12)
plt.title('基于收益的量价动能因子与股价走势对比', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()
相比于基础的开盘价版本,这个扩展因子的核心优势在于:它直接锚定了价格涨跌的核心动能,而非价格的绝对数值,能更敏锐地捕捉到趋势的内在质量变化,提前预判趋势的延续与反转,是行业内趋势跟踪策略、动量策略中使用频次极高的核心因子。
四、两大进阶因子的适用场景与组合使用技巧
4.1 两个进阶因子核心差异对比
为了方便大家根据自己的策略风格选择,我们通过表格清晰对比两个因子的核心差异:
| 因子名称 | 核心逻辑 | 适用策略风格 | 核心优势 |
|---|---|---|---|
| 短中期量价结构差因子 | 捕捉短长周期量价结构分化,定位短期资金异动 | 短线交易、题材轮动、事件驱动策略 | 适配 A 股快节奏市场,精准抓短期行情启动点 |
| 基于收益的量价动能因子 | 刻画涨跌动能与量能的匹配度,判断趋势健康度 | 趋势跟踪、动量策略、中长线波段交易 | 精准识别趋势真假,提前预判趋势反转,稳定性更强 |
4.2 实盘组合使用技巧
在实战中,两个因子并非二选一,组合使用能实现更好的策略效果,分享 2 个经过实战验证的组合用法:
- 趋势 + 短线共振选股:先用「量价动能因子」筛选出因子值为正、趋势健康的标的,缩小选股范围;再用「短中期量价结构差因子」筛选出短期资金异动的标的,作为最终的买入标的,兼顾趋势的安全性与短线的爆发力。
- 多因子模型权重分配:在多因子模型中,给「量价动能因子」分配更高的核心权重,作为 Alpha 的主要来源;给「短中期量价结构差因子」分配辅助权重,作为短期增强因子,既能保证模型的长期稳定性,又能提升短期收益表现。
五、总结与风险提示
本文核心总结
- 基础量价因子的核心优化方向,主要来自周期维度的多周期分化和价格维度的动能本质两大方向,本文的两个进阶扩展因子,正是这两个方向的经典实战方案。
- 短中期量价结构差因子,通过长短期窗口的相关性差值,精准捕捉 A 股题材驱动、资金异动的短线机会,完美适配 A 股的市场节奏特征。
- 基于收益的量价动能因子,锚定价格涨跌的核心动能,能更精准地判断趋势的健康度与可持续性,是行业内高频使用的经典量价因子版本,稳定性与实战性远超基础版本。
- 两个因子可单独使用,也可组合构建多因子体系,新手可直接复用本文代码,替换真实行情数据即可完成回测与优化。
风险提示
- 历史因子表现不代表未来收益,量化因子存在策略失效、市场环境变化导致逻辑失灵的风险,实盘使用前需经过充分的样本外验证与参数敏感性测试。
- 本文内容仅为量化技术分享,不构成任何投资建议,股市有风险,入市需谨慎。
- 因子回测效果需充分考虑交易手续费、滑点、标的流动性等实盘摩擦成本,避免回测与实盘出现大幅偏差。
后续我会持续更新 WorldQuant 101 Alphas 系列因子的原理拆解与 Python 实战实现,包括更多行业内常用的因子优化方案、因子中性化处理、多因子模型构建等核心内容,欢迎大家关注、点赞、收藏,一起交流量化投资心得!
更多推荐



所有评论(0)