| Overall Statistics |
|
Total Trades 788 Average Win 0.20% Average Loss -0.19% Compounding Annual Return 13.147% Drawdown 11.300% Expectancy 0.122 Net Profit 13.147% Sharpe Ratio 0.83 Probabilistic Sharpe Ratio 40.548% Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.04 Alpha 0.123 Beta -0.028 Annual Standard Deviation 0.143 Annual Variance 0.02 Information Ratio -0.088 Tracking Error 0.221 Treynor Ratio -4.301 Total Fees $2626.68 |
from QuantConnect.Data.UniverseSelection import *
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel
class DynamicNadionCircuit(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 1, 1) # Set Start Date
self.SetEndDate(2011, 1, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
self.SetUniverseSelection(MyUniverseSelectionModel())
self.SetAlpha(MaAlpha())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
self.SetRiskManagement(NullRiskManagementModel())
class MyPortfolioConstructionModel(PortfolioConstructionModel):
# Create list of PortfolioTarget objects from Insights
def CreateTargets(self, algorithm, insights):
targets = list()
for symbol in algorithm.ActiveSecurities.Keys:
target = PortfolioTarget.Percent(algorithm, symbol, 0.1)
targets.append(target)
return targets
# OPTIONAL: Security change details
def OnSecuritiesChanged(self, algorithm, changes):
# Security additions and removals are pushed here.
# This can be used for setting up algorithm state.
# changes.AddedSecurities:
# changes.RemovedSecurities:
pass
class MaAlpha(AlphaModel):
def __init__(self):
self.ma = []
def OnSecuritiesChanged(self, algorithm, changes):
# 1. Initialize a 14-day momentum indicator for each symbol
for security in changes.AddedSecurities:
symbol = security.Symbol
self.ma.append({"symbol": symbol, "indicator": algorithm.EMA(symbol, 100, Resolution.Daily), "close": security.Close})
pass
def Update(self, algorithm, data):
priceUnderEMA = []
for maItem in self.ma :
if maItem["indicator"].Current.Value > maItem["close"] :
priceUnderEMA.append(Insight.Price(maItem["symbol"], timedelta(1), InsightDirection.Up))
insightsGroup = Insight.Group(priceUnderEMA)
return insightsGroup
class MyUniverseSelectionModel(FundamentalUniverseSelectionModel):
def __init__(self):
super().__init__(True, None, None)
def SelectCoarse(self, algorithm, coarse):
filtered = [x for x in coarse if x.HasFundamentalData and x.Price > 0]
sortedByDollarVolume = sorted(filtered, key=lambda x: x.DollarVolume, reverse=True)
return [x.Symbol for x in sortedByDollarVolume][:10]
def SelectFine(self, algorithm, fine):
filtered = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Technology]
self.technology = sorted(filtered, key=lambda f: f.MarketCap, reverse=True)[:3]
#filtered = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.FinancialServices]
#self.financialServices = sorted(filtered, key=lambda f: f.MarketCap, reverse=True)[:2]
#filtered = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.ConsumerDefensive]
#self.consumerDefensive = sorted(filtered, key=lambda f: f.MarketCap, reverse=True)[:1]
#return [x.Symbol for x in self.technology + self.financialServices + self.consumerDefensive]
return [x.Symbol for x in self.technology]