开始学习期货的量化交易,从米筐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)