ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【ptrade】MACD金叉 回测实录

【ptrade】MACD金叉 回测实录 07_MACD金叉 · 回测实录12只ETF各自判断MACD金叉买入、死叉卖出最多同时持有3只。策略类型趋势跟踪 / 指标回测批次2026-10-06本地 QuantStudio 回测引擎数据来源QuantStudio 本地行情库etf_daily/stock_daily一、策略思路MACD是最经典的趋势指标快线 EMA12 上穿慢线 EMA26 叫金叉视为趋势转多反向下穿叫死叉视为趋势结束。策略把这套判断分别套在12只ETF上——谁出金叉就买谁谁出死叉就卖谁。最多同时持有3只如果同一天有超过3只出现金叉就按 DIF 值快线减慢线的差值排序优先买趋势更强的那几只每只占总资产的约1/3。关键参数参数取值FAST12SLOW26SIGNAL9MAX_HOLDINGS3EXPOSURE0.98二、回测设置项目设置策略文件07_MACD金叉.py回测区间2022-01-01 ~ 2026-09-01初始资金100000 元佣金费率0.00035最低 5.0 元印花税率0.001过户费率1e-05滑点0.0撮合价格close基准000300交易日数1130三、回测结果净值曲线会非常趋势策略2022、2023连续两年小幅磨损2025年跟着一轮上涨快速拉升37.1%2026年又吐回一部分。请把累计收益和最大回撤两个数字放在一起看4年半赚22%中途却出现过30%的回撤年化波动率17.9%风险调整后收益夏普0.088几乎为零。这就是趋势策略的真实面目——不是不赚而是赚得极不稳定。绩效指标指标数值累计收益22.04%年化收益4.51%最大回撤30.01%年化波动率17.85%夏普比率0.088索提诺比率0.132卡玛比率0.150回合胜率44.06%日胜率50.18%盈亏比132.2%盈利回合数63亏损回合数80平均持仓天数80.5成交笔数315「盈亏比」 平均盈利 ÷ 平均亏损 100%表示平均每笔赚的比亏的多。「回合」指一次完整的买入→卖出round_trips「成交笔数」是买卖双方分开计数的原始成交记录条数。⚠️本窗口基准数据不完整引擎的基准序列尾部为占位填充值据此算出的沪深300收益为 0.00%该数字不可信净值图中的基准曲线已截断至有效区间至 2026-07-31。因此本策略的α、β、超额收益、信息比率等相对指标一律不可引用只能用绝对收益与回撤来判断。分年度收益年份区间收益交易日2022-11.25%2422023-3.02%242202411.50%242202537.14%2432026-4.65%161四、交易明细完整交易回合数143个盈利 63 / 亏损 80单笔平均盈亏227.73 元最大单笔盈利10974.54 元最大单笔亏损-5382.51 元持仓天数平均80.5 天最长1336 天最短1 天盈利最多的 5 个回合买入日卖出日标的盈亏(元)持仓天数2022-05-052022-07-04516160.SH10974.54602026-04-022026-05-06515880.SH10323.38342024-09-092024-10-24512880.SH10002.25452025-06-092025-08-08515880.SH9798.39602025-12-012026-01-21512660.SH9311.1851亏损最多的 5 个回合买入日卖出日标的盈亏(元)持仓天数2022-01-042022-03-16512170.SH-5382.51712023-11-222024-01-18512690.SH-4566.53572022-01-172022-02-11516160.SH-4026.28252026-05-082026-06-09518880.SH-3884.07322024-08-012024-09-24512480.SH-3810.2454五、完整回测代码文件名07_MACD金叉.py共 124 行引擎QuantStudio 本地回测全部为公开 API无平台专有调用。# -*- coding: utf-8 -*- 07_MACD金叉策略 (QuantStudio 本地回测版) 核心逻辑MACD金叉DIF上穿DEA买入死叉卖出。 经典趋势指标多标的独立判断最多持3只。 参数EMA12/EMA26/DEA9。 importnumpyasnp ETF_POOL[510300.SS,159915.SZ,510500.SS,512880.SS,512800.SS,512690.SS,512170.SS,512480.SS,515880.SS,512660.SS,516160.SS,518880.SS,]FAST12SLOW26SIGNAL9MAX_HOLDINGS3EXPOSURE0.98definitialize(context):set_benchmark(000300.SS)run_daily(context,trade,time09:30)log.info(07_MACD金叉初始化: 池%d, 参数%d/%d/%d, 最多持%d只,len(ETF_POOL),FAST,SLOW,SIGNAL,MAX_HOLDINGS)def_ema(arr,period):计算EMA序列iflen(arr)period:returnNoneemanp.zeros_like(arr,dtypefloat)ema[period-1]np.mean(arr[:period])k2.0/(period1)foriinrange(period,len(arr)):ema[i]arr[i]*kema[i-1]*(1-k)returnemadef_get_macd_cross(code):返回 (是否金叉, 是否死叉, DIF, DEA)try:nSLOWSIGNAL5hget_history(n,1d,field[close],security_listcode,fqpre,includeFalse,is_dictTrue)ifhisNoneorcodenotinh:returnFalse,False,None,Noneclosesnp.asarray(h[code][close],dtypefloat)closescloses[np.isfinite(closes)]iflen(closes)SLOWSIGNAL2:returnFalse,False,None,Noneema_fast_ema(closes,FAST)ema_slow_ema(closes,SLOW)ifema_fastisNoneorema_slowisNone:returnFalse,False,None,Nonedifema_fast-ema_slow# 从有效位置开始计算DEAvalid_startSLOW-1dif_validdif[valid_start:]dea_ema(dif_valid,SIGNAL)ifdeaisNone:returnFalse,False,None,None# 对齐dif_aligneddif_valid[-len(dea):]# 判断金叉/死叉最近两根iflen(dif_aligned)2orlen(dea)2:returnFalse,False,None,Nonegolden(dif_aligned[-2]dea[-2])and(dif_aligned[-1]dea[-1])death(dif_aligned[-2]dea[-2])and(dif_aligned[-1]dea[-1])returngolden,death,float(dif_aligned[-1]),float(dea[-1])exceptException:returnFalse,False,None,Nonedeftrade(context):heldlist(context.portfolio.positions.keys())# 1. 死叉卖出forcodeinheld:_,death,dif,dea_get_macd_cross(code)ifdeath:order_target_value(code,0)log.info(MACD死叉卖出 %s (DIF%.4f, DEA%.4f),code,difor0,deaor0)# 2. 金叉买入heldlist(context.portfolio.positions.keys())iflen(held)MAX_HOLDINGS:returncandidates[]forcodeinETF_POOL:ifcodeinheld:continuegolden,_,dif,dea_get_macd_cross(code)ifgolden:candidates.append((code,difor0))ifnotcandidates:return# 按DIF值排序DIF越大趋势越强candidates.sort(keylambdax:x[1],reverseTrue)slotsMAX_HOLDINGS-len(held)buy_listcandidates[:slots]total_valuecontext.portfolio.total_value per_valuetotal_value*EXPOSURE/MAX_HOLDINGSforcode,difinbuy_list:order_target_value(code,per_value)log.info(MACD金叉买入 %s (DIF%.4f, 目标市值%.0f),code,dif,per_value)defhandle_data(context,data):pass六、风险提示MACD是滞后指标金叉通常出现在一段上涨的中后段、死叉出现在下跌的中后段趋势策略的固有代价是吃到鱼身、丢掉鱼头鱼尾。本策略回合胜率只有44.1%靠132%的盈亏比平均盈利是平均亏损的1.32倍维持正收益这意味着它必须容忍连续多次止损。更值得注意的是持仓时间平均80天最长一笔超过1300天——资金可能被一只长期横盘的ETF占住好几年期间既没有收益、也失去了其他机会。另外12只标的里有7只是行业主题ETF同时持有3只时可能出现同一波行情重复押注的情况组合的实际波动高于分散持3只给人的印象。免责声明本文所有数字来自本地历史回测回测收益不代表未来表现也不构成任何投资建议或个股/基金推荐。策略代码仅供研究学习实盘执行还需额外考虑滑点、冲击成本、流动性、涨跌停与平台差异等因素。投资有风险决策需谨慎。
返回列表