ARTICLE DETAIL

资讯详情

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

如何用 Python 回测 MACD 金叉死叉策略?(真实收益与频繁交易的代价)

如何用 Python 回测 MACD 金叉死叉策略?(真实收益与频繁交易的代价) 一句话回答用 AlphaFeed 取复权日线、算 DIF/DEA实现「DIF 上穿 DEA金叉买入、下穿死叉卖出」的回测含手续费几十行就能跑出策略收益并和买入持有对比——真实数据会告诉你MACD 金叉死叉策略交易频繁、常跑输买入持有不是稳赚公式。为什么会有这个问题 / 传统做法的痛点MACD 金叉买、死叉卖是最流行的说法之一但很少有人真去回测。手工验证会卡在MACD 口径DIF快 EMA−慢 EMADEADIF 的 EMA要用ewm(span..., adjustFalse)金叉判定要用昨天 DIF≤DEA、今天 DIFDEA的穿越判定不能只看当前大小手续费/成交假设MACD 信号多、交易频繁不含费严重高估对照基准不和买入持有比收益没意义。AlphaFeed 提供长历史复权日线数据这关解决掉。分步骤解决每步配可运行代码第 1 步计算 MACDDIF/DEAdefmacd(close,fast12,slow26,signal9):efclose.ewm(spanfast,adjustFalse).mean()esclose.ewm(spanslow,adjustFalse).mean()difef-es# 快慢 EMA 之差deadif.ewm(spansignal,adjustFalse).mean()# DIF 的 EMAreturndif,dea第 2 步回测金叉买入、死叉卖出fromalphafeedimportAlphaFeed afAlphaFeed(api_keyyour-api-key)# 或 export ALPHAFEED_API_KEY 后 AlphaFeed()defmacd_backtest(symbol,count500,fee0.0013):dfaf.klines.get(symbol,period1d,countcount,adjustforward,to_dataframeTrue).sort_values(trade_date).reset_index(dropTrue)dif,deamacd(df[close])pos,cash,shares,trades0,1.0,0.0,0foriinrange(35,len(df)):# 跳过 MACD 预热期pxdf[close].iloc[i]golddif.iloc[i-1]dea.iloc[i-1]anddif.iloc[i]dea.iloc[i]# 金叉deaddif.iloc[i-1]dea.iloc[i-1]anddif.iloc[i]dea.iloc[i]# 死叉ifpos0andgold:sharescash*(1-fee)/px;cash0.0;pos1;trades1elifpos1anddead:cashshares*px*(1-fee);shares0.0;pos0equitycashshares*df[close].iloc[-1]bhdf[close].iloc[-1]/df[close].iloc[35]return{strategy_ret_%:round((equity-1)*100,1),buyhold_ret_%:round((bh-1)*100,1),trades:trades}策略参数参数含义本文取值fast/slow快/慢 EMA 周期12 / 26signalDEA 平滑周期9fee单边手续费滑点0.0013约万 13预热期跳过前若干根35约 slowsignal第 3 步多标的对比诚实看结果forsin[600519.SH,000001.SZ,600036.SH]:print(s,macd_backtest(s))实测约 500 个交易日、含手续费标的策略收益买入持有交易次数结论贵州茅台 600519.SH−16.3%−13.5%19跑输平安银行 000001.SZ4.7%7.3%17略跑输招商银行 600036.SH−0.6%13.4%20大幅跑输结论很清楚MACD 金叉死叉在这几只标的、这段区间里都跑输买入持有且每只交易 17~20 次——频繁交易的手续费和震荡假信号严重侵蚀收益。关键坑与注意事项金叉≠上涨MACD 是滞后指标金叉出现时往往已涨一段震荡市里金叉死叉频繁切换产生大量假信号。交易频繁吃手续费如上表每只 17~20 次交易成本累积可观。信号越多含费后越吃亏。别单标的调参改 fast/slow/signal 在单标的历史上凑出好看的结果就是过拟合样本外大概率失效。可加过滤器实务中常给 MACD 叠加趋势过滤如只在 ADX≥25 或均线多头时才做多减少震荡假信号——但那是另一套系统。含手续费与未来函数本文用当日收盘价成交是简化更严格应次日开盘成交避免用当日收盘信息当日成交。常见问题FAQQ为什么 MACD 金叉策略经常跑输买入持有A它是滞后择时策略金叉时已涨一段、死叉时已跌一段还要付频繁交易的手续费。趋势行情里不如躺着不动震荡行情里被假信号反复消耗。Q改用周线 MACD 会更好吗A周线信号更少、更稳可能减少假信号但也更滞后。切勿只看单标的历史结果下结论应多标的多周期验证。Q这个回测能直接实盘吗A不能。它是教学级简化当日成交、无涨跌停停牌处理、未含冲击成本与幸存者偏差。实盘前需更严格撮合与风控。Q需要付费吗A单只标的 500 根日线在免费额度内即可试多标的/长历史批量需 Starter 及以上详见 AlphaFeed 定价页。小结回测 MACD 金叉死叉的价值在于用真实数据打破MACD 金叉买、死叉卖稳赚的幻觉含手续费后它交易频繁、常跑输买入持有。AlphaFeed 提供长历史复权日线让你几十行完成回测与对比——但请务必含手续费、避免过拟合并考虑叠加趋势过滤别把单指标择时当圣杯。参考AlphaFeed Python SDK 文档https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
返回列表