加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

量化交易策略——MACD策略

(2017-01-09 19:46:56)
标签:

量化交易

macd策略

分类: 交易策略
    1979年,查拉尔·阿佩尔(Gerald Apple)创造了MACD(Moving Average Convergence and Divergence)指标,最开始是一种跟踪股票、黄金运行趋势的技术分析工具,由一快及一慢指数移动平均(EMA)之间的差计算出来,买进信号:MACD从负数转向正数;卖出信号:MACD从正数转向负数。在应用上MACD应先行计算出短时期EMA和长时期EMA的移动平均值,12及26日EMA是最常用的。


MACD(蓝线): 计算12天平均和26天平均的差

Signal (红线): 计算macd9天均值

Histogram (柱): 计算macd与signal的差值

公式算法:

12日EMA = 前一日EMA12 X 11/13 + 今日收盘 X 2/13
26日EMA = 前一日EMA26 X 25/27 + 今日收盘 X 2/27
DIF线   = EMA12 - EMA26  
DEA线   = DIF线的M日指数平滑移动平均线,此值为了不与指标原名相混淆又称DEA或DEM
MACD线  = DIF线与DEA线的差

    虽然绝大多数投资者对MACD指标相当熟悉,但是想用的遂心应手却不是一件容易的事情,MACD指标的一般研判标准可以从4个方面分析:1.DIF和MACD的值及线的位置;2.DIF和MACD的交叉情况;3.红柱状的收缩情况;4.MACD图形的形态。

参数:一般为12日、26日、9日。

指数加权平滑系数为:

12日EMA平滑系数: 2/(12日EMA+1)
26日EMA平滑系数: 2/(26日EMA+1)
DEA线平滑系数:   2/(9日EMA+1)

策略实现:

买进:DIF从下而上穿过DEA;
卖出:DIF从上往下穿过DEA。
import pandas as pd
start = datetime(2013, 1, 1)
end = datetime(2015, 7, 13)
benchmark = 'HS300'
#universe = ['601398.XSHG', '600028.XSHG', '601988.XSHG', '600036.XSHG', '600030.XSHG',
            #'601318.XSHG', '600000.XSHG', '600019.XSHG', '600519.XSHG', '601166.XSHG']
universe = set_universe('SH50')
capital_base = 200000
refresh_rate = 1
window = 1
initMACD = -10000.0
histMACD = pd.DataFrame(initMACD, index = universe, columns = ['preShortEMA', 'preLongEMA', 'preDIF', 'preDEA'])
shortWin = 26    # 短期EMA平滑天数
longWin  = 52    # 长期EMA平滑天数
macdWin  = 15    # DEA线平滑天数
longest_history = window
def initialize(account):
    account.amount = 10000
    account.universe = universe
    account.days = 0
    
def handle_data(account):
    account.days = account.days+1
    
    for stk in account.universe:
        all_close_prices = account.get_attribute_history('closePrice', 1)
        prices = all_close_prices[stk]
        if prices is None:
            continue
        
        preShortEMA = histMACD.at[stk, 'preShortEMA']
        preLongEMA = histMACD.at[stk, 'preLongEMA']
        preDIF = histMACD.at[stk, 'preDIF']
        preDEA = histMACD.at[stk, 'preDEA']
        if preShortEMA == initMACD or preLongEMA == initMACD:
            histMACD.at[stk, 'preShortEMA'] = prices[-1]
            histMACD.at[stk, 'preLongEMA'] = prices[-1]
            histMACD.at[stk, 'preDIF'] = 0
            histMACD.at[stk, 'preDEA'] = 0
            return
            
        shortEMA = preShortEMA*1.0*(shortWin-1)/(shortWin+1) + prices[-1]*2.0/(shortWin+1)
        longEMA = preLongEMA*1.0*(longWin-1)/(longWin+1) + prices[-1]*2.0/(longWin+1)
        DIF = shortEMA - longEMA
        DEA = preDEA*1.0*(macdWin-1)/(macdWin+1) + DIF*2.0/(macdWin+1)
        
        histMACD.at[stk, 'preShortEMA'] = shortEMA
        histMACD.at[stk, 'preLongEMA'] = longEMA
        histMACD.at[stk, 'preDIF'] = DIF
        histMACD.at[stk, 'preDEA'] = DEA
            
        if account.days > longWin and account.days%1 == 0:
            #if DIF > 0 and DEA > 0 and preDIF > preDEA and DIF < DEA:
            if preDIF > preDEA and DIF < DEA:
                order_to(stk, 0)
            #if DIF < 0 and DEA < 0 and preDIF < preDEA and DIF > DEA:
            if preDIF < preDEA and DIF > DEA:
                amount = account.amount/prices[-1]
                order_to(stk, amount)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有