『期货策略』-MACD指标


(caoxiyang) #1

期货策略-MACD指标

策略介绍:

指数平滑异同移动平均线(英语:Moving Average Convergence / Divergence, MACD)是股票交易中一种常见的技术分析工具, 由Gerald Appel于1970年代提出,用于研判股票价格变化的强度、方向、能量,以及趋势周期,以便把握股票买进和卖出的时机。

MACD指标由一组曲线与图形组成,通过收盘时股价或指数的快变及慢变的指数移动平均值(EMA)之间的差计算出来。“快”指更短时段的EMA(Exponential Moving Average),而“慢”则指较长时段的EMA,最常用的是12及26日EMA。

策略思路:

利用收盘价的短期(常用为12日)指数移动平均线与长期(常用为26日)指数移动平均线之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标。

  • 短期EMA: 短期(例如12日)的收盘价指数移动平均值
  • 长期EMA: 长期(例如26日)的收盘价指数移动平均值
  • DIF线:(Difference)短期EMA和长期EMA的离差值
  • DEA线:(Difference Exponential Average)DIF线的M日指数平滑移动平均线
  • MACD线: DIF线与DEA线的差
  • 参数:SHORT(短期)、LONG(长期)、M天数,一般为12、26、9。

计算方法

一、离差值(DIF):

  • 先利用收盘价的指数移动平均值(12日/26日)计算出离差值。
  • 公式: $DIF = EMA_{(close,12)}-EMA_{(close,26)}$

二、讯号线(DEA):

  • 计算出DIF后,会再画一条“讯号线”,通常是DIF的9日指数移动平均值。
  • 公式: $DEM = EMA_{(DIF,9)}$

三、柱形图或棒形图:

  • 接着,将DIF与DEM的差画成“柱形图(MACD bar/OSC)”
  • 公式: $OSC = DIF - DEM = DIF - MACD$ 或简写为 $D - M$

MACD图形:

上表为收市价图表,绿线是离差值(DIF),红线是讯号线(DEA),白色区块柱形图(MACD bar / OSC)是两者的差(D-M)。

策略解读

MACD其实就是两条指数移动平均线——EMA(12)和EMA(26)——的背离和交叉,EMA(26)可视为MACD的零轴,但是MACD呈现的讯息噪声较均线少。

MACD是一种趋势分析指标,不宜同时分析不同的市场环境。以下为三种交易讯号:

  • 差离值(DIF值)与讯号线(DEM值,又称MACD值)相交;
  • 差离值与零轴相交;
  • 股价与差离值的背离。

差离值(DIF)形成“快线”,讯号线(DEM)形成“慢线”。
当差离值(DIF)从下而上穿过讯号线(DEM),为买进讯号;相反若从上而下穿越,为卖出讯号。买卖讯号可能出现频繁,需要配合其他指标(如:RSI、KD)一同分析。

棒形图(MACD bar / Oscillator,OSC)的作用是显示出“差离值”与“讯号线”的差,同时将两条线的走势具体化,以判断差离值和讯号线交叉形成的买卖讯号,例如正在下降的棒形图代表两线的差值朝负的方向走,趋势向下;靠近零轴时,差离值和讯号线将相交出现买卖讯号。

棒形图会根据正负值分布在零轴(X轴)的上下。棒形图在零轴上方时表示走势较强,反之则是走势较弱。

差离值由下而上穿过零轴代表市场气氛利好股价,相反由上而下则代表利淡股价。差离值与讯号线均在零轴上方时,被称为多头市场,反之,则被称为空头市场。

当股价创新低,但MACD并没有相应创新低(牛市背离),视为利好(利多)讯息,股价跌势或将完结。相反,若股价创新高,但MACD并没有相应创新高(熊市背离),视为利淡(利空)讯息。同样地,若股价与棒形图不配合,也可作类似结论。

MACD是一种中长线的研判指标。当股市强烈震荡或股价变化巨大(如送配股拆细等)时,可能会给出错误的信号。所以在决定股票操作时,应该谨慎参考其他指标,以及市场状况,不能完全信任差离值的单一研判,避免造成损失。

策略实现:

