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...