ranaroussi / yfinance

Download market data from Yahoo! Finance's API
https://aroussi.com/post/python-yahoo-finance
Apache License 2.0
14.93k stars 2.45k forks source link

YFTzMissingError('$%ticker%: possibly delisted; No timezone found') when downloading price data #1996

Open mattpabi opened 4 months ago

mattpabi commented 4 months ago

Describe bug

Hi, this was an issue I have not seen anybody raise: YFTzMissingError. I have been using yfinance for about 2 years now without ever encountering this issue too.

When using yf.download(ticker), a timezone not found error is raised, and it says that the request timed out. It's weird as the code seems to randomly work (without any intervention) every few minutes.

Thanks in advance.

Simple code that reproduces your problem

yf.enable_debug_mode()  # show debug log
df = yf.download("AAPL")  # <-- suspect

### OUTPUT:

Failed to get ticker 'AAPL' reason: HTTPSConnectionPool(host='query1.finance.yahoo.com', port=443): Read timed out. (read timeout=30)
[*********************100%%**********************]  1 of 1 completed

1 Failed download:
['AAPL']: YFTzMissingError('$%ticker%: possibly delisted; No timezone found')

Debug log

DEBUG    Entering download()
DEBUG     Disabling multithreading because DEBUG logging enabled
DEBUG     Entering history()
DEBUG      Entering history()
DEBUG       AAPL: Yahoo GET parameters: {'period1': '1925-08-13 20:00:00-04:00', 'period2': '2024-07-20 07:28:56-04:00', 'interval': '1d', 'includePrePost': False, 'events': 'div,splits,capitalGains'}
DEBUG       Entering get()
DEBUG        url=https://query2.finance.yahoo.com/v8/finance/chart/AAPL
DEBUG        params={'period1': -1400630400, 'period2': 1721474936, 'interval': '1d', 'includePrePost': False, 'events': 'div,splits,capitalGains'}
DEBUG        Entering _get_cookie_and_crumb()
DEBUG         cookie_mode = 'basic'
DEBUG         Entering _get_cookie_and_crumb_basic()
DEBUG          reusing cookie
DEBUG          reusing crumb
DEBUG         Exiting _get_cookie_and_crumb_basic()
DEBUG        Exiting _get_cookie_and_crumb()
ERROR     
          1 Failed download:
