学习了MACD指标以后,我们通过量化回测来验证一下,这个指标能否帮我们挣到钱。我们还是使用Backtrader框架,实现MACD的交易策略,然后用苹果股票历史数据完成这个示例。
示例代码如下:
import backtrader as bt
import yfinance as yf
# 定义MACD策略
class MACDStrategy(bt.Strategy):
params = (
('macd1', 12),
('macd2', 26),
('macdsig', 9),
)
def __init__(self):
self.macd = bt.indicators.MACD(self.data, period_me1=self.params.macd1,
period_me2=self.params.macd2, period_signal=self.params.macdsig)
self.crossover = bt.indicators.CrossOver(self.macd.macd, self.macd.signal)
def next(self):
if not self.position:
if self.crossover > 0:
commission_info = self.broker.getcommissioninfo(self.data)
cash = self.broker.get_cash() - commission_info.getsize(1, self.data.close[0])
size = cash // self.data.close[0]
self.buy(size=size)
print(f'BUY: {size} shares')
elif self.crossover < 0:
size = self.position.size
self.close(size=size)
print(f'SELL: {size} shares')
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
print(f'BUY executed at {self.data.num2date(order.executed.dt).date()}, Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}, Comm: {order.executed.comm:.2f}')
elif order.issell():
cost = order.executed.value
profit = order.executed.value - order.created.size * order.created.price
profit_percent = (profit / cost) * 100
print(f'SELL executed at {self.data.num2date(order.executed.dt).date()}, Price: {order.executed.price:.2f}, Cost: {cost:.2f}, Profit: {profit:.2f}, Profit %: {profit_percent:.2f}%')
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
print('Order Canceled/Margin/Rejected')
# 创建Cerebro引擎
cerebro = bt.Cerebro()
# 设置初始资金
cerebro.broker.setcash(100000.0)
# 下载苹果股票数据
data = yf.download('AAPL', '2020-01-01', '2023-12-30')
data = data.dropna()
# 将数据添加到Cerebro引擎中
data = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data)
# 添加MACD策略
cerebro.addstrategy(MACDStrategy)
# 设置佣金为0.1%
cerebro.broker.setcommission(commission=0.001)
# 添加分析指标
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# 运行回测
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 获取回测结果
strat = results[0]
returns = strat.analyzers.returns.get_analysis()
sharpe = strat.analyzers.sharpe.get_analysis()
drawdown = strat.analyzers.drawdown.get_analysis()
# 打印回测指标
print('Annualized Return: %.2f%%' % (returns['rnorm100']))
print('Sharpe Ratio: %.2f' % (sharpe['sharperatio']))
print('Max Drawdown: %.2f%%' % (drawdown['max']['drawdown']))
print('Max Drawdown Period: %s' % (drawdown['max']['len']))
# 绘制回测结果
cerebro.plot()
这个示例代码的主要步骤如下:
-
导入必要的库:backtrader和yfinance。
-
定义MACD策略类
MACDStrategy
,继承自bt.Strategy
。在策略类中:- 定义MACD指标的参数(快线、慢线和信号线的周期)。
- 在
__init__
方法中创建MACD指标和交叉信号指标。 - 在
next
方法中编写交易逻辑:当MACD线与信号线向上交叉时买入,向下交叉时卖出。
-
创建Cerebro引擎的实例
cerebro
。 -
使用yfinance库获取苹果股票的历史数据,并将其转换为Backtrader可接受的数据格式。
-
将数据添加到Cerebro引擎中。
-
将MACD策略添加到Cerebro引擎中。
-
设置初始资金和交易佣金。
-
运行回测并绘制结果图表。
运行该代码后,将对苹果股票在2020年1月1日至2023年12月30日期间进行回测,使用MACD指标作为买卖信号,并绘制回测结果图表。图表将显示股票价格、MACD指标以及策略的买卖点。
运行的结果如下:
执行的结果:
Starting Portfolio Value: 10000.00
Final Portfolio Value: 150972.73
Annualized Return: 10.87%
Sharpe Ratio: 0.50
Max Drawdown: 20.45%
Max Drawdown Period: 441
让我们逐一解读这个运行的结果:
-
Starting Portfolio Value(初始投资组合价值): 10000.00
这表示在回测开始时,投资组合的初始资金为10000.00。 -
Final Portfolio Value(最终投资组合价值): 150972.73
这表示在回测结束时,投资组合的最终价值为150972.73。与初始投资组合价值相比,投资组合的价值显著增加。 -
Annualized Return(年化收益率): 10.87%
年化收益率表示投资组合在一年内的平均收益率,考虑了复利效应。10.87%的年化收益率表示该策略在回测期间平均每年获得10.87%的回报。 -
Sharpe Ratio(夏普比率): 0.50
夏普比率衡量投资组合的风险调整后收益。它表示每单位风险(以标准差衡量)所获得的超额收益。0.50的夏普比率表示该策略在考虑风险的情况下获得了适度的回报。 -
Max Drawdown(最大回撤): 20.45%
最大回撤表示从峰值到谷值的最大百分比下跌。20.45%的最大回撤意味着在回测期间,投资组合从最高点下跌了20.45%。 -
Max Drawdown Period(最大回撤周期): 441
最大回撤周期表示从峰值到谷值,再到恢复到前期高点所经历的交易日数。441个交易日的最大回撤周期表示投资组合经历了较长时间的下跌和恢复过程。
综合来看,该MACD策略在回测期间取得了积极的结果:
- 投资组合价值从10000增长到了150972.73,实现了显著的绝对收益。
- 年化收益率为10.87%,表明策略在长期内提供了可观的回报。
- 夏普比率为0.50,说明策略在风险调整后的基础上获得了适度的回报。
- 最大回撤为20.45%,表明策略经历了一定程度的下跌,但仍然在可接受的范围内。
哈哈,通过个策略,我们回测的结果是好的,相当于4年挣了50%左右的回报,先开心一下。需要注意的是,回测结果并不能保证未来的表现,市场状况可能发生变化。在实际应用中,还需要考虑交易成本、滑点等因素,并对策略进行进一步的优化和调整。此外,还应该对策略进行更长时间段的回测,以评估其在不同市场环境下的稳健性。