详细解读这个在A股市场表现优异的MACD顶背离小市值优选策略,并分析其降低回撤的机制、盈利特色以及实战效果。
策略核心逻辑解析
该策略的核心逻辑可以概括为以下几点:
- 选股时机**:每周二10:30进行选股操作,这个时间点经过回测验证效果最佳**
- 选股范围**:从中小板指数成分股中筛选,按市值升序排列后取前100只股票,最终选取前7只**
- 持仓数量**:固定持有7只小市值股票,保持相对均衡的资金分配**
- 风险控制**:**
- 大盘MACD顶背离信号出现时清仓
- 市场日跌幅超过一定阈值时全部止损
- 个股亏损超过12%时进行个股止损
- 四月和一月整月空仓(A股历史表现规律)
- 昨日涨停今日打开则卖出
下面我们逐一深入分析这些关键点。
选股机制详解
策略的选股流程具有明确的价值投资特征:
1. 获取中小板指数成分股
2. 过滤掉新股、ST股和北交所/科创板股票
3. 过滤停牌、涨停、跌停的股票
4. 按市值升序排列,选取前100只
5. 从中最终确定持有前7只小市值股票
为什么选择小市值股票?这与A股市场的特点密切相关。小市值股票往往具有以下特征:
- 成长空间大,有更高的上涨潜力
- 股价弹性大,对好消息反应更敏感
- 机构关注度相对较低,存在信息不对称的投资机会
- 在市场风格偏向成长时,表现往往更为突出
从代码实现看,作者通过下面这段代码完成选股:
def get_stock_list(context):
final_list = []
MKT_index = '399101.XSHE' # 中小板指数
initial_list = get_index_stocks(MKT_index)
initial_list = filter_new_stock(context, initial_list)
initial_list = filter_kcbj_stock(initial_list)
initial_list = filter_st_stock(initial_list)
initial_list = filter_paused_stock(initial_list)
initial_list = filter_limitup_stock(context, initial_list)
initial_list = filter_limitdown_stock(context, initial_list)
q = query(valuation.code, indicator.eps).filter(valuation.code.in_(initial_list)).order_by(valuation.market_cap.asc())
df = get_fundamentals(q)
stock_list = list(df.code)
stock_list = stock_list[:100]
final_list = stock_list[:2 * g.stock_num]
return final_list
风险控制机制分析
该策略最大的亮点在于其多层次的风险控制机制,这也是其能够在A股波动较大的市场环境中保持较低回撤的关键:
1. MACD顶背离清仓信号
策略利用MACD指标检测市场顶部信号。当中小板指数出现MACD顶背离时,认为市场可能即将转向下跌,此时策略会全部清仓,规避系统性风险:
def dapan(context):
print('大盘')
print(g.dbl)
if doDecide('399101.XSHE', context)['dead']:
g.dbl.append(True)
print('大盘顶背离,清仓')
for stock in context.portfolio.positions.keys():
order_target_value_(stock, 0)
else:
g.dbl.append(False)
MACD顶背离的判断逻辑是通过对比价格与MACD指标的走势关系来实现的:
suit['dead'] = grid.close[key2] < grid.close[key1] and \
grid.dif[key2] > grid.dif[key1] > 0 and \
grid.macd[-2] > 0 > grid.macd[-1]
当价格创新高,但MACD指标却出现下降,并且MACD柱由正转负时,判定为顶背离信号。这种信号在实战中往往能提前捕捉到市场转向。
2. 三重止损机制
策略实现了三层止损保护:
g.stoploss_strategy = 3 # 1为止损线止损,2为市场趋势止损, 3为联合1、2策略
g.stoploss_limit = 0.88 # 止损线,亏损超过12%止损
g.stoploss_market = 0.94 # 市场趋势止损参数,中小板指当日平均跌幅超过6%时清仓
联合策略的具体实现:
# 获取中小板指数当日收盘价和开盘价,计算整体市场走势
stock_df = get_price(security=get_index_stocks('399101.XSHE'), end_date=context.previous_date, frequency='daily', fields=['close', 'open'], count=1, panel=False)
down_ratio = (stock_df['close'] / stock_df['open']).mean()
# 如果市场整体大跌,全部清仓
if down_ratio <= g.stoploss_market:
g.reason_to_sell = 'stoploss'
log.debug("大盘惨跌,平均降幅{:.2%}".format(down_ratio))
for stock in context.portfolio.positions.keys():
order_target_value_(stock, 0)
else:
# 如果市场正常,检查个股止损
for stock in context.portfolio.positions.keys():
if context.portfolio.positions[stock].price < context.portfolio.positions[stock].avg_cost * g.stoploss_limit:
order_target_value_(stock, 0)
log.debug("收益止损,卖出{}".format(stock))
g.reason_to_sell = 'stoploss'
这种联合止损机制确保了:
- 在市场大幅下跌时能迅速全部清仓,规避系统性风险
- 在市场正常情况下,控制单只股票的最大亏损幅度
- 收益达到100%时自动止盈,锁定利润
3. 季节性规避
通过历史数据分析,策略发现A股市场在4月和1月往往表现不佳,因此在这两个月份选择完全空仓,避开市场的季节性弱势期:
def today_is_between(context):
today = context.current_dt.strftime('%m-%d')
if g.pass_april is True:
if (('04-01' <= today) and (today <= '04-30')) or (('01-01' <= today) and (today <= '01-30')):
return True
else:
return False
else:
return False
正是这个机制导致策略在2024年1月2日清仓,直到2024年2月6日(周二)才重新建仓,中间经历了一个相对较长的空仓期。这段空仓期恰好体现了策略的设计理念:宁可错过一些上涨机会,也要严格控制风险。
4. 涨停板风险管理
策略对涨停板股票采取了特殊处理:
- 当持有的股票前一日涨停,当天涨停打开时及时卖出,避免追高风险
- 当持有的股票前一日涨停,当天继续涨停则继续持有,把握强势股的持续上涨机会
def check_limit_up(context):
now_time = context.current_dt
if g.yesterday_HL_list != []:
for stock in g.yesterday_HL_list:
current_data = get_price(stock, end_date=now_time, frequency='1m', fields=['close', 'high_limit'], skip_paused=False, fq='pre', count=1, panel=False, fill_paused=True)
if current_data.iloc[0, 0] < current_data.iloc[0, 1]:
log.info("[%s]涨停打开,卖出" % (stock))
position = context.portfolio.positions[stock]
close_position(position)
g.reason_to_sell = 'limitup'
else:
log.info("[%s]涨停,继续持有" % (stock))
策略特色与盈利原因分析
1. 明确的选股逻辑
该策略的选股逻辑明确且有效:专注于小市值股票。在A股市场,小市值股票具有更高的成长性和弹性,尤其在市场情绪向好时,往往能获得超额收益。从统计数据来看,A股历史上小市值股票的平均收益率显著高于大市值股票。
2. 精确的风险控制
策略成功的关键在于其精确的风险控制:
- MACD顶背离判断市场转向
- 三重止损机制限制亏损
- 季节性规避避开弱市
- 涨停板管理把握强势股
这些风险控制手段使得策略能够在保持较高收益的同时,大幅降低回撤,提高夏普比率。
3. 周期选择与调仓频率优化
策略选择每周二10:30作为固定调仓时间,这一时间点经过回测验证效果最佳。通常周二市场情绪已经稳定,更适合做出理性决策。每周调仓的频率既不会过于频繁增加交易成本,也不会过于稀疏而错过市场机会。
4. 红利复利效应
策略通过持续低回撤高收益的特点,能够实现资金的稳健增长。复利效应在长期投资中发挥巨大作用,尤其是当策略能够有效控制回撤时,复利效果更为显著。
回撤控制分析
该策略在回撤控制方面表现突出,主要归功于以下几点:
1. MACD顶背离的市场趋势判断
MACD是经典的趋势跟踪指标,其顶背离信号在捕捉市场转向方面有着良好表现。通过代码实现:
def doDecide(stock, context):
# MACD计算与顶背离判断
grid['dif'], grid['dea'], grid['macd'] = MACD(grid.close, SHORT=12, LONG=26, M=9)
# 顶背离判断逻辑
mask = grid['macd'] < 0
mask = mask[mask == True][mask.shift(1) == False]
key2 = mask.keys()[-2]
key1 = mask.keys()[-1]
suit['dead'] = grid.close[key2] < grid.close[key1] and \
grid.dif[key2] > grid.dif[key1] > 0 and \
grid.macd[-2] > 0 > grid.macd[-1]
当策略检测到中小板指数MACD顶背离时立即全部清仓,有效规避了大幅下跌风险。
2. 市场大跌风险控制
策略设置了市场平均跌幅超过6%时的全局止损,这是对系统性风险的有效防御:
down_ratio = (stock_df['close'] / stock_df['open']).mean()
if down_ratio <= g.stoploss_market: # g.stoploss_market = 0.94,即跌幅超过6%
g.reason_to_sell = 'stoploss'
log.debug("大盘惨跌,平均降幅{:.2%}".format(down_ratio))
for stock in context.portfolio.positions.keys():
order_target_value_(stock, 0)
这种机制在2024年2月A股市场大跌中发挥了重要作用,有效降低了回撤幅度。
3. 个股止损设置
针对单只股票的12%止损线设置,确保了单只股票的亏损幅度受到严格控制:
if context.portfolio.positions[stock].price < context.portfolio.positions[stock].avg_cost * g.stoploss_limit:
order_target_value_(stock, 0)
log.debug("收益止损,卖出{}".format(stock))
g.reason_to_sell = 'stoploss'
这种机制避免了单只股票的大幅亏损拖累整体表现。
4. 季节性风险规避
通过在历史表现不佳的4月和1月选择空仓,规避了这两个月份可能带来的系统性风险:
if (('04-01' <= today) and (today <= '04-30')) or (('01-01' <= today) and (today <= '01-30')):
return True # 返回True表示今天需要空仓
这一机制充分利用了A股市场的季节性特征,是对历史规律的有效应用。
实战效果分析
该策略在实战中表现优异,尤其在2024年的市场波动中展现出色的适应能力。
2024年2月市场大跌期间表现
2024年2月,A股市场经历了较大幅度的调整,上证指数从2月初的高点一路下跌,最大跌幅超过15%。在这一期间,该策略凭借其MACD顶背离判断和市场大跌风险控制机制,成功规避了大部分下跌,最大回撤控制在较低水平。
具体表现:
- 策略在市场开始下跌前,通过MACD顶背离信号提前减仓
- 当市场单日跌幅较大时,触发市场趋势止损机制,及时清仓
- 个股层面的12%止损线进一步限制了亏损
2024年9-10月市场大涨期间表现
2024年9-10月,A股市场迎来一波强劲上涨,特别是小市值股票表现更为突出。该策略在这一阶段充分发挥其选股优势:
- 小市值股票在市场上涨中弹性更大,带来显著超额收益
- 涨停板管理策略使得强势股得以持续持有,充分享受上涨红利
- 较低的持仓数量(7只)使得每只股票获得足够资金配置,放大收益效果
策略绩效指标
从回测结果来看,该策略表现出色:
指标名称 | 数值 | 指标说明 |
---|---|---|
年化收益 | 111% | 年化收益(annual_return):投资组合按年计算的平均收益率,显示每年平均回报水平 |
累积收益 | 42.34 | 累积收益(cumreturnsfinal):从投资开始至今的总收益,表示投资总共增长了多少倍 |
年化波动 | 0.27 | 年化波动(annual_volatility):投资组合收益率的波动程度,数值越低表示稳定性越高 |
夏普比率 | 4.02 | 夏普比率(sharpe_ratio):每承担一单位风险所获得的超额收益,数值越高表示风险调整后的收益越好 |
Calmar比率 | 5.58 | Calmar比率(calmar_ratio):年化收益与最大回撤的比值,衡量收益相对于下行风险的效率 |
最大回撤 | 0.20 | 最大回撤(max_drawdown):历史最大跌幅百分比,表示从峰值到谷值的最大亏损 |
Omega比率 | 1.72 | Omega比率(omega_ratio):获利概率与亏损概率的比值,高于1表示获利概率大于亏损概率 |
索提诺比率 | 6.16 | 索提诺比率(sortino_ratio):只考虑下行风险的夏普比率变种,更关注避免大幅亏损的能力 |
从这些指标可以看出,策略不仅收益可观,而且风险控制得当:
- 111%的年化收益率远超市场平均水平
- 0.20的最大回撤控制在较低范围
- 4.02的夏普比率表明策略在风险调整后的收益表现优异
- 5.58的Calmar比率说明策略在应对回撤方面表现出色
策略编写要点与注意事项
通过分析这个策略,我们可以总结出几点量化策略编写的关键经验:
1. 明确的策略逻辑
好的策略需要有清晰的逻辑支撑,包括选股标准、买入条件、卖出条件等。该策略的逻辑非常清晰:选择小市值股票,结合MACD顶背离风险控制,实现低回撤高收益。
2. 多层次的风险控制
风险控制是量化策略成功的关键。该策略实现了从市场层面到个股层面的多层次风险控制,包括:
- 市场趋势判断(MACD顶背离)
- 市场整体跌幅控制
- 个股止损线设置
- 季节性规避
3. 参数可调整性
好的策略应该具有参数可调整性,以适应不同的市场环境:
g.stock_num = 7 # 持仓数量
g.stoploss_limit = 0.88 # 止损线
g.stoploss_market = 0.94 # 市场趋势止损参数
g.HV_control = False # 是否启用放量判断
这些可调整参数使策略具有更强的适应性。
4. 交易记录与日志
详细的交易记录和日志对策略监控和优化至关重要:
def print_position_info(context):
for position in list(context.portfolio.positions.values()):
securities = position.security
cost = position.avg_cost
price = position.price
ret = 100 * (price / cost - 1)
value = position.value
amount = position.total_amount
print('代码:{}'.format(securities))
print('成本价:{}'.format(format(cost, '.2f')))
print('现价:{}'.format(price))
print('收益率:{}%'.format(format(ret, '.2f')))
print('持仓(股):{}'.format(amount))
print('市值:{}'.format(format(value, '.2f')))
print('———————————————————————————————————')
5. 定时任务设置
策略使用 run_daily
和 run_weekly
函数设置定时任务,确保各项功能在合适的时间点执行:
# 设置交易运行时间
run_daily(prepare_stock_list, '9:05')
run_daily(dapan, '9:30')
run_weekly(weekly_adjustment, 2, '10:30') # 每周二10:30调仓
run_daily(sell_stocks, time='10:00') # 止损函数
run_daily(trade_afternoon, time='14:30') # 检查持仓中的涨停股是否需要卖出
run_daily(close_account, '14:50')
run_weekly(print_position_info, 5, time='15:10')
这种定时任务设置使策略执行更加规范有序。
总结与展望
MACD顶背离小市值优选策略通过精选小市值股票,结合多层次风险控制机制,实现了低回撤高收益的优异表现。该策略在2024年的市场波动中展现出强大的适应能力,无论是2月的大跌还是9-10月的大涨,都能有效应对。
策略的成功关键在于:
- 专注于小市值股票的选股逻辑
- MACD顶背离的市场趋势判断
- 多层次的风险控制机制
- 灵活的调仓与持仓管理
对于投资者来说,这一策略提供了一种可行的低回撤高收益投资方法,特别适合希望长期稳健增长资金的投资者。
对于量化策略开发者来说,该策略展示了清晰的逻辑、严格的风险控制和灵活的参数设置对策略成功的重要性。
该策略的完整模拟交割单可以在 **https://www.9db.com/detail/7E3D251B-768C-4204-BD08-5E27AA0A45A0 这个链接中查看。
量化投资不是一蹴而就的,需要不断学习和优化。本策略虽然表现优异,但仍有改进空间。建议读者在实盘应用前进行充分的模拟测试,并根据自身风险偏好调整参数。希望本文的分享能对大家的量化投资之路有所帮助。