双剑合璧:国证2000掘金+白马价值策略的完美结合

91 阅读7分钟

今天给大家分享一个多策略组合的量化交易系统,将国证2000小市值选股策略与沪深300白马股价值策略相结合,通过子账户独立管理,实现收益稳定增长。

image.png

策略概述

这个策略的核心价值是:"小市值策略提供攻击锐度,价值策略提供防守厚度",通过两个完全独立的子策略分别管理资金:

  1. 国证2000掘金策略 :专注小市值股票,在特定交易周期内捕捉短线机会
  2. 价值优选策略:从沪深300中筛选白马股,进行中长线价值投资

资金分配与子账户架构

# 资金分配比例
- 子账户0(现金池):0% - 用于资金调配
- 子账户1(策略3):50% - 国证2000掘金策略
- 子账户2(价值优选策略):50% - 白马价值策略

设计亮点:每个子策略独立运行,互不干扰,便于单独评估策略表现和风险控制。

策略一:国证2000掘金策略详解

1. 选股逻辑(六重筛选)

# 第一重:基础筛选
# 从国证2000指数(399303.XSHE)中剔除ST股
stocks = get_index_stocks('399303.XSHE', date=context.previous_date)
st_flags = get_extras('is_st', stocks, count=1, end_date=context.previous_date).T

国证2000特点:代表A股市场小盘股,成分股市值相对较小,波动性较大,适合短线策略。

# 第二重:基本面筛选("国九条"标准)
q = query(
    valuation.code,
    income.np_parent_company_owners,
    income.net_profit,
    income.operating_revenue,
    indicator.roe,
    indicator.roa
).filter(
    income.np_parent_company_owners > 0,  # 归母净利润为正
    income.net_profit > 0,                # 净利润为正
    income.operating_revenue > 1e8,       # 营业收入过亿
    indicator.roe > 0,                    # ROE为正
    indicator.roa > 0                     # ROA为正
)

筛选逻辑:即使在短线策略中,也注重基本面质量,避免踩雷。

# 第三重:技术面筛选
cond = (
    (last_data['close'] > last_data['prev_low']) &  # 收盘价高于前低
    (last_data['close'] > last_data['ma10']) &       # 站在10日均线上
    (last_data['volume'] > last_data['prev_volume']) &  # 放量
    (last_data['volume'] < 10 * last_data['prev_volume'])  # 量能不异常
)

技术要点:价格在均线之上,温和放量,避免无量上涨或巨量异常。

2. 交易时机控制

策略只在特定时间段交易,这是风险控制的重要一环

def is_trade_period(self, context):
    today = context.current_dt.strftime('%m-%d')
    return (
        '01-15' <= today <= '01-31' or  # 年报预告期
        '04-15' <= today <= '04-30' or  # 一季报期
        '12-15' <= today <= '12-31'     # 年底调仓期
    )

设计理念:避开财报季前后的不确定性,只在信息相对透明时期操作。

3. 集合竞价策略

这是本策略的核心特色,利用集合竞价数据预判当日走势:

# 集合竞价买盘力量计算
auction = auction.assign(
    sellmoney=lambda dfdf['a1_p']*df['a1_v'] + ... + df['a5_p']*df['a5_v'],
    buymoney=lambda dfdf['b1_p']*df['b1_v'] + ... + df['b5_p']*df['b5_v']
)
auction['b_s'] = (auction['buymoney'] - auction['sellmoney']) / auction['sellmoney']

买入信号:买盘力量显著大于卖盘力量(b_s > 0),且开盘价在合理范围内。

4. 排序因子:换手率 × 开盘溢价

# 独创排序因子
df['factor'] = df['turnover_ratio'] * (df['open'] / df['pre_close'])
result = df.sort_values(by='factor', ascending=False)['code'].tolist()

因子逻辑

  • 高换手率:市场关注度高,流动性好
  • 开盘溢价:集合竞价表现强势
  • 两者结合:寻找既有热度又有实际资金推动的股票

5. 卖出与止损机制

# 三重卖出条件(或关系)
cond_not_limit_up = (df_history['last_price'] != df_history['high_limit'])
cond_break_ma7 = df_history['last_price'] < df_history['ma7']  # 跌破7日均线
cond_profit = (df_history['price']/df_history['avg_cost'] - 1)*100 > 0  # 有盈利
cond_yesterday_limit_up = (df_history['close'] == df_history['high_limit'])

sell_condition = cond_not_limit_up & (cond_break_ma7 | cond_profit | cond_yesterday_limit_up)

卖出策略特点

  • 7日均线止损:技术面破位即出
  • 盈利保护:只要有盈利,随时可出
  • 涨停打开:昨日涨停今日不开板继续持有,开板即出

策略二:价值优选策略(大白马组合)

1. 动态持仓管理

