MACD顶背离小市值优选策略详解:低回撤高收益的A股投资智慧

用户头像sh_***174w0d
2025-05-08 发布

241d19600f8c1518c216d4f1360c1abd.png

详细解读这个在A股市场表现优异的MACD顶背离小市值优选策略,并分析其降低回撤的机制、盈利特色以及实战效果。

策略核心逻辑解析

该策略的核心逻辑可以概括为以下几点:

  1. 选股时机**:每周二10:30进行选股操作,这个时间点经过回测验证效果最佳**
  2. 选股范围**:从中小板指数成分股中筛选,按市值升序排列后取前100只股票,最终选取前7只**
  3. 持仓数量**:固定持有7只小市值股票,保持相对均衡的资金分配**
  4. 风险控制**:**
    1. 大盘MACD顶背离信号出现时清仓
    2. 市场日跌幅超过一定阈值时全部止损
    3. 个股亏损超过12%时进行个股止损
    4. 四月和一月整月空仓(A股历史表现规律)
    5. 昨日涨停今日打开则卖出

下面我们逐一深入分析这些关键点。

选股机制详解

策略的选股流程具有明确的价值投资特征:

1. 获取中小板指数成分股
2. 过滤掉新股、ST股和北交所/科创板股票
3. 过滤停牌、涨停、跌停的股票
4. 按市值升序排列,选取前100只
5. 从中最终确定持有前7只小市值股票

为什么选择小市值股票?这与A股市场的特点密切相关。小市值股票往往具有以下特征:

  1. 成长空间大,有更高的上涨潜力
  2. 股价弹性大,对好消息反应更敏感
  3. 机构关注度相对较低,存在信息不对称的投资机会
  4. 在市场风格偏向成长时,表现往往更为突出

从代码实现看,作者通过下面这段代码完成选股:

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'

这种联合止损机制确保了:

  1. 在市场大幅下跌时能迅速全部清仓,规避系统性风险
  2. 在市场正常情况下,控制单只股票的最大亏损幅度
  3. 收益达到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日(周二)才重新建仓,中间经历了一个相对较长的空仓期。这段空仓期恰好体现了策略的设计理念:宁可错过一些上涨机会,也要严格控制风险。

b480634d2ba7514568b66b339315631a.png

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年的市场波动中展现出色的适应能力。

4955d699b12af4c1292ee74ce53d18b5.png

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_dailyrun_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月的大涨,都能有效应对。

策略的成功关键在于:

  1. 专注于小市值股票的选股逻辑
  2. MACD顶背离的市场趋势判断
  3. 多层次的风险控制机制
  4. 灵活的调仓与持仓管理

对于投资者来说,这一策略提供了一种可行的低回撤高收益投资方法,特别适合希望长期稳健增长资金的投资者。

对于量化策略开发者来说,该策略展示了清晰的逻辑、严格的风险控制和灵活的参数设置对策略成功的重要性。

该策略的完整模拟交割单可以在 **https://www.9db.com/detail/7E3D251B-768C-4204-BD08-5E27AA0A45A0 这个链接中查看。

51268499641c310dbb4e4f8af50d4946.png

量化投资不是一蹴而就的,需要不断学习和优化。本策略虽然表现优异,但仍有改进空间。建议读者在实盘应用前进行充分的模拟测试,并根据自身风险偏好调整参数。希望本文的分享能对大家的量化投资之路有所帮助。

评论

用户头像
2025-05-08 15:13:16

这个策略挺牛逼的,完整代码会有分享吗

评论

需要帮助?

试试AI小助手吧