Python 语言 用 Backtrader 回测双均线策略 优化参数提高夏普比率

Python阿木 发布于 10 小时前 2 次阅读


使用Backtrader回测双均线策略并优化参数以提高夏普比率

双均线策略是一种简单而有效的股票交易策略,它基于两条移动平均线(MA)来判断买卖时机。当短期移动平均线(如5日均线)上穿长期移动平均线(如20日均线)时,视为买入信号;当短期移动平均线下穿长期移动平均线时,视为卖出信号。本文将使用Backtrader框架来构建和回测这一策略,并通过优化参数来提高夏普比率。

环境搭建

确保你已经安装了Backtrader库。如果没有安装,可以通过以下命令进行安装:

bash
pip install backtrader

双均线策略实现

以下是一个简单的双均线策略实现:

python
import backtrader as bt

class DoubleMA(bt.Strategy):
params = (
('short_window', 5),
('long_window', 20),
)

def __init__(self):
self.short_ma = bt.indicators.SMA(self.data.close, period=self.params.short_window)
self.long_ma = bt.indicators.SMA(self.data.close, period=self.params.long_window)
self.crossover = bt.indicators.CrossOver(self.short_ma, self.long_ma)

def next(self):
if self.crossover > 0:
self.buy()
elif self.crossover < 0:
self.sell()

def stop(self):
self.log('Sharpe Ratio:', round(self.sharpe(), 2))
self.log('Final Portfolio Value:', round(self.broker.getvalue(), 2))

回测策略

接下来,我们将使用Backtrader的Cerebro引擎来运行回测:

python
cerebro = bt.Cerebro()
cerebro.addstrategy(DoubleMA)

添加数据
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2010, 1, 1), todate=datetime(2020, 1, 1))
cerebro.adddata(data)

设置初始资金
cerebro.broker.set_cash(100000)

设置交易手续费
cerebro.broker.setcommission(commission=0.001)

运行回测
cerebro.run()

绘制结果
cerebro.plot()

参数优化

为了提高夏普比率,我们可以使用Backtrader的OptBacktest类来优化策略参数:

python
from backtrader.optimizers import OptBacktest

创建优化器
optimizer = OptBacktest(
data=data,
optimizerclass=bt.strategies.DoubleMA,
optimizerparams={'short_window': range(5, 21), 'long_window': range(20, 41)}
)

执行优化
results = optimizer.run()

打印最佳参数和夏普比率
best = results.best
print('Best Sharpe Ratio:', best.sharpe_ratio)
print('Best Short Window:', best.params.short_window)
print('Best Long Window:', best.params.long_window)

结论

本文介绍了如何使用Backtrader框架实现和回测双均线策略,并通过参数优化提高了夏普比率。在实际交易中,投资者可以根据自己的风险偏好和市场环境调整参数,以获得更好的交易效果。需要注意的是,双均线策略在震荡市场中表现较好,但在趋势市场中可能效果不佳。在实际应用中,投资者应结合其他指标和策略进行综合判断。