Skip to content

Commit af87fbb

Browse files
authored
Merge pull request #2425 from R5dan/fix-screener
Fix Screener
2 parents 40aa002 + d07e206 commit af87fbb

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

yfinance/screener/screener.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
from .query import FundQuery as FndQy
33
from .query import QueryBase, EquityQuery, FundQuery
44

5-
from yfinance.const import _BASE_URL_, _SENTINEL_
5+
from yfinance.const import _QUERY1_URL_, _SENTINEL_
66
from yfinance.data import YfData
77

88
from ..utils import dynamic_docstring, generate_list_table_from_dict_universal, print_once
99

1010
from typing import Union
1111
import requests
1212

13-
_SCREENER_URL_ = f"{_BASE_URL_}/v1/finance/screener"
13+
_SCREENER_URL_ = f"{_QUERY1_URL_}/v1/finance/screener"
1414
_PREDEFINED_URL_ = f"{_SCREENER_URL_}/predefined/saved"
1515

1616
PREDEFINED_SCREENER_BODY_DEFAULTS = {
17-
"offset":0, "size":25, "userId":"","userIdType":"guid"
17+
"offset":0, "count":25, "userId":"","userIdType":"guid"
1818
}
1919

2020
PREDEFINED_SCREENER_QUERIES = {
@@ -28,7 +28,7 @@
2828
"query": EqyQy('and', [EqyQy('gte', ['quarterlyrevenuegrowth.quarterly', 25]), EqyQy('gte', ['epsgrowth.lasttwelvemonths', 25]), EqyQy('eq', ['sector', 'Technology']), EqyQy('is-in', ['exchange', 'NMS', 'NYQ'])])},
2929
'most_actives': {"sortField":"dayvolume", "sortType":"DESC",
3030
"query": EqyQy('and', [EqyQy('eq', ['region', 'us']), EqyQy('gte', ['intradaymarketcap', 2000000000]), EqyQy('gt', ['dayvolume', 5000000])])},
31-
'most_shorted_stocks': {"size":25, "offset":0, "sortField":"short_percentage_of_shares_outstanding.value", "sortType":"DESC",
31+
'most_shorted_stocks': {"count":25, "offset":0, "sortField":"short_percentage_of_shares_outstanding.value", "sortType":"DESC",
3232
"query": EqyQy('and', [EqyQy('eq', ['region', 'us']), EqyQy('gt', ['intradayprice', 1]), EqyQy('gt', ['avgdailyvol3m', 200000])])},
3333
'small_cap_gainers': {"sortField":"eodvolume", "sortType":"desc",
3434
"query": EqyQy("and", [EqyQy("lt", ["intradaymarketcap",2000000000]), EqyQy("is-in", ["exchange", "NMS", "NYQ"])])},
@@ -53,7 +53,8 @@
5353
@dynamic_docstring({"predefined_screeners": generate_list_table_from_dict_universal(PREDEFINED_SCREENER_QUERIES, bullets=True, title='Predefined queries (Dec-2024)')})
5454
def screen(query: Union[str, EquityQuery, FundQuery],
5555
offset: int = None,
56-
size: int = None,
56+
size: int = None,
57+
count: int = None,
5758
sortField: str = None,
5859
sortAsc: bool = None,
5960
userId: str = None,
@@ -71,6 +72,10 @@ def screen(query: Union[str, EquityQuery, FundQuery],
7172
The offset for the results. Default 0.
7273
size : int
7374
number of results to return. Default 100, maximum 250 (Yahoo)
75+
Use count instead for predefined queries.
76+
count : int
77+
number of results to return. Default 25, maximum 250 (Yahoo)
78+
Use size instead for custom queries.
7479
sortField : str
7580
field to sort by. Default "ticker"
7681
sortAsc : bool
@@ -117,24 +122,35 @@ def screen(query: Union[str, EquityQuery, FundQuery],
117122
# that endpoint might be ignoring these fields.
118123
defaults = {
119124
'offset': 0,
120-
'size': 25,
125+
'count': 25,
121126
'sortField': 'ticker',
122127
'sortAsc': False,
123128
'userId': "",
124129
'userIdType': "guid"
125130
}
126131

132+
if count is not None and count > 250:
133+
raise ValueError("Yahoo limits query count to 250, reduce count.")
134+
127135
if size is not None and size > 250:
128136
raise ValueError("Yahoo limits query size to 250, reduce size.")
129137

130-
fields = {'offset': offset, 'size': size, 'sortField': sortField, 'sortAsc': sortAsc, 'userId': userId, 'userIdType': userIdType}
138+
fields = {'offset': offset, 'count': count, "size": size, 'sortField': sortField, 'sortAsc': sortAsc, 'userId': userId, 'userIdType': userIdType}
131139

132140
params_dict = {"corsDomain": "finance.yahoo.com", "formatted": "false", "lang": "en-US", "region": "US"}
133141

134142
post_query = None
135143
if isinstance(query, str):
136144
# post_query = PREDEFINED_SCREENER_QUERIES[query]
137145
# Switch to Yahoo's predefined endpoint
146+
147+
if size is not None:
148+
print_once("YF deprecation warning: 'size' argument is deprecated for predefined screens, set 'count' instead.")
149+
count = size
150+
size = None
151+
fields['count'] = fields['size']
152+
del fields['size']
153+
138154
params_dict['scrIds'] = query
139155
for k,v in fields.items():
140156
if v is not None:

0 commit comments

Comments
 (0)