为何要自定义策略
常见的一些策略,比如双均线,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 | 福耀玻璃 | 汽车 |
山西汾酒
福耀玻璃
效果分析
| 股票 | MACD收益率 | 双均线收益率 | MACD最大回撤 | 双均线最大回撤 | MACD交易次数 | 双均线次数 |
|---|---|---|---|---|---|---|
| 山西汾酒 | 9.05% | -1.37% | 8.24% | 15.51% | 6 | 2 |
| 福耀玻璃 | 25.66% | -10.69% | 8.21% | 14.46% | 8 | 3 |
从结果上来看,效果也是不同个股对应的结果有很大不同,总体来说,大部分的个股,它的MACD收益率都是要高于MACD底背离收益率的。因此,底背离数据可以进行参考,不能作为核心指标。
总结
零零散散已经讲了多章基于指标的策略。但实际的量化交易中,很少有人用这些简单的指标作为买入卖出的凭据。之所以要花这么大的篇幅介绍,因为后面的实战中,这些指标将成为我们的核心参考指标来进行量化。 后面一节,我们将介绍backTrade,虽然我们已经使用了那么久了。但是还是需要详细介绍一下这个工具