def update_stock_num(self, context):
    # 根据沪深300指数与10日均线的偏离度调整持仓数量
    diff = last_row['close'] - last_row['ma']
    
    self.buy_stock_count = 5 if diff >= 500 else \
                        4 if 200 <= diff < 500 else \
                        4 if -200 <= diff < 200 else \
                        3 if -500 <= diff < -200 else \
                        3

风控逻辑:市场越强持仓越集中,市场越弱持仓越分散,控制单票风险。

2. 三阶段市场温度识别

def market_temperature_calc(self, context):
    # 计算市场相对位置
    market_height = (np.mean(index300[-5:]) - min(index300)) / (max(index300) - min(index300))
    
    if market_height < 0.20return "cold"     # 市场低位
    elif market_height > 0.90return "hot"    # 市场高位
    elif max(index300[-60:]) / min(index300) > 1.20return "warm"  # 上涨趋势
    return "warm"

不同市场环境采用不同选股标准

  • 冷市场:侧重安全边际(PB<1,现金流/净利润>2)
  • 暖市场:平衡增长与估值
  • 热市场:侧重成长性(净利润增长>20%)

3. 综合评分体系

# ROE和ROA双因子加权评分
roe_inv_rank = df['roe'].rank(ascending=False)
roa_inv_rank = df['roa'].rank(ascending=False)
df['point'] = (self.roe_weight * roe_inv_rank + self.roa_weight * roa_inv_rank)

权重设置:ROE权重10,ROA权重6,体现对盈利质量的重视。

4. 多层止损体系

这是价值策略的核心风控,包括六重保护:

# 1. 大盘止损
avg_down_ratio = np.mean(down_ratios)
return avg_down_ratio <= self.stoploss_market  # 0.93

# 2. 个股止损止盈
if current_price >= cost_price * 2:  # 盈利100%止盈
    stocks_to_sell.append(stock)
elif current_price < cost_price * self.stoploss_limit:  # 亏损9%止损
    stocks_to_sell.append(stock)

# 3. MACD顶背离止损
if macd_result.get('dead'False):
    stocks_to_sell.append(stock)

# 4. 涨停打开卖出
if current_price < high_limit:
    stocks_to_sell.append(stock)

# 5. 异常放量卖出
if current_vol > self.HV_ratio * max_vol:  # 超过历史90%成交量
    stocks_to_sell.append(stock)

# 6. 换手率异常卖出
if avg_turnover < self.turnover_shrink or (current_turnover > self.turnover_expand and ratio > 2):
    stocks_to_sell.append(stock)

风控哲学:宁可错过,不可做错。多重信号验证,确保退出时点合理。

资金动态调配机制

def transfer_excess_funds(context):
    # 策略3资产超过100万时,超额部分调拨给策略2
    excess = max(0, sub3.total_value - 1000000)
    if excess > 0:
        transfer_cash(
            from_pindex=strategy3.subportfolio_index,
            to_pindex=strategy2.subportfolio_index,
            cash=transfer_amount
        )

资金调配逻辑

  1. 小市值策略设置100万上限,控制风险敞口
  2. 超额收益自动转入稳健的价值策略
  3. 实现"小盘创收,大盘守成"的良性循环

策略优势与实盘价值

1. 风险分散

  • 大小盘风格互补
  • 长短线周期搭配
  • 不同选股逻辑对冲

2. 适应性强大

  • 牛市:价值策略受益于白马股上涨
  • 震荡市:小市值策略捕捉结构性机会
  • 熊市:严格止损机制保护本金

3. 执行精细

  • 集合竞价数据利用
  • 动态仓位调整
  • 多层止盈止损

4. 风控完善

  • 个股层面:技术面+基本面+资金面三重风控
  • 组合层面:子账户隔离+资金上限控制
  • 系统层面:大盘环境判断+动态调仓

回测表现关键点

从原策略的回测结果看,这种双策略组合表现出:

  1. 稳定收益曲线:年化收益约15-25%
  2. 较低回撤:最大回撤控制在20%以内
  3. 胜率较高:小市值策略月度胜率约60-70%

实盘注意事项

  1. 流动性考虑:小市值策略需注意个股流动性
  2. 交易成本:短线交易需充分考虑佣金和滑点
  3. 数据延迟:集合竞价数据获取的实时性
  4. 仓位管理:根据资金量适当调整单票仓位

总结

这个双策略组合的核心价值在于:

"小市值策略提供进攻锐度,价值策略提供防守厚度"

通过科学的资金分配、精细的选股逻辑和严格的风控体系,实现了收益与风险的较好平衡。特别适合有一定资金量、希望获得稳定超额收益的投资者。

因源码过长,获取全部源码,请移步gzh:量化学习实战笔记


免责声明:本文仅分享量化策略逻辑,不构成任何投资建议。量化交易存在风险,实盘前请充分回测和模拟交易。