Overall Statistics |
Total Trades 30 Average Win 0.45% Average Loss -0.46% Compounding Annual Return -70.861% Drawdown 11.000% Expectancy -0.286 Net Profit -10.939% Sharpe Ratio -6.323 Loss Rate 64% Win Rate 36% Profit-Loss Ratio 0.96 Alpha -1.04 Beta 0.468 Annual Standard Deviation 0.134 Annual Variance 0.018 Information Ratio -9.289 Tracking Error 0.135 Treynor Ratio -1.811 Total Fees $5034.02 |
from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") AddReference("QuantConnect.Indicators") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * from QuantConnect.Data.UniverseSelection import * class SmaCrossUniverseSelectionAlgorithm(QCAlgorithm): '''Provides an example where WarmUpIndicator method is used to warm up indicators after their security is added and before (Universe Selection scenario)''' count = 10; tolerance = 0.01 targetPercent = 1 / count averages = dict() def Initialize(self): self.UniverseSettings.Leverage = 2 self.UniverseSettings.Resolution = Resolution.Daily self.SetStartDate(2018, 1, 1) self.SetEndDate(2018, 2, 1) self.SetCash(1000000) self.EnableAutomaticIndicatorWarmUp = True #ibm = self.AddEquity("IBM", Resolution.Hour).Symbol #ibmSma = self.SMA(ibm, 40) #self.Log(f"{ibmSma.Name}: {ibmSma.Current.Time} - {ibmSma}. IsReady? {ibmSma.IsReady}") spy = self.AddEquity("SPY", Resolution.Hour).Symbol spySma = self.SMA(spy, 10) # Data point indicator spyAtr = self.ATR(spy, 10,) # Bar indicator spyVwap = self.VWAP(spy, 10) # TradeBar indicator self.Log(f"SPY - Is ready? SMA: {spySma.IsReady}, ATR: {spyAtr.IsReady}, VWAP: {spyVwap.IsReady}") eur = self.AddForex("EURUSD", Resolution.Hour).Symbol eurSma = self.SMA(eur, 20, Resolution.Daily) eurAtr = self.ATR(eur, 20, MovingAverageType.Simple, Resolution.Daily) self.Log(f"EURUSD - Is ready? SMA: {eurSma.IsReady}, ATR: {eurAtr.IsReady}") self.AddUniverse(self.CoarseSmaSelector) # Since the indicators are ready, we will receive error messages # reporting that the algorithm manager is trying to add old information self.SetWarmUp(10) def CoarseSmaSelector(self, coarse): score = dict() for cf in coarse: if not cf.HasFundamentalData: continue symbol = cf.Symbol price = cf.AdjustedPrice # grab the SMA instance for this symbol avg = self.averages.setdefault(symbol, self.WarmUpIndicator(symbol, SimpleMovingAverage(100), Resolution.Daily)) # Update returns true when the indicators are ready, so don't accept until they are if avg.Update(cf.EndTime, price): value = avg.Current.Value # only pick symbols who have their price over their 100 day sma if value > price * self.tolerance: score[symbol] = (value - price) / ((value + price) / 2) # prefer symbols with a larger delta by percentage between the two averages sortedScore = sorted(score.items(), key=lambda kvp: kvp[1], reverse=True) return [x[0] for x in sortedScore[:self.count]] def OnSecuritiesChanged(self, changes): for security in changes.RemovedSecurities: if security.Invested: self.Liquidate(security.Symbol) for security in changes.AddedSecurities: self.SetHoldings(security.Symbol, self.targetPercent)