| Overall Statistics |
|
Total Trades 9 Average Win 0.01% Average Loss -0.05% Compounding Annual Return -1.924% Drawdown 0.300% Expectancy -0.762 Net Profit -0.208% Sharpe Ratio -3.503 Probabilistic Sharpe Ratio 0.043% Loss Rate 80% Win Rate 20% Profit-Loss Ratio 0.19 Alpha -0.015 Beta -0.001 Annual Standard Deviation 0.004 Annual Variance 0 Information Ratio -4.837 Tracking Error 0.103 Treynor Ratio 10.872 Total Fees $9.00 |
class CalibratedUncoupledCoreWave(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 10, 1) # Set Start Date
self.SetEndDate(2019, 11, 10) # Set End Date
self.SetCash(100000) # Set Strategy Cash
# Setup universe
self.UniverseSettings.Resolution = Resolution.Minute
self.AddUniverse(self.SelectCoarse,self.SelectFine)
self.AddEquity("SPY", Resolution.Minute)
# Liquidate all positions before the market close each day
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose("SPY", 30), self.ClosePositions)
self.coarseclose={} # Store yesterday's close in a dictionary for reference
self.traded={} # Ensure only 1 trade per day per stock
self.targetentry=2.00 # Only enter a trade if today's price doubles yesterday's close
self.stops = {} # Keep track of stop loss orders so we can update them
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]
self.coarseclose.clear() # Clear the dictionary each day before re-populating it
# Save yesterday's close
for c in myuniverse:
self.coarseclose[c.Symbol] = c.AdjustedPrice
return [x.Symbol for x in myuniverse] # Return filtered stocks for further filtering by the SelectFine
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
'''
# Primary share, common stock, not limited partnership, and not ADR
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.traded.clear()
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
# Entry conditions:
# - We have no position in this stock
# - We haven't traded this symbol today
# - Bar closed above our target
# - Before 10:30am
# - Large dollar volume for this bar
if (self.Portfolio[symbol].Quantity == 0.0 and
symbol in self.traded.keys() and
self.traded[symbol] == 0 and
close >= self.coarseclose[symbol]*self.targetentry and
self.Time.hour <= 10 and self.Time.minute <=29 and
close * kvp.Value.Volume >= 50000):
# Signal today's entry
self.traded[symbol] = 1
# Determine position size
quantity = int(self.Portfolio.TotalPortfolioValue / 100 / data[symbol].Close) #self.CalculateOrderQuantity(symbol, 0.01) // 2
if quantity < 4:
continue
# Enter with market order
enter_ticket = self.MarketOrder(symbol, quantity)
# Set profit targets
quarter = int(quantity / 4)
final = quantity - 3 * quarter
for i in range(3):
order = self.LimitOrder(symbol, -quarter, enter_ticket.AverageFillPrice * (1 + (i+1)*0.05))
updateSettings = UpdateOrderFields()
updateSettings.Tag = "pt"
order.Update(updateSettings)
order = self.LimitOrder(symbol, -final, enter_ticket.AverageFillPrice * 1.2)
order.Update(updateSettings)
# Set stop loss
self.stops[symbol] = self.StopMarketOrder(symbol, -quantity, enter_ticket.AverageFillPrice * 0.95)
updateSettings.Tag = "sl"
self.stops[symbol].Update(updateSettings)
def OnOrderEvent(self, orderEvent):
if orderEvent.Status == OrderStatus.Filled:
order = self.Transactions.GetOrderById(orderEvent.OrderId)
if order.Tag == 'pt': # If hit profit target, update stop order quantity
updateSettings = UpdateOrderFields()
updateSettings.Quantity = self.stops[orderEvent.Symbol].Quantity - orderEvent.Quantity
self.stops[orderEvent.Symbol].Update(updateSettings)
elif order.Tag == 'sl': # If hit stop loss, cancel profit target orders
self.Transactions.CancelOpenOrders(orderEvent.Symbol, "Hit stop price")
def ClosePositions(self):
if self.Portfolio.Invested:
self.Transactions.CancelOpenOrders()
self.Liquidate()