| 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 |
from QuantConnect.Securities.Option import OptionPriceModels
from datetime import timedelta
import pandas as pd
import numpy as np
class ImpliedVolatilityToDataFrame(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 7, 1)
self.SetEndDate(2017, 8, 25)
self.SetCash(100000)
self.symbols = []
# Symbols in Dow Jones Industrial Average (DJIA)
self.tickers = ["MMM", "AXP", "AAPL", "BA", "CAT", "CVX", "CSCO","KO",
"DIS","DD","XOM","GE","GS","HD","IBM","INTC","JPM","MCD",
"MRK","MSFT","NKE","PFE","PG","TRV","UTX","UNH","VZ","V","WMT"]
self.IV = pd.DataFrame(columns=self.tickers)
nRow = pd.Series(np.repeat(np.nan,len(self.tickers)),index=self.tickers)
self.IV=self.IV.append(nRow,ignore_index=True)
# Add options and set pricing model
for ticker in self.tickers:
option = self.AddOption(ticker,Resolution.Minute)
self.symbols.append(option.Symbol)
option.SetFilter(-1, 1, timedelta(10), timedelta(30))
option.PriceModel = OptionPriceModels.CrankNicolsonFD()
self.SetWarmUp(TimeSpan.FromDays(7))
# Set iteration variable
self.m = 0
def OnData(self,slice):
if self.Portfolio.Invested: return
for symbol in self.symbols:
if self.IsMarketOpen(symbol):
# Loop through the option chain at the end of day
if self.Time.hour == 15 and self.Time.minute == 59:
for kvp in slice.OptionChains:
if kvp.Key == symbol:
chain = kvp.Value
call = [i for i in chain if i.Right == OptionRight.Call]
if len(call) == 0: continue
# Retrieve the call ATM option contract, at the furthest date within our filtered universe of options
contracts = sorted(sorted(call, key=lambda x: x.Expiry, reverse=False), key=lambda x: abs(x.UnderlyingLastPrice - x.Strike))
atm_contract = contracts[0]
strSymbol=symbol.Value[1:len(symbol.Value)]
# Populate the DataFrame IV, which includes implied volatility at the end of day for each stock
self.IV[strSymbol].iloc[self.m]=atm_contract.ImpliedVolatility
## Add new row for next iteration
if strSymbol==self.tickers[len(self.tickers)-1]:
# Retrieve implied volatility for all stocks, for seven last observations and print to log file.
if self.m >= 7:
self.Log(str(self.IV.tail(7)))
# Print Strike, Implied Volatility and Greeks to log file
self.logAttributes(atm_contract)
self.m=self.m+1
nRow = pd.Series(np.repeat(np.nan,len(self.tickers)),index=self.tickers)
self.IV=self.IV.append(nRow,ignore_index=True)
def logAttributes(self,contract):
self.Log("Symbol: " + str(contract.Symbol) + " - Strike: " + str(contract.Strike))
self.Log("Symbol: " + str(contract.Symbol) + " - Delta: " + str(contract.Greeks.Delta))
self.Log("Symbol: " + str(contract.Symbol) + " - Vega: " + str(contract.Greeks.Vega))
self.Log("Symbol: " + str(contract.Symbol) + " - Gamma: " + str(contract.Greeks.Gamma))