from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Python import PythonQuandl
from datetime import timedelta, datetime
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel

class SMAPairsTrading(QCAlgorithm):

def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetEndDate(2010,3,16)# Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
self.UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw

def OnEndOfDay(self, symbol):
self.Log("Taking a position of " + str(self.Portfolio[symbol].Quantity) + " units of symbol " + str(symbol))

def CustomSecurityInitializer(self, security):

class Smaalphamodel(AlphaModel):

def __init__(self):
self.Symbols = [ ]
self.SMALT = SimpleMovingAverage(200)
self.SMAMT = SimpleMovingAverage(50)
self.SMAST = SimpleMovingAverage(20)
self.period = timedelta(days=2)

def Update(self, algorithm, data):

Appd = []

for i in range(len(List)):
Price[i] = self.Symbols[i].Price

List=[x.Symbol for x in self.Symbols]

self.SMALT.Update(algorithm.Time,[x for x in Prices])
self.SMAMT.Update(algorithm.Time,[x for x in Prices])
self.SMAST.Update(algorithm.Time,[x for x in Prices])

for i in List:
if self.Symbols[i].Price > self.SMAL[i].Current.Value > self.SMAMT[i].Current.Value>self.SMAST[i].Current.Value :
Appd.append(Insight.Price(i, self.period, InsightDirection.Up))
elif self.Symbols[i].Price < self.SMAL[i].Current.Value < self.SMAMT[i].Current.Value < self.SMAST[i].Current.Value :
Appd.append(Insight.Price(i, self.period, InsightDirection.Down))
Appd.append(Insight.Price(i, self.period, InsightDirection.Flat))

return Insight.Group([ x for x in Appd])

def OnSecuritiesChanged(self, algorithm, changes):
self.Symbols = [x for x in changes.AddedSecurities]

#1. Call for 500 bars of history data for each symbol in the pair and save to the variable history
history = algorithm.History([x.Symbol for x in self.Symbols], 200)
#2. Unstack the Pandas data frame to reduce it to the history close price
history = history.close.unstack(level=0)
for tuple in history.itertuples():
self.SMALT.Update(tuple[0],[tuple[i] for i in range(len(self.Symbols))])
self.SMAMT.Update(tuple[0],[tuple[i] for i in range(len(self.Symbols))])
self.SMAST.Update(tuple[0],[tuple[i] for i in range(len(self.Symbols))])

class AllUniverse(FundamentalUniverseSelectionModel):
This module selects the most liquid stocks listed on the New York Stock Exchange.
def __init__(self, filterFineData = True, universeSettings = None, securityInitializer = None):
'''Initializes a new default instance of the TechnologyUniverseModule'''
super().__init__(filterFineData, universeSettings, securityInitializer)
self.numberOfSymbolsCoarse = 1000
self.numberOfSymbolsFine = 500
self.dollarVolumeBySymbol = {}
self.lastMonth = -1

def SelectCoarse(self, algorithm, coarse):
Performs a coarse selection:

-The stock must have fundamental data
-The stock must have positive previous-day close price
-The stock must have positive volume on the previous trading day
if algorithm.Time.month == self.lastMonth:
return Universe.Unchanged

sortedByDollarVolume = sorted([x for x in coarse if x.HasFundamentalData and x.Volume > 0 and x.Price > 5],
key = lambda x: x.DollarVolume, reverse=True)[:self.numberOfSymbolsCoarse]

self.dollarVolumeBySymbol = {x.Symbol:x.DollarVolume for x in sortedByDollarVolume}

# If no security has met the QC500 criteria, the universe is unchanged.
if len(self.dollarVolumeBySymbol) == 0:
return Universe.Unchanged

return list(self.dollarVolumeBySymbol.keys())

def SelectFine(self, algorithm, fine):
Performs a fine selection:

-The company's headquarter must in the U.S.
-The stock must be traded on the NASDAQ stock exchange
-The stock must be in the Industry Template Code catagory N
-At least half a year since its initial public offering
# Filter stocks and sort on dollar volume
sortedByDollarVolume = sorted([x for x in fine if x.CompanyReference.CountryId == "USA"
and x.CompanyReference.PrimaryExchangeID == "NYS"
and (algorithm.Time - x.SecurityReference.IPODate).days > 180],
key = lambda x: self.dollarVolumeBySymbol[x.Symbol], reverse=True)

if len(sortedByDollarVolume) == 0:
return Universe.Unchanged

self.lastMonth = algorithm.Time.month

return [x.Symbol for x in sortedByDollarVolume[:self.numberOfSymbolsFine]]


Hello , I want to create an alpha model using technical analysis but unfortunately I couldn't update the historical datas in the SimpleMovingAverage function.Does anyone know how to fix this problem?


Thank you