| Overall Statistics |
|
Total Trades 2 Average Win 0% Average Loss -0.03% Compounding Annual Return -0.420% Drawdown 0.000% Expectancy -1 Net Profit -0.025% Sharpe Ratio -6.425 Probabilistic Sharpe Ratio 0.000% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.003 Beta 0 Annual Standard Deviation 0.001 Annual Variance 0 Information Ratio 1.626 Tracking Error 0.6 Treynor Ratio 347.646 Total Fees $2.00 |
## (*) Denotes code changes
class VerticalNadionGearbox(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 2, 20) # Set Start Date
self.SetEndDate(2020, 3, 12)
self.SetCash(100000) # Set Strategy Cash
symbols = [ Symbol.Create("SPY", SecurityType.Equity, Market.USA) ]
self.SetUniverseSelection( ManualUniverseSelectionModel(symbols) )
self.UniverseSettings.Resolution = Resolution.Daily
self.AddAlpha(MyAlphaModel())
self.SetPortfolioConstruction(MyPortfolioModel()) # (*)
self.SetRiskManagement(MaximumDrawdownPercentPerSecurityCustom(0.05))
self.SetExecution(ImmediateExecutionModel())
def OnData(self, data):
pass
class MyAlphaModel(AlphaModel):
emited = False
def Update(self, algorithm, data):
if not self.emited:
self.emited = True
return [Insight.Price("SPY", timedelta(365), InsightDirection.Up)]
return []
class MyPortfolioModel(EqualWeightingPortfolioConstructionModel):
def __init__(self):
pass
def CreateTargets(self, algorithm, insights):
# (*)
targets = []
for insight in insights:
targ = PortfolioTarget(insight.Symbol, insight.Direction)
targets.append(targ)
return targets
class MaximumDrawdownPercentPerSecurityCustom(RiskManagementModel):
def __init__(self, maximumDrawdownPercent = 0.01):
self.maximumDrawdownPercent = -abs(maximumDrawdownPercent)
self.liquidated = set()
self.currentTargets = set()
def ManageRisk(self, algorithm, targets):
# (*)
if (set(targets) != self.currentTargets) and len(targets)>0:
algorithm.Log(f"Different Targets: Quantity {targets[0].Quantity}")
self.currentTargets = set(targets)
self.liquidated = set()
targets = []
for kvp in algorithm.Securities:
security = kvp.Value
pnl = security.Holdings.UnrealizedProfitPercent
if pnl < self.maximumDrawdownPercent or security.Symbol in self.liquidated:
# liquidate
targets.append(PortfolioTarget(security.Symbol, 0))
if algorithm.Securities[security.Symbol].Invested:
self.liquidated.add(security.Symbol)
algorithm.Log(f"Liquidating {security.Symbol}")
return targets