Overall Statistics 
Total Trades
218
Average Win
0.36%
Average Loss
0.48%
Compounding Annual Return
1.086%
Drawdown
16.700%
Expectancy
0.041
Net Profit
1.086%
Sharpe Ratio
0.053
Loss Rate
45%
Win Rate
55%
ProfitLoss Ratio
0.76
Alpha
0.013
Beta
0.036
Annual Standard Deviation
0.196
Annual Variance
0.039
Information Ratio
0.311
Tracking Error
0.232
Treynor Ratio
0.288
Total Fees
$255.15

# # QuantConnect Basic Template: # Fundamentals to using a QuantConnect algorithm. # # You can view the QCAlgorithm base class on Github: # https://github.com/QuantConnect/Lean/tree/master/Algorithm # import numpy as np class DemoAlgorithm(QCAlgorithm): def __init__(self): self.symbols = ['MSFT','UNH','CTAS','JNS','COG'] def Initialize(self): # Set the cash we'd like to use for our backtest # This is ignored in live trading self.SetCash(20000) # Start and end dates for the backtest. # These are ignored in live trading. self.SetStartDate(2016,1,1) self.SetEndDate(2017,1,1) #convert the strings in our list into QuantConnect.Symbol object for convenience. for i in range(len(self.symbols)): # Add those symbols to our universe symbol = self.AddEquity(self.symbols[i],Resolution.Daily).Symbol # replace the original strings with QuantConnect.Symbols self.symbols[i] = symbol # self.History returns the historical price data into a pandas DataFrame, # with columns['close','open','high','low'] history = self.History(self.symbols[i],30,Resolution.Daily) # assign the price list to the corresponding QuantConnect.symbol instance for convenience. self.symbols[i].prices = [x for x in history['close']] # Calculate the 30 days and 10 days sma. self.symbols[i].sma_10 = np.mean(self.symbols[i].prices[10:]) self.symbols[i].sma_30 = np.mean(self.symbols[i].prices) # the scheduled event will be on fire every Monday after the market open self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Monday), self.TimeRules.AfterMarketOpen(self.symbols[0], 2), Action(self.Rebalance)) def OnData(self, data): # the 'data' contains other information besides daipy price. e.g, if there is a stock split on weekend, it would # returns a data at that time. we check here to ensure it's a normal data slice contains all the price information. if False in [data.ContainsKey(x) for x in self.symbols]: return # update each stocks' price list every day for asset in self.symbols: asset.prices.append(float(data[asset].Close)) asset.prices = asset.prices[30:] def Rebalance(self): # first calculate the raw_weight for each stock for asset in self.symbols: asset.sma_10 = np.mean(asset.prices[10:]) asset.sma_30 = np.mean(asset.prices) asset.raw_weight = (asset.sma_10  asset.sma_30)/asset.sma_30 # calculate the total weight total_weights = sum([abs(x.raw_weight) for x in self.symbols]) # calculate normalized_weights and then long/short for asset in self.symbols: asset.normalized_weights = asset.raw_weight/total_weights self.SetHoldings(asset,asset.normalized_weights) if asset.normalized_weights > 0: self.Log('long %s at weight %f'%(str(asset),asset.normalized_weights)) else: self.Log('short %s at weight %f'%(str(asset),asset.normalized_weights))