今天给大家分享一个多策略组合的量化交易系统,将国证2000小市值选股策略与沪深300白马股价值策略相结合,通过子账户独立管理,实现收益稳定增长。
策略概述
这个策略的核心价值是:"小市值策略提供攻击锐度,价值策略提供防守厚度",通过两个完全独立的子策略分别管理资金:
- 国证2000掘金策略 :专注小市值股票,在特定交易周期内捕捉短线机会
- 价值优选策略:从沪深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 df: df['a1_p']*df['a1_v'] + ... + df['a5_p']*df['a5_v'],
buymoney=lambda df: df['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.20: return "cold" # 市场低位
elif market_height > 0.90: return "hot" # 市场高位
elif max(index300[-60:]) / min(index300) > 1.20: return "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
)
资金调配逻辑:
- 小市值策略设置100万上限,控制风险敞口
- 超额收益自动转入稳健的价值策略
- 实现"小盘创收,大盘守成"的良性循环
策略优势与实盘价值
1. 风险分散
- 大小盘风格互补
- 长短线周期搭配
- 不同选股逻辑对冲
2. 适应性强大
- 牛市:价值策略受益于白马股上涨
- 震荡市:小市值策略捕捉结构性机会
- 熊市:严格止损机制保护本金
3. 执行精细
- 集合竞价数据利用
- 动态仓位调整
- 多层止盈止损
4. 风控完善
- 个股层面:技术面+基本面+资金面三重风控
- 组合层面:子账户隔离+资金上限控制
- 系统层面:大盘环境判断+动态调仓
回测表现关键点
从原策略的回测结果看,这种双策略组合表现出:
- 稳定收益曲线:年化收益约15-25%
- 较低回撤:最大回撤控制在20%以内
- 胜率较高:小市值策略月度胜率约60-70%
实盘注意事项
- 流动性考虑:小市值策略需注意个股流动性
- 交易成本:短线交易需充分考虑佣金和滑点
- 数据延迟:集合竞价数据获取的实时性
- 仓位管理:根据资金量适当调整单票仓位
总结
这个双策略组合的核心价值在于:
"小市值策略提供进攻锐度,价值策略提供防守厚度"
通过科学的资金分配、精细的选股逻辑和严格的风控体系,实现了收益与风险的较好平衡。特别适合有一定资金量、希望获得稳定超额收益的投资者。
因源码过长,获取全部源码,请移步gzh:量化学习实战笔记
免责声明:本文仅分享量化策略逻辑,不构成任何投资建议。量化交易存在风险,实盘前请充分回测和模拟交易。