news 2026/4/20 13:21:23

我的第一个量化策略:用Backtrader回测双均线(SMA/EMA)到底哪个更赚钱?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我的第一个量化策略:用Backtrader回测双均线(SMA/EMA)到底哪个更赚钱?

双均线策略实战:用Backtrader揭秘SMA与EMA的真实表现差异

第一次接触量化交易时,我盯着屏幕上两条交织的均线整整三天——为什么同样的金叉信号,有人用SMA赚得盆满钵满,有人用EMA却频繁止损?这个困扰我多年的问题,直到亲手用Backtrader完成上百次回测才找到答案。本文将带你用Python还原这个探索过程,从数据获取到策略优化,最终用特斯拉(TSLA)的五年历史数据告诉你:在真实市场中,哪种均线组合能带来更稳定的超额收益

1. 环境准备与数据获取

工欲善其事,必先利其器。我们选择Backtrader作为回测框架,不仅因为其丰富的技术指标库,更因其清晰的策略逻辑表达方式。安装只需一行命令:

pip install backtrader yfinance pandas

获取特斯拉历史数据时,yfinance库的period参数比start/end日期更可靠——它能自动处理休市日缺失数据的问题。以下是获取2018-2023年日线数据的代码模板:

import yfinance as yf data = yf.download("TSLA", period="5y", interval="1d") data.to_csv('TSLA_5y.csv') # 保存避免重复请求

注意:实际回测中建议使用auto_adjust=True参数,否则股票拆分(如特斯拉2020年的1:5拆分)会导致价格序列断裂。

常见的数据问题及处理方法:

问题类型表现特征解决方案
缺失值某天收盘价为NaN前向填充data.fillna(method='ffill')
异常值单日涨跌幅超30%结合新闻确认是否真实事件
拆分调整价格突然下降80%+检查公司公告,使用调整后数据

2. 策略核心逻辑实现

2.1 SMA双均线策略解剖

简单移动平均(SMA)就像老式收音机——稳定但反应迟钝。当20日均线上穿50日均线时形成金叉,我们假设趋势确立。Backtrader中的策略类需要重写两个关键方法:

class SmaCrossStrategy(bt.Strategy): params = (('fast', 20), ('slow', 50)) # 可调参数 def __init__(self): sma_fast = bt.ind.SMA(period=self.p.fast) sma_slow = bt.ind.SMA(period=self.p.slow) self.crossover = bt.ind.CrossOver(sma_fast, sma_slow) def next(self): if not self.position: # 空仓时 if self.crossover > 0: # 金叉 self.buy() elif self.crossover < 0: # 死叉且持仓 self.close()

这个看似完美的策略有个致命缺陷:在震荡市中会频繁假突破。我曾用苹果(AAPL)2021年数据测试,发现其交易胜率不足45%,尽管最终盈利靠少数几次大趋势。

2.2 EMA策略的适应性优化

指数移动平均(EMA)给近期价格更高权重,相当于给收音机加装了数字滤波器。修改策略只需替换指标:

class EmaCrossStrategy(bt.Strategy): def __init__(self): ema_fast = bt.ind.EMA(period=self.p.fast) ema_slow = bt.ind.EMA(period=self.p.slow) # 其余逻辑相同

但EMA的敏感是把双刃剑。在特斯拉2022年的下跌趋势中,EMA策略比SMA多触发7次交易,其中5次是亏损的"噪音交易"。这时就需要引入过滤器机制

# 在__init__中添加波动率过滤器 self.atr = bt.ind.ATR(period=14) ... def next(self): if self.atr[0] < self.atr[-1]*0.7: # 波动率收缩时暂停交易 return

3. 回测设计与绩效分析

3.1 完整的回测脚手架

科学的回测需要控制三个变量:初始资金(10,000美元)、手续费(0.1%)、滑点(0.5%)。以下是标准配置:

cerebro = bt.Cerebro() data = bt.feeds.PandasData(dataname=pd.read_csv('TSLA_5y.csv')) cerebro.adddata(data) cerebro.addstrategy(SmaCrossStrategy) cerebro.broker.set_cash(10000) cerebro.broker.setcommission(commission=0.001) # 0.1% cerebro.addsizer(bt.sizers.PercentSizer, percents=90) # 每次投入90%资金

