| Overall Statistics |
|
Total Trades 10 Average Win 46.41% Average Loss -0.07% Compounding Annual Return 19.395% Drawdown 39.900% Expectancy 557.936 Net Profit 1486.887% Sharpe Ratio 0.667 Probabilistic Sharpe Ratio 3.431% Loss Rate 20% Win Rate 80% Profit-Loss Ratio 697.67 Alpha 0.077 Beta 1.096 Annual Standard Deviation 0.248 Annual Variance 0.061 Information Ratio 0.506 Tracking Error 0.167 Treynor Ratio 0.151 Total Fees $147.64 Estimated Strategy Capacity $380000000.00 Lowest Capacity Asset AAPL R735QTJ8XC9X Portfolio Turnover 0.12% |
#region imports
from AlgorithmImports import *
#endregion
# https://quantpedia.com/Screener/Details/25
class SmallCapInvestmentAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2008, 1, 1)
#self.SetEndDate(2019, 7, 1)
self.SetCash(100000)
self.year = -1
self.count = 1
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
#self.AddRiskManagement(MaximumUnrealizedProfitPercentPerSecurity(0.10))
self.AddRiskManagement(MaximumDrawdownPercentPortfolio(-0.10))
def CoarseSelectionFunction(self, coarse):
''' Drop stocks which have no fundamental data or have low price '''
if self.year == self.Time.year:
return Universe.Unchanged
return [x.Symbol for x in coarse if x.HasFundamentalData and x.Price > 5]
def FineSelectionFunction(self, fine):
''' Selects the stocks by lowest market cap '''
sorted_market_cap = sorted([x for x in fine if x.MarketCap > 0],
key=lambda x: x.MarketCap, reverse=True)
return [x.Symbol for x in sorted_market_cap[:self.count]]
def OnData(self, data):
if self.year == self.Time.year:
return
self.year = self.Time.year
for symbol in self.ActiveSecurities.Keys:
self.SetHoldings(symbol, 1/self.count)
def OnSecuritiesChanged(self, changes):
''' Liquidate the securities that were removed from the universe '''
for security in changes.RemovedSecurities:
symbol = security.Symbol
if self.Portfolio[symbol].Invested:
self.Liquidate(symbol, 'Removed from Universe')