Overall Statistics |
Total Trades 239 Average Win 1.10% Average Loss -0.65% Compounding Annual Return 10.589% Drawdown 17.400% Expectancy 0.398 Net Profit 32.296% Sharpe Ratio 0.669 Loss Rate 48% Win Rate 52% Profit-Loss Ratio 1.70 Alpha 0.181 Beta -4.839 Annual Standard Deviation 0.146 Annual Variance 0.021 Information Ratio 0.551 Tracking Error 0.146 Treynor Ratio -0.02 Total Fees $1812.63 |
from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Indicators") AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Data import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * from System.Collections.Generic import List import decimal as d import numpy as np import time from datetime import timedelta ### <summary> ##Remvoing an if statement increased the returns by 4 % ### </summary> class BasicTemplateAlgorithm(QCAlgorithm): '''Basic template algorithm simply initializes the date range and cash''' def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' self.SetStartDate(2010,10,07) #Set Start Date self.SetEndDate(2012,10,01) #Set End Date self.SetCash(100000) #Set Strategy Cash ## N=Normal (Manufacturing), M=Mining, U=Utility, T=Transportation, B=Bank, I=Insurance self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction) self.bond = self.AddEquity('TLT',Resolution.Daily).Symbol self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol self.spy_sma = self.SMA('SPY',200,Resolution.Daily) self.first = 0 self.month = 0 self.Top_sector = '' self.The_sectors = {"XME|M":0,"KIE|I":0,"XLU|U":0,"XLF|B":0,"IYT|T":0,} for symbol in self.The_sectors: self.AddEquity(symbol.split('|')[0],Resolution.Daily) self.The_sectors[symbol]= self.MOM(symbol.split('|')[0],30,Resolution.Daily) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(3,45),Action(self.rebalance)) self.SetWarmUp(200) def CoarseSelectionFunction(self, coarse): filtered_stocks = filter(lambda x: x.HasFundamentalData,coarse) filtered_stocks = list(filter(lambda x: x.DollarVolume >250000,filtered_stocks)) filtered_stocks.sort(key = lambda x: x.DollarVolume) return [stock.Symbol for stock in filtered_stocks[:50]] def FineSelectionFunction(self, fine): ready = [indicator.IsReady for indicator in self.The_sectors.values()] if not ready: return if not self.first: self.Top_sector = max(self.The_sectors,key = self.The_sectors.get).split('|')[-1] self.first +=1 filtered_stocks = list(filter(lambda x: self.Top_sector in str(x.CompanyReference.IndustryTemplateCode),fine)) return [stock.Symbol for stock in filtered_stocks[:5]] def OnSecuritiesChanged(self, changes): if self.spy_sma.IsReady: if self.Securities[self.spy].Price >self.spy_sma.Current.Value: for stock in self.Portfolio.Values: bond =[stock.Symbol for stock in self.Portfolio.Values if stock.Invested and str(stock.Symbol).split(' ')[0] == 'TLT'] if bond: self.Liquidate('TLT') self.Log("Bonds were here") else: for stock in changes.AddedSecurities: oo = len(self.Transactions.GetOpenOrders(stock.Symbol)) cash = float(self.Portfolio.Cash) if not oo and cash >0 and str(stock.Symbol).split(' ')[0] != 'SPY': self.SetHoldings(stock.Symbol,0.10) def rebalance(self): self.month+=1 if self.month % 25 == 0: curr_best_sector = max(self.The_sectors,key = self.The_sectors.get).split('|')[-1] if self.Top_sector!= curr_best_sector: self.Top_sector= curr_best_sector bond =[stock.Symbol for stock in self.Portfolio.Values if stock.Invested and str(stock.Symbol).split(' ')[0] == 'TLT'] if not bond: self.Liquidate() time.sleep(20) if self.spy_sma.IsReady and not self.Portfolio.HoldStock: if self.Securities[self.spy].Price < self.spy_sma.Current.Value: self.SetHoldings(self.bond,1) self.Log('Should buy TLT')