想要得到某一天所有LOF基金那天的份额
在聚宽教程里的场内基金份额数据的字段设计里,没有基金类型(LOF,ETF)。
怎么能得到某一天,所有LOF(ETF)基金的基金份额呢?谢谢!
下面是聚宽上相关教程内容:
名称 类型 描述
code varchar(12) 基金代码
name varchar(50) 基金简称
exchange_code varchar(12) 交易市场编码,XSHG-上海证券交易所;XSHE-深圳证券交易所
date date 日期
shares bigint 基金份额(份)
场内基金份额数据
from jqdata import *
finance.run_query(query(finance.FUND_SHARE_DAILY).filter(finance.FUND_SHARE_DAILY.date=='2019-05-23').limit(n))
描述:记录每日场内基金份额数据
参数:
query(finance.FUND_SHARE_DAILY):表示从finance.FUND_SHARE_DAILY这张表中查询每日场内基金份额数据,还可以指定所要查询的字段名,格式如下:query(库名.表名.字段名1,库名.表名.字段名2),多个字段用逗号分隔进行提取;query函数的更多用法详见:query简易教程
finance.FUND_SHARE_DAILY:收录了每日场内基金份额数据,表结构和字段信息如下:
字段设计:
名称 类型 描述
code varchar(12) 基金代码
name varchar(50) 基金简称
exchange_code varchar(12) 交易市场编码,XSHG-上海证券交易所;XSHE-深圳证券交易所
date date 日期
shares bigint 基金份额(份)
filter(finance.FUND_SHARE_DAILY.date==date):指定筛选条件,通过finance.FUND_SHARE_DAILY.date==date可以指定你想要查询的日期;除此之外,还可以对表中其他字段指定筛选条件;多个筛选条件用英文逗号分隔。
limit(n):限制返回的数据条数,n指定返回条数。
返回结果:
返回一个 dataframe,每一行对应数据表中的一条数据, 列索引是您所查询的字段名称
注意:
为了防止返回数据量过大, 我们每次最多返回3000行
不能进行连表查询,即同时查询多张表的数据
示例:
查询2019-05-23的场内基金份额数据。
from jqdata import *
df=finance.run_query(query(finance.FUND_SHARE_DAILY).filter(finance.FUND_SHARE_DAILY.date=='2019-05-23').limit(10))
df
id code name exchange_code date shares
0 960881 150008.XSHE 瑞和小康 XSHE 2019-05-23 17749200
1 960882 150009.XSHE 瑞和远见 XSHE 2019-05-23 17749200
2 960883 150012.XSHE 中证100A XSHE 2019-05-23 36139500
3 960884 150013.XSHE 中证100B XSHE 2019-05-23 54209300
4 960885 150016.XSHE 合润A XSHE 2019-05-23 38111200
5 960886 150017.XSHE 合润B XSHE 2019-05-23 57166800
6 960887 150018.XSHE 银华稳进 XSHE 2019-05-23 3081515900
7 960888 150019.XSHE 银华锐进 XSHE 2019-05-23 3081515900
8 960889 150022.XSHE 深成指A XSHE 2019-05-23 2472644500
9 960890 150023.XSHE 深成指B XSHE 2019-05-23 2472644500
问题描述
解决方案
在聚宽(JoinQuant)平台上,finance.FUND_SHARE_DAILY 表确实只记录了场内基金的份额数据,并没有直接提供基金类型的字段。要获取特定类型(如 LOF 或 ETF)的基金份额,我们需要结合聚宽的另一个 API:get_all_securities。
解决思路
- 获取 LOF 基金列表:首先使用
get_all_securities函数,指定types=['lof'](如果是 ETF 则指定['etf']),获取在指定日期上市的所有 LOF 基金代码。 - 查询基金份额:将获取到的 LOF 基金代码列表作为过滤条件,使用
in_操作符传入finance.run_query中,查询finance.FUND_SHARE_DAILY表。
Python 实现代码
以下是获取 2019-05-23 所有 LOF 基金份额的完整代码示例:
from jqdata import *
# 指定要查询的日期
target_date = '2019-05-23'
# 1. 获取指定日期还在上市的所有 LOF 基金信息
# 如果想查询 ETF,只需将 ['lof'] 改为 ['etf']
lof_securities = get_all_securities(types=['lof'], date=target_date)
# 提取 LOF 基金的代码列表
lof_codes = list(lof_securities.index)
# 2. 构建查询语句,使用 in_ 操作符筛选属于 LOF 的基金代码
q = query(
finance.FUND_SHARE_DAILY
).filter(
finance.FUND_SHARE_DAILY.date == target_date,
finance.FUND_SHARE_DAILY.code.in_(lof_codes)
)
# 执行查询
# 注意:finance.run_query 每次最多返回 4000 行,LOF 基金数量通常不会超过此限制
df = finance.run_query(q)
# 打印结果
print(df)
代码解析
get_all_securities(types=['lof'], date=target_date):这个函数非常强大,它可以获取平台支持的所有标的信息。通过传入types=['lof'],我们过滤出所有的 LOF 基金;传入date参数可以确保我们获取的是在该日期仍然上市的基金,避免包含尚未上市或已退市的基金。finance.FUND_SHARE_DAILY.code.in_(lof_codes):在 SQLAlchemy 的查询语法中,in_方法用于匹配列表中的任意一个值。这样我们就可以精准地只查出 LOF 基金的份额数据了。
通过这种组合查询的方式,您可以灵活地获取任意特定类型标的(如分级A、分级B等)的财务或份额数据。