问题描述
调用get_extras函数查lof基金的复权净值报错:
Exception: adj_net_value现在仅支持场外基金
可是LOF基金也有场外啊。该如何获取LOF基金的复权净值呢?
解决方案
在 JoinQuant 聚宽平台上,遇到调用 get_extras 获取 LOF 基金复权净值报错 Exception: adj_net_value现在仅支持场外基金,通常是因为传入的基金代码后缀不正确或混淆了场内/场外基金的获取方式。
以下是详细的报错原因及解决方案:
报错原因分析
LOF 基金(上市型开放式基金)确实既有场内份额也有场外份额。在聚宽的数据体系中,它们通过代码后缀来进行区分:
- 场内基金代码:后缀通常为
.XSHG(上交所)或.XSHE(深交所),例如162411.XSHE。 - 场外基金代码:后缀统一为
.OF,例如162411.OF。
get_extras 函数中的 adj_net_value(复权净值)字段,系统底层设定仅针对场外基金代码(.OF)开放。如果您传入了场内代码(如 .XSHE),系统就会抛出该异常。
解决方案
根据您的实际需求,可以通过以下几种方式获取所需数据:
方案一:获取场外 LOF 的复权净值(修改代码后缀)
如果您确实需要该 LOF 基金的场外复权净值,只需将查询代码的后缀改为 .OF 即可。
from jqdata import *
# 使用 .OF 后缀查询场外复权净值
lof_code_otc = '162411.OF'
df = get_extras('adj_net_value', [lof_code_otc], start_date='2023-01-01', end_date='2023-10-01')
print(df)
方案二:获取场内 LOF 的复权价格(用于回测交易)
如果您是在编写交易策略,需要获取场内 LOF 的历史行情来进行买卖信号判断,您应该使用 get_price 函数,并设置复权参数 fq。场内基金的交易基于价格而非净值(存在折溢价)。
from jqdata import *
# 获取场内 LOF 的前复权收盘价
lof_code_exchange = '162411.XSHE'
df_price = get_price(lof_code_exchange, start_date='2023-01-01', end_date='2023-10-01', frequency='daily', fields=['close'], fq='pre')
print(df_price)
方案三:获取场内 LOF 的单位净值和累计净值
如果您需要分析场内 LOF 的实际净值表现,可以使用 get_extras 获取 unit_net_value(单位净值)和 acc_net_value(累计净值)。累计净值在不考虑分红再投资的情况下,可以作为衡量基金长期表现的参考。
from jqdata import *
lof_code_exchange = '162411.XSHE'
# 获取累计净值
df_acc = get_extras('acc_net_value', [lof_code_exchange], start_date='2023-01-01', end_date='2023-10-01')
# 获取单位净值
df_unit = get_extras('unit_net_value', [lof_code_exchange], start_date='2023-01-01', end_date='2023-10-01')
print("累计净值:\n", df_acc)
print("单位净值:\n", df_unit)
总结
- 查场外复权净值:用
get_extras+adj_net_value+.OF代码。 - 查场内复权行情:用
get_price+fq='pre'+.XSHG/.XSHE代码。 - 查场内累计/单位净值:用
get_extras+acc_net_value/unit_net_value+.XSHG/.XSHE代码。