Overall Statistics |
Total Trades 11 Average Win 0.19% Average Loss 0% Compounding Annual Return 15.540% Drawdown 2.100% Expectancy 0 Net Profit 15.449% Sharpe Ratio 3.228 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.083 Beta 2.993 Annual Standard Deviation 0.044 Annual Variance 0.002 Information Ratio 2.786 Tracking Error 0.044 Treynor Ratio 0.047 Total Fees $11.00 |
class ProportionalSimpleMovingAverage(QCAlgorithm): def Initialize(self): # Set the cash we'd like to use for our backtest # This is ignored in live trading self.SetCash(10000) # Start and end dates for the backtest. # These are ignored in live trading. self.SetStartDate(2017,1,1) self.SetEndDate(2018,1,1) # Add assets you'd like to see self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol self.qqq = self.AddEquity("QQQ", Resolution.Daily).Symbol self.tlt = self.AddEquity("TLT", Resolution.Daily).Symbol self.agg = self.AddEquity("AGG", Resolution.Daily).Symbol self.benchmark = self.spy #Custom member variables self.risk_on_symbols = [self.spy, self.qqq] self.risk_off_symbols = [self.tlt, self.agg] #Schedule every day SPY is trading self.Schedule.On(self.DateRules.EveryDay(), \ self.TimeRules.AfterMarketOpen(self.benchmark, 10), \ Action(self.EveryDayOnMarketOpen)) def EveryDayOnMarketOpen(self): #self.Log("Market Open!") #Do nothing if outstanding orders exist if self.Transactions.GetOpenOrders(): return #Lookup last 84 days slices = self.History(self.benchmark, 84) #Get close of last (yesterday's) slice bench_close = slices["close"][-1] #Get mean over last 21 days bench_prices_short = slices["close"][-21:] bench_mean_short = bench_prices_short.mean() #Get mean over last 84 days bench_prices_long = slices["close"] bench_mean_long = bench_prices_long.mean() risk_on_pct = (bench_mean_short/bench_close) * \ ((bench_mean_short *2 / bench_mean_long) *.25) / \ len(self.risk_on_symbols) risk_off_pct = (bench_close/bench_mean_short) * \ ((bench_mean_long *2 / bench_mean_short) *.25) / \ len(self.risk_off_symbols) #Submit orders for sid in self.risk_on_symbols: self.SetHoldings(sid, risk_on_pct) for sid in self.risk_off_symbols: self.SetHoldings(sid, risk_off_pct)