MACD日測定コード及びMACDの計算方法


先物の量子化取引を学び始め、米かごAPIからコピーされた株価指数先物主力契約の日級MACD日回収に関する入門コード:まず、MACDに関する紹介と計算方式を見てみましょう.MACDは指数平滑移動平均線と呼ばれ、二指数移動平均線から発展し、速い指数移動平均線(EMA 12)から遅い指数移動平均線(EMA 26)を差し引いて速い線DIFを得て、2×(高速線DIF-DIFの9日重み付け移動平均線DEA)MACDカラムを得る.以上のいくつかの指標について:EMA 12:指数移動平均線.EMA(12)=(終値-昨日のEMA)×2/13+昨日のEMA=終値*2/13+昨日のEMA×11/13(株式上場初日のEMAは0)という意味がはっきりしていて、このEMA(12)の計算値は今日の終値の重み配分が2/13で、前日計算したEMA配分が11/13であることを示しています.EMA 26:指数移動平均線.同じ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)