MTM指标可以用来指导买卖决策,其基本逻辑如下:
-
买入信号:
当MTM从负值上穿0线,并向上突破某个阈值(如20)时,表明上升动力充足,可以考虑买入。当MTM在0线上方并持续上升,创出新高时,表明上升趋势强劲,可以考虑加仓或持有。 -
卖出信号:
当MTM从正值下穿0线,并向下突破某个阈值(如-20)时,表明下跌动力充足,可以考虑卖出。当MTM在0线下方并持续下降,创出新低时,表明下跌趋势强劲,可以考虑减仓或观望。 -
趋势追踪:
当MTM持续在0线上方运行时,表明市场处于上升趋势,可以维持多头仓位。当MTM持续在0线下方运行时,表明市场处于下降趋势,可以维持空头仓位或者观望。 -
背离判断:
当价格创新高,但MTM未能创新高,形成顶背离时,表明上升动力减弱,可以考虑卖出。当价格创新低,但MTM未能创新低,形成底背离时,表明下跌动力减弱,可以考虑买入。 -
均线系统:
当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年的数据进行回测。下面是对代码的详细解读:
-
导入需要的库:backtrader和yfinance。
-
定义MTMStrategy类,继承自bt.Strategy:
- 定义策略参数:mtm_period(MTM指标周期)、buy_threshold(买入阈值)、sell_threshold(卖出阈值)。
- 在__init__方法中,创建MTM指标(bt.indicators.Momentum)。
- 在next方法中,编写交易逻辑:
- 如果当前无持仓,且MTM指标大于买入阈值,则计算可用资金,并用全部资金买入股票。
- 如果已有持仓,且MTM指标小于卖出阈值,则卖出全部持仓。
- 在notify_order方法中,处理订单状态:
- 如果订单状态为Completed,打印买入/卖出的执行信息,包括日期、价格、成本、佣金等。
- 如果订单状态为Canceled/Margin/Rejected,打印相应信息。
-
创建Cerebro引擎,设置初始资金为100,000美元。
-
使用yfinance下载苹果股票2020年到2023年的数据,并将其添加到Cerebro引擎中。
-
将MTMStrategy添加到Cerebro引擎中。
-
设置佣金为0.1%。
-
添加分析指标:Returns(收益率)、SharpeRatio(夏普比率)、DrawDown(回撤)。
-
运行回测,打印回测前后的资金情况。
-
获取回测结果,并打印相关指标:
- 年化收益率(Annualized Return)
- 夏普比率(Sharpe Ratio)
- 最大回撤(Max Drawdown)
- 最大回撤期间(Max Drawdown Period)
-
绘制回测结果图表。
代码运行以后结果怎么样呢,我们一起来看一下。
执行结果:
Starting Portfolio Value: 10000.00
Final Portfolio Value: 205910.77
Annualized Return: 19.83%
Sharpe Ratio: 1.64
Max Drawdown: 17.69%
Max Drawdown Period: 313
根据回测结果,我们可以得到以下信息:
-
最终资产组合价值(Final Portfolio Value)为205,910.77美元。相比初始的100,000美元,资产实现了105.91%的增长。这表明在回测期间,该MTM策略在苹果股票上取得了不错的收益。
-
年化收益率(Annualized Return)为19.83%。这意味着平均每年该策略能够提供19.83%的回报。这是一个相当可观的收益率,高于同期的许多其他投资机会。
-
夏普比率(Sharpe Ratio)为1.64。夏普比率衡量了策略的风险调整后收益,即每承受一单位风险,策略能够提供多少超额回报。一般来说,夏普比率大于1就被认为是不错的策略。1.64的夏普比率表明该MTM策略在回测期间提供了高于平均水平的风险调整后收益。
-
最大回撤(Max Drawdown)为17.69%。最大回撤衡量了从高点到低点的最大跌幅,反映了策略可能遭受的最大损失。17.69%的最大回撤说明在最糟糕的情况下,该策略可能会损失17.69%的资产。这个数值相对较高,投资者需要有相应的风险承受能力。
-
最大回撤期间(Max Drawdown Period)为313。这表示从回撤开始到恢复到之前的高点,共经历了313个交易日。这个时间较长,说明该策略可能面临一定的回撤风险,需要较长时间来恢复损失。
哈哈,不错不错,4年时间资产翻了一倍,想想都刺激。MTM策略在回测期间表现优异,取得了高于平均水平的收益和风险调整后收益。但是,该策略也面临着较大的回撤风险,投资者需要有足够的风险承受能力和长期投资的耐心。此外,回测结果只是基于历史数据的模拟,未来的表现可能与回测结果存在差异。
注意,这个只是一个例子,不保证你能靠这个指标就一定能赚到钱,不构成投资建议,大家投资要结合实际情况谨慎投资。