| Overall Statistics |
|
Total Trades 320 Average Win 1.68% Average Loss -1.94% Compounding Annual Return 10.027% Drawdown 21.200% Expectancy 0.200 Net Profit 76.890% Sharpe Ratio 0.766 Probabilistic Sharpe Ratio 25.986% Loss Rate 36% Win Rate 64% Profit-Loss Ratio 0.86 Alpha 0.019 Beta 0.648 Annual Standard Deviation 0.147 Annual Variance 0.021 Information Ratio -0.292 Tracking Error 0.107 Treynor Ratio 0.173 Total Fees $675.13 |
class OptimizationExample(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetCash(75000)
self.stocks = ["SPY"]
symbols = []
for i in self.stocks:
symbols.append(Symbol.Create(i, SecurityType.Equity, Market.USA))
take_profit = self.GetParameter("take-profit") # We grab our value from the Algorithm Parameters. GetParameter must be declared here for the optimization to work
self.UniverseSettings.Resolution = Resolution.Hour
self.SetUniverseSelection(ManualUniverseSelectionModel(symbols))
self.SetAlpha(TradeSPY(self, take_profit)) # We want to pass in the value from our Algorithm Parameters, which we aim to optimize
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
class TradeSPY(AlphaModel):
def __init__(self, algorithm, take_profit): # Our third parameter is the value we aim to optimize
self.Trade = True
self.stocks = []
self.profit = float(take_profit) # Since the Algorithm Parameter is a string we must convert it to a float
algorithm.Schedule.On(algorithm.DateRules.Every(DayOfWeek.Monday),
algorithm.TimeRules.At(9, 30),
self.TradeSet) # Enter a long position every Monday at 9:30 am
def Update(self, algorithm, data):
insights = []
if self.Trade != True: # If self.Trade != True, we monitor our UnrealizedProfitPercent and liquidate our position if it is greater than our optimized variable
for symbol in self.stocks:
if algorithm.Portfolio[symbol].Invested and (algorithm.Securities[symbol].Holdings.UnrealizedProfitPercent > self.profit):
insights.append(Insight.Price(symbol,timedelta(days=6), InsightDirection.Flat))
if self.Trade == True: # Enter long position
for symbol in self.stocks:
#symbol = ticker.Symbol
if not algorithm.Portfolio[symbol].Invested:
insights.append(Insight.Price(symbol,timedelta(days=6), InsightDirection.Up))
self.Trade = False
return insights
def OnSecuritiesChanged(self, algorithm, changes):
for added in changes.AddedSecurities:
self.stocks.append(added.Symbol)
# Triggers every Monday at 9:30 am
def TradeSet(self):
self.Trade = True