| 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 -2.005 Tracking Error 0.177 Treynor Ratio 0 Total Fees $0.00 |
from Execution.ImmediateExecutionModel import ImmediateExecutionModel
from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel
import numpy as np
from collections import deque
from datetime import datetime, timedelta
from array import *
#from MovingReturn import MovRet
#from MovingVolatility import MovVol
from clr import AddReference
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Algorithm.Framework")
AddReference("QuantConnect.Indicators")
from QuantConnect import *
from QuantConnect.Indicators import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Alphas import *
class NadionResistanceAutosequencers(QCAlgorithmFramework):
def Initialize(self):
self.SetStartDate(2020, 6, 4) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
# self.AddEquity("SPY", Resolution.Minute)
self.SetExecution(ImmediateExecutionModel())
self.SetPortfolioConstruction(NullPortfolioConstructionModel())
self.SetRiskManagement(NullRiskManagementModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.tickers = ["SPY","IWM","QQQ","EFA","EEM","VNQ","LQD","GLD","SHY","IEF","TLT","AGG"] # Define symbols for Trading
self.UniverseSettings.Resolution = Resolution.Daily
# self.AddUniverseSelection(ScheduledUniverseSelectionModel(self.DateRules.Every(DayOfWeek.Friday),self.TimeRules.Every(timedelta(hours = 24)),self.SelectSymbols))
self.sym=[]
self.SetAlpha(RisingAssetsAlphaModel())
for x in self.tickers:
self.sym.append(Symbol.Create(x, SecurityType.Equity, Market.USA))
self.SetUniverseSelection( ManualUniverseSelectionModel(self.sym) )
self.UniverseSettings.Resolution = Resolution.Daily
# def SelectSymbols(self,datetime):
# sym=[]
# for x in self.tickers:
# a=self.AddEquity(x, Resolution.Daily)
# sym.append(self.AddEquity(x, Resolution.Daily).Symbol)
# return sym
class RisingAssetsAlphaModel(AlphaModel):
def __init__(self):
self.M1={}
self.M3={}
self.M6={}
self.M12={}
self.MomentumScore={}
self.V61={}
self.active_sym=[]
self.ready={}
self.N=5
def OnSecuritiesChanged(self,algorithm, changes):
for security in changes.AddedSecurities:
symbol = security.Symbol
self.M1[symbol] = MovRet(symbol,21)
self.M3[symbol] = MovRet(symbol,21*3)
self.M6[symbol] = MovRet(symbol,21*6)
self.M12[symbol] = MovRet(symbol,21*12)
# self.V61[symbol]=MovVol(symbol,21*3)
algorithm.Debug(self.M12[symbol].Value)
history = algorithm.History(symbol, 21*12+1, Resolution.Daily)
self.M1[symbol].Warmup(history)
self.M3[symbol].Warmup(history)
self.M6[symbol].Warmup(history)
self.M12[symbol].Warmup(history)
# self.V61[symbol].Warmup(history)
# if self.M1[symbol].IsReady and self.M3[symbol].IsReady and self.M6[symbol].IsReady and self.M12[symbol].IsReady and self.V61[symbol].IsReady:
# self.ready[symbol]= True
algorithm.RegisterIndicator(symbol, self.M1[symbol], Resolution.Daily)
algorithm.RegisterIndicator(symbol, self.M3[symbol], Resolution.Daily)
algorithm.RegisterIndicator(symbol, self.M6[symbol], Resolution.Daily)
algorithm.RegisterIndicator(symbol, self.M12[symbol], Resolution.Daily)
# algorithm.RegisterIndicator(symbol, self.V61[symbol], Resolution.Daily)
self.active_sym.append(symbol)
def Update(self, algorithm, data):
return []
for symbol in self.active_sym:
algorithm.Debug(self.M12[symbol].IsReady)
if self.M12[symbol].IsReady :
algorithm.Debug(2)
self.MomentumScore[symbol]=np.mean([self.M1[symbol].Value,self.M3[symbol].Value,self.M6[symbol].Value,self.M12[symbol].Value],dtype=np.float64)
algorithm.Debug(self.MomentumScore)
# algorithm.Debug(self.MomentumScore)
# #3. Return a group of insights, emitting InsightDirection.Up for the first item of ordered, and InsightDirection.Flat for the second
# return Insight.Group([
# # Create a grouped insight
# Insight.Price(ordered[0]["symbol"], timedelta(1), InsightDirection.Up),
# Insight.Price(ordered[1]["symbol"], timedelta(1),InsightDirection.Flat)
# ])
class MovRet():
def __init__(self,symbol, periods):
self.symbol=symbol
self.N=periods
self.window = RollingWindow[float](periods)
self.window_Close=RollingWindow[float](2)
self.IsReady=False
self.IsReadyClose=False
# Volatility is a mandatory attribute
self.Value = 0
self.Close=0
self.Time=None
# Updates this model using the new price information in the specified security instance
# Update is a mandatory method
def Update(self,input):
self.Close=input.Close
if self.window_Close.IsReady:
self.IsReadyClose=True
self.window.Add(float(self.window_Close[0] / self.window_Close[1]) - 1.0)
if self.window.IsReady:
self.Value=np.mean([ x for x in self.window ])
self.IsReady=self.window.IsReady
if self.window.Count<self.N:
self.Value=0
if self.window.Count<2:
self.Value=0
self.IsReadyClose=False
def Warmup(self,history):
if self.symbol not in history:
return
for index, row in history.loc[self.symbol].iterrows():
self.Close=row["close"]
self.window_Close.Add(row["close"])
self.Time=index