本文共 2010 字,大约阅读时间需要 6 分钟。
开始学习期货的量化交易,从米筐API上拷贝的一个关于股指期货主力合约日级别MACD日回测的入门代码:
首先,先看一下关于MACD的介绍以及计算方式:MACD称为指数平滑移动平均线,是从双指数移动平均线发展而来,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。 关于以上的几种指标: EMA12:指数移动平均线。EMA(12)=(收盘价-昨日的EMA)×2/13+昨日的EMA =收盘价*2/13+昨日的EMA×11/13(股票上市的第一天的EMA是0) 这样意思很明显了,这个EMA(12)的计算值表示的是今天的收盘价的权重分配为2/13,前一天计算的EMA分配为11/13。 EMA26:指数移动平均线。同理EMA(12),EMA(26)=收盘价*25/27+昨日的EMA×2/27。 DIF:离差值。即12日EMA数值减去26日EMA数值。即为talib-MACD返回值macd。 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。# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等import talib# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递def init(context): # context内引入全局变量s1,存储目标合约信息 context.s1 = 'IF1606' # 使用MACD需要设置长短均线和macd平均线的参数 context.SHORTPERIOD = 12 context.LONGPERIOD = 26 context.SMOOTHPERIOD = 9 context.OBSERVATION = 50 #初始化时订阅合约行情。订阅之后的合约行情会在handle_bar中进行更新 subscribe(context.s1)# 你选择的期货数据更新将会触发此段逻辑,例如日线或分钟线更新def handle_bar(context, bar_dict): # 开始编写你的主要的算法逻辑 # 获取历史收盘价序列,history_bars函数直接返回ndarray,方便之后的有关指标计算 prices = history_bars(context.s1, context.OBSERVATION, '1d', 'close') # 用Talib计算MACD取值,得到三个时间序列数组,分别为macd,signal 和 hist macd, signal, hist = talib.MACD(prices, context.SHORTPERIOD, context.LONGPERIOD, context.SMOOTHPERIOD) # macd 是长短均线的差值(即DIF),signal是macd的均线(即DEA),如果短均线从下往上突破长均线,为入场信号,进行买入开仓操作 if macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0: sell_qty = context.portfolio.positions[context.s1].sell_quantity # 先判断当前卖方仓位,如果有,则进行平仓操作 if sell_qty > 0: buy_close(context.s1, 1) # 买入开仓 buy_open(context.s1, 1) if macd[-1] - signal[-1] < 0 and macd[-2] - signal[-2] > 0: buy_qty = context.portfolio.positions[context.s1].buy_quantity # 先判断当前买方仓位,如果有,则进行平仓操作 if buy_qty > 0: sell_close(context.s1, 1) # 卖出开仓 sell_open(context.s1, 1)
转载地址:http://zuklf.baihongyu.com/