Overall Statistics |
Total Trades 10 Average Win 0% Average Loss -0.15% Compounding Annual Return -8.083% Drawdown 0.700% Expectancy -1 Net Profit -0.729% Sharpe Ratio -5.766 Probabilistic Sharpe Ratio 0.000% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.01 Beta -0.049 Annual Standard Deviation 0.014 Annual Variance 0 Information Ratio -8.084 Tracking Error 0.189 Treynor Ratio 1.654 Total Fees $0.00 |
from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Algorithm.Framework import * from QuantConnect.Algorithm.Framework.Portfolio import PortfolioTarget from QuantConnect.Algorithm.Framework.Risk import RiskManagementModel from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel class RiskTest(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) self.SetEndDate(2019,2,1) self.SetCash(1000) self.AddEquity("SPY", Resolution.Minute) self.Securities['SPY'].FeeModel = ConstantFeeModel(0) # Emit new insights every Friday self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday), self.TimeRules.AfterMarketOpen('SPY', 0), self.PlaceOrder ) self.SetPortfolioConstruction(MyPortfolioModel()) self.AddRiskManagement(MyRiskModel(1e-5)) self.SetExecution(ImmediateExecutionModel()) def OnData(self, data): pass def PlaceOrder(self): """ Emit insight to short SPY every Friday """ insight = Insight.Price('SPY', timedelta(days=30), InsightDirection.Down, None, None, None, 1) self.EmitInsights([insight]) class MyPortfolioModel(EqualWeightingPortfolioConstructionModel): def __init__(self): pass def CreateTargets(self, algorithm, insights): # Simple insight weighting PCM targets = [] for insight in insights: targ = PortfolioTarget(insight.Symbol, insight.Direction*insight.Weight) targets.append(targ) return targets class MyRiskModel(RiskManagementModel): def __init__(self, maxDrawdown=0.05): self.maxDrawdown = maxDrawdown self.liquidatedSymbols = set() # Tracks symbols that have been liquidated self.currentTargets = [] # Tracks state of current targets def ManageRisk(self, algorithm, targets): # Reset trackers on new targets if (set(targets) != self.currentTargets) and len(targets)>0: algorithm.Log(f'New Targets. Quantity: {targets[0].Quantity}') self.liquidatedSymbols = set() self.currentTargets = set(targets) riskAdjustedTargets = [] for _ in algorithm.Securities: symbol = _.Key # Symbol object security = _.Value # Security object ticker = symbol.Value # String ticker symbolPnL = security.Holdings.UnrealizedProfitPercent # Current PnL # Liquidate if exceed drawdown if (symbolPnL < -self.maxDrawdown) or (ticker in self.liquidatedSymbols): riskAdjustedTargets.append(PortfolioTarget(symbol, 0)) if algorithm.Securities[symbol].Invested: self.liquidatedSymbols.add(ticker) algorithm.Log(f'Trailing stop loss triggered for {ticker}.') return riskAdjustedTargets