Overall Statistics |
Total Trades 64 Average Win 44.75% Average Loss -10.81% Compounding Annual Return 28.596% Drawdown 84.900% Expectancy 2.558 Net Profit 7935.717% Sharpe Ratio 0.796 Probabilistic Sharpe Ratio 8.181% Loss Rate 31% Win Rate 69% Profit-Loss Ratio 4.14 Alpha 0.204 Beta 0.652 Annual Standard Deviation 0.32 Annual Variance 0.102 Information Ratio 0.577 Tracking Error 0.308 Treynor Ratio 0.391 Total Fees $354574.95 Estimated Strategy Capacity $140000.00 Lowest Capacity Asset DFAX R735QTJ8XC9X |
#region imports from AlgorithmImports import * #endregion class NetCurrentAssetValue(QCAlgorithm): def Initialize(self): #rebalancing should occur in July self.SetStartDate(2005,1,1) #Set Start Date # self.SetEndDate(2018,7,15) #Set End Date self.SetCash(1000000) #Set Strategy Cash self.UniverseSettings.Resolution = Resolution.Daily self.previous_fine = None self.filtered_fine = None self.AddUniverse(self.CoarseSelectionFunction,self.FineSelectionFunction) self.AddEquity("SPY", Resolution.Daily) #monthly scheduled event but will only rebalance once a year self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.At(23, 0), self.rebalance) self.months = -1 self.yearly_rebalance = False def CoarseSelectionFunction(self, coarse): if self.yearly_rebalance: # drop stocks which have no fundamental data self.filtered_coarse = [x.Symbol for x in coarse if (x.HasFundamentalData)] # and (x.Market == "usa")] return self.filtered_coarse else: return [] def FineSelectionFunction(self, fine): if self.yearly_rebalance: self.filtered_fine = [x for x in fine if (float(x.CompanyProfile.EnterpriseValue) < 0)] sorted_filter = sorted(self.filtered_fine, key=lambda x: x.CompanyProfile.EnterpriseValue) self.filtered_fine = [i.Symbol for i in sorted_filter] ev = [x for x in fine if (float(x.CompanyProfile.EnterpriseValue) < 0)] self.Debug(self.Time) self.Debug(len(ev)) return self.filtered_fine else: return [] def rebalance(self): #yearly rebalance self.months+=1 if self.months%12 == 0: self.yearly_rebalance = True def OnData(self, data): if not self.yearly_rebalance: return if self.filtered_fine: portfolio_size = int(len(self.filtered_fine)/10) #pick the upper decile to short and the lower decile to long long_stocks = self.filtered_fine[:portfolio_size] stocks_invested = [x.Key for x in self.Portfolio] for i in stocks_invested: #liquidate the stocks not in the filtered balance sheet accrual list if i not in self.filtered_fine: self.Liquidate(i) #long the stocks in the list elif i in long_stocks: self.SetHoldings(i, 1/(portfolio_size)) #short the stocks in the list self.yearly_rebalance = False self.filtered_fine = False