交易标的:橡胶1809
策略开始时间:2017-11-01
策略结束时间:2018-06-01

使用以下交易逻辑:

  • DIF从下而上穿过DEA,买入开仓;
  • 相反,如DIF从上往下穿过DEA,卖出开仓。

策略代码如下:

克隆策略
In [4]:
import talib
def initialize(context):
    # 设置是否是结算模式
    context.set_need_settle(False)
    # 设置最大杠杆
    context.set_max_leverage(1, 'fill_amap')
    # 设置参数
    context.longest_history = 50 
    # 均线窗口
    context.shortWin = 12    # 短期EMA平滑天数
    context.longWin  = 26    # 长期EMA平滑天数
    context.macdWin  = 9    # DEA线平滑天数
In [5]:
def handle_data(context, data):
    
    if context.trading_day_index  < context.longest_history: # 在50个交易日以后才开始真正运行
        return
   
    today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
    instrument = context.future_symbol(context.instruments[0]) # 交易标的
    curr_po=context.portfolio.positions[instrument] # 组合持仓
    curr_position = curr_po.amount  # 持仓数量
    
    # 获取价格数据
    prices = data.history(instrument, 'price', context.longest_history, '1d')
    # 均线计算
    macd_tmp = talib.MACD(np.array(prices), context.shortWin,context.longWin, context.macdWin)
    DIF = macd_tmp[0]
    DEA = macd_tmp[1]
    MACD = macd_tmp[2]
    # 交易逻辑
    if  DIF[-1] < DEA[-1] and DIF[-2] > DEA[-2]: # 卖出开仓
        if curr_position >= 0 and data.can_trade(instrument):
            order_target(instrument, -20)
            print(today,'今日DIF下穿DEA,卖出开仓')
    elif  DIF[-1] > DEA[-1] and DIF[-2] < DEA[-2]:# 买入开仓
        if curr_position <= 0 and data.can_trade(instrument):
            order_target(instrument, 20)
            print(today,'今日DIF上穿DEA,买入开仓')
In [6]:
# 启动回测
# 策略回测接口: https://bigquant.com/docs/module_trade.html
m = M.trade.v3(
    instruments= ['RU1809.SHF'],
    start_date='2017-11-01',
    end_date='2018-06-01',
    initialize=initialize,
    handle_data=handle_data,
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=1000000,
    benchmark='RU1809.SHF',
    m_deps=np.random.rand()
)
[2018-08-01 15:31:27.154406] INFO: bigquant: backtest.v7 开始运行..
[2018-08-01 15:31:27.161168] INFO: bigquant: biglearning backtest:V7.1.2
[2018-08-01 15:31:29.058049] INFO: algo: TradingAlgorithm V1.2.2
2018-01-15 今日DIF上穿DEA,买入开仓
2018-01-17 今日DIF下穿DEA,卖出开仓
2018-02-23 今日DIF上穿DEA,买入开仓
2018-03-20 今日DIF下穿DEA,卖出开仓
2018-04-12 今日DIF上穿DEA,买入开仓
2018-04-17 今日DIF下穿DEA,卖出开仓
2018-04-19 今日DIF上穿DEA,买入开仓
[2018-08-01 15:31:30.169585] INFO: Performance: Simulated 143 trading days out of 143.
[2018-08-01 15:31:30.176790] INFO: Performance: first open: 2017-10-31 21:00:00+00:00
[2018-08-01 15:31:30.178184] INFO: Performance: last close: 2018-06-01 15:00:00+00:00
  • 收益率9.65%
  • 年化收益率17.63%
  • 基准收益率-16.99%
  • 阿尔法0.03
  • 贝塔-0.52
  • 夏普比率0.53
  • 胜率0.29
  • 盈亏比3.16
  • 收益波动率37.88%
  • 信息比率0.06
  • 最大回撤22.4%
[2018-08-01 15:31:30.859610] INFO: bigquant: backtest.v7 运行完成[3.705215s].

(WKing1111) #2

您好,获取数据那一条代码里,频率只能是:‘1d’吗,频率可以是5分钟或者15分钟吗?或者有其他方法可以实现5分钟MACD策略,谢谢