| Overall Statistics |
|
Total Trades 5 Average Win 24.80% Average Loss -0.11% Compounding Annual Return 24.924% Drawdown 28.300% Expectancy 108.794 Net Profit 32.048% Sharpe Ratio 0.839 Probabilistic Sharpe Ratio 37.746% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 218.59 Alpha 0.228 Beta -0.484 Annual Standard Deviation 0.238 Annual Variance 0.057 Information Ratio 0.363 Tracking Error 0.393 Treynor Ratio -0.413 Total Fees $37.17 Estimated Strategy Capacity $14000000.00 Lowest Capacity Asset TMF UBTUG7D0B7TX |
# g score investing updated
from QuantConnect.Python import PythonQuandl
import numpy as np
import pandas as pd
import scipy as sc
from datetime import timedelta
from QuantConnect.Data.UniverseSelection import *
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel
from AlgorithmImports import *
import statistics as stat
from collections import deque
class DynamicCalibratedGearbox(QCAlgorithm):
def Initialize(self):
self.FinSci_ROA_key = 'FINSCI_ROA'
self.Energy_ROA_key = 'ENERGY_ROA'
self.SetStartDate(2019, 1, 1)
self.SetEndDate(2022, 6, 24)
self.SetCash(100000)
#self.SetBrokerageModel(AlphaStreamsBrokerageModel())
#self.SetAlpha(ConstantAlphaModel(InsightType.Price, InsightDirection.Up, timedelta(days=31)))
#self.SetExecution(ImmediateExecutionModel())
#self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel(lambda time:None))
#self.AddUniverseSelection(FineFundamentalUniverseSelectionModel(self.CoarseFilter, self.FineFilter))
self.UniverseSettings.Resolution = Resolution.Daily
self.curr_month = -1
self.FinSci_ROA = {}
self.energy_ROA = {}
self.symbols = None
self.quarters = 0
self.SetWarmUp(756, Resolution.Daily)
#KEI
quandl_symbol = "OECD/KEI_LOLITOAA_OECDE_ST_M"
self.kei = self.AddData(NasdaqDataLink, quandl_symbol, Resolution.Daily).Symbol
self.init = True
self.sma = self.SMA(self.kei, 1)
self.mom = self.MOMP(self.kei, 2)
self.XLFsector_symbolDataBySymbol = {}
self.XLEsector_symbolDataBySymbol = {}
self.XLBsector_symbolDataBySymbol = {}
self.XLIsector_symbolDataBySymbol = {}
self.XLYsector_symbolDataBySymbol = {}
self.XLPsector_symbolDataBySymbol = {}
self.XLUsector_symbolDataBySymbol = {}
self.XLKsector_symbolDataBySymbol = {}
self.XLVsector_symbolDataBySymbol = {}
self.XLCsector_symbolDataBySymbol = {}
self.XLEstocks = [x.Value for x in self.energy_ROA]
self.XLFstocks = []
self.XLBstocks = []
self.XLIstocks = []
self.XLYstocks = []
self.XLPstocks = []
self.XLUstocks = []
self.XLKstocks = []
self.XLVstocks = []
self.XLCstocks = []
self.trade = True
self.stateData = { }
self.SPY = self.AddEquity('SPY', Resolution.Daily).Symbol
self.stock = self.AddEquity('QQQ', Resolution.Hour).Symbol
self.bond = self.AddEquity('TMF', Resolution.Hour).Symbol
self.vix = self.AddEquity('VIX', Resolution.Minute).Symbol
self.XLF = self.AddEquity('XLF', Resolution.Hour).Symbol
self.XLE = self.AddEquity('XLE', Resolution.Hour).Symbol
self.XLB = self.AddEquity('XLB', Resolution.Hour).Symbol
self.XLI = self.AddEquity('XLI', Resolution.Hour).Symbol
self.XLY = self.AddEquity('XLY', Resolution.Hour).Symbol
self.XLP = self.AddEquity('XLP', Resolution.Hour).Symbol
self.XLU = self.AddEquity('XLU', Resolution.Hour).Symbol
self.XLK = self.AddEquity('XLK', Resolution.Hour).Symbol
self.XLV = self.AddEquity('XLV', Resolution.Hour).Symbol
self.XLC = self.AddEquity('XLC', Resolution.Hour).Symbol
#Shorts
self.SQQQ = self.AddEquity('SQQQ', Resolution.Daily).Symbol
#self.manually_selected = [self.SPY, self.stock, self.bond, self.vix, self.XLF, self.XLE, self.XLB, self.XLI, self.XLY, self.XLP, self.XLU, self.XLK, self.XLV, self.XLC]
self.manually_selected = []
# Stock Selector
#self.UniverseSettings.Resolution = Resolution.Minute
self.universeXLF = self.AddUniverse(self.coarse, self.XLFfine)
self.universeXLE = self.AddUniverse(self.coarse, self.XLEfine)
# self.universeXLB = self.AddUniverse(self.coarse, self.XLBfine)
# self.universeXLI = self.AddUniverse(self.coarse, self.XLIfine)
# self.universeXLY = self.AddUniverse(self.coarse, self.XLYfine)
# self.universeXLP = self.AddUniverse(self.coarse, self.XLPfine)
# self.universeXLU = self.AddUniverse(self.coarse, self.XLUfine)
# self.universeXLK = self.AddUniverse(self.coarse, self.XLKfine)
# self.universeXLV = self.AddUniverse(self.coarse, self.XLVfine)
# self.universeXLC = self.AddUniverse(self.coarse, self.XLCfine)
self.SetWarmup(500)
self.symbolBySectorCode = dict()
self.__numberOfSymbols = 2000
self.__numberOfSymbolsFine = 3
self.addedsymbols = [self.SPY, self.stock, self.bond, self.vix, self.XLF, self.XLE, self.XLB, self.XLI, self.XLY, self.XLP, self.XLU, self.XLK, self.XLV, self.XLC, self.SQQQ]
self.Schedule.On(self.DateRules.EveryDay(self.stock), self.TimeRules.AfterMarketOpen(self.stock, 1),
self.Rebalance)
self.Schedule.On(self.DateRules.EveryDay(self.stock), self.TimeRules.AfterMarketOpen(self.stock, 5),
self.Collectsymboldata)
#set the following between 1 - 4 hours depending on buy frequency
self.Schedule.On(self.DateRules.EveryDay(self.stock),
self.TimeRules.Every(timedelta(hours=1)),
self.buySignals)
self.Schedule.On(self.DateRules.EveryDay(self.stock),
self.TimeRules.Every(timedelta(hours=4)),
self.takeShort)
# self.Schedule.On(self.DateRules.EveryDay(self.stock),
# self.TimeRules.Every(timedelta(hours=3.25)),
# self.sellSignals)
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.AfterMarketOpen("SPY"),
self.tradeStart)
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.BeforeMarketClose("SPY"),
self.tradeEnd)
def tradeStart(self):
self.trade = True
def tradeEnd(self):
self.trade = False
def Collectsymboldata(self):
for symbol in self.XLFstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLFsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLEstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLEsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLBstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLBsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLIstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLIsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLYstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLYsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLPstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLPsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLUstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLUsector_symbolDataBySymbol[symbol] = symbolData
for symbol in self.XLKstocks:
self.AddEquity(symbol, Resolution.Hour)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
high = self.MAX(symbol, int(self.GetParameter("highHist")), Resolution.Daily, Field.High)
midhigh = self.MAX(symbol, 3, Resolution.Daily, Field.High)
low = self.MIN(symbol, int(self.GetParameter("lowHist")), Resolution.Daily, Field.Low)
stoplow = self.MIN(symbol, 20, Resolution.Daily, Field.Low)
symbolData = SymbolData(symbol, sma7, ema10, sma20, sma200, sma50, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow)
self.XLKsector_symbolDataBySymbol[symbol] = symbolData
def OnData(self, data):
#for symbol in self.activelyTrading:
# if not self.Portfolio[symbol].Invested:
# self.SetHoldings(symbol, self.weight)
# Note: in the below, x is Symbol and x.Value is string
self.Debug(f"XLE universe includes: {[x.Value for x in self.energy_ROA]}")
self.Debug(f"XLF universe includes: {[x.Value for x in self.FinSci_ROA]}")
self.Debug(f"XLE has data on: {[x.Value for x in self.XLEsector_symbolDataBySymbol]}")
#self.Debug(f"Actively Trading: {[x.Value for x in self.activelyTrading]}")
self.Debug(f"XLE-2 universe includes: {[x.Value for x in self.XLEstocks]}")
# self.Debug(f"XLI universe includes: {[x.Value for x in self.XLIstocks]}")
# self.Debug(f"XLY universe includes: {[x.Value for x in self.XLYstocks]}")
# self.Debug(f"XLP universe includes: {[x.Value for x in self.XLPstocks]}")
# self.Debug(f"XLU universe includes: {[x.Value for x in self.XLUstocks]}")
self.Debug(f"XLK universe includes: {[x.Value for x in self.XLKstocks]}")
# self.Debug(f"XLV universe includes: {[x.Value for x in self.XLVstocks]}")
# self.Debug(f"XLC universe includes: {[x.Value for x in self.XLCstocks]}")
def coarse(self, coarse):
if self.curr_month == self.Time.month:
return Universe.Unchanged
self.curr_month = self.Time.month
if self.Time.month % 3 != 1:
return Universe.Unchanged
self.quarters += 1
return [c.Symbol for c in coarse if c.HasFundamentalData]
def XLFfine(self, fine):
FinSci_securities = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.FinancialServices and
f.OperationRatios.ROA.ThreeMonths]
for security in FinSci_securities:
symbol = security.Symbol
if symbol not in self.FinSci_ROA:
self.FinSci_ROA[symbol] = deque(maxlen=12)
self.FinSci_ROA[symbol].append(security.OperationRatios.ROA.ThreeMonths)
if self.Time.month != 4 or (self.quarters < 12 ):
return Universe.Unchanged
FinSci_securities = [x for x in FinSci_securities if x.OperationRatios.ROA.OneYear and
x.FinancialStatements.CashFlowStatement.OperatingCashFlow.TwelveMonths and
x.FinancialStatements.BalanceSheet.TotalAssets.TwelveMonths and
x.FinancialStatements.IncomeStatement.ResearchAndDevelopment.TwelveMonths and
x.FinancialStatements.CashFlowStatement.CapExReported.TwelveMonths and
x.FinancialStatements.IncomeStatement.SellingGeneralAndAdministration.TwelveMonths and
x.MarketCap]
FinSci_VARROA = {symbol:stat.variance(ROA) for symbol, ROA in self.FinSci_ROA.items() if len(ROA) == ROA.maxlen}
if len(FinSci_VARROA) < 2:
return Universe.Unchanged
FinSci_VARROA_median = stat.median(FinSci_VARROA.values())
FinSci_ROA1Y = {x.Symbol:x.OperationRatios.ROA.OneYear for x in FinSci_securities}
FinSci_ROA1Y_median = stat.median(FinSci_ROA1Y.values())
FinSci_CFROA = {x.Symbol: (
x.FinancialStatements.CashFlowStatement.OperatingCashFlow.TwelveMonths
/ x.FinancialStatements.BalanceSheet.TotalAssets.TwelveMonths
) for x in FinSci_securities}
FinSci_CFROA_median = stat.median(FinSci_CFROA.values())
FinSci_RD2MktCap = {x.Symbol: (
x.FinancialStatements.IncomeStatement.ResearchAndDevelopment.TwelveMonths / x.MarketCap
) for x in FinSci_securities}
FinSci_RD2MktCap_median = stat.median(FinSci_RD2MktCap.values())
FinSci_CaPex2MktCap = {x.Symbol: (
x.FinancialStatements.CashFlowStatement.CapExReported.TwelveMonths / x.MarketCap
) for x in FinSci_securities}
FinSci_CaPex2MktCap_median = stat.median(FinSci_CaPex2MktCap.values())
FinSci_Ad2MktCap = {x.Symbol: (
x.FinancialStatements.IncomeStatement.SellingGeneralAndAdministration.TwelveMonths / x.MarketCap
) for x in FinSci_securities}
FinSci_Ad2MktCap_median = stat.median(FinSci_Ad2MktCap.values())
has_book = [f for f in fine if f.FinancialStatements.BalanceSheet.NetTangibleAssets.TwelveMonths and f.MarketCap]
sorted_by_BM = sorted(has_book, key=lambda x: x.FinancialStatements.BalanceSheet.NetTangibleAssets.TwelveMonths / x.MarketCap)[:len(has_book)//4]
FinSci_symbols = [f.Symbol for f in sorted_by_BM if f in FinSci_securities]
ratioDicts_medians = [(FinSci_ROA1Y, FinSci_ROA1Y_median),
(FinSci_CFROA, FinSci_CFROA_median), (FinSci_RD2MktCap, FinSci_RD2MktCap_median),
(FinSci_CaPex2MktCap, FinSci_CaPex2MktCap_median), (FinSci_Ad2MktCap, FinSci_Ad2MktCap_median)]
def XLEfine(self, fine):
energy_securities = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Energy and
f.OperationRatios.ROA.ThreeMonths]
for security in energy_securities:
symbol = security.Symbol
if symbol not in self.energy_ROA:
self.energy_ROA[symbol] = deque(maxlen=12)
self.energy_ROA[symbol].append(security.OperationRatios.ROA.ThreeMonths)
if self.Time.month != 4 or (self.quarters < 12 ):
return Universe.Unchanged
energy_securities = [x for x in energy_securities if x.OperationRatios.ROA.OneYear and
x.FinancialStatements.CashFlowStatement.OperatingCashFlow.TwelveMonths and
x.FinancialStatements.BalanceSheet.TotalAssets.TwelveMonths and
x.FinancialStatements.IncomeStatement.ResearchAndDevelopment.TwelveMonths and
x.FinancialStatements.CashFlowStatement.CapExReported.TwelveMonths and
x.FinancialStatements.IncomeStatement.SellingGeneralAndAdministration.TwelveMonths and
x.MarketCap]
energy_VARROA = {symbol:stat.variance(ROA) for symbol, ROA in self.energy_ROA.items() if len(ROA) == ROA.maxlen}
if len(energy_VARROA) < 2:
return Universe.Unchanged
energy_VARROA_median = stat.median(energy_VARROA.values())
energy_ROA1Y = {x.Symbol:x.OperationRatios.ROA.OneYear for x in energy_securities}
energy_ROA1Y_median = stat.median(energy_ROA1Y.values())
energy_CFROA = {x.Symbol: (
x.FinancialStatements.CashFlowStatement.OperatingCashFlow.TwelveMonths
/ x.FinancialStatements.BalanceSheet.TotalAssets.TwelveMonths
) for x in energy_securities}
energy_CFROA_median = stat.median(energy_CFROA.values())
energy_RD2MktCap = {x.Symbol: (
x.FinancialStatements.IncomeStatement.ResearchAndDevelopment.TwelveMonths / x.MarketCap
) for x in energy_securities}
energy_RD2MktCap_median = stat.median(energy_RD2MktCap.values())
energy_CaPex2MktCap = {x.Symbol: (
x.FinancialStatements.CashFlowStatement.CapExReported.TwelveMonths / x.MarketCap
) for x in energy_securities}
energy_CaPex2MktCap_median = stat.median(energy_CaPex2MktCap.values())
energy_Ad2MktCap = {x.Symbol: (
x.FinancialStatements.IncomeStatement.SellingGeneralAndAdministration.TwelveMonths / x.MarketCap
) for x in energy_securities}
energy_Ad2MktCap_median = stat.median(energy_Ad2MktCap.values())
has_book = [f for f in fine if f.FinancialStatements.BalanceSheet.NetTangibleAssets.TwelveMonths and f.MarketCap]
sorted_by_BM = sorted(has_book, key=lambda x: x.FinancialStatements.BalanceSheet.NetTangibleAssets.TwelveMonths / x.MarketCap)[:len(has_book)//4]
energy_symbols = [f.Symbol for f in sorted_by_BM if f in energy_securities]
ratioDicts_medians = [(energy_ROA1Y, energy_ROA1Y_median),
(energy_CFROA, energy_CFROA_median), (energy_RD2MktCap, energy_RD2MktCap_median),
(energy_CaPex2MktCap, energy_CaPex2MktCap_median), (energy_Ad2MktCap, energy_Ad2MktCap_median)]
def compute_g_score_finance(symbol):
g_score = 0
if FinSci_CFROA[symbol] > FinSci_ROA1Y[symbol]:
g_score += 1
if symbol in FinSci_VARROA and FinSci_VARROA[symbol] < FinSci_VARROA_median:
g_score += 1
for ratio_dict, median in ratioDicts_medians:
if symbol in ratio_dict and ratio_dict[symbol] > median:
g_score += 1
return g_score
g_scores = {symbol:compute_g_score(symbol) for symbol in FinSci_symbols}
return [symbol for symbol, g_score in g_scores.items() if g_score >= 5]
def compute_g_score_energy(symbol):
g_score = 0
if energy_CFROA[symbol] > energy_ROA1Y[symbol]:
g_score += 1
if symbol in energy_VARROA and energy_VARROA[symbol] < energy_VARROA_median:
g_score += 1
for ratio_dict, median in ratioDicts_medians:
if symbol in ratio_dict and ratio_dict[symbol] > median:
g_score += 1
return g_score
g_scores = {symbol:compute_g_score(symbol) for symbol in energy_symbols}
return [symbol for symbol, g_score in g_scores.items() if g_score >= 5]
def Rebalance(self):
if not self.mom.IsReady or not self.sma.IsReady: return
initial_asset = self.stock if self.mom.Current.Value > 0 else self.bond
if self.init:
self.SetHoldings(initial_asset, .01)
self.init = False
keihist = self.History([self.kei], (int(self.GetParameter("keihist"))))
#keihist = keihist['Value'].unstack(level=0).dropna()
keihistlowt = np.nanpercentile(keihist, 15)
keihistmidt = np.nanpercentile(keihist, 50)
keihisthight = np.nanpercentile(keihist, 90)
kei = self.sma.Current.Value
keimom = self.mom.Current.Value
if (keimom < 0 and kei < keihistmidt and kei > keihistlowt) and not (self.Securities[self.bond].Invested) :
# DECLINE
self.Liquidate()
self.SetHoldings(self.XLP, .01)
for symbol, symbolData in self.XLPsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#Stop Loss
# for symbol, symbolData in self.XLPsector_symbolDataBySymbol.items():
# if not (self.Securities[symbol].Close < symbolData.low.Current.Value) and (self.Securities[self.XLB].Invested):
# self.Liquidate()
# self.SetHoldings(self.XLP, .01)
self.SetHoldings(self.bond, .4)
self.Debug("STAPLES {0} >> {1}".format(self.XLP, self.Time))
elif (keimom > 0 and kei < keihistlowt) and not (self.Securities[self.XLB].Invested) :
# RECOVERY
self.Liquidate()
self.SetHoldings(self.XLB, .01)
for symbol, symbolData in self.XLEsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#XLB
for symbol, symbolData in self.XLBsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#XLY
for symbol, symbolData in self.XLYsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#Stop Loss
# for symbol, symbolData in self.XLBsector_symbolDataBySymbol.items():
# if not (self.Securities[symbol].Close < symbolData.low.Current.Value) and (self.Securities[self.XLB].Invested):
# self.Liquidate()
# self.SetHoldings(self.XLB, .01)
self.Debug("MATERIALS {0} >> {1}".format(self.XLB, self.Time))
elif (keimom > 0 and kei > keihistlowt and kei < keihistmidt) and not (self.Securities[self.XLE].Invested) :
# EARLY
self.Liquidate()
self.SetHoldings(self.XLE, .01)
#XLF
for symbol, symbolData in self.XLFsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#XLI
for symbol, symbolData in self.XLIsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#XLE
for symbol, symbolData in self.XLEsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .1, False, "Buy Signal")
#Stop Loss
# for symbol, symbolData in self.XLEstocks.items():
# if not (self.Securities[symbol].Close < symbolData.low.Current.Value) and (self.Securities[self.XLE].Invested):
# self.Liquidate()
# self.SetHoldings(self.XLE, .01)
self.Debug("ENERGY {0} >> {1}".format(self.XLE, self.Time))
elif (keimom > 0 and kei > keihistmidt and kei < keihisthight) and not (self.Securities[self.XLU].Invested) :
# REBOUND
self.Liquidate()
#self.SetHoldings(self.XLK, .5)
self.SetHoldings(self.XLU, .01)
#XLU
for symbol, symbolData in self.XLUsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested : #and (self.Securities[symbol].Close > symbolData.sma50.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
#Stop Loss
# for symbol, symbolData in self.XLUsector_symbolDataBySymbol.items():
# if not (self.Securities[symbol].Close < symbolData.low.Current.Value) and (self.Securities[self.XLU].Invested):
# self.Liquidate()
# self.SetHoldings(self.XLU, .01)
self.Debug("UTILITIES {0} >> {1}".format(self.XLU, self.Time))
elif (keimom < 0 and kei < keihisthight and kei > keihistmidt) and not (self.Securities[self.XLK].Invested) :
# LATE
self.Liquidate()
self.SetHoldings(self.XLK, .01)
for symbol, symbolData in self.XLKsector_symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value) :
self.SetHoldings(symbol, .1, False, "Buy Signal")
self.Debug("INFO TECH {0} >> {1}".format(self.XLK, self.Time))
#Stop Loss
# for symbol, symbolData in self.XLKsector_symbolDataBySymbol.items():
# if not (self.Securities[symbol].Close < symbolData.low.Current.Value) and (self.Securities[self.XLK].Invested):
# self.Liquidate()
# self.SetHoldings(self.XLK, .01)
elif (keimom < 0 and kei < 100 and not self.Securities[self.bond].Invested):
self.Liquidate()
self.SetHoldings(self.bond, .5)
self.Plot("LeadInd", "SMA(LeadInd)", self.sma.Current.Value)
self.Plot("LeadInd", "THRESHOLD", 100)
self.Plot("MOMP", "MOMP(LeadInd)", self.mom.Current.Value)
self.Plot("MOMP", "THRESHOLD", 0)
def buySignals(self):
if self.trade == False:
return
## EARLY - XLE
for symbol, symbolData in self.XLEsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLE].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .15, False, "Buy Signal")
for symbol, symbolData in self.XLFsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLE].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .15, False, "Buy Signal")
for symbol, symbolData in self.XLIsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLE].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .15, False, "Buy Signal")
## Recovery - XLB
for symbol, symbolData in self.XLEsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLB].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
for symbol, symbolData in self.XLBsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLB].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
for symbol, symbolData in self.XLYsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLB].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
## Rebound - XLU
for symbol, symbolData in self.XLUsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLU].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
## Decline - XLP
for symbol, symbolData in self.XLPsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLP].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
## Late - XLK
for symbol, symbolData in self.XLKsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLK].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
for symbol, symbolData in self.XLVsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLK].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value):
self.SetHoldings(symbol, .2, False, "Buy Signal")
def takeShort(self):
if self.trade == False:
return
## SHORT - XLK
for symbol, symbolData in self.XLKsector_symbolDataBySymbol.items():
if self.Portfolio[self.XLK].Invested: # and (self.Securities[symbol].Close < symbolData.sma50.Current.Value):
self.Liquidate()
self.SetHoldings(self.SQQQ, .5, "Short Position Signal")
class SelectionData(object):
def __init__(self, symbol, period):
self.symbol = symbol
self.ema = ExponentialMovingAverage(period)
self.is_above_ema = False
self.volume = 0
def update(self, time, price, volume):
self.volume = volume
if self.ema.Update(time, price):
self.is_above_ema = price > ema
class SymbolData:
def __init__(self, symbol, sma7, ema10, sma20, sma50, sma200, ema20, rsi, wilr, wilr_fast, high, midhigh, low, stoplow):
self.Symbol = symbol
self.sma7 = sma7
self.ema10 = ema10
self.sma20 = sma20
self.sma50 = sma50
self.sma200 = sma200
self.ema20 = ema20
self.rsi = rsi
self.wilr = wilr
self.wilr_fast = wilr_fast
self.high = high
self.midhigh = midhigh
self.low = low
self.stoplow = stoplow
# Quandl often doesn't use close columns so need to tell LEAN which is the "value" column.
class QuandlCustomColumns(PythonQuandl):
def __init__(self):
# Define ValueColumnName: cannot be None, Empty or non-existant column name
self.ValueColumnName = "Value"