| Overall Statistics |
|
Total Trades 28 Average Win 0.44% Average Loss -0.46% Compounding Annual Return -76.044% Drawdown 11.800% Expectancy -0.286 Net Profit -11.775% Sharpe Ratio -8.625 Loss Rate 64% Win Rate 36% Profit-Loss Ratio 0.96 Alpha -1.733 Beta 0.622 Annual Standard Deviation 0.157 Annual Variance 0.025 Information Ratio -12.92 Tracking Error 0.152 Treynor Ratio -2.182 Total Fees $5007.74 |
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}")
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)