Overall Statistics |
Total Trades 485 Average Win 1.51% Average Loss -1.02% Compounding Annual Return 21.128% Drawdown 41.600% Expectancy 0.629 Net Profit 276.995% Sharpe Ratio 0.86 Probabilistic Sharpe Ratio 26.118% Loss Rate 34% Win Rate 66% Profit-Loss Ratio 1.48 Alpha 0.073 Beta 0.829 Annual Standard Deviation 0.188 Annual Variance 0.035 Information Ratio 0.376 Tracking Error 0.146 Treynor Ratio 0.195 Total Fees $2655.35 Estimated Strategy Capacity $110000.00 Lowest Capacity Asset ACH SAG21CX51085 |
# region imports from AlgorithmImports import * # endregion class MuscularRedOrangeWhale(QCAlgorithm): def Initialize(self): # self.SetStartDate(2015, 1 ,1) self.SetEndDate(2021, 12, 1) self.SetCash(100000) self.UniverseSettings.Resolution = Resolution.Daily self.UniverseSettings.Leverage = 10.0 self.AddUniverse(self.CoarseSelection,self.FineSelection) self.selected = [] self.selection_flag = 0 self.symbol = self.AddEquity('SPY',Resolution.Daily) self.Schedule.On(self.DateRules.MonthEnd(self.symbol.Symbol), self.TimeRules.AfterMarketOpen(self.symbol.Symbol), self.time_check) self.SetBenchmark('SPY') def CoarseSelection(self,coarse): if self.selection_flag != 6: return Universe.Unchanged selected = [c for c in coarse if c.HasFundamentalData] pb_sorted = sorted(selected, key= lambda c: c.DollarVolume ,reverse= True) pb = [x.Symbol for x in pb_sorted] return pb[:5000] def FineSelection(self, fine): pb_checked = [c for c in fine if c.ValuationRatios.PBRatio < 1 and c.ValuationRatios.PBRatio > 0] filtered_fine = [x for x in fine if x.FinancialStatements.IncomeStatement.NetIncome.TwelveMonths and x.FinancialStatements.CashFlowStatement.CashFlowFromContinuingOperatingActivities.TwelveMonths and x.OperationRatios.ROA.ThreeMonths and x.OperationRatios.ROA.OneYear and x.FinancialStatements.BalanceSheet.ShareIssued.ThreeMonths and x.FinancialStatements.BalanceSheet.ShareIssued.TwelveMonths and x.OperationRatios.GrossMargin.ThreeMonths and x.OperationRatios.GrossMargin.OneYear and x.OperationRatios.LongTermDebtEquityRatio.ThreeMonths and x.OperationRatios.LongTermDebtEquityRatio.OneYear and x.OperationRatios.CurrentRatio.ThreeMonths and x.OperationRatios.CurrentRatio.OneYear and x.OperationRatios.AssetsTurnover.ThreeMonths and x.OperationRatios.AssetsTurnover.OneYear and x.ValuationRatios.NormalizedPERatio] sortedByfactor1 = [x for x in filtered_fine if FScore(x.FinancialStatements.IncomeStatement.NetIncome.TwelveMonths, x.FinancialStatements.CashFlowStatement.CashFlowFromContinuingOperatingActivities.TwelveMonths, x.OperationRatios.ROA.ThreeMonths, x.OperationRatios.ROA.OneYear, x.FinancialStatements.BalanceSheet.ShareIssued.ThreeMonths, x.FinancialStatements.BalanceSheet.ShareIssued.TwelveMonths, x.OperationRatios.GrossMargin.ThreeMonths, x.OperationRatios.GrossMargin.OneYear, x.OperationRatios.LongTermDebtEquityRatio.ThreeMonths, x.OperationRatios.LongTermDebtEquityRatio.OneYear, x.OperationRatios.CurrentRatio.ThreeMonths, x.OperationRatios.CurrentRatio.OneYear, x.OperationRatios.AssetsTurnover.ThreeMonths, x.OperationRatios.AssetsTurnover.OneYear).ObjectiveScore() > 7] self.sortedbyfactor = [x.Symbol for x in sortedByfactor1] return self.sortedbyfactor def OnData(self, data): if self.selection_flag != 6: return self.selection_flag = 0 self.Liquidate() for symbol in self.sortedbyfactor: self.SetHoldings(symbol, 1 / len(self.sortedbyfactor)) self.sortedbyfactor.clear() def time_check(self): self.selection_flag = self.selection_flag + 1 class FScore(object): def __init__(self, netincome, operating_cashflow, roa_current, roa_past, issued_current, issued_past, grossm_current, grossm_past, longterm_current, longterm_past, curratio_current, curratio_past, assetturn_current, assetturn_past): self.netincome = netincome self.operating_cashflow = operating_cashflow self.roa_current = roa_current self.roa_past = roa_past self.issued_current = issued_current self.issued_past = issued_past self.grossm_current = grossm_current self.grossm_past = grossm_past self.longterm_current = longterm_current self.longterm_past = longterm_past self.curratio_current = curratio_current self.curratio_past = curratio_past self.assetturn_current = assetturn_current self.assetturn_past = assetturn_past def ObjectiveScore(self): fscore = 0 fscore += np.where(self.netincome > 0, 1, 0) fscore += np.where(self.operating_cashflow > 0, 1, 0) fscore += np.where(self.roa_current > self.roa_past, 1, 0) fscore += np.where(self.operating_cashflow > self.roa_current, 1, 0) fscore += np.where(self.longterm_current <= self.longterm_past, 1, 0) fscore += np.where(self.curratio_current >= self.curratio_past, 1, 0) fscore += np.where(self.issued_current <= self.issued_past, 1, 0) fscore += np.where(self.grossm_current >= self.grossm_past, 1, 0) fscore += np.where(self.assetturn_current >= self.assetturn_past, 1, 0) return fscore