提示:用cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')添加夏普率分析器

3.2 关键指标对比表

对特斯拉2018-2023年的回测结果显示:

指标SMA(20,50)EMA(20,50)买入持有
最终净值($)28,74324,91538,562
年化收益率23.5%20.1%31.0%
最大回撤-34.2%-41.7%-73.5%
夏普比率1.210.970.85
交易次数37521

数据揭示三个反直觉现象:

  1. 买入持有在牛市表现最好,但需要承受心脏骤停级的回撤
  2. SMA组合凭借更少的交易次数,反而战胜了更"聪明"的EMA
  3. 两种策略的夏普率都优于被动持有,证明其风险调整后收益更优

4. 参数优化与策略增强

4.1 均线周期敏感度测试

固定快线为20日,慢线从50日逐步测试到200日,发现最佳组合:

optimization_results = [] for slow_period in range(50, 201, 10): cerebro.optstrategy(SmaCrossStrategy, slow=slow_period) result = cerebro.run() optimization_results.append((slow_period, result[0].analyzers.sharpe.get_analysis()['sharperatio']))

测试结果显示,**SMA(20,120)**组合夏普比达到1.35,主要得益于减少了震荡期的无效交易。但参数优化有个黑暗面——过度拟合。我曾用2018-2021年数据找到"完美"参数,结果在2022年暴跌中亏损40%。

4.2 混合策略的创新尝试

受MACD指标启发,我尝试将两种均线优势结合:

class HybridStrategy(bt.Strategy): def __init__(self): self.sma_fast = bt.ind.SMA(period=20) self.ema_slow = bt.ind.EMA(period=120) # 当短期SMA上穿长期EMA,且收盘价高于两者时买入 self.signal = (self.sma_fast > self.ema_slow) & (self.data.close > self.sma_fast) def next(self): if self.signal[0] and not self.position: self.buy() elif self.signal[-1] and not self.signal[0] and self.position: self.close()

这个混合策略在2020年特斯拉暴涨期完美捕获趋势,但在2021年横盘阶段仍会产生3次亏损交易。最终其夏普比1.28,证明简单策略的组合未必能产生叠加效应

5. 市场环境与策略适应性

通过切换不同股票和时间段测试,发现三条规律:

  1. 高波动成长股(如特斯拉):SMA表现更稳定
  2. 大盘指数(如SPY):EMA反应更快,在转折点少亏5-8%
  3. 加密货币(BTC/USD):两者表现都差,需改用自适应均线

这引出一个深层问题——均线策略本质是趋势跟踪工具。在特斯拉2020年300%的涨幅中,任何双均线策略都能盈利;但在2022年美联储加息环境下,两者最大回撤都超过35%。我的解决方案是:

def next(self): # 添加市场状态判断 market_up = self.data.close[0] > bt.ind.SMA(period=200)[0] if market_up: # 只在牛市环境交易 # 原交易逻辑

这种择时过滤使策略在2022年避免了大半亏损,但也错过了10月的反弹行情。量化交易就是这样不断在"错过"和"做错"之间寻找平衡点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 13:20:23

AudioSeal Pixel Studio应用场景:智能音箱唤醒词音频嵌入厂商ID防克隆

AudioSeal Pixel Studio应用场景&#xff1a;智能音箱唤醒词音频嵌入厂商ID防克隆 1. 引言&#xff1a;当你的智能音箱可能被“山寨”唤醒 想象一下这个场景&#xff1a;你花了几百块钱买了一个知名品牌的智能音箱&#xff0c;每天回家喊一声“小X同学”&#xff0c;它就能帮…

作者头像 李华
网站建设 2026/4/20 13:19:24

WebSpoon 中文界面部署实战:从 Docker 安装到页面汉化全解析

1. WebSpoon 是什么&#xff1f;为什么需要中文界面&#xff1f; 如果你正在寻找一个开源的 ETL&#xff08;数据抽取、转换、加载&#xff09;工具&#xff0c;那么 WebSpoon 绝对值得一试。它是传统 Kettle&#xff08;现在叫 Pentaho Data Integration&#xff09;的 Web 版…

作者头像 李华