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

如何解决JupyterLite中使用FinanceDataReader时的SSLError问题

解决JupyterLite中FinanceDataReader的SSLError问题

问题根源

JupyterLite基于Pyodide在浏览器环境运行,Pyodide的Python环境中原生SSL模块支持不完善,而FinanceDataReader默认调用的Naver金融HTTPS接口需要SSL证书验证,因此直接调用会触发SSL module is not available错误。

可行解决方案

方案1:利用浏览器Fetch API手动获取并解析Naver数据

浏览器本身具备完整的SSL处理能力,我们可以通过Pyodide调用浏览器的fetch接口绕过Pyodide的SSL限制,手动解析Naver返回的K线数据:

import pandas as pd
import xml.etree.ElementTree as ET
from pyodide.ffi import to_js
import js

# 配置参数
symbol = '005930'
start_date = '2020-01-01'
end_date = '2020-12-31'

# 构造Naver金融K线数据请求URL
url = f"https://fchart.stock.naver.com/sise.nhn?timeframe=day&count=6000&requestType=0&symbol={symbol}"

# 调用浏览器fetch获取数据(浏览器自动处理SSL)
response = await js.fetch(url)
text = await response.text()

# 解析XML格式的返回数据
root = ET.fromstring(text)
data = []
for item in root.findall('.//item'):
    date, open_p, high, low, close, volume = item.attrib['data'].split('|')
    data.append({
        'Date': date,
        'Open': float(open_p),
        'High': float(high),
        'Low': float(low),
        'Close': float(close),
        'Volume': int(volume)
    })

# 转换为DataFrame并过滤日期范围
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
df = df[(df.index >= start_date) & (df.index <= end_date)]

# 查看结果
df

方案2:改用Yahoo Finance的CSV数据源

如果不需要严格依赖Naver数据,可以直接读取Yahoo Finance的CSV格式数据,同样利用浏览器fetch处理SSL:

import pandas as pd
from pyodide.ffi import to_js
import js
from io import StringIO

# 配置参数(三星电子在Yahoo的代码为005930.KS)
symbol = '005930.KS'
start_date = '2020-01-01'
end_date = '2020-12-31'

# 构造Yahoo Finance下载URL
period1 = int(pd.Timestamp(start_date).timestamp())
period2 = int(pd.Timestamp(end_date).timestamp())
url = f"https://query1.finance.yahoo.com/v7/finance/download/{symbol}?period1={period1}&period2={period2}&interval=1d&events=history&includeAdjustedClose=true"

# 调用浏览器fetch获取CSV数据
response = await js.fetch(url)
text = await response.text()

# 转换为DataFrame
df = pd.read_csv(StringIO(text), index_col='Date', parse_dates=True)

# 查看结果
df

为什么之前的方法无效?

  1. Stack Overflow的session参数方案:FinanceDataReader的DataReader确实不支持session参数,且即使支持,Pyodide环境下的requests模块同样受限于SSL缺失问题。
  2. Inflearn的安装命令:JupyterLite中无法通过pip安装需要编译的底层依赖,且--trusted-host这类参数在Pyodide的pip实现中不兼容,因此会触发解析错误。
  3. JupyterLite社区讨论:FinanceDataReader主要针对桌面Python环境开发,对Pyodide的支持不完善,因此社区相关讨论较少。
  4. pandas的SSL解决方案:如设置verify=False,在Pyodide环境中因无SSL模块,该配置无法生效,因此无效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:15:36