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