量价背离因子
由bq6xpbvc创建,最终由small_q 被浏览 105 用户
因子逻辑
量价背离是指股价与成交量的变化出现了“分歧”。当股价或指数在上升时,成交量减少,通常表示市场可能在隐约传递不好的信号。可以用“成交量加权价格”(VWAP)与成交量(VOLUME)的负相关性表示这种股市“冷场”现象。
\
因子构建&分析
- 数据构建:调用VWAP和Volume数据,将其转换为因子。
alpha_test = {
"alpha_class":"test",
"alpha_name":"teat_0001",
"alpha_name_chinese":"价量相关性波动性因子",
"alpha_sql":"""
SELECT date, instrument,
m_corr(wap_11_vwap_buy, volume, 30) AS factor
FROM cn_stock_wap
INNER JOIN cn_stock_prefactors USING (date, instrument)
""",
"alpha_desc":" ",
"group_num":10,
"instruments":"全市场",
"benchmark":"中证500",
"data_process":True,
"is_bigvip":False,
"is_featured":False,
}
- 因子排序与分组:将因子值从小到大排序,将数据分为10组,其中0组为因子值最小的一组,9组为因子值最大的一组。
def cut(df, group_num=10):
df = df.drop_duplicates('factor')
df['group'] = pd.qcut(df['factor'], q=group_num, labels=False, duplicates='drop')
df = df.dropna(subset=['group'], how='any')
df['group'] = df['group'].apply(int).apply(str)
return df
- 因子处理:对因子进行取极值、标准化、中性化操作。
data_alpha_process AS (
SELECT
date,
instrument,
factor,
clip(factor, c_avg(factor) - 3 * c_std(factor), c_avg(factor) + 3 * c_std(factor)) AS clipped_factor,
c_normalize(clipped_factor) AS normalized_factor,
c_neutralize(normalized_factor, sw2021_level1, LOG(total_market_cap)) AS neutralized_factor,
FROM data_alpha_origin JOIN cn_stock_factors_base USING (date, instrument)
WHERE 1=1
AND {pool_dict[pool_class]}
AND amount > 0
AND st_status = 0
AND trading_days > 252
AND (instrument LIKE '%SH' OR instrument LIKE '%SZ')
QUALIFY COLUMNS(*) IS NOT NULL
ORDER BY date, instrument
)
- 分组分析:根据分组结果,统计各组的累计收益,观察不同因子值下的收益表现。
def get_group_cumret(self):
# 获取基准收益率
def get_bm_ret():
bm_dict = {
"中证500":"000905.SH",
"中证1000":"000852.SH",
"沪深300":"000300.SH",
}
sql = f"""
SELECT
date,instrument, (close - m_Lag(close,1)) / m_LAG(close, 1) as benchmark_ret
FROM cn_stock_index_bar1d
WHERE date BETWEEN DATE '{self.sd}' - INTERVAL 10 DAY AND '{self.ed}'
AND instrument = '{bm_dict[self.params['benchmark']]}'
"""
bm_ret = dai.query(sql).df()
return bm_ret
# 基准收益率
bm_ret = get_bm_ret()
bm_ret = bm_ret.set_index('date')
# 分组收益率
groupret_data = self.group_data[['date','group','daily_ret']].groupby(['date','group'], group_keys=False).apply(lambda x:np.nanmean(x)).reset_index()
groupret_data.rename(columns={0:'g_ret'}, inplace=True)
groupret_pivotdata = groupret_data.pivot(index='date', values='g_ret', columns='group')
groupret_pivotdata['ls'] = groupret_pivotdata[str(self.params['group_num']-1)] - groupret_pivotdata['0']
groupret_pivotdata['bm'] = bm_ret['benchmark_ret']
groupret_pivotdata = groupret_pivotdata.shift(1)
# 分组累计收益率
groupcumret_pivotdata = groupret_pivotdata.cumsum()
# 返回分组收益率与分组累计收益率
return groupret_pivotdata, groupcumret_pivotdata
如图所示,第0-3组的因子累计收益率最高。数据显示:因子值越小,其累计收益越大。这表明,在该因子条件下,量价背离现象对市场走势具有一定的预测能力。
\
策略构建
基于以上的因子分析,可以构建一个简单的策略。
- 股票筛选:按照因子值进行升序排序,每天选取因子值最小的前50只股票。
- 持仓调整:每五个交易日换仓。
在首次回测结果中,通过分析策略的持仓可以发现,小盘股交易量较大,存在较高风险。因此,可以尝试做个优化,将股票池限定为大市值股票,采取量价背离,进一步提升收益、降低回撤风险。
对修改后的回测结果进行分析,优化后的策略不仅有效地提升了收益率,还显著降低了最大回撤,表现出更高的稳健性与持续性。
\
策略源码
{{pro}}
https://bigquant.com/codesharev3/a20d9c1a-c84c-4796-bc99-115432e380a1
\