ERROR     ['AAPL']: ReadTimeout(ReadTimeoutError("HTTPSConnectionPool(host='query2.finance.yahoo.com', port=443): Read timed out. (read timeout=10)"))
DEBUG     ['AAPL']: Traceback (most recent call last):
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 466, in _make_request
              self._validate_conn(conn)
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 1095, in _validate_conn
              conn.connect()
            File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 652, in connect
              sock_and_verified = _ssl_wrap_socket_and_match_hostname(
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 805, in _ssl_wrap_socket_and_match_hostname
              ssl_sock = ssl_wrap_socket(
                         ^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/util/ssl_.py", line 465, in ssl_wrap_socket
              ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/util/ssl_.py", line 509, in _ssl_wrap_socket_impl
              return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/ssl.py", line 455, in wrap_socket
              return self.sslsocket_class._create(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/ssl.py", line 1042, in _create
              self.do_handshake()
            File "/usr/local/lib/python3.12/ssl.py", line 1320, in do_handshake
              self._sslobj.do_handshake()
          TimeoutError: _ssl.c:983: The handshake operation timed out

          The above exception was the direct cause of the following exception:

          Traceback (most recent call last):
            File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 667, in send
              resp = conn.urlopen(
                     ^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 843, in urlopen
              retries = retries.increment(
                        ^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/util/retry.py", line 474, in increment
              raise reraise(type(error), error, _stacktrace)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/util/util.py", line 39, in reraise
              raise value
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 789, in urlopen
              response = self._make_request(
                         ^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 490, in _make_request
              raise new_e
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 468, in _make_request
              self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
            File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 369, in _raise_timeout
              raise ReadTimeoutError(
          urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='query2.finance.yahoo.com', port=443): Read timed out. (read timeout=10)

          During handling of the above exception, another exception occurred:

          Traceback (most recent call last):
            File "/usr/local/lib/python3.12/site-packages/yfinance/multi.py", line 268, in _download_one
              data = Ticker(ticker).history(
                     ^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/yfinance/utils.py", line 104, in wrapper
              result = func(*args, **kwargs)
                       ^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/yfinance/base.py", line 78, in history
              return self._lazy_load_price_history().history(*args, **kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/yfinance/utils.py", line 104, in wrapper
              result = func(*args, **kwargs)
                       ^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/yfinance/scrapers/history.py", line 140, in history
              # Date range in past so safe to fetch through cache:
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/yfinance/utils.py", line 104, in wrapper
              result = func(*args, **kwargs)
                       ^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/yfinance/data.py", line 366, in get
              response = self._session.get(**request_args)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests_cache/session.py", line 127, in get
              return self.request('GET', url, params=params, **kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests_cache/session.py", line 183, in request
              return super().request(method, url, *args, headers=headers, **kwargs)  # type: ignore
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 589, in request
              resp = self.send(prep, **send_kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests_cache/session.py", line 230, in send
              response = self._send_and_cache(request, actions, cached_response, **kwargs)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests_cache/session.py", line 254, in _send_and_cache
              response = super().send(request, **kwargs)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 703, in send
              r = adapter.send(request, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 713, in send
              raise ReadTimeout(e, request=request)
          requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='query2.finance.yahoo.com', port=443): Read timed out. (read timeout=10)

DEBUG    Exiting download()

Bad data proof

No response

yfinance version

0.2.41

Python version

3.12.4

Operating system

No response

ValueRaider commented 4 months ago

Each command-line Python re-run will fetch a new crumb to initialise the new data singleton. But Jupyter persists Python state so no re-fetch happens? That could explain random difference.

mattpabi commented 4 months ago

Each command-line Python re-run will fetch a new crumb to initialise the new data singleton. But Jupyter persists Python state so no re-fetch happens? That could explain random difference.

Thanks, I see. Any way to solve this issue though? It's quite troublesome to scrape on-demand with this error.

Especially since I can't find anyone who has had this YFtz error with a fix

TheSardOz commented 4 months ago

I have been having the same issue. The data return randomly, I have also been using just the endpoint daily for the last 3 years and same thing there. This has been happening for about one month now. And same as you, when I run my code on Jupiter note book the data is more consistent, but still takes quite a bit longer than it used to. If you play with Yahoo Finance itself (pulling up a ticket and changing timeframes) the data is inconsistent there too.

quanxiang-liu commented 4 months ago

the same to me

fabiodm7 commented 4 months ago

same issue

martinbouhier commented 4 months ago

same issue

ValueRaider commented 4 months ago

Spamming "same" not helping, use the reaction feature.

https://github.com/ranaroussi/yfinance#developers-want-to-contribute

mattpabi commented 4 months ago

Can we assume this is an issue from Yahoo's API, and not the yfinance package?

oxhaowang commented 3 months ago

Experienced the same problem with version 0.2.41 (with python 3.12.2) , and for the same code somehowever I got a '0.2.28' version in a different environment(with python 3.12.4) working perfectly well....

ValueRaider commented 3 months ago

Only 1 request change since 0.2.28: adding cookie & crumb in 0.2.32, 9 months ago. Cookie is cached, but cache might not work in Jupyter so cookie fresh in each notebook.

oxhaowang commented 3 months ago

After some heavy testing, it appears Yahoo has blocked some of my requests.

On the failed machine (a Linux server) it got the 403 Forbidden Error, whilst the working machine(a Mac) also using wget method would complain Openssl error instead.

JIeJaitt commented 1 month ago

same problem

fdriessen commented 1 month ago

I had the same issue. Traced the issue back to my ad blocker. After I whitelisted fc.yahoo.com it all worked as expected.

fabiodm7 commented 1 month ago

I was using Pi-hole, and this domain was blocked. I requested that the maintainer remove it from the block list, and it worked fine.

PeterSchober005 commented 1 week ago

I am having the same issue. It occurs more often when pulling a large number of tickers. And sometimes a ticker works and sometimes it doesn't. The ticket is still open, so I guess no solution has been found yet, correct? Btw. I do not have an ad-blocker. I only got Google Chrome, which already includes some form of an ad-blocker. I whiteliste finance.yahoo.com and yahoo.com but the problem still persists.

ValueRaider commented 1 week ago

I've left ticket open because ideally YF would detect that fc.yahoo.com is blocked and handle gracefully (nice message), not blow up.

PeterSchober005 commented 1 week ago

@ValueRaider Many thanks for the info!

When typing in "fc.yahoo.com" into the browser, it opens yahoo.com. Is this normal or does this mean I am being re-directed?

I am facing the following problem:

Any support is deeply appreciated! Many thanks in advance!

PeterSchober005 commented 1 week ago

Just a quick note: it seems like yf.download stopped being able to handle a ticket list with more than 600 or 700 tickers. So it does not work anymore that a ticket list with 3000 tickers is downloaded at once. I have to split this large ticket list into multiple ticket list (each one with 500 tickers). This works!

RamXX commented 1 week ago

This issue manifests itself with even 1 ticker. Example:

import yfinance as yf

ticker = "AAPL"
start_date = "2024-11-01"
end_date = "2024-11-15"
data = yf.download(ticker, start=start_date, end=end_date)
print(data.head())
data.to_csv(f"{ticker}_stock_data.csv")

Output:

Failed to get ticker 'AAPL' reason: HTTPSConnectionPool(host='fc.yahoo.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x10e714590>: Failed to establish a new connection: [Errno 61] Connection refused'))
[*********************100%***********************]  1 of 1 completed

1 Failed download:
['AAPL']: YFTzMissingError('$%ticker%: possibly delisted; no timezone found')
Empty DataFrame
Columns: [(Adj Close, AAPL), (Close, AAPL), (High, AAPL), (Low, AAPL), (Open, AAPL), (Volume, AAPL)]
Index: []

And this was my first try in 24 hours, so it's not that I'm exceeding any limit here.