接口用法 · 参数枚举与字段
investpy search_quotes 怎么用:参数枚举与 SearchObj 字段
官方 README 特别强调 search_quotes 是与 Investing.com 数据 1:1 对齐的函数,但它指向的官方文档页 search_api.html 已经 404。本站改从源码与运行时枚举还原这个函数的完整契约:参数取值有哪些、返回对象带哪些字段、能继续调用什么。
一次搜索的对象流转
search.py 与 utils/search_obj.py 整理的对象流转示意。本机在第二步即被 403 拦截,因此未产生真实的 SearchObj 实例——本页字段说明全部来自源码,不含实测数据。investpy 的函数签名与四个参数
四个参数里有两个是过滤列表,它们的取值来自内置枚举表,写错会直接抛 ValueError,因此值得逐个记清。
| 参数 | 类型 | 是否必填 | 取值来源 | 说明 / 注意点 |
|---|---|---|---|---|
text | str | 必填 | 自由文本 | 空值或非字符串会抛 ERR#0074 |
products | list[str] | 可选 | PRODUCT_FILTERS 的 10 个键 | 用复数(stocks 而非 stock);非 list 抛 ERR#0094,值非法抛 ERR#0095 |
countries | list[str] | 可选 | COUNTRY_FILTERS 的 100 个国家名 | 入参会被 lower().strip() 归一化,China 可以;值非法抛 ERR#0129 |
n_results | int | 可选 | 正整数 | 等于 1 时返回单个对象而非列表;小于 1 抛 ERR#0088 |
返回值有个容易踩的坑:n_results 为 1 时返回单个 SearchObj,其余情况返回 list。写循环处理时如果不加判断,n_results=1 会因为对象不可迭代而报错。
SearchObj 有哪些字段,分别是什么含义?
搜索结果的每个条目都是一个 SearchObj。它的构造参数直接来自 Investing.com 的搜索返回,因此字段语义要按对方的定义理解。
| 字段 | 来源字段 | 含义 | 注意点 |
|---|---|---|---|
id_ | pairId | Investing.com 内部的资产 ID | 不是交易所代码;取历史数据时会作为 curr_id 参与请求 |
name | name | 资产显示名 | 同一公司常有多个市场多条记录,名称会重复 |
symbol | symbol | 交易代码 | 不同市场的同一公司在各自市场有各自的 symbol |
tag | link | 站点路径片段 | 公司简介、分红等接口用 tag 拼 URL,不是稳定的标识 |
country | flag 映射 | 资产所属国家/地区 | 加密货币与商品会被置为 None(源码中对这两类跳过国家映射) |
pair_type | pair_type 经 PAIR_FILTERS 映射 | 资产类别 | 映射表与搜索用的 PRODUCT_FILTERS 不是同一张表 |
exchange | exchange | 交易所名称 | 只在搜索结果里存在;历史上取到的 DataFrame 并不包含它 |
data / information / technical_indicators / default_currency | 调用 retrieve 方法后填充 | 延迟填充的结果容器 | 未调用前为空,不要在取数前读取 |
SearchObj 上的五个取数方法分别走哪个端点?
拿到对象之后,真正的取数发生在这些方法里。它们各自走哪个端点、返回什么,决定了搜索之外还能做什么。
| 方法 | 返回 | 走的端点 | 适用场景 |
|---|---|---|---|
retrieve_recent_data() | DataFrame,仅最近若干条 | 历史数据端点 | 只想看最新几根 K 线;字段与历史数据一致 |
retrieve_historical_data(from_date, to_date) | DataFrame,日期区间 | 历史数据端点 | 要完整区间做分析或回测 |
retrieve_information() | 资产信息(名称、代码、交易所、币种等) | 资产页面 | 想确认代码与交易所的对应关系 |
retrieve_technical_indicators(interval='daily') | 技术指标数值 | 技术指标端点 | 需要对方算好的指标值,而不是自己算 |
retrieve_currency() | 默认币种 | 资产页面 | 做跨市场对比前先确认币种 |
本机现状:上述五个方法都依赖联网端点,在本站 2026-10-12 的实测中均无法走到(搜索阶段即 403)。本页的字段与方法说明全部来自源码,不是实测成功的结果,请勿当作「可用证明」。
investpy 的两张枚举表:products 与 countries 到底能填什么?
这是最容易出错的部分——两张表的命名风格不一样,而且还有第三张表在背后做映射。
| 枚举表 | 用在哪 | 取值风格 | 完整取值 |
|---|---|---|---|
PRODUCT_FILTERS | search_quotes(products=...) | 复数 / 小写 | indices, stocks, etfs, funds, commodities, currencies, cryptos, bonds, certificates, fxfutures |
PRODUCT_TYPE_FILES | technical_indicators(product_type=...) | 单数 / 下划线 | certificate, commodity, currency_cross, etf, fund, index, stock, bond |
PAIR_FILTERS | 内部:把搜索返回的 pair_type 映射成可读类别 | 单数 / 含 equities | bond, certificate, commodity, crypto, currency, equities, etf, fund, fxfuture, indice |
| 你写的值 | 结果 | 正确写法 |
|---|---|---|
products=['stock'] | ERR#0095 值非法 | products=['stocks'] |
products=['equities'] | ERR#0095 值非法(那是内部表的值) | products=['stocks'] |
countries=['China'] | 可以,内部会归一化成小写 | 保持 'china' 更直观 |
countries=['HongKong'] | ERR#0129 值非法 | countries=['hong kong'](带空格) |
n_results=1 | 返回单个对象而非列表 | 按需判断类型,或用 n_results=2 保持列表 |
国家名共 100 个(COUNTRY_FILTERS),全部小写、多词用空格分隔,例如 hong kong、united states、south korea、euro zone。完整清单可在资产清单页查到逐类国家的数量分布。
investpy search_quotes 的报错码与处理方式
下表把源码中与搜索相关的错误码整理出来。区分「你参数写错了」和「对方拒绝了请求」很关键,前者能改,后者改不了。
| 错误码 / 现象 | 触发条件 | 是谁的问题 | 处理方式 |
|---|---|---|---|
ERR#0074 | text 为空或非字符串 | 调用方 | 传非空字符串 |
ERR#0094 / ERR#0128 | products / countries 不是 list | 调用方 | 改成 list,即使只有一个值 |
ERR#0095 / ERR#0129 | 过滤值不在枚举表内 | 调用方 | 按报错信息里给出的完整枚举改正 |
ERR#0088 | n_results 小于 1 或非整数 | 调用方 | 传 ≥1 的整数 |
ERR#0015 | HTTP 状态码不是 200 | 对方 / 网络 | 本机实测恒为 403,属不可修复类 |
ERR#0093 | 请求成功但搜索结果为零 | 调用方(多为关键词问题) | 换关键词或放宽过滤;注意这说明端点其实是通的 |
怎么区分:ERR#0093 与 ERR#0015 的差别决定了你的下一步——前者说明请求已经打到对方并拿到了 200,只是没有匹配结果,此时应该改搜索策略;后者说明请求根本没被接受,改进关键词毫无意义。
FAQ
investpy 常见问题:还能装吗、还能取数吗、换什么
search_quotes 和 get_stocks_historical_data 有什么区别?
search_quotes 是与 Investing.com 数据 1:1 对齐的函数,因为它直接用对方的搜索服务;而按国家+代码取数依赖随包名录是否收录了该标的。选哪个取决于你已经知道代码还是只知道名称。n_results 设成 1 为什么返回的不是列表?
n_results == 1 且是用户显式指定时,函数直接返回单个 SearchObj,否则返回列表切片。这属于设计而非 bug,但写通用代码时要用 isinstance 判断,或干脆传 2 以上保持列表类型稳定。以源码实现为准。为什么 countries 里写 'China' 可以,'HongKong' 不行?
COUNTRY_FILTERS,100 个国家/地区),函数会把你的输入统一转成小写并去空格后再查表。'China' 归一化后等于表里的 'china',可以命中;'HongKong' 归一化后是 'hongkong',而表里是 'hong kong'(带空格),所以查不到。写成 'hong kong' 即可。products 到底用单数还是复数?
search_quotes 用复数:stocks、etfs、cryptos 等 10 个值。而 technical_indicators 的 product_type 用单数:stock、etf 等 8 个值。两套枚举互不通用,这是本站核对源码时发现的易错点,官方文档没写明。以源码中的 PRODUCT_FILTERS 与 PRODUCT_TYPE_FILES 为准。SearchObj 的 tag 能直接当资产 ID 用吗?
tag 来自站点链接片段(例如 /equities/apple-computer-inc),它是页面路径而不是稳定主键;id_(内部 pairId)才是取数请求里用到的标识。如果你的流程需要持久化标识,优先存 id_ 与 symbol 的组合,并对变化做校验。search_quotes 现在能跑通吗?
ConnectionError: ERR#0015: error 403。本页的参数与字段说明来自源码与运行时枚举,不是实测成功的调用结果。建议你按可用性核验页的步骤在自己的环境里复测一次,用你自己的结果做决策。