| Overall Statistics |
|
Total Trades 66 Average Win 1.18% Average Loss 0% Compounding Annual Return -78.211% Drawdown 57.700% Expectancy 0 Net Profit -39.920% Sharpe Ratio -0.169 Probabilistic Sharpe Ratio 22.821% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha -0.341 Beta -0.303 Annual Standard Deviation 1.402 Annual Variance 1.967 Information Ratio 0.073 Tracking Error 1.422 Treynor Ratio 0.782 Total Fees $4217.50 |
from clr import AddReference
AddReference("System.Core")
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Data.UniverseSelection import *
from datetime import datetime, timedelta
class CoarseFundamentalTop3Algorithm(QCAlgorithm):
def Initialize(self):
self._volHighThreshold =.2
self._volLowThreshold = 0.02
self.SetStartDate(2018,9,1)
self.SetEndDate(2019,1,1)
self.SetCash(1000000)
self.indicators = {}
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
self._changes = None
def FineSelectionFunction(self, fine):
symbolList = [ x.Symbol for x in fine
if
x.SecurityReference.IsPrimaryShare is True
and
x.SecurityReference.IsDepositaryReceipt is False
]
return symbolList
def CoarseSelectionFunction(self, coarse):
filtered = [ x.Symbol for x in coarse
if x.Price > 5 and x.DollarVolume > 1000000 ]
return filtered
def OnData(self, slice):
account_leverage = self.Portfolio.TotalHoldingsValue / self.Portfolio.TotalPortfolioValue
self.Plot("Leverage", "%", account_leverage)
if self._changes is None: return
for security in self._changes.AddedSecurities:
if security.Symbol not in self.indicators:
self.indicators[security.Symbol] = SymbolData(security.Symbol, self)
if not slice.ContainsKey(security.Symbol): return
if security.Type != SecurityType.Equity: continue
if not hasattr(slice[security.Symbol],"Price"): return
self.indicators[security.Symbol].update_value(self.Time, slice[security.Symbol].Price)
if self.IsWarmingUp: continue
lowerband = self.indicators[security.Symbol].bb_10.LowerBand.Current.Value
upperband = self.indicators[security.Symbol].bb_10.UpperBand.Current.Value
isVol = float((abs(slice[security.Symbol].Price - lowerband) +
abs(slice[security.Symbol].Price - upperband))/slice[security.Symbol].Price/2)
sells = []
buys = []
if isVol < self._volHighThreshold and isVol > self._volLowThreshold:
option = self.AddOption(security.Symbol.Value)
chain = slice.OptionChains.GetValue(option.Symbol)
self.Portfolio[option.Symbol].dateEntered = datetime.now()
if chain is None:
return
for x in chain:
writeCalls = [x for x in chain if x.Right == 0 and
(x.Strike - x.UnderlyingLastPrice)/x.UnderlyingLastPrice > 0
]
writePuts = [x for x in chain if x.Right == 1 and
(x.UnderlyingLastPrice - x.Strike)/x.UnderlyingLastPrice > 0 ]
if len(writePuts) == 0:
self.Debug("!!!!!!!!!!!!!!! writePuts !!!!!!!!!!!!!!!!!!!!")
return
if len(writeCalls) == 0:
self.Debug("!!!!!!!!!!!!!!! writeCalls !!!!!!!!!!!!!!!!!!!!!")
return
sells.append(writePuts[len(writePuts)-1])
buys.append(writeCalls[len(writeCalls)-1])
availableCapital = self.Portfolio.TotalPortfolioValue-self.Portfolio.TotalHoldingsValue
numTrades = round(len(sells)+len(buys)/2)
if numTrades > 0:
perCapitalAvail = availableCapital/numTrades
else:
perCapitalAvail = 0
self.Debug("NumTRADES: "+str(numTrades)+"________________")
for write in sells:
twentyPercentLeverageOnLot = write.UnderlyingLastPrice*100*.8+10
contractsForOrder = round(perCapitalAvail/twentyPercentLeverageOnLot)
self.Sell(write.Symbol, contractsForOrder)
for write in buys:
twentyPercentLeverageOnLot = write.UnderlyingLastPrice*100*.8+10
contractsForOrder = round(perCapitalAvail/twentyPercentLeverageOnLot)
self.Sell(write.Symbol, contractsForOrder)
self._changes = None
# this event fires whenever we have changes to our universe
def OnSecuritiesChanged(self, changes):
self._changes = changes
self.Log(f"OnSecuritiesChanged({self.UtcTime}):: {changes}")
def OnOrderEvent(self, fill):
self.Log(f"OnOrderEvent({self.UtcTime}):: {fill}")
class SymbolData(object):
def __init__(self, symbol, context):
self.symbol = symbol
self.bb_10 = context.BB(symbol,10,2,MovingAverageType.Simple,Resolution.Daily)
def update_value(self, time, value):
self.bb_10.Update(time, value)