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
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
import numpy as np
from QuantConnect.Securities.Option import OptionPriceModels ## Import Options Pricing Models
from datetime import datetime, timedelta

class LocalVolatilityAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2018, 6, 1)  # Set Start Date
        self.SetEndDate(2018, 9, 1)
        self.SetCash(100000)  # Set Strategy Cash
        
        option = self.AddOption("SPY");
        option.SetFilter(-2, 2, timedelta(0), timedelta(30))
        option.PriceModel = OptionPriceModels.CrankNicolsonFD()
        
        self.localVolatility = {}

    def OnData(self, slice):
        for chain in slice.OptionChains.Values:
            contracts = sorted(sorted(chain, \
                               key = lambda x: abs(chain.Underlying.Price - x.Strike)), \
                               key = lambda x: x.Expiry, reverse=True)
            for contract in contracts:
                self.Log(str(contract.Symbol))
                ## Calculate Local Volatility and store in dictionary, indexed by contract Symbol
                self.localVolatility[contract.Symbol] = self.CalculateLocalVolatility(contract)
                self.Log(f'Local Volatility: {self.localVolatility[contract.Symbol]}')
                

    def CalculateLocalVolatility(self, contract):
        ## Access relevant greeks and strike price
        delta = contract.Greeks.Delta
        strike = contract.Strike
        gamma = contract.Greeks.Gamma
        
        ## Calculate LV
        if (delta == 0) or (gamma == 0):
            localVolatility = 0.0
        else:
            localVolatility = np.sqrt( delta / ( 0.5*(strike**2)*gamma ) )
        return localVolatility