| Overall Statistics |
|
Total Trades 82 Average Win 0.31% Average Loss -0.14% Compounding Annual Return -6.867% Drawdown 2.300% Expectancy -0.373 Net Profit -2.159% Sharpe Ratio -2.579 Probabilistic Sharpe Ratio 2.324% Loss Rate 80% Win Rate 20% Profit-Loss Ratio 2.21 Alpha -0.058 Beta -0.004 Annual Standard Deviation 0.022 Annual Variance 0 Information Ratio 0.289 Tracking Error 0.497 Treynor Ratio 14.546 Total Fees $197.47 |
class CalibratedUncoupledCoreWave(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020,1, 1) # Set Start Date
#self.SetEndDate(2016, 12, 12) # Set End Date
self.SetCash(100000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Minute
self.AddUniverse(self.SelectCoarse,self.SelectFine)
self.SetExecution( NullExecutionModel() )
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday,DayOfWeek.Wednesday, DayOfWeek.Thursday,DayOfWeek.Friday), self.TimeRules.At(15, 30), self.ClosePositions)
self.coarseclose={}
self.fineclose={}
self.traded={}
self.targetentry=2
def SelectCoarse(self, coarse):
myuniverse = [x for x in coarse if x.HasFundamentalData and x.DollarVolume > 0 \
and x.DollarVolume < 50000 and x.Price > 0 and x.Price <= 5.0]
#for x in myuniverse:
#self.Debug('stock: ' + str(x.Symbol.Value)
#+ ', price: ' + str(x.Price) + ', adjustedprice: ' + str(x.AdjustedPrice))
stocks = {x.Symbol: x for x in myuniverse}
self.coarseclose.clear()
#self.yesterdayclose = {}
for c in myuniverse:
self.coarseclose[c.Symbol] = c.AdjustedPrice
'''
histStocks=list(stocks.keys())
history = self.History(histStocks, self.coursedays, Resolution.Daily)
dollarvolumes = {}
stddev={}
prices={}
for stock in histStocks:
if stock in history.index:
df = history.loc[stock].dropna()
if df.empty or len(df)<self.coursedays:
continue
dollarvolumes[stock] = (df["close"]*df["volume"]).mean()
stddev[stock]=((df["close"].pct_change()).std())*15.87*100
mystocks = {x: x for x in stddev if stddev[x] < 10 }
mystocks4= {k:v for (k,v) in stddev.items() if v <10}
mystocks1 = {x: x for x in stddev if stddev[x] < 50 }
mystocks2 = {x: x for x in stddev if stddev[x] < 100 }
mystocks3 = {x: x for x in stddev if stddev[x] < 5 }
return list(mystocks.keys())
'''
return list(stocks.keys())
def SelectFine(self,fine):
'''
This function takes the stock of the CoarceFundamental function and narrow the list adding specific fundamental filters
'''
fine_filter = [x.Symbol for x in fine if x.SecurityReference.IsPrimaryShare == 1 and x.SecurityReference.SecurityType == 'ST00000001' and x.CompanyReference.IsLimitedPartnership == 0 and
x.SecurityReference.IsDepositaryReceipt == 0 ]
self.fineclose.clear()
self.traded.clear()
self.fineclose = {k: self.coarseclose[k] for k in fine_filter}
self.traded = {k: 0 for k in fine_filter}
return fine_filter
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
for kvp in data.Bars:
symbol = kvp.Key
close = kvp.Value.Close
dollarvolume=kvp.Value.Close*kvp.Value.Volume
target =self.fineclose[kvp.Key]*self.targetentry
if self.Portfolio[symbol].Quantity == 0.0:
if self.traded[symbol] == 0:
if close>=target:
if self.Time.hour <= 15 and self.Time.minute <=29:
if dollarvolume >= 10000:
self.traded[symbol]=1
#self.SetHoldings(symbol, (min(1/len(self.traded),0.01)))
self.SetHoldings(symbol,0.01 )
if self.Portfolio[symbol].Invested:
cost = round(self.Portfolio[symbol].AveragePrice,3)
profittarget = cost * 1.30
stoploss = cost * 0.9
if self.Time.hour <= 15 and self.Time.minute <=29:
if (close >= profittarget) or (close <= stoploss):
self.Liquidate()
#self.Log("OnData(Slice): {0}: {1}: {2}".format(self.Time, symbol, value.Close))
def ClosePositions(self):
if self.Portfolio.Invested:
self.Liquidate()