问题描述
ETFList = list((getall_securities(['fund'])['type'] == 'etf').index)
df=get_fundamentals(query(valuation.code,valuation.market_cap).filter(valuation.code.in(ETFList ),valuation.market_cap >= 1), date=datetime(2021,12,14))
是否get_fundamentals()函数只支持股票市值查询 不支持基金?基金市值如何查?
解决方案
1. get_fundamentals() 是否只支持股票市值查询?
是的,get_fundamentals() 函数查询的 valuation(市值表)仅支持股票数据,不支持基金。
valuation 表记录的是上市公司的总股本、流通股本、总市值、市盈率(PE)、市净率(PB)等财务指标。由于 ETF 基金不属于上市公司,其资产规模和份额是动态变化的,因此无法通过 valuation 表来获取基金的市值。
2. 在 JoinQuant 中如何查询 ETF 基金的市值(规模)?
在 JoinQuant 平台中,基金的详细数据(如基金规模、份额、资产净值等)独立于股票的财务数据,需要通过 finance.run_query() 接口查询专门的基金数据库表。
虽然 get_fundamentals 不能查基金,但你可以通过查询基金概况表或基金资产组合表来获取 ETF 的规模数据。具体步骤如下:
解决方案:使用 finance.run_query() 查询基金数据
你需要查阅 JoinQuant 官网的数据字典 -> 基金数据,找到记录基金规模或份额的表(例如 finance.FUND_MAIN_INFO 基金主表,或 finance.FUND_PORTFOLIO 基金资产组合表),然后进行查询。
示例代码思路:
from jqdata import *
# 1. 获取所有 ETF 基金代码列表
etf_df = get_all_securities(['etf'])
etf_list = list(etf_df.index)
# 2. 使用 finance.run_query 查询基金相关表
# 注意:以下表名和字段名需根据聚宽最新数据字典进行替换
# 假设我们要查询基金的资产净值或份额
q = query(
finance.FUND_PORTFOLIO.code,
finance.FUND_PORTFOLIO.total_asset # 假设该字段代表基金总资产/规模
).filter(
finance.FUND_PORTFOLIO.code.in_(etf_list),
finance.FUND_PORTFOLIO.pub_date >= '2021-12-01'
).limit(3000)
# 执行查询
df = finance.run_query(q)
print(df.head())
补充说明:
- 基金净值获取:如果你只需要获取 ETF 的单位净值或累计净值,可以使用
get_extras()函数。例如:get_extras('unit_net_value', etf_list, start_date='2021-12-14', end_date='2021-12-14')。 - 数据字典参考:由于基金数据表结构较为丰富,强烈建议在 JoinQuant 官网导航栏点击 “数据” -> “基金数据”,查看具体的表名(如
FUND_MAIN_INFO)和代表基金规模的字段名称,以便准确构造query语句。