I have plotted the IV of TSLA options using yahoo options data, but the scatter plot doesn't look right, can anyone advise why the plot looks like this? I would expect to see a vol smile plotted.
EDIT additional question, is the same risk-free rate used to get those options data? and what is the rf used in practice, please?
import pandas_datareader.data as web
import pandas as pd
import matplotlib.pyplot as plt
tesla = web.YahooOptions('TSLA')
tesla.headers = {'User-Agent': 'Firefox'}
tesla_calls = tesla.get_call_data(12,2023)
tesla_calls.reset_index(inplace=True)
tesla_calls = tesla_calls[tesla_calls['Expiry'] == '2023-12-01T00:00:00.000000000']
plt.scatter(tesla_calls['Strike'], tesla_calls['IV'])
Strike Expiry Type Symbol Last Bid Ask Chg \
19 100.0 2023-12-01 call TSLA231201C00100000 107.00 0.0 0.0 0.0
28 140.0 2023-12-01 call TSLA231201C00140000 82.30 0.0 0.0 0.0
30 145.0 2023-12-01 call TSLA231201C00145000 76.80 0.0 0.0 0.0
32 150.0 2023-12-01 call TSLA231201C00150000 58.75 0.0 0.0 0.0
35 160.0 2023-12-01 call TSLA231201C00160000 50.22 0.0 0.0 0.0
PctChg Vol Open_Int IV Root IsNonstandard Underlying \
19 0.0 11.0 0.0 0.00001 TSLA False TSLA
28 0.0 NaN 0.0 0.00001 TSLA False TSLA
30 0.0 2.0 0.0 0.00001 TSLA False TSLA
32 0.0 6.0 0.0 0.00001 TSLA False TSLA
35 0.0 5.0 0.0 0.00001 TSLA False TSLA
Underlying_Price Quote_Time Last_Trade_Date \
19 205.76 2023-10-26 20:00:01 2023-10-26 16:17:53
28 205.76 2023-10-26 20:00:01 2023-10-19 16:58:57
30 205.76 2023-10-26 20:00:01 2023-10-24 14:04:46
32 205.76 2023-10-26 20:00:01 2023-10-23 13:33:46
35 205.76 2023-10-26 20:00:01 2023-10-26 18:42:36
JSON
19 {'contractSymbol': 'TSLA231201C00100000', 'str...
28 {'contractSymbol': 'TSLA231201C00140000', 'str...
30 {'contractSymbol': 'TSLA231201C00145000', 'str...
32 {'contractSymbol': 'TSLA231201C00150000', 'str...
35 {'contractSymbol': 'TSLA231201C00160000', 'str...
