| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -2.219 Tracking Error 0.124 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from datetime import datetime
from collections import *
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Orders import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Selection import *
from QuantConnect.Algorithm.Framework.Execution import *
from QuantConnect.Algorithm.Framework.Risk import *
from Execution.StandardDeviationExecutionModel import StandardDeviationExecutionModel
import decimal as d
class ETFSimple(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021,1,13)
self.SetCash(1000000)
self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel()) #we want our portfolio to be made up of insights
self.SetExecution(ImmediateExecutionModel())
self.SetBrokerageModel(BrokerageName.AlphaStreams) #required brokerage model for submission
############################################################################
## OPTIONS
############################################################################
self.STRIKES = 30 # no of strikes around ATM => for uni selection
self.MIN_EXPIRY = 45 # min num of days to expiration => for uni selection
self.MAX_EXPIRY = 126 # max num of days to expiration => for uni selection
self.MIN_DELTA = d.Decimal(0.25)
self.MAX_DELTA = d.Decimal(0.45)
self.MIN_PREMIUM = d.Decimal(0.05)
self.optionSymbol = "SPY"
equity = self.AddEquity(self.optionSymbol, Resolution.Minute)
option = self.AddOption(self.optionSymbol, Resolution.Minute)
# set strike/expiry filter for this option chain
option.SetFilter(-self.STRIKES, self.STRIKES, timedelta(self.MIN_EXPIRY), timedelta(self.MAX_EXPIRY))
# for greeks and pricer (needs some warmup) - https://github.com/QuantConnect/Lean/blob/21cd972e99f70f007ce689bdaeeafe3cb4ea9c77/Common/Securities/Option/OptionPriceModels.cs#L81
option.PriceModel = OptionPriceModels.CrankNicolsonFD() # both European & American, automatically
# this is needed for Greeks calcs
self.SetWarmUp(TimeSpan.FromDays(self.MAX_EXPIRY))
def OnData(self, slice):
if (self.IsWarmingUp): return
##buy calls
self.TradeCallOptions(slice)
def TradeCallOptions(self,slice):
calls = [];
for i in slice.OptionChains:
if i.Key != self.optionSymbol: continue
chain = i.Value
# filter the put options contracts
calls = [x for x in chain if x.Right == OptionRight.Call and abs(x.Greeks.Delta) > self.MIN_DELTA and abs(x.Greeks.Delta) < self.MAX_DELTA and x.BidPrice > self.MIN_PREMIUM]
# sorted the contracts according to their expiration dates
contracts = sorted(sorted(calls, key = lambda x: x.BidPrice, reverse=True),
key = lambda x: x.Expiry)
if len(contracts) == 0: continue
call = contracts[0].Symbol
self.EmitInsights(Insight.Price(call, timedelta(MIN_EXPIRY), InsightDirection.Up, None, None, None, 1))
# buy the call options
#ticket = self.MarketOrder(self.call, 1, asynchronous = False)
# set Take Profit order
#self.takeProfitTicket = self.LimitOrder(self.call, 1, round(ticket.AverageFillPrice * 1.5, 2))