| Overall Statistics |
|
Total Trades 26 Average Win 3.35% Average Loss -0.92% Compounding Annual Return 8.233% Drawdown 13.700% Expectancy 3.212 Net Profit 37.257% Sharpe Ratio 0.929 Loss Rate 9% Win Rate 91% Profit-Loss Ratio 3.63 Alpha -0.039 Beta 6.115 Annual Standard Deviation 0.089 Annual Variance 0.008 Information Ratio 0.706 Tracking Error 0.089 Treynor Ratio 0.014 Total Fees $197.18 |
from QuantConnect.Data.UniverseSelection import *
import math
import numpy as np
import pandas as pd
import scipy as sp
class PriceEarningsAnamoly(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2012, 1, 1)
self.SetEndDate(2016, 1, 1)
self.SetCash(100000)
self.UniverseSettings.Resolution = Resolution.Daily
self.filtered_fine = None
self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
self.AddEquity("SPY", Resolution.Daily)
self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.AfterMarketOpen("SPY"), self.rebalance)
self._NumCoarseStocks = 200
self._NumStocksInPortfolio = 10
# Count the number of months that have passed since the algorithm starts
self.months = -1
self.yearly_rebalance = True
def CoarseSelectionFunction(self, coarse):
if self.yearly_rebalance:
# drop stocks which have no fundamental data or have low price
CoarseWithFundamental = [x for x in coarse if x.HasFundamentalData and x.Price > 5]
sortedByDollarVolume = sorted(CoarseWithFundamental, key=lambda x: x.DollarVolume, reverse=False)
top = sortedByDollarVolume[:self._NumCoarseStocks]
return [i.Symbol for i in top]
else:
return []
def FineSelectionFunction(self, fine):
if self.yearly_rebalance:
fine = [x for x in fine if (x.ValuationRatios.PERatio > 0)]
for i in fine:
i.PERatio = float(i.ValuationRatios.PERatio)
sortedPERatio = sorted(fine, key=lambda x: x.PERatio)
self.filtered_fine = [i.Symbol for i in sortedPERatio[:self._NumStocksInPortfolio]]
self.yearly_rebalance = False
return self.filtered_fine
else:
return []
def rebalance(self):
# Rebalance at the start of each year
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]
# Liquidate stocks that are not in the list of stocks with lowest PE ratio
for i in stocks_invested:
if i not in self.filtered_fine:
self.Liquidate(i)
elif i in self.filtered_fine:
self.SetHoldings(i, 1/len(self.filtered_fine))