| Overall Statistics |
|
Total Trades 35 Average Win 0.22% Average Loss -0.42% Compounding Annual Return -67.208% Drawdown 7.100% Expectancy -0.360 Net Profit -7.069% Sharpe Ratio -6.189 Probabilistic Sharpe Ratio 0.485% Loss Rate 58% Win Rate 42% Profit-Loss Ratio 0.52 Alpha -0.877 Beta 0.025 Annual Standard Deviation 0.14 Annual Variance 0.02 Information Ratio -7.64 Tracking Error 0.156 Treynor Ratio -35.158 Total Fees $52.58 |
class ModulatedCalibratedThrustAssembly(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 12, 1) # Set Start Date
self.SetEndDate(2019, 12 , 25)
self.SetCash(100000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
self.SetExecution(ImmediateExecutionModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetRiskManagement(TrailingStopRiskManagementModel(0.02))
tickers = ["AAPL", "FB", "GOOG", "AMD"]
symbols = [Symbol.Create(ticker, SecurityType.Equity, Market.USA) for ticker in tickers]
self.SetUniverseSelection(ManualUniverseSelectionModel(symbols))
self.AddAlpha(MomentumAlpha())
class MomentumAlpha(AlphaModel):
def __init__(self):
self.indicators = {}
def Update(self, algorithm, data):
insights = []
for symbol in self.indicators:
rsi = self.indicators[symbol].rsi
if rsi.Current.Value < 30:
insights.append(Insight.Price(symbol, timedelta(days = 2), InsightDirection.Up))
elif rsi.Current.Value > 70:
insights.append(Insight.Price(symbol, timedelta(days = 2), InsightDirection.Down))
return insights
def OnSecuritiesChanged(self, algorithm, changes):
for security in changes.AddedSecurities:
symbol = security.Symbol
if symbol not in self.indicators:
self.indicators[symbol] = SymbolData(algorithm, symbol)
class SymbolData:
def __init__(self, algorithm, symbol):
self.algorithm = algorithm
self.symbol = symbol
self.rsi = self.algorithm.RSI(symbol, 14, MovingAverageType.Exponential, Resolution.Daily)
self.rsi.Updated += self.OnRSIUpdated
def OnRSIUpdated(self, sender, updated):
self.algorithm.Plot("RSI", self.symbol.Value, updated)