| Overall Statistics |
|
Total Trades 5 Average Win 0.97% Average Loss 0% Compounding Annual Return 13.397% Drawdown 2.900% Expectancy 0 Net Profit 6.461% Sharpe Ratio 1.618 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.043 Beta 0.303 Annual Standard Deviation 0.071 Annual Variance 0.005 Information Ratio -0.772 Tracking Error 0.161 Treynor Ratio 0.38 Total Fees $1.50 |
from datetime import timedelta
class BasicTemplateOptionsAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2016, 01, 01)
self.SetEndDate(2016, 06, 30)
self.SetCash(40000)
equity = self.AddEquity("IBM", Resolution.Minute)
option = self.AddOption("IBM", Resolution.Minute)
self.symbol = option.Symbol
# set our strike/expiry filter for this option chain
option.SetFilter(-3, +3, timedelta(0), timedelta(60))
# use the underlying equity as the benchmark
self.SetBenchmark(equity.Symbol)
def OnData(self,slice):
optionchain = slice.OptionChains
for i in slice.OptionChains:
if i.Key != self.symbol: continue
chains = i.Value
contract_list = [x for x in chains]
if (slice.OptionChains.Count < 1) or (len(contract_list) < 1):
return
if not self.Portfolio.HoldStock:
self.Buy("IBM",100) # buy 100 the underlying stock
self.SellCall(optionchain) # sell the call option
# if the option contract expires, choose a new call option to sell
if slice.Delistings.Count > 0 and self.Portfolio.HoldStock:
for x in slice.Delistings:
if x.Key == self.contract_symbol:
self.SellCall(optionchain)
def SellCall(self,optionchain):
for i in optionchain:
if i.Key != self.symbol: continue
chain = i.Value
call = [x for x in chain if x.Right == 0] # filter the call options contracts
# sorted the contracts according to their expiration dates and choose the ATM options
contracts = sorted(sorted(call, key = lambda x: abs(chain.Underlying.Price - x.Strike)),
key = lambda x: x.Expiry, reverse=True)
if len(contracts) == 0: continue
contract = contracts[0]
self.Log("Price: {0}; ATM Strike: {1}".format(self.Securities["IBM"].Price, contract.Strike))
self.contract_symbol = contract.Symbol
self.Sell(self.contract_symbol, 1) # short the call options