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)
Beispiel #2
0
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)