第十讲 自定义MACD策略

0 阅读3分钟

为何要自定义策略

常见的一些策略,比如双均线,macd,RSI,布林带,乖离率这些我们都已经验证过了,但是他们的设置通常都是写死,或者说是不够灵活,而市场通常都是变化的。我们很难采用一套打发打天下。因此,我们会根据某些指标的一些隐藏特性来定义策略。 后续,这些指标和隐藏特性都将成为我们的一个个参考指标。然后进行不断的统计和回测。

如何自定义MACD策略

本次自定义策略,将选择MACD作为我们的策略模板,之前我们使用macd的使用,更多的是关注他的动量柱,直接根据动量柱来决定买入和买出点。本次自定义,我们换一种思路:

当 价格创N日新低但MACD柱未创新低(底背离),说明下跌动能衰竭,买入 MACD死叉的时候卖出

具体的实现代码

STRATEGY_META = {
    'name': 'MACD底背离',
    'category': 'custom',
    'desc': '价格创新低但MACD未创新低时买入,捕捉趋势反转的经典背离策略',
    'params': {'lookback': 30, 'fast': 12, 'slow': 26, 'signal': 9},
    'params_desc': '观察周期30日, MACD参数(12,26,9)',
    'logic': '价格创N日新低且MACD未创新低(底背离) -> 买入; MACD死叉 -> 卖出',
}


class Strategy(bt.Strategy):
    """自定义策略类,必须命名为 Strategy"""
    params = (
        ('lookback', 30),
        ('fast', 12),
        ('slow', 26),
        ('signal', 9),
    )

    def __init__(self):
        self.macd = bt.indicators.MACD(
            self.data.close,
            period_me1=self.p.fast,
            period_me2=self.p.slow,
            period_signal=self.p.signal)
        self.price_lowest = bt.indicators.Lowest(
            self.data.low, period=self.p.lookback)
        self.macd_lowest = bt.indicators.Lowest(
            self.macd.macd, period=self.p.lookback)

    def next(self):
        if not self.position:
            # 底背离: 价格在N日最低点附近, 但MACD高于N日最低值
            at_price_low = self.data.low[0] <= self.price_lowest[0] * 1.01
            macd_higher = self.macd.macd[0] > self.macd_lowest[0] * 0.8
            golden_cross = self.macd.macd[0] > self.macd.signal[0]
            if at_price_low and macd_higher and golden_cross:
                self.buy()
        else:
            # MACD死叉卖出
            if (self.macd.macd[0] < self.macd.signal[0] and
                    self.macd.macd[-1] >= self.macd.signal[-1]):
                self.close()

if __name__ == '__main__':
    print("=" * 60)
    print("自定义策略模板")
    print("=" * 60)
    show_template()

    strategies = load_custom_strategies()
    if not strategies:
        print("没有找到自定义策略,请在 strategies/ 目录下创建策略文件")
    else:
        for key, info in strategies.items():
            meta = info['meta']
            print(f"\n策略: {meta.get('name', key)}")
            print(f"逻辑: {meta.get('logic', '')}")
            run_and_report(info['class'], '600660.SH', '2024-01-01', '2025-12-31',
                          label=meta.get('name', key), plot=True)

使用自定义策略进行结果验证

我们和macd原始策略数据进行比较

股票代码股票名称所属板块
600809.SH山西汾酒食品饮料,白酒
600660.SH福耀玻璃汽车

山西汾酒

image.png

image.png

福耀玻璃

image.png

image.png

效果分析

股票MACD收益率双均线收益率MACD最大回撤双均线最大回撤MACD交易次数双均线次数
山西汾酒9.05%-1.37%8.24%15.51%62
福耀玻璃25.66%-10.69%8.21%14.46%83

从结果上来看,效果也是不同个股对应的结果有很大不同,总体来说,大部分的个股,它的MACD收益率都是要高于MACD底背离收益率的。因此,底背离数据可以进行参考,不能作为核心指标。

总结

零零散散已经讲了多章基于指标的策略。但实际的量化交易中,很少有人用这些简单的指标作为买入卖出的凭据。之所以要花这么大的篇幅介绍,因为后面的实战中,这些指标将成为我们的核心参考指标来进行量化。 后面一节,我们将介绍backTrade,虽然我们已经使用了那么久了。但是还是需要详细介绍一下这个工具