| Overall Statistics |
|
Total Trades 46 Average Win 1.19% Average Loss -1.48% Compounding Annual Return 11.817% Drawdown 4.200% Expectancy 0.174 Net Profit 5.793% Sharpe Ratio 1.181 Probabilistic Sharpe Ratio 53.840% Loss Rate 35% Win Rate 65% Profit-Loss Ratio 0.80 Alpha 0.127 Beta -0.08 Annual Standard Deviation 0.083 Annual Variance 0.007 Information Ratio -1.215 Tracking Error 0.209 Treynor Ratio -1.231 Total Fees $70.76 |
class TransdimensionalNadionPrism(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 6, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.profits = {}
spy = self.AddEquity("SPY", Resolution.Daily).Symbol
self.sma = self.SMA('SPY', 10, Resolution.Daily)
def OnData(self, data):
if not data.Bars.ContainsKey('SPY'):
return
if self.sma.Current.Value > data['SPY'].Close and not self.Portfolio.Invested:
self.SetHoldings('SPY', 1)
else:
self.Liquidate('SPY')
def OnOrderEvent(self, orderEvent):
if orderEvent.Status == OrderStatus.Filled:
profit = self.Portfolio[orderEvent.Symbol].LastTradeProfit
# this prevents trades that open a position from adding a duplicate value
if self.profits[orderEvent.Symbol].Count == 0 or profit != self.profits[orderEvent.Symbol][0]:
self.profits[orderEvent.Symbol].Add(profit)
if self.profits[orderEvent.Symbol].IsReady:
self.Plot('5th profit', 'value', self.profits[orderEvent.Symbol][4])
def OnSecuritiesChanged(self, changed):
for security in changed.AddedSecurities:
sym = security.Symbol
if sym not in self.profits:
self.profits[sym] = RollingWindow[float](10)
for security in changed.RemovedSecurities:
self.Liduidate(security.Symbol)
self.profits.pop(security.Symbol, None)