是的,没有看错,是双MACD,我写这个MACD的目的很简单,一方面是给想要做量化交易的朋友或者刚开始做量化交易的朋友做个开发策略示范,希望能起到一个抛砖引玉、开拓思维的作用;另外一方面,我看到很多自媒体都在讲MACD的用法,但他们都是主观地通过几个商品股票,几个MACD的图形片段,便得出一个以偏概全的MACD用法的所谓有效结论,统计过全市场的的股票数据么?胜率是多少?盈亏比是多少?夏普多少?他们统统不知道,以错误的结论误导投资者。我这次将以客观的数量化的方式,有别于传统MACD的使用方法,看看是不是能实现相对稳定的收益。

(图片来源:Tradingview)
MACD回顾
指数平滑移动平均线(英语:Moving Average Convergence / Divergence, 缩写:MACD,港澳台称为**指数平滑异同移动平均线)**是股票交易中一种常见的技术分析工具,由Gerald Appel于1970年代提出,用于研判股票价格变化的强度、方向、能量,以及趋势周期,找出股价支撑与压力,以便把握股票买进和卖出的时机。
MACD指标由一组曲线与图形组成,通过收盘时股价或指数的快变及慢变的指数移动平均值(EMA)之间的差计算出来。“快”指更短时段的EMA,而“慢”则指较长时段的EMA,最常用的是12及26日EMA。
MACD的计算方法:
一、差离值(DIF值)
先利用收盘价的指数移动平均值(12日/26日)计算出差离值。

二、信号线(DEM值,又称MACD值)
计算出DIF后,会再画一条“信号线”,通常是DIF的9日指数移动平均值

三、柱形图(histogram)
接着,将DIF与DEM的差画成“柱形图”(MACD bar / OSC)。

MACD的简单解读
MACD其实就是两条指数移动平均线——EMA(12)和EMA(26)——的背离和交叉,EMA(26)可视为MACD的零轴,但是MACD呈现的消息噪声较均线少。
MACD是一种趋势分析指针,不宜同时分析不同的市场环境。以下为三种交易信号:
• 差离值(DIF值)与信号线(DEM值,又称MACD值)相交;
• 差离值与零轴相交;
• 股价与差离值的背离。
差离值(DIF)形成“快线”,信号线(DEM)形成“慢线”。若股价持续上涨,DIF 值为正,且愈来愈大;若股价持续下跌,DIF 值为负,且负的程度愈来愈大。
当差离值(DIF)从下而上穿过信号线(DEM),为买进信号;相反若从上而下穿越,为卖出信号。买卖信号可能出现频繁,需要配合其他指针(如:RSI、KD)一同分析。 DIF 值与 MACD 值在0轴在线,代表市场为牛市,若两者皆在0轴线之下,代表市场为熊市。 DIF 值若向上突破 MACD 值及0 轴线,为买进信号,不过若尚未突破0轴,仍不宜买进;DIF 值若向下跌破 MACD 值及0 轴线,为卖出信号,不过若尚未跌破0轴,仍不宜卖出。
离值自底向上穿过零轴代表市场气氛利好股价,相反由上而下则代表利淡股价。差离值与信号线均在零轴上方时,被称为多头市场,反之,则被称为空头市场。
当股价创新低,但MACD并没有相应创新低(牛市背离),视为利好(利多)消息,股价跌势或将完结。相反,若股价创新高,但MACD并没有相应创新高(熊市背离),视为利淡(利空)消息。同样地,若股价与棒形图不配合,也可作类似结论。
MACD是一种中长线的研判指标。当股市强烈震荡或股价变化巨大(如送配股拆细等)时,可能会给出错误的信号。所以在决定股票操作时,应该谨慎参考其他指标,以及市场状况,不能完全信任差离值的单一研判,避免造成损失。
MACD的优缺点:
• 优点:主要适于研判中长期走势,以判断上涨或下跌行情的开始与结束,利用MACD指标,可以判断出目前市况是多头市场还是空头市场,避免逆向操作。在确定趋势后,则可采用相应的买卖策略,减少无谓频繁进出。
• 缺点:当然行情剧烈震荡时,信号反复,造成不必要的损失。同时当价格剧烈单边运动时,MACD信号又有一定的滞后。
策略实现
策略思想:
传统的MACD是使用了价格一个维度的信息,这样不少的信息可能会丢失掉,这次我们的双MACD将采用价格和成交量两个维度的信息,就是分别计算价格的MACD和成交量的MACD。
做多条件:价格和成交量的MACD同时向上穿越0轴
做空条件:价格和成交量的MACD同时向下穿越0轴
测试环境:
• 交易平台——vnpy(python)
• 测试品种——RB8(米筐数据主连合约)
代码实现:
# 设置参数
Shares: int = 1 #交易数量
FastLength: int = 9
SlowLength: int = 12
MACDLength: int = 9
#计算指标
#计算价格的MACD值
pMACD, pSignal, pHist = talib.MACD(self.am.close_array, fastperiod=self.FastLength, slowperiod=self.SlowLength, signalperiod=self.MACDLength)
# 计算成交量的MACD值
vMACD, vSignal, vHist = talib.MACD(self.am.volume_array, fastperiod=self.FastLength, slowperiod=self.SlowLength, signalperiod=self.MACDLength)
#进出场条件
# 做多条件
BuyContidion = ((pHist[-2] < 0) and (pHist[-1] > 0)) and ((vHist[-2] < 0) and (vHist[-1] > 0))
# 做空条件
ShortCondition = ((pHist[-2] > 0) and (pHist[-1] < 0)) and ((vHist[-2] > 0) and (vHist[-1] < 0))
# 主交易逻辑
# 当满足做多条件,先判断是否持有空单,如无,直接多单开多单,若有,平空后开新多单
if BuyContidion:
if self.pos == 0:
self.buy(bar.close_price, self.Shares)
elif self.pos < 0:
self.cover(bar.close_price, abs(self.pos))
self.buy(bar.close_price, self.Shares)
# 当满足做空条件时,先判断是否持有多单,如无,直接开空单,若有,平多后开新空单
elif ShortCondition:
if self.pos == 0:
self.short(bar.close_price, self.Shares)
elif self.pos > 0:
self.sell(bar.close_price, self.pos)
self.short(bar.close_price, self.Shares)
测试结果:


总结
这次我们用价格和成交量的双MACD的方式做了一个初步的有别与传统MACD的探索,策略逻辑也可能存在不完善的地方,比如策略的风险控制,止损止盈等等,如果后期有机会的话,再尝试做一些交易逻辑上的优化和提升。如果这篇文章能给大家带来那么一点点的启发,那么我的目的也就达到了。
一句题外话,做量化一定要打破传统思维,试想下,如果大家都在使用的策略或者量化方法,而且都能赚钱,这样的策略盈利效率一定低下甚至无效,因为这个残酷的市场不会让大部分人赚钱的。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/288626
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!