Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -0.017 Tracking Error 0.109 Treynor Ratio 0 Total Fees $0.00 |
from Execution.ImmediateExecutionModel import ImmediateExecutionModel from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel class NetNet(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) # Set Start Date self.SetEndDate(2020, 1, 31) self.SetCash(100000) # Set Strategy Cash self.SetAlpha(NetNetAlpha()) self.SetExecution(ImmediateExecutionModel()) self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.SetUniverseSelection(FineFundamentalUniverseSelectionModel(self.CoarseSelectionFunction, self.FineSelectionFunction, None, None)) self.UniverseSettings.Resolution = Resolution.Daily self.SetSecurityInitializer(lambda x: x.SetDataNormalizationMode(DataNormalizationMode.Raw)) def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' # if not self.Portfolio.Invested: # self.SetHoldings("SPY", 1) # on 15 Jan, filter for securities with fundamental data def CoarseSelectionFunction(self, coarse): if self.Time.month == 1 and self.Time.date == 15: filtered = [ x.Symbol for x in coarse if x.HasFundamentalData ] return filtered else: return Universe.Unchanged # on 15 Jan, filter for securities with price above 1000 def FineSelectionFunction(self, fine): if self.Time.month == 1 and self.Time.date == 15: filtered = [ x.Symbol for x in fine if x.Price > 1000 ] # filtered = [ x.Symbol for x in fine if ( (x.FinancialStatements.BalanceSheet.CurrentAssets.ThreeMonths > x.FinancialStatements.BalanceSheet.TotalLiabilitiesAsReported.ThreeMonths) and (x.FinancialStatements.BalanceSheet.OrdinarySharesNumber.ThreeMonths > 0)) ] # filtered = [ x.Symbol for x in filtered if x.FinancialStatements.BalanceSheet.TotalLiabilitiesAsReported.ThreeMonths ] # filtered = [ x.Symbol for x in filtered if x.FinancialStatements.BalanceSheet.OrdinarySharesNumber.OneMonth ] # filtered = [ x.Symbol for x in filtered if (x.Price / ((x.FinancialStatements.BalanceSheet.CurrentAssets.OneMonth - x.FinancialStatements.BalanceSheet.TotalLiabilitiesAsReported.ThreeMonths) / x.FinancialStatements.BalanceSheet.OrdinarySharesNumber.ThreeMonths)) <= 0.66] return filtered else: return Universe.Unchanged class NetNetAlpha(AlphaModel): def __init__(self): pass # self.lastMonth = -1 def OnSecuritiesChanged(self, algorithm, changes): pass def Update(self, algorithm, data): insights = [] if self.Time.month == 1 and self.Time.date == 15: # if algorithm.Time.month == 1 and algorithm.Time.date == 15: for security in algorithm.ActiveSecurities.Values: # price = security.Price # currentAssets = security.Fundamentals.FinancialStatements.BalanceSheet.CurrentAssets.ThreeMonths # totalLiabilities = security.Fundamentals.FinancialStatements.BalanceSheet.TotalLiabilitiesAsReported.ThreeMonths # shares = security.Fundamentals.FinancialStatements.BalanceSheet.OrdinarySharesNumber.ThreeMonths # if ( price / ( (currentAssets - totalLiabilities) / shares ) <= 0.66 ): # insights.append(Insight.Price(security.Symbol, timedelta(days = 366), InsightDirection.Up)) insights.append(Insight.Price(security.Symbol, timedelta(days=366), InsightDirection.Up)) return insights else: return insights