Overall Statistics |
Total Trades 4322 Average Win 0.04% Average Loss -0.01% Compounding Annual Return 10.017% Drawdown 41.900% Expectancy 3.583 Net Profit 161.882% Sharpe Ratio 0.568 Loss Rate 13% Win Rate 87% Profit-Loss Ratio 4.24 Alpha 0.255 Beta -9.922 Annual Standard Deviation 0.161 Annual Variance 0.026 Information Ratio 0.466 Tracking Error 0.161 Treynor Ratio -0.009 Total Fees $4954.33 |
class NetCurrentAssetValue(QCAlgorithm): def Initialize(self): #rebalancing should occur in July self.SetStartDate(2008,6,15) #Set Start Date self.SetEndDate(2018,7,15) #Set End Date self.SetCash(1000000) #Set Strategy Cash self.UniverseSettings.Resolution = Resolution.Minute self.filtered_fine = None self.filtered_coarse = None self.AddUniverse(self.CoarseSelectionFunction,self.FineSelectionFunction) self.AddEquity("SPY", Resolution.Hour) #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 or have low price self.filtered_coarse = [x.Symbol for x in coarse if (x.HasFundamentalData) and (float(x.AdjustedPrice) > 5)] return self.filtered_coarse else: return [] def FineSelectionFunction(self, fine): if self.yearly_rebalance: #calculate the NCAV/MV and add the property to fine universe object #filters out the companies in the financial sector as suggested fine = [x for x in fine if (float(x.FinancialStatements.BalanceSheet.CurrentAssets.Value) > 0) and (float(x.EarningReports.BasicAverageShares.Value) > 0) and (float(x.FinancialStatements.BalanceSheet.CurrentLiabilities.Value) > 0) and (float(x.FinancialStatements.BalanceSheet.TotalNonCurrentLiabilitiesNetMinorityInterest.Value) > 0) and (x.CompanyReference.IndustryTemplateCode!="B") and (x.CompanyReference.IndustryTemplateCode!="I")] for i in fine: #calculates the net current asset value per share total_liabilities = float(i.FinancialStatements.BalanceSheet.CurrentLiabilities.Value)+float(i.FinancialStatements.BalanceSheet.TotalNonCurrentLiabilitiesNetMinorityInterest.Value) i.ncav = (float(i.FinancialStatements.BalanceSheet.CurrentAssets.Value) - total_liabilities)/float(i.EarningReports.BasicAverageShares.Value) #keeps all symbols that have a NCAV/MV higher than 1.5 self.filtered_fine = [i.Symbol for i in fine if (i.ncav > 1.5)] 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: stocks_invested = [x.Key for x in self.Portfolio] for i in stocks_invested: #liquidate the stocks not in the filtered NCAV/MV list if i not in self.filtered_fine: self.Liquidate(i) #purchase the stocks in the list elif i in self.filtered_fine: self.SetHoldings(i, 1/len(self.filtered_fine)) self.yearly_rebalance = False