You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用yfinance下载NOK小时级数据时遭遇JSONDecodeError求助

问题描述

运行以下代码获取诺基亚(NOK)2020年11月30日至2021年9月30日的小时级历史数据:

import yfinance as yf
df = yf.Ticker("NOK").history(start_date="2020-11-30", end_date="2021-09-30", interval="1h")

触发JSONDecodeError,报错堆栈如下:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-15-c5289e094c7b> in <module>
      1 import yfinance as yf
      2 
----> 3 df = yf.Ticker("NOK").history(start_date="2020-11-30", end_date="2021-09-30", interval="1h")

D:\Programme\Python\Anaconda\lib\site-packages\yfinance\base.py in history(self, period, interval, start, end, prepost, actions, auto_adjust, back_adjust, proxy, rounding, tz, **kwargs)
    155                 # Every valid ticker has a timezone. Missing = problem
    156                 shared._DFS[self.ticker] = utils.empty_df()
--> 157                 shared._ERRORS[self.ticker] = err_msg
    158                 if "many" not in kwargs and debug_mode:
    159                     print('- %s: %s' % (self.ticker, err_msg))

D:\Programme\Python\Anaconda\lib\site-packages\requests\models.py in json(self,** kwargs)
    896             if self.status_code == 0 or self.raw is None:
    897                 self._content = None
--> 898             else:
    899                 self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b""
    900 

D:\Programme\Python\Anaconda\lib\json\__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    355             parse_int is None and parse_float is None and
    356             parse_constant is None and object_pairs_hook is None and not kw):
--> 357         return _default_decoder.decode(s)
    358     if cls is None:
    359         cls = JSONDecoder

D:\Programme\Python\Anaconda\lib\json\decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

D:\Programme\Python\Anaconda\lib\json\decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

已尝试执行以下命令升级yfinance库,但问题未解决:

pip install yfinance --upgrade --no-cache-dir

同时怀疑该时间段的小时级数据是否不存在,寻求可行解决方案。

解决方案

1. 明确小时级数据的可用性限制

yfinance对小时级数据的获取有严格时间范围约束:仅能获取最近7天的小时数据,或通过period参数获取最长约1个月的历史小时数据。你请求的2020-2021年时间段远超出这个范围,这是导致报错的核心原因。

2. 调整需求或更换数据源

  • 如果必须获取该时段的小时级数据,建议更换专业金融数据源(如Alpha Vantage、IEX Cloud等),这类平台支持更长时间范围的分钟/小时级历史数据查询。
  • 若可接受降级为日线数据,修改interval参数即可正常获取目标时段的NOK数据:
    import yfinance as yf
    df = yf.Ticker("NOK").history(start="2020-11-30", end="2021-09-30", interval="1d")
    

3. 针对JSONDecodeError的额外排查

如果需要测试短时间范围的小时数据获取,可尝试以下操作:

  • 检查网络连接,确保能正常访问Yahoo Finance(部分地区可能需要代理)
  • 手动清除yfinance缓存:删除缓存目录(通常为~/.cache/yfinance或Anaconda环境对应的缓存路径)
  • 使用period参数替代start/end测试最近的小时数据:
    df = yf.Ticker("NOK").history(period="7d", interval="1h")
    

内容的提问来源于stack exchange,提问作者reCaptcha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:05:26