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)