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)
加载中,请稍候......