Esempio n. 1
0
def my_rebalance(context, data):
    fx_contract = data.current(context.fx, 'contract')
    fy_contract = data.current(context.fy, 'contract')

    target_weights = {}
    sign_f1_f2, sign_fx_fy, entry_flag = get_entry_flag(context, data)

    if entry_flag:  # 符号が同じなのでトレードしない.
        context.x_short_y_long = False
        context.x_long_y_short = False
        target_weights[fx_contract] = 0.0
        target_weights[fy_contract] = 0.0
        c_pair = opt.Pair(fx_contract, fy_contract)

    else:
        if sign_fx_fy > 0:
            context.x_long_y_short = True
            target_weights[fx_contract] = 0.5 * context.levarage
            target_weights[fy_contract] = -0.5 * context.levarage
            c_pair = opt.Pair(fx_contract, fy_contract)

        else:  # sign_fx_fy < 0
            context.x_short_y_long = True
            target_weights[fx_contract] = -0.5 * context.levarage
            target_weights[fy_contract] = 0.5 * context.levarage
            c_pair = opt.Pair(fy_contract, fx_contract)

    order_optimal_portfolio(
        objective=opt.TargetWeights(target_weights),
        constraints=[opt.MaxGrossExposure(context.levarage), c_pair])
Esempio n. 2
0
def my_rebalance(context, data):
    ## 現在の期近と5限月のコントラクトを取得
    near = data.current(context.near, 'contract')
    far = data.current(context.far, 'contract')
    target_weights = {}
    sign_near, sign_far, entry_flag = get_entry_flag(context, data)

    # nearの満期まであと何日(営業日ベース)残っているか出力(ストラテジーには使っていない. )
    todays_date = get_datetime('US/Eastern')
    context.distance = context.futures_calendar.session_distance(todays_date, near.auto_close_date)
    log.info(context.distance)        
    #log.info(context.futures_calendar.session_distance(near.auto_close_date, far.auto_close_date))  
    
    # entry_flag がFalseのとき,もし,ポジションを持っている場合は,クローズ
    if not entry_flag:
        if context.near_short_far_long or context.near_long_far_short:
            target_weights[near] = 0.0
            target_weights[far] = 0.0
            
            
    # entry_flag が True, つまり sign_nearとsign_farのフラグが逆の場合.
    else:
        # 2と3限月がコンタンゴ,4と5限月がバックワーデーション
        if sign_near > 0:
            target_weights[near] = -0.5
            target_weights[far] = 0.5
            c_pair = opt.Pair(far, near,)

            
            # if context.near_short_far_long:
            #     # 既にポジションを持っているので
            #     pass 
            # else: 
            #     target_weights[near] = 0.5
            #     target_weights[far] = -0.5
                
        else: # つまり sign_near < 0
            target_weights[near] = 0.5
            target_weights[far] = -0.5
            c_pair = opt.Pair(near, far,)
            
            # if context.near_long_far_short:
            #     pass 
            # else:
            #     target_weights[near] = -0.5
            #     target_weights[far] = 0.5

        
        order_optimal_portfolio(objective=opt.TargetWeights(target_weights),
                                constraints=[opt.MaxGrossExposure(context.levarage),
                                             c_pair])