• TA-LIB】之MACD


    移动平滑异同平均线(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函数值一致,说明两种计算方法一致。

  • 相关阅读:
    mac添加环境变量
    Flex 中文字体终极解决方案
    C# Label背景透明
    C# 字节数组和十六进制字符串之间转换的另类写法
    C# params 动态参数
    HttpFlexSession注册失败的怪问题
    sun.misc.BASE64Encoder找不到jar包的解决方法
    Eclipse jee 3.7常用插件安装手记
    GitHub安装缓慢甚至下载失败的解决办法
    subclipse解决JavaHL不可用的问题
  • 原文地址:https://www.cnblogs.com/mxhmxh/p/9367669.html
Copyright © 2020-2023  润新知