How to pull Call/Put Option prices with pandas-datareader in Python? - python

I have the following code. I tried to pull the data from yahoo and google, both don't work. It's throwing the below message
from pandas_datareader.data import Options
fb_options = Options('TSLA', 'yahoo')
options_df = fb_options.get_options_data(expiry=fb_options.expiry_dates[0])
print(options_df.tail())
Error Message: Yahoo Options has been immediately deprecated due to large breaks in the API without the
introduction of a stable replacement. Pull Requests to re-enable these data
connectors are welcome.
Is there any other way to retrieve the options prices?

The following is working for me right now
import yfinance as yf # https://github.com/ranaroussi/yfinance
aapl= yf.Ticker("AAPL")
# aapl.options # list of dates
DF_calls, DF_puts = aapl.option_chain(aapl.options[0]) # returns 2 DataFrames
Alternative method
import pandas_datareader as pdr
aapl = Options('aapl')
calls = aapl.get_call_data()
Partial output:
Last Bid Ask Chg Vol Open_Int IV Underlying_Price Last_Trade_Date
200.0 2020-07-02 call AAPL200702C00200000 164.50 151.60 156.20 0.000000 13.0 13.0 1.962891 353.63 2020-06-23 13:30:03
Link to my project code

Yahoo ended support for their options API, and as such, the Yahoo options reader and get_options_data were deprecated in pandas_datareader 0.7.0 (marked for removal). Unfortunately, there are no other readers in pandas_datareader which provide options prices.
There are (to my knowledge) no free-to-use APIs for options data, other than TD Ameritrade (see this endpoint), though you must be a TD Ameritrade account holder to obtain access to their developer API (link).

Related

Download Historic NSE Futures Data

I need to download NSE Futures data since 2012 for my strategy backtesting. I tried NSEpy and jugaad-data libraries but they are giving one day's data at a time.
I tried Getbhavcopy as well but the data is not accurate there.
Is there any other free source to download the same.
Thanks,
Mohit
You can get as follows .....
from datetime import timedelta, date
from nsepy import get_history
def importdata(stock):
stock_fut = get_history(symbol=stock,
start=date.today() - timedelta(days = 14), end=date.today(),
futures=True,
expiry_date=date(2022,11,24))
#print(stock_fut.columns)
print(stock_fut[["Open","Close","Change in OI","Open Interest"]])
a = ["AARTIIND","ABB","ABBOTINDIA","ABCAPITAL","ABFRL","ACC","ADANIENT"]
for i in range(0,len(a)):
print(a[i])
importdata(a[i])
I've used NSEpy, this is basically scraping from the NSE website, better to use some API which actually has the right to provide the data. e.g: Samco, angel one APIs.
they are free as well.

Yahoo Pandas datareader date difference

I am trying to import stock data using Yahoo API as a source. I have tried it many times and I always get the same error, the start and end date are different from what I have passed. For example I pass the start and end date as '2015-1-1' & '2017-1-1' but the stock data I get start and ends at '2014-12-31' & '2016-12-30'. I dont know what I am doing wrong. I even tried using google but got a error as "data_sorce='google' not implemented."
Is there some other free data source I can use or correct the dates while using Yahoo? Jupyter notebook
You can import as yfinance and just enter a start and end when importing the data. Yahoo decommissioned their historical data API check out the Ran Aroussi the developer's of fix-yahoo-finance which is now yfinance blog where he details everything nicely https://aroussi.com/post/python-yahoo-finance
To install/upgrade yfinance using pip, run:
$ pip install yfinance
instead of this method
facebook = web.DateReader("FB", "yahoo", start, end)
can be in a format like this instead
override method from pandas_datareader by importing data as pdr
import yfinance as yf
yf.pdr_override() # <== the override :-)
# download dataframe using pandas_datareader
facebook = pdr.get_data_yahoo("FB", start="2015-1-1", end="2017-1-1")
or you can just use yfinance instead
import yfinance as yf
facebook = yf.download("FB", start="2015-1-1", end="2017-1-1")

Problems with Pandas DataReader and Yahoo

I was trying to get stock information as follows:
from pandas.io.data import DataReader
import datetime
data = DataReader("F", "yahoo", datetime.datetime(1990, 1, 1),datetime.datetime(2002, 1, 1))
which fails with
IOError: after 3 tries, Yahoo! did not return a 200 for url 'http://ichart.finance.yahoo.com/table.csv?s=C001.F&a=0&b=1&c=2014&d=11&e=1&f=2017&g=d&ignore=.csv'
Up to now, I could not find a fix for this issue or a suitable work-around. Do you guys have any suggestions?
It seems 'yahoo'is no longer supported. Try "morningstar" or "google".
The simple yahoo financial link,that worked for years, is no longer supported.
I've heard of a work around that involves browser spoofing (wget from command line) requires browser aliasing to obtain time sensitive cookies that are then required for each request -- but I've never tried it myself since "morningstar" currently still works (but I miss yahoo's adjusted close).
#(Pascal 3.6)
import pandas as pd
import pandas_datareader.data as web
...
df = web.DataReader('MSFT','morningstar')
for idx, row in df.iterrows():
print(idx[1],row[0],row[1],row[2],row[3],row[4])

Pandas Options Broken Again?

Running this canonical example:
from pandas.io.data import Options
aapl = Options('aapl', 'yahoo')
data = aapl.get_all_data()
gives
RemoteDataError: Data not available
I know this used to be an issue in v0.14 or so, but it was supposedly fixed with v0.15. I'm on 0.18.1
It's Yahoo - they've changed their options site, so old parsers aren't working properly
Suggestion: first of all consider using pandas_datareader instead of deprecated pandas.io.data and monitor this issue so you'll know when this issue is fixed

Python pandas - yahoo finance isn't providing GOOG's historical prices?

Can someone please elaborate on why yahoo suddenly stopped giving GOOG's historical prices? GOOG's historicla prices page isn't very helpful either.
Code I used to check: (AAPL works, GOOG doesn't)
import pandas.io.data as web
import datetime
print web.get_data_yahoo('AAPL', datetime.datetime(2010,1,1), datetime.datetime(2013,12,31))['Adj Close']
print web.get_data_yahoo('GOOG', datetime.datetime(2010,1,1), datetime.datetime(2013,12,31))['Adj Close']

Categories