| Overall Statistics |
|
Total Trades 2 Average Win 0% Average Loss 0% Compounding Annual Return 3.039% Drawdown 0.000% Expectancy 0 Net Profit 0.079% Sharpe Ratio 10.302 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.02 Beta 0.317 Annual Standard Deviation 0.002 Annual Variance 0 Information Ratio 3.837 Tracking Error 0.002 Treynor Ratio 0.079 Total Fees $1.25 |
import numpy as np
from datetime import timedelta
from QuantConnect.Securities.Option import OptionPriceModels
class OptionChainProvider(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 2, 1)
self.SetEndDate(2017, 2, 10)
self.SetCash(100000)
self.equity = self.AddEquity("SPY", Resolution.Minute)
def OnData(self,data):
if not self.Portfolio.Invested and self.IsMarketOpen(self.equity.Symbol):
# get a symbol list of all option contracts
contracts = self.OptionChainProvider.GetOptionContractList(self.equity.Symbol, data.Time)
self.underlyingPrice = self.Securities[self.equity.Symbol].Price
# filter the out-of-money call options from the contract list which expire in 20 to 30 days from now on
otm_calls = [i for i in contracts if i.ID.OptionRight == OptionRight.Call and
i.ID.StrikePrice - self.underlyingPrice > 0 and
20 < (i.ID.Date - data.Time).days < 30]
# add those contracts
for i in otm_calls:
option = self.AddOptionContract(i, Resolution.Minute)
option.PriceModel = OptionPriceModels.CrankNicolsonFD()
# get the greeks by accessing the OptionChain
if data.OptionChains.Count != 0:
for kvp in data.OptionChains:
chain = kvp.Value
for i in chain:
self.Log('{0} delta={1}, vega={2}'.format(i.Symbol.Value,i.Greeks.Delta,i.Greeks.Vega));
#self.Log('{0} quantity: {1}'.format(str(contract.Value),self.Portfolio[contract].Quantity))
#self.Log('GOOG Price S(T): '+ str(self.Securities['GOOG'].Price))
#self.Log(str([i.Greeks.Vega for i in chain]))
contract = sorted(sorted(chain, key = lambda x: abs(chain.Underlying.Price - x.Strike)),
key = lambda x: x.Expiry)[0]
self.MarketOrder(contract.Symbol, -1)
self.MarketOrder(self.equity.Symbol, 100)