移动平滑异同平均线(Moving Average Convergence Divergence,简称MACD指标)策略。MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一慢指数移动平均(EMA)之间的差计算出来。“快”指短时期的EMA,而“慢”则指长时期的EMA,最常用的是12及26日EMA。

  MACD指标是运用快速(短期)和慢速(长期)移动平均线及其聚合与分离的征兆,加以双重平滑运算,是一种趋向类指标。根据移动平均线原理发展出来的MACD,一则去除了移动平均线频繁发出假信号的缺陷,二则保留了移动平均线的效果,因此,MACD指标具有均线趋势性、稳重性、安定性等特点,是用来研判买卖股票的时机,预测股票价格涨跌的技术分析指标 。

Talib提供了MACD函数,我在研究中实验了MACD的用法,并自己进行了编程,对比了结果,与同花顺交易软件中的指标走势一致。使用Talib中的MACD进行了策略回测。

MACD=M快 - M慢

  M快为快速平均线,即较短时间移动平均线,M慢为慢速移动平均线,即较长时间的移动平均线

应用:

1.DIF 与MACD均为正值亦即在中轴线上,大势属多头市场,DIF 向上突破 MACD,应作买。若 DIF向下跌破MACD应只可作回档,暂时获利了解。

  2.反之DIF与MACD均为负值时,即在0轴线以下时,大势属空头市场,DIF 向下跌破MACD,可作卖。若 DIF向上突破MACD只可作空头暂时补空。

  3.如同强弱指标,背离走势也适用在 MACD的图形上,当MACD图形与 K线 图趋势线发生背离时亦为反转讯号。

  4.MACD无法预知高价及低价。盘局时,失误率较高, 但如配合 RSI及KD线 应用则可以解决此二缺点.

  5.运用柱形图的变化可提早作买或作卖,免得失去一段行情,但注意有时 亦会因贪小而失大。

  从MACD的走势,投资者可以发现三种讯息: 1. 当MACD升穿Signal Line,入市讯息;当MACD跌穿Signal Line,出市讯息。 2. 当MACD上升时,股票价格可能是超买

有些函数必须在回测环境中运行,这里是在聚宽的jupyter notbook中写的

