| Overall Statistics |
|
Total Trades 396 Average Win 0.07% Average Loss -0.05% Compounding Annual Return -3.658% Drawdown 5.000% Expectancy -0.531 Net Profit -4.762% Sharpe Ratio -3.188 Probabilistic Sharpe Ratio 0.252% Loss Rate 82% Win Rate 18% Profit-Loss Ratio 1.58 Alpha -0.03 Beta -0.004 Annual Standard Deviation 0.009 Annual Variance 0 Information Ratio -0.538 Tracking Error 0.259 Treynor Ratio 7.281 Total Fees $599.42 |
class CalibratedUncoupledCoreWave(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019,1, 1) # Set Start Date
#self.SetEndDate(2016, 12, 12) # Set End Date
self.SetCash(100000) # Set Strategy Cash
# Set the resolution of your data
self.UniverseSettings.Resolution = Resolution.Minute
# Add the universes
self.AddUniverse(self.SelectCoarse,self.SelectFine)
# Liquidate all positions before the market close each day
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday,DayOfWeek.Wednesday, DayOfWeek.Thursday,DayOfWeek.Friday), self.TimeRules.At(15, 30), self.ClosePositions)
# Store yesterday's close in a dictionary for reference in the SelectFine Function
self.coarseclose={}
# Store yesterday's close on fine filtered stocks to reference them in the OnData function
self.fineclose={}
# Ensure only 1 trade per day per stock
self.traded={}
# Ensure each level of profit taking is only executed once per stock per day
self.pt1={}
self.pt2={}
self.pt3={}
self.pt4={}
# Only enter a trade if today's price is above yesterday's close * self.targetentry
self.targetentry=2.00
def SelectCoarse(self, coarse):
# Penny Stock filter
myuniverse = [x for x in coarse if x.HasFundamentalData and x.DollarVolume > 1000000 \
and x.DollarVolume < 5000000 and x.Price > 0 and x.Price <= 5.0]
stocks = {x.Symbol: x for x in myuniverse}
# Clear the dictionary each day before re-populating it
self.coarseclose.clear()
# Load the dictionary with yesterday's close for each filtered stock
for c in myuniverse:
self.coarseclose[c.Symbol] = c.AdjustedPrice
# Return filtered stocks for further filtering by the SelecFine function
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
Largely to ensure that only common stock is traded and not EG Preference Shares or ETFs
'''
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.pt1.clear()
self.pt2.clear()
self.pt3.clear()
self.pt4.clear()
self.pt1={k: 0 for k in fine_filter}
self.pt2={k: 0 for k in fine_filter}
self.pt3={k: 0 for k in fine_filter}
self.pt4={k: 0 for k in fine_filter}
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
if kvp.Key in self.fineclose.keys():
target =self.fineclose[kvp.Key]*self.targetentry
if self.Portfolio[symbol].Quantity == 0.0:
if kvp.Key in self.traded.keys():
if self.traded[symbol] == 0:
if close>=target:
if self.Time.hour <= 10 and self.Time.minute <=29:
if dollarvolume >= 50000:
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)
profittarget1 = cost * 1.05
profittarget2 = cost * 1.10
profittarget3 = cost * 1.15
profittarget4 = cost * 1.20
stoploss = cost * 0.95
quantity=self.Portfolio[symbol].Quantity
if self.Time.hour <= 15 and self.Time.minute <=29:
if close>= profittarget1 and self.pt1 == 0:
self.MarketOrder(symbol, quantity*0.25)
self.pt1 = 1
if close>= profittarget2 and self.pt2 == 0:
self.MarketOrder(symbol, quantity*0.33)
self.pt2 = 1
if close>= profittarget3 and self.pt3 == 0:
self.MarketOrder(symbol, quantity*0.50)
self.pt3 = 1
if close>= profittarget4 and self.pt4 == 0:
self.Liquidate()
self.pt4 = 1
if self.Time.hour <= 15 and self.Time.minute <=29:
if (close <= stoploss):self.Liquidate()
def ClosePositions(self):
if self.Portfolio.Invested:
self.Liquidate()