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])
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])