Overall Statistics |
Total Trades 47 Average Win 5.40% Average Loss -2.36% Compounding Annual Return 2.259% Drawdown 17.600% Expectancy 0.573 Net Profit 31.696% Sharpe Ratio 0.279 Loss Rate 52% Win Rate 48% Profit-Loss Ratio 2.29 Alpha -0.04 Beta 3.7 Annual Standard Deviation 0.076 Annual Variance 0.006 Information Ratio 0.064 Tracking Error 0.076 Treynor Ratio 0.006 Total Fees $143.63 |
from Execution.ImmediateExecutionModel import ImmediateExecutionModel from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel class HorizontalMultidimensionalReplicator(QCAlgorithm): def Initialize(self): self.SetStartDate(2007, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash # Set WarmUp period of 252 days self.SetWarmUp(252) # Add the Alpha Model self.AddAlpha(PanicToExcuberanceAlphaModel(self)) # Use EqualWeightingPortfolioConstructionModel() to maintain equal weights self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) # Use ImmediateExecutionModel() for instant execution using market orders self.SetExecution(ImmediateExecutionModel()) # Add SPY to the security universe symbols = [ Symbol.Create("SPY", SecurityType.Equity, Market.USA) ] self.SetUniverseSelection( ManualUniverseSelectionModel(symbols) ) class PanicToExcuberanceAlphaModel(AlphaModel): def __init__(self, algorithm): # Set resolution for EMA Indicator self.resolution = Resolution.Daily self.algorithm = algorithm # Add custom data from Quandl self.yearlyHighs = algorithm.AddData(QuandlData, 'URC/NASDAQ_52W_HI', Resolution.Daily).Symbol # Add indicators using custom data self.ema = algorithm.EMA(self.yearlyHighs, 5, self.resolution) self.max = algorithm.MAX(self.yearlyHighs, 252, self.resolution) self.min = algorithm.MIN(self.yearlyHighs, 252, self.resolution) # Set the prediction period self.period = timedelta(days=30) def Update(self, algorithm, data): insights = [] # Return if no data if not data.ContainsKey(self.yearlyHighs): return insights # Return if indicators are not ready if not (self.min.IsReady or self.max.IsReady): return insights # Calculate the numerator of the custom indicator delta = self.max.Current.Value - self.min.Current.Value # Calculate the denominator of the custom indicator scaled = self.ema.Current.Value - self.min.Current.Value # Calculate the value of the custom indicator rank = scaled / delta # Plot the custom indicator self.algorithm.Plot("Rank", "High Rank", rank) # Emit insight on SPY if the indicator value exceeds 0.5 if rank > 0.50: insights.append(Insight.Price("SPY", self.period, InsightDirection.Up, 0.001)) return insights class QuandlData(PythonQuandl): def __init__(self): ## Retrieve the data from the the Quandl object, specifying the data field used on Quandl self.ValueColumnName = "NUMBERS OF STOCKS"