Back to Community
Dual momentum now goes to cash if everything is down

This is my latest version of Dual Momentum. Now I get out of everything if nothing has moved up over last 250 days.
Let me know what you think. Notice how it dodged the downturn in market in 2008 -9

Clone Algorithm
243
Loading...
Backtest from to with initial capital
Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Max Drawdown
--
Benchmark Returns
--
Volatility
--
Returns 1 Month 3 Month 6 Month 12 Month
Alpha 1 Month 3 Month 6 Month 12 Month
Beta 1 Month 3 Month 6 Month 12 Month
Sharpe 1 Month 3 Month 6 Month 12 Month
Sortino 1 Month 3 Month 6 Month 12 Month
Volatility 1 Month 3 Month 6 Month 12 Month
Max Drawdown 1 Month 3 Month 6 Month 12 Month

# Put any initialization logic here.  The context object will be passed to
# the other methods in your algorithm.
def initialize(context):
    #set_symbol_lookup_date('2002-08-01')
    context.stocks = symbols('SPY','QQQ','EFA','IEV','GLD')
    context.formation = 250#30#250
    context.port_size = 1
    
    context.month_count = 0
    
    schedule_function(
    rebalance,
    date_rules.month_end(days_offset=0),
    time_rules.market_close(minutes=5)
    )
    pass

def rebalance(context, data):
    #get daily historical prices
    h = history(context.formation, '1d', 'price')[context.stocks]
    #use dataframe resample to get monthly values
    h = h.resample('M', how='last')
    print h
    #first, get the pct_change() from the first date (0) in the dataframe and today (-1). Then splice the last row because the first row is all NaN. Drop all stocks with NaN then turn the dataframe into series. Series make it easier to sort.
 
    
    chg = h.iloc[[0,-1]].pct_change().tail(1).dropna(axis=1)
    
    mom = chg.squeeze()
    
    #order by return percentage, and take only the top N
    mom = mom.order().index[-context.port_size:]
    print mom
    #liquidate positions that are not in the buy list
    for s in context.portfolio.positions:
        if s not in mom or chg[s][0] < 0.0:
            order_target_percent(s, 0)
    
    #get weight based on how many stocks are selected
    weight = 0.95/len(mom)
    
    #purchase stocks in the buy list
    for s in mom:
        if s in data and chg[s][0] > 0.0:
            order_target_percent(s, weight)
    
# Will be called on every trade event for the securities you specify. 
def handle_data(context, data):
    record(leverage = context.account.leverage)
    pass
There was a runtime error.