| 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 5.818 Tracking Error 0.069 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel
from datetime import timedelta
class RedGhost(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 12)
self.SetEndDate(2021, 1, 15)
self.SetCash(100000)
self.AddUniverseSelection(UniverseModule())
self.UniverseSettings.Resolution = Resolution.Daily
self.SetAlpha(RGAlphaModel())
self.histories = {}
class UniverseModule(FundamentalUniverseSelectionModel):
def __init__(self, filterFineData = True, universeSettings = None):
super().__init__(filterFineData, universeSettings)
self.averages = {}
'''
Filter by price
'''
def SelectCoarse(self, algorithm, coarse):
return [
x.Symbol for x in coarse if (
x.Price > 10
and x.HasFundamentalData
)
]
'''
Filter by min market cap and share count
'''
def SelectFine(self, algorithm, fine):
MIN_MKT_CAP = 1 * 10 ^ 9
MIN_SHARE_COUNT = 1 * 10 ^ 9
MAX_BARS_BACK = 200
initialFilter = [
x.Symbol for x in fine if (
x.FinancialStatements.BalanceSheet.OrdinarySharesNumber.Value >= MIN_SHARE_COUNT
and x.MarketCap >= MIN_MKT_CAP
)
]
historySlices = algorithm.History(initialFilter, MAX_BARS_BACK, Resolution.Daily)
for symbol, history in historySlices.groupby(level=0):
if symbol not in self.averages:
self.averages[symbol] = SymbolData(symbol, history)
avg = self.averages[symbol]
latestTime = history.loc[symbol].index[-1]
lastClose = history.loc[symbol].close.iloc[-1]
avg.update(latestTime, lastClose)
# algorithm.histories[symbol] = history # -> had to comment this line out, giving the error
upTrending = list(filter(lambda x: x.isUptrend, self.averages.values()))
finalSymbols = [x.symbol for x in upTrending]
return finalSymbols
class RGAlphaModel(AlphaModel):
def __init__(self):
self.insightPeriod = timedelta(days = 30)
def Update(self, algorithm, slice):
insights = []
# for symbol in slice.Bars:
# closingPrices = algorithm.histories[symbol]["close"].tolist()[:10]
# append to insights
return insights
class SymbolData(object):
def __init__(self, symbol, history):
self.symbol = symbol
self.longTerm = ExponentialMovingAverage(200)
self.mediumTerm = ExponentialMovingAverage(100)
self.isUptrend = False
history.loc[self.symbol].apply(lambda row: self.update(row.name, row.close), axis=1)
def update(self, time, value):
self.longTerm.Update(time, value)
self.mediumTerm.Update(time, value)
longTerm = self.longTerm.Current.Value
mediumTerm = self.mediumTerm.Current.Value
self.isUptrend = (
mediumTerm > longTerm
)