#此例子采用Talib提供的MACD指标作为买入/卖出信号。
#当MACD信号小于0卖出。
#当MACD信号大于0买入。
import talib
import numpy as np
import pandas as pd # 定义一个全局变量, 保存要操作的证券
stocks = ['000001.XSHE','000002.XSHE','000004.XSHE','000005.XSHE']
# 设置我们要操作的股票池
set_universe(stocks)
# 初始化此策略
def handle_data(context, data):
# 取得当前的现金
cash = context.portfolio.cash
# 循环股票列表
for stock in stocks:
# 获取股票的收盘价数据
prices = attribute_history(stock, 40, '1d', ('close'))
# 创建MACD买卖信号,包括三个参数fast period, slow period, and the signal
# 注意:MACD使用的price必须是narray
macd = MACD(prices['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
# 获取当前股票的数据
current_position = context.portfolio.positions[stock].amount
# 获取当前股票价格
current_price = data[stock].price
# 当MACD信号小于0,且拥有的股票数量大于0时,卖出所有股票
if macd < 0 and current_position > 0:
order_target(stock, 0)
# 当MACD信号大于0, 且拥有的股票数量为0时,则全仓买入
elif macd > 0 and current_position == 0:
number_of_shares = int(cash/current_price)
# 购买量大于0时,下单
if number_of_shares > 0:
# 买入股票
order(stock, +number_of_shares)
# 记录这次买入
log.info("Buying %s" % (stock)) # 定义MACD函数
def MACD(prices, fastperiod=12, slowperiod=26, signalperiod=9):
'''
参数设置:
fastperiod = 12
slowperiod = 26
signalperiod = 9 返回: macd - signal
'''
macd, signal, hist = talib.MACD(prices,
fastperiod=fastperiod,
slowperiod=slowperiod,
signalperiod=signalperiod)
return macd[-1] - signal[-1]

对于talib中的macd:

计算方法:

12日EMA的计算:EMA12 = 前一日EMA12 X 11/13 + 今日收盘 X 2/13

26日EMA的计算:EMA26 = 前一日EMA26 X 25/27 + 今日收盘 X 2/27

差离值(DIF)的计算: DIF = EMA12 - EMA26,即为talib-MACD返回值macd

根据差离值计算其9日的EMA,即离差平均值,是所求的DEA值。今日DEA = (前一日DEA X 8/10 + 今日DIF X 2/10),即为talib-MACD返回值signal

DIF与它自己的移动平均之间差距的大小一般BAR=(DIF-DEA)2,即为MACD柱状图。但是talib中MACD的计算是bar = (dif-dea)1

买卖原则为:

DIF-DEA均为正,买入信号参考。

DIF-DEA均为负,卖出信号参考。

talib.MACD详情:

以下是用两种方式求得的结果:


importimport talibtalib
importimport matplotlib.pyplotmatplot as plt
import numpy as np
import pandas as pd df = get_price('000001.XSHE', start_date='2015-04-01', end_date='2015-11-10', frequency='daily')
#剔除停盘数据
df[df['volume']==0]=np.nan
df= df.dropna() def myMACD(price, fastperiod=12, slowperiod=26, signalperiod=9):
ewma12 = pd.ewma(price,span=fastperiod)
ewma60 = pd.ewma(price,span=slowperiod)
dif = ewma12-ewma60
dea = pd.ewma(dif,span=signalperiod)
bar = (dif-dea) #有些地方的bar = (dif-dea)*2,但是talib中MACD的计算是bar = (dif-dea)*1
return dif,dea,bar
#第一种
macd, signal, hist = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
#第二种
mydif,mydea,mybar = myMACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9) #画图
fig = plt.figure(figsize=[18,5])
plt.plot(df.index,macd,label='macd dif')
plt.plot(df.index,signal,label='signal dea')
plt.plot(df.index,hist,label='hist bar')
plt.plot(df.index,mydif,label='my dif')
plt.plot(df.index,mydea,label='my dea')
plt.plot(df.index,mybar,label='my bar')
plt.legend(loc='best')

两种方式结果比对:

1.可以看出Talib中的MACD对前33个初始值是未定义的,使用时需注意。

2.可以自己编程,将初始值赋值为计算的第一天价格,得到曲线,由于初始值赋值不同在一段时间后,自己定义的macd函数和Talib提供的MACD函数值一致,说明两种计算方法一致。

TA-LIB】之MACD的更多相关文章

  1. TA-Lib中文文档(一):快速开始

    TA-Lib 简介: 这是一个Python 金融指数处理库TA-LIB,他是基于 Cython 而不是 SWIG. TA-Lib is widely used by trading software ...

  2. 用anaconda的pip安装第三方python包的日志

    用anaconda的pip安装第三方python包的日志 启动anaconda命令窗口: 开始> 所有程序> anaconda> anaconda prompt 会得到两行提示: D ...

  3. zipline-- 开发指南

    Development Guidelines开发指南This page is intended for developers of Zipline, people who want to contri ...

  4. python安装talib库

    简便安装方法 最简单的安装方式: $ pip install TA-Lib 用setup.py的方式自己安装一个源文件 $ python setup.py install 有可能遇到的问题 func. ...

  5. DLL and LIB

    在StackOverflow中看到一个提问“what's the difference between DLL's and LIB's?” 有如下回复值得参考: 回复一:

  6. BotVS趋势交易策略-MACD

    MACD低买高卖自动跟单滑动止损策略 , 基于Python实现. 交叉后前一柱指金叉后的第一柱的值, 交叉后前一柱指金叉前的最后一个柱的值, 滑动价格指下单时加的价格,比如买单会现价加上这个价格,卖单 ...

  7. BotVS开发基础—2.7 指标MACD

    代码 def main(): while true: records = _C(exchange.GetRecords); # 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函 ...

  8. /lib/dracut/hooks/shutdown/30-dm-shutdown.sh

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVQAAAMACAIAAABEqXuoAAAgAElEQVR4nOydPWjryOK3VaZM8RYpU2 ...

  9. 高频交易算法研发心得--MACD指标算法及应用

    凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...

  10. 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

    这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...

随机推荐

  1. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  2. vscode好用的扩展及常用的快捷键

    1.open-in-browser 或者view in browser  安装后右键即可快速打开浏览器 2.quokka调试工具插件,能对正在编写的代码提供实时反馈,并能预览变量的函数和计算结果 3. ...

  3. C++/CLI中的const literal initonly 友元(转)

    C++/CLI中的const literal initonly 友元 C++/CLI中的const Visual C++并不允许在const对象上调用成员函数,除非该成员函数也被声明为const. C ...

  4. git分支合并冲突

    合并冲突 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们. 如果你对 #53 问题的修改和有关 hotfix 的修改都涉及到同一个文件的同一处,在合并 ...

  5. 微信小程序电商实战-商品列表流式布局

    今天给大家分享一下微信小程序中商品列表的流式布局方式,根据文章内容操作就可以看到效果哦~~~ 流式布局概念 流式布局也叫百分比布局 把元素的宽,高,margin,padding不再用固定数值,改用百分 ...

  6. SublimeText插件autoprefixer : css 添加前续

    /* 使用前 */ body { background: linear-gradient(to bottom, #DADADA, #000); } p a { -webkit-border-radiu ...

  7. css3照片墙

    一张张照片散乱的撒在一起,鼠标悬浮时旋转放大并摆正,效果如下图(所有图片均来自网络),主要使用到的css3属性有:transition.transform(scale.rotateZ).box-sha ...

  8. 如何让Oracle数据库保持优良性能的方法

    OracleDatabase,又名OracleRDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上流行 ...

  9. 了解Web及网络基础(一)

    在理解HTTP之前,先大概知道TCP/IP是什么. 当不同的硬件.操作系统或者不同的设备想要进行通信,那么双方就要遵循同一个协议才可以进行通信,而这个协议的通称就是TCP/IP,也就是说TCP/IP之 ...

  10. while循环小例

    # 使用while 循环输入 1 2 3 4 5 6 8 9 10 n = 1 while n <= 10: if n == 7: pass else: print(n) n = n + 1 # ...