22from .query import FundQuery as FndQy
33from .query import QueryBase , EquityQuery , FundQuery
44
5- from yfinance .const import _BASE_URL_ , _SENTINEL_
5+ from yfinance .const import _QUERY1_URL_ , _SENTINEL_
66from yfinance .data import YfData
77
88from ..utils import dynamic_docstring , generate_list_table_from_dict_universal , print_once
99
1010from typing import Union
1111import 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
1616PREDEFINED_SCREENER_BODY_DEFAULTS = {
17- "offset" :0 , "size " :25 , "userId" :"" ,"userIdType" :"guid"
17+ "offset" :0 , "count " :25 , "userId" :"" ,"userIdType" :"guid"
1818}
1919
2020PREDEFINED_SCREENER_QUERIES = {
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" ])])},
5353@dynamic_docstring ({"predefined_screeners" : generate_list_table_from_dict_universal (PREDEFINED_SCREENER_QUERIES , bullets = True , title = 'Predefined queries (Dec-2024)' )})
5454def 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