3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant 聚宽平台上,get_bars、get_price 等常用的 API 函数实际上是被直接注入到了策略和研究环境的**全局命名空间(Global Namespace)**中的。这就是为什么你在平台上不需要加任何前缀就可以直接调用它们的原因。
而你尝试使用的 import jqdata as jq 之所以会报错 AttributeError: module 'jqdata' has no attribute 'get_bars',是因为在云端环境中,jqdata 模块主要用于存放 jqdata.macro(宏观数据)、jqdata.finance(财务数据)等子模块,全局的行情 API 并不直接挂载在 jqdata 这个模块对象下(这与本地的 jqdatasdk 结构不同)。
kuanke.user_space_api为了实现你的需求——不修改代码,直接在本地和云端都能使用 jq.get_bars() 的形式调用,你可以引入聚宽云端底层的 API 模块:kuanke.user_space_api。
在聚宽云端,所有的全局 API 都存放在这个模块中。你可以通过 try...except 语句来编写一段兼容本地和云端的导入代码:
# 兼容本地 jqdatasdk 与 聚宽云端环境的导入方式
try:
# 尝试导入本地的 jqdatasdk
import jqdatasdk as jq
# 如果在本地运行,可以在这里加上登录代码(云端运行会跳过)
# jq.auth('你的账号', '你的密码')
except ImportError:
# 如果导入失败,说明当前在聚宽云端环境
# 导入云端的底层 API 模块,并重命名为 jq
import kuanke.user_space_api as jq
# 接下来你就可以在任何地方愉快地使用 jq. 前缀了!
# 无论是在本地还是上传到聚宽平台,下面的代码都不需要修改:
def initialize(context):
# 示例:使用 jq. 前缀调用 API
df = jq.get_bars(security='000001.XSHE', count=5, unit='1d', fields=['open', 'close'])
print(df)
# 其他 API 也同理
price = jq.get_price('000001.XSHE', count=1, end_date=context.current_dt)
print(price)
jqdatasdk,try 块执行成功,jq 成为 jqdatasdk 的别名,jq.get_bars() 正常工作。jqdatasdk 的包(或者你没有调用 auth),触发 ImportError,进入 except 块。此时导入 kuanke.user_space_api as jq,这个模块包含了云端所有的全局函数,因此 jq.get_bars() 同样可以完美运行。通过这种优雅的兼容写法,你就可以实现“一套代码,两端运行”,再也不用手动去删改前缀了!