量化交易入门(二十四)MTM指标买卖逻辑和回测

文章介绍了MTM指标在买卖决策中的作用,包括其上下穿越阈值的信号、趋势判断以及与均线系统的配合。通过实例展示了如何使用Backtrader和yfinance对苹果股票进行回测,结果显示策略在4年间实现了显著收益,但强调回测结果仅供参考,投资需谨慎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MTM指标可以用来指导买卖决策,其基本逻辑如下:

  1. 买入信号:

    当MTM从负值上穿0线,并向上突破某个阈值(如20)时,表明上升动力充足,可以考虑买入。当MTM在0线上方并持续上升,创出新高时,表明上升趋势强劲,可以考虑加仓或持有。
  2. 卖出信号:

    当MTM从正值下穿0线,并向下突破某个阈值(如-20)时,表明下跌动力充足,可以考虑卖出。当MTM在0线下方并持续下降,创出新低时,表明下跌趋势强劲,可以考虑减仓或观望。
  3. 趋势追踪:

    当MTM持续在0线上方运行时,表明市场处于上升趋势,可以维持多头仓位。当MTM持续在0线下方运行时,表明市场处于下降趋势,可以维持空头仓位或者观望。
  4. 背离判断:

    当价格创新高,但MTM未能创新高,形成顶背离时,表明上升动力减弱,可以考虑卖出。当价格创新低,但MTM未能创新低,形成底背离时,表明下跌动力减弱,可以考虑买入。
  5. 均线系统:

    当MTM上穿其均线时,可以考虑买入;下穿均线时,可以考虑卖出。均线的选择可以根据自己的喜好,常用的有5日、10日、20日等。

 下面我们和前面两个指标一样,使用苹果的历史数据来回测一下,看看MTM指标能不能给我们带来收益。

回测的示例代码:

import backtrader as bt
import yfinance as yf

class MTMStrategy(bt.Strategy):
    params = (
        ('mtm_period', 10),
        ('buy_threshold', 0),
        ('sell_threshold', 0),
    )

    def __init__(self):
        self.mtm = bt.indicators.Momentum(self.data.close, period=self.params.mtm_period)

    def next(self):
        if not self.position:
            if self.mtm[0] > self.params.buy_threshold:
                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.mtm[0] < self.params.sell_threshold:
            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(MTMStrategy)

# 设置佣金为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框架对苹果股票从2020年到2023年的数据进行回测。下面是对代码的详细解读:

  1. 导入需要的库:backtrader和yfinance。

  2. 定义MTMStrategy类,继承自bt.Strategy:

    • 定义策略参数:mtm_period(MTM指标周期)、buy_threshold(买入阈值)、sell_threshold(卖出阈值)。
    • 在__init__方法中,创建MTM指标(bt.indicators.Momentum)。
    • 在next方法中,编写交易逻辑:
      • 如果当前无持仓,且MTM指标大于买入阈值,则计算可用资金,并用全部资金买入股票。
      • 如果已有持仓,且MTM指标小于卖出阈值,则卖出全部持仓。
    • 在notify_order方法中,处理订单状态:
      • 如果订单状态为Completed,打印买入/卖出的执行信息,包括日期、价格、成本、佣金等。
      • 如果订单状态为Canceled/Margin/Rejected,打印相应信息。
  3. 创建Cerebro引擎,设置初始资金为100,000美元。

  4. 使用yfinance下载苹果股票2020年到2023年的数据,并将其添加到Cerebro引擎中。

  5. 将MTMStrategy添加到Cerebro引擎中。

  6. 设置佣金为0.1%。

  7. 添加分析指标:Returns(收益率)、SharpeRatio(夏普比率)、DrawDown(回撤)。

  8. 运行回测,打印回测前后的资金情况。

  9. 获取回测结果,并打印相关指标:

    • 年化收益率(Annualized Return)
    • 夏普比率(Sharpe Ratio)
    • 最大回撤(Max Drawdown)
    • 最大回撤期间(Max Drawdown Period)
  10. 绘制回测结果图表。

代码运行以后结果怎么样呢,我们一起来看一下。

执行结果:
Starting Portfolio Value: 100000.00 
Final Portfolio Value: 205910.77
Annualized Return: 19.83%
Sharpe Ratio: 1.64
Max Drawdown: 17.69%
Max Drawdown Period: 313

根据回测结果,我们可以得到以下信息:

  1. 最终资产组合价值(Final Portfolio Value)为205,910.77美元。相比初始的100,000美元,资产实现了105.91%的增长。这表明在回测期间,该MTM策略在苹果股票上取得了不错的收益。

  2. 年化收益率(Annualized Return)为19.83%。这意味着平均每年该策略能够提供19.83%的回报。这是一个相当可观的收益率,高于同期的许多其他投资机会。

  3. 夏普比率(Sharpe Ratio)为1.64。夏普比率衡量了策略的风险调整后收益,即每承受一单位风险,策略能够提供多少超额回报。一般来说,夏普比率大于1就被认为是不错的策略。1.64的夏普比率表明该MTM策略在回测期间提供了高于平均水平的风险调整后收益。

  4. 最大回撤(Max Drawdown)为17.69%。最大回撤衡量了从高点到低点的最大跌幅,反映了策略可能遭受的最大损失。17.69%的最大回撤说明在最糟糕的情况下,该策略可能会损失17.69%的资产。这个数值相对较高,投资者需要有相应的风险承受能力。

  5. 最大回撤期间(Max Drawdown Period)为313。这表示从回撤开始到恢复到之前的高点,共经历了313个交易日。这个时间较长,说明该策略可能面临一定的回撤风险,需要较长时间来恢复损失。

哈哈,不错不错,4年时间资产翻了一倍,想想都刺激。MTM策略在回测期间表现优异,取得了高于平均水平的收益和风险调整后收益。但是,该策略也面临着较大的回撤风险,投资者需要有足够的风险承受能力和长期投资的耐心。此外,回测结果只是基于历史数据的模拟,未来的表现可能与回测结果存在差异。

 注意,这个只是一个例子,不保证你能靠这个指标就一定能赚到钱,不构成投资建议,大家投资要结合实际情况谨慎投资。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder加油!

感谢您的认可和支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值