问题描述
多空指标如何量化:
在蜡烛图里,开盘价,最高价,收盘价,最低价可以比较好的呈现多空表征。但是这个表征有个什么方式可以量化了?即比较量化的输出多空的因子数。
用途:考虑使用该多空因子数和涨跌幅进行相关性学习。
解决方案
在量化交易中,将蜡烛图(K线)的开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)转化为具体的数值因子,是进行机器学习和相关性分析的常见且有效的方法。以下为您提供几种量化多空表征的方法,以及如何在 JoinQuant(聚宽)平台上实现它们。
一、 基于 OHLC 的基础多空特征构造
最直接的方法是通过计算 K 线各部分的比例来量化多空力量的博弈:
- 多空对比度 (Bull/Bear Ratio)
公式:(Close - Open) / (High - Low)
含义:衡量实体占整个价格波动区间的比例。值为正且接近1表示多头绝对控盘;值为负且接近-1表示空头绝对控盘。 - 多头反击力度 (Lower Shadow Ratio)
公式:(Min(Close, Open) - Low) / (High - Low)
含义:下影线占整体波动的比例,代表下跌后多头将价格推高的力量。 - 空头打压力度 (Upper Shadow Ratio)
公式:(High - Max(Close, Open)) / (High - Low)
含义:上影线占整体波动的比例,代表上涨后空头将价格压低的力量。
二、 经典多空技术指标量化
金融工程领域已有许多成熟的基于 OHLC 的多空指标,您可以直接将其作为因子:
- WVAD (威廉变异离散量)
公式:(Close - Open) / (High - Low) * Volume
含义:结合了多空对比度和成交量,量化了多空双方在当天的真实资金博弈结果。 - ARBR (人气意愿指标)
- AR (人气指标) =
Sum(High - Open, N) / Sum(Open - Low, N) - BR (意愿指标) =
Sum(High - Ref(Close, 1), N) / Sum(Ref(Close, 1) - Low, N)
含义:AR 衡量开盘后的多空动能,BR 衡量隔夜及盘中的多空意愿。
- AR (人气指标) =
- Elder-Ray Index (多空力道)
- Bull Power (多头力道) =
High - EMA(Close, N) - Bear Power (空头力道) =
Low - EMA(Close, N)
- Bull Power (多头力道) =
三、 在 JoinQuant 中的实现代码
在 JoinQuant 中,您可以通过两种方式获取这些多空因子:一是自己通过行情数据计算,二是直接调用聚宽的因子库。
方法1:自定义计算基础多空特征
import pandas as pd
from jqdata import *
def get_custom_long_short_factors(security, start_date, end_date):
# 获取 OHLC 数据
df = get_price(security, start_date=start_date, end_date=end_date,
frequency='daily', fields=['open', 'close', 'high', 'low'])
# 避免分母为0
range_hl = df['high'] - df['low']
range_hl[range_hl == 0] = 0.0001
# 1. 多空对比度
df['ls_ratio'] = (df['close'] - df['open']) / range_hl
# 2. 多头反击力度 (下影线比例)
df['bull_force'] = (df[['close', 'open']].min(axis=1) - df['low']) / range_hl
# 3. 空头打压力度 (上影线比例)
df['bear_force'] = (df['high'] - df[['close', 'open']].max(axis=1)) / range_hl
# 计算次日涨跌幅作为机器学习的 Label (Target)
df['next_day_return'] = df['close'].pct_change().shift(-1)
return df[['ls_ratio', 'bull_force', 'bear_force', 'next_day_return']].dropna()
# 示例调用
factors_df = get_custom_long_short_factors('000001.XSHE', '2023-01-01', '2023-10-01')
print(factors_df.head())
方法2:直接调用 JoinQuant 因子库
聚宽因子库 (jqfactor) 已经内置了大量多空情绪因子,您可以直接提取用于相关性学习。
from jqfactor import get_factor_values
def get_jq_long_short_factors(security_list, start_date, end_date):
# 定义需要获取的多空因子
# WVAD: 威廉变异离散量
# ARBR: 人气意愿指标差值
# bull_power: 多头力道
# bear_power: 空头力道
factors = ['WVAD', 'ARBR', 'bull_power', 'bear_power']
# 获取因子值
factor_data = get_factor_values(securities=security_list,
factors=factors,
start_date=start_date,
end_date=end_date)
return factor_data
# 示例调用
factor_dict = get_jq_long_short_factors(['000001.XSHE'], '2023-01-01', '2023-10-01')
# 查看多头力道因子
print(factor_dict['bull_power'].head())
四、 机器学习应用建议
- 数据平滑与标准化:单日的 K 线多空因子可能噪音较大,建议在输入模型前,对其进行移动平均(如计算 5 日均值)或使用
jqfactor.standardlize进行标准化处理。 - 结合成交量:单纯的价格多空表征如果不结合成交量,往往缺乏置信度。建议将上述因子与成交量(Volume)或换手率(Turnover)相乘,或者作为独立的特征一起输入模型。
- 相关性检验:在输入复杂模型前,可以使用 Pandas 的
corr()函数或 Spearman 秩相关系数,初步检验这些多空因子与next_day_return(次日涨跌幅)的线性或单调相关性。