def compute_rollovers(context, data): next_open = context.trading_calendar.next_open(data.current_dt) days = (next_open.date() - data.current_dt.date()).days if days > 1: days = days + 1 positions = get_positions(context) rates_3m = short_rates.current(context, context.ccy_universe) carry = 0 for asset, row in positions.iterrows(): rates_differential = (rates_3m[asset.quote_ccy] - rates_3m[asset.base_ccy]) / 100.0 rates_spread = 2 * context.params['rollover_spread'] / 100.0 carry_effective_notional = row['amount'] * row[ 'last_sale_price'] * row['last_fx_value'] carry_cost = carry_effective_notional * rates_differential carry_spread_cost = abs(carry_effective_notional) * rates_spread carry = carry + carry_cost - carry_spread_cost # we assume ACT/360 convention for all currencies daily_carry = (carry * days) / 360.0 context.perf_tracker.cumulative_performance.handle_cash_payment( daily_carry) context.perf_tracker.todays_performance.handle_cash_payment(daily_carry)
def signal_function_carry(context, data): rates_3m = short_rates.current(context,context.ccy_universe) rates_differentials = {} for pair in context.universe: rates_differentials[pair] = rates_3m[pair.quote_ccy] - rates_3m[ pair.base_ccy] sorted_universe = sorted(rates_differentials.items(), key=lambda x: x[1]) n_pos = context.params['positions'] short_pos = [(k[0],-0.5/n_pos) for k in sorted_universe[:n_pos]] zero_pos = [(k[0],0.0) for k in sorted_universe[n_pos:-n_pos]] long_pos = [(k[0],0.5/n_pos) for k in sorted_universe[-n_pos:]] context.weights = dict(short_pos+zero_pos+long_pos)