ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

yfinance 中 Market.status 在非 US 市场返回 None 是为什么

yfinance 中 Market.status 在非 US 市场返回 None 是为什么 yfinance 中 Market.status 在非 US 市场返回 None 是为什么【免费下载链接】yfinanceDownload market data from Yahoo! Finances API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance如果你的代码里写着yf.Market(EUROPE).status然后发现拿到的是None而不是预期的开盘/收盘时间这不是网络故障也不是 yfinance 的解析 bugYahoo 的markettime接口本身就不支持非US市场yfinance 从 v1.4.0 起会主动把这种拿错了市场的数据置为None并输出一条 warning。本文基于仓库中的参考文档 yfinance.market.rst、示例代码 market.py 和实现源码 market.py 说明根因、复现方法、验证方式以及拿到None之后可以怎么做。根因markettime 端点会忽略 market 参数Market类一次访问两个 Yahoo 端点见 market.py 的_parse_datahttps://query1.finance.yahoo.com/v6/finance/quote/marketSummary用于Market.summaryhttps://query1.finance.yahoo.com/v6/finance/markettime用于Market.status。两个请求都会带上market参数US、GB、ASIA、EUROPE、RATES、COMMODITIES、CURRENCIES、CRYPTOCURRENCIES这 8 个合法取值。参考文档 yfinance.market.rst 里的 note 明确写道OnlyMarket.summaryreturns regional data for all of the values above.Market.statusis backed by Yahoosmarkettimeendpoint, which currently ignores themarketparameter and only returns U.S. data; for any non-USmarket,statuswill therefore beNoneand a warning is logged.也就是说markettime无论传什么market值返回的都是id us的美国数据。源码在解包完返回数据后有一段防误导检查# Yahoos markettime endpoint silently ignores the market param # and always returns U.S. data. Detect the mismatch so callers # arent misled into believing they got regional status data. if self.market ! US and self._status.get(id) us: self._logger.warning( f{self.market}: Yahoo markettime endpoint does not support fmarket{self.market!r}; status data unavailable. ) self._status None这段逻辑对应 CHANGELOG 1.4.0 中的修复条目「Fix #2784: validate Market region and stop returning misleading status #2801」见 CHANGELOG.rst。在它生效之前Market(EUROPE).status会静默返回美国市场数据——比返回None更危险。所以 v1.4.0 及之后的版本里非US市场看到None是设计行为。另外两点边界值得注意Market.__init__会用MarketRegion枚举校验市场名传入非法值例如FR直接抛ValueError提示合法市场列表只有Market.summary对全部 8 个市场返回对应区域的数据status实际上只对US有效。复现与验证复现US 与非 US 对比示例取自仓库自带的 market.py运行环境需已安装 yfinancepip install yfinance在 Python 中import yfinance as yf us yf.Market(US) europe yf.Market(EUROPE) print(us.status) # 返回 status 数据 print(europe.status) # None并伴随一条 warning 日志 print(europe.summary) # 正常返回区域汇总数据其中europe.status打印None同时日志会输出一条warning 级别EUROPE: Yahoo markettime endpoint does not support marketEUROPE; status data unavailable.yfinance 默认通过标准logging模块输出消息日志开关见 logging.rst。如果终端里看不到这条 warning可以在复现代码前开启 debug 日志import yfinance as yf yf.config.debug.logging True验证当前版本的行为仓库的测试套件 test_market.py 把这个行为固化成了两条断言可直接照抄为验证脚本import yfinance as yf m yf.Market(US) assert m.status is not None assert m.status.get(id) us # US 市场的 status 里带 id m yf.Market(EUROPE) assert m.status is None # 非 US 市场的 status 应为 None两条断言都通过说明当前安装的行为与文档一致。status正常时是一个 dict其中的open、close字段在源码解析阶段会被转成datetime对象并附带tz时区字段见 market.py 中self._status.update({...})一段timezone和time键会被改写或移除——如果你需要展示或持久化这些时间字段要按datetime处理而不是原始字符串。想确认自己装的是否为包含该行为的版本import yfinance as yf print(yf.__version__)拿到 None 之后可以怎么做只需要美国市场状态用Market(US).status这是该端点唯一保证可用的市场。需要各区域的行情概况改用Market.summary。参考文档明确说明summary对所有 8 个市场都返回区域数据对 EUROPE 这类区域市场summary返回的是该区域内各交易所以交易所代码为键的shortName、regularMarketPrice、regularMarketChange、regularMarketChangePercent。在应用里做防御把status is None当作该市场无状态数据的哨兵值处理而不是当作异常抛出配合 warning 日志可用logging记录或展示说明数据不可用的原因。限制Market.status当前只对US市场可用Yahoo 侧是否未来支持其它市场取决于 Yahoo 的markettime端点行为yfinance 侧只是如实透传。Market构造参数的合法取值只有上述 8 个字符串或对应的MarketRegion枚举成员其它值在构造阶段就会抛ValueError与status返回None无关。行为版本分界为 v1.4.0低于该版本时非US市场的status可能返回实为美国的数据而非None。如果你的代码同时兼容新旧版本建议在取用status前显式检查版本或id字段。【免费下载链接】yfinanceDownload market data from Yahoo! Finances API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表