| Overall Statistics |
|
Total Trades 1741 Average Win 0.60% Average Loss -0.64% Compounding Annual Return 6.927% Drawdown 59.800% Expectancy 0.140 Net Profit 103.269% Sharpe Ratio 0.364 Loss Rate 41% Win Rate 59% Profit-Loss Ratio 0.94 Alpha 0.122 Beta -0.607 Annual Standard Deviation 0.301 Annual Variance 0.091 Information Ratio 0.298 Tracking Error 0.301 Treynor Ratio -0.18 Total Fees $3372.30 |
class JanuaryEffectInStocksAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2008, 1, 1)
self.SetEndDate(2018, 8, 1)
self.SetCash(100000)
self.AddEquity("SPY", Resolution.Daily)
self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.AfterMarketOpen("SPY"), self.Rebalance)
self.monthly_rebalance = False
self.coarse = False
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
def CoarseSelectionFunction(self, coarse):
if self.monthly_rebalance:
self.coarse = True
coarse = [x for x in coarse if (x.AdjustedPrice > 10)]
topDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)[:1000]
return [i.Symbol for i in topDollarVolume]
else:
return []
def FineSelectionFunction(self, fine):
if self.monthly_rebalance:
fine =[i for i in fine if i.EarningReports.BasicAverageShares.ThreeMonths!=0
and i.EarningReports.BasicEPS.TwelveMonths!=0
and i.ValuationRatios.PERatio!=0]
for i in fine:
i.MarketCap = float(i.EarningReports.BasicAverageShares.ThreeMonths * (i.EarningReports.BasicEPS.TwelveMonths*i.ValuationRatios.PERatio))
sorted_market_cap = sorted(fine, key = lambda x:x.MarketCap, reverse=True)
symbols = [i.Symbol for i in sorted_market_cap]
self.top_market_cap = symbols[:10]
self.bottom_market_cap = symbols[-10:]
return self.top_market_cap + self.bottom_market_cap
else:
return []
def Rebalance(self):
self.monthly_rebalance = True
def OnData(self, data):
if not (self.monthly_rebalance and self.coarse): return
self.coarse = False
self.monthly_rebalance = False
stocks_invested = [x.Key for x in self.Portfolio if x.Value.Invested]
# invest in small cap stocks at the beginning of each January
if self.Time.month == 1:
# liquidate stocks not in the small-cap group
for i in stocks_invested:
if i not in self.bottom_market_cap:
self.Liquidate(i)
weight = 1/len(self.bottom_market_cap)
for i in self.bottom_market_cap:
self.SetHoldings(i, weight)
# invest in large cap stocks for rest of the year
else:
# liquidate stocks not in the large-cap group
for i in stocks_invested:
if i not in self.top_market_cap:
self.Liquidate(i)
weight = 1/len(self.top_market_cap)
for i in self.top_market_cap:
self.SetHoldings(i, weight)