Overall Statistics |
Total Trades 8 Average Win 0.00% Average Loss 0% Compounding Annual Return -15.368% Drawdown 1.000% Expectancy 0 Net Profit -0.540% Sharpe Ratio -2.973 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha -0.029 Beta -6.262 Annual Standard Deviation 0.041 Annual Variance 0.002 Information Ratio -3.333 Tracking Error 0.041 Treynor Ratio 0.02 Total Fees $2.00 |
from QuantConnect.Data.Market import * from QuantConnect.Data.Consolidators import * from datetime import * from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * from QuantConnect.Securities.Option import OptionPriceModels import decimal as d import operator class BasicTemplateOptionsAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2017, 12, 1) self.SetEndDate(2017, 12, 12) self.SetCash(100000) self.symbols = [] self.fill_price =dict() for ticker in ["AER", "URI", "FISV", "BAC", "HDS", "BF.B", "NEE", "JPM", "EBAY"]: option = self.AddOption(ticker) self.symbols.append(option.Symbol) option.SetFilter(-2, +2, timedelta(0), timedelta(180)) option.PriceModel = OptionPriceModels.CrankNicolsonFD() def OnData(self,slice): option_invested = [x.Key for x in self.Portfolio if x.Value.Invested and x.Value.Type==SecurityType.Option] for symbol in self.symbols: invested = [option for option in option_invested if option.Underlying == symbol.Underlying] for kvp in slice.OptionChains: if kvp.Key == symbol: chain = kvp.Value contracts_iv = [x for x in chain if x.ImpliedVolatility > d.Decimal(0.4) and x.Greeks.Delta < 0.4] #for x in chain: #self.Log(str(x.ImpliedVolatility)) #self.Log(str(x.Strike)) contracts = sorted(sorted(sorted(contracts_iv, key = lambda x: -x.AskPrice/(x.AskPrice+ max(20*chain.Underlying.Price - (chain.Underlying.Price - x.Strike), 10*x.Strike))), key = lambda x: x.Expiry, reverse=True), key = lambda x: x.Right, reverse=True) # if found, trade it if len(contracts) == 0: continue contract_symbol = contracts[0].Symbol symbol = contracts[0].Symbol if self.Portfolio[contract_symbol].Invested: self.Log(str(symbol) +str(self.fill_price[symbol])+"::" +str(self.Securities[contract_symbol].Price)) if self.fill_price[symbol] > self.Securities[contract_symbol].Price * d.Decimal(1.1): self.Liquidate(contract_symbol) if len(invested) > 0: return ticket=self.MarketOrder(contract_symbol, -1) self.fill_price[symbol] = ticket.AverageFillPrice