| 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