策略分享

量价背离因子策略

由bq6xpbvc创建,最终由bq6xpbvc 被浏览 15 用户

因子逻辑

量价背离是指股价与成交量的变化出现了“分歧”。当股价或指数在上升时,成交量减少,通常表示市场可能在隐约传递不好的信号。可以用“成交量加权价格”(VWAP)与成交量(VOLUME)的负相关性表示这种股市“冷场”现象。

\

因子构建&分析

  1. 数据构建:调用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,
}
  1. 因子排序与分组:将因子值从小到大排序,将数据分为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
  1. 因子处理:对因子进行取极值、标准化、中性化操作。
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
            )
  1. 分组分析:根据分组结果,统计各组的累计收益,观察不同因子值下的收益表现。
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组的因子累计收益率最高。数据显示:因子值越小,其累计收益越大。这表明,在该因子条件下,量价背离现象对市场走势具有一定的预测能力。

\

策略构建

基于以上的因子分析,可以构建一个简单的策略。

  1. 股票筛选:按照因子值进行升序排序,每天选取因子值最小的前50只股票。
  2. 持仓调整:每五个交易日换仓。

在首次回测结果中,通过分析策略的持仓可以发现,小盘股交易量较大,存在较高风险。因此,可以尝试做个优化,将股票池限定为大市值股票,采取量价背离,进一步提升收益、降低回撤风险。

对修改后的回测结果进行分析,优化后的策略不仅有效地提升了收益率,还显著降低了最大回撤,表现出更高的稳健性与持续性。

\

策略实现

https://bigquant.com/codesharev3/a20d9c1a-c84c-4796-bc99-115432e380a1

\

{link}