问题描述
看起来返回的是相同的东西?
# 获取基金单位净值
# df=False,返回一个dict, key是基金代号, value是[numpy.ndarray]
unit_net_value = get_extras('unit_net_value', ['162415.XSHE'], start_date='2023-01-03', end_date='2023-01-04',df=False)
print(unit_net_value)
#查询基金净值数据,传入的基金代码无需添加后缀
q=query(finance.FUND_NET_VALUE).filter(finance.FUND_NET_VALUE.code=="162415",finance.FUND_NET_VALUE.day=="2023-01-04").order_by(finance.FUND_NET_VALUE.day.desc()).limit(5000)
df=finance.run_query(q)
print(df)
{'162415.XSHE': array([1.691, 1.706])}
id code day net_value sum_value factor acc_factor \
0 37434898 162415 2023-01-04 1.70600 1.70600 1.00000 1.00000
refactor_net_value
0 1.70600
https://www.joinquant.com/help/api/doc?name=JQDatadoc&id=9944
# 获取基金单位净值
# df=False,返回一个dict, key是基金代号, value是[numpy.ndarray]
get_extras('unit_net_value', ['510300.XSHG', '510050.XSHG'], start_date='2015-12-01', end_date='2015-12-03',df=False)
#返回
{'510300.XSHG': array([3.6446, 3.7746, 3.8023]),
'510050.XSHG': array([2.344, 2.455, 2.458])}
https://www.joinquant.com/help/api/doc?name=JQDatadoc&id=9942
#查询瑞和小康("150008)基金净值数据,传入的基金代码无需添加后缀
from jqdatasdk import finance
q=query(finance.FUND_NET_VALUE).filter(finance.FUND_NET_VALUE.code=="150008").order_by(finance.FUND_NET_VALUE.day.desc()).limit(5)
df=finance.run_query(q)
print(df)
id code day net_value sum_value factor acc_factor \
0 23506832 150008 2020-08-27 1.227 1.613 1.0 1.314668
1 23506831 150008 2020-08-26 1.228 1.614 1.0 1.314668
2 23506830 150008 2020-08-25 1.234 1.622 1.0 1.314668
3 23425100 150008 2020-08-24 1.234 1.622 1.0 1.314668
4 23414948 150008 2020-08-21 1.229 1.616 1.0 1.314668
refactor_net_value
0 1.613098
1 1.614412
2 1.622300
3 1.622300
4 1.615727
解决方案
您好!您的观察非常准确。在 JoinQuant 平台中,通过 get_extras 获取的 unit_net_value 和通过 finance.FUND_NET_VALUE 表查询到的 net_value,在底层数据含义上是完全相同的,它们都代表基金的单位净值。
既然数据相同,为什么平台会提供两种不同的获取方式呢?它们的主要区别在于使用场景、返回数据结构以及包含的信息丰富度:
1. 适用场景与调用便捷性
get_extras(策略回测首选):这是一个专门为策略回测和时间序列分析设计的快捷 API。您可以直接传入一个包含多个基金代码(需带后缀,如162415.XSHE)的列表和时间段,它会直接返回对齐好的pandas.DataFrame或numpy.ndarray。非常适合在handle_data中快速获取历史净值序列进行计算。finance.run_query(深度研究与数据挖掘首选):这是基于 SQLAlchemy 的数据库查询接口。它适合在研究环境(Research)中进行复杂的数据筛选、排序和多表关联。传入的基金代码通常不需要后缀(如162415)。
2. 返回信息的丰富度
get_extras('unit_net_value', ...):顾名思义,它只返回您请求的那一个特定指标(单位净值)的数值序列。finance.FUND_NET_VALUE表:返回的是完整的数据库表结构。正如您打印出的结果所示,除了net_value(单位净值),它还同时包含了:sum_value:累计净值factor:复权因子acc_factor:累计复权因子refactor_net_value:复权净值
如果您需要同时分析单位净值和累计净值,或者需要自己计算复权收益,使用finance表查询会更加全面。
总结建议
- 如果您在编写交易策略,只需要用到基金的单位净值序列来计算均线或收益率,推荐使用
get_extras,代码更简洁,执行效率高。 - 如果您在做投研分析,需要全面了解基金的复权情况、累计净值,或者需要按特定条件(如净值大于某数值)过滤全市场的基金,推荐使用
finance.run_query。