问题描述
自定义了一个函数库mylib.py,里面自定义了一个函数analyze_stock, 该函数中应用了get_price 函数。这样analyze_stock函数在研究环境中调用没有任何问题,但是在回测环境中,就会出现“name 'get_price' is not defined”的错误。
请问这个怎么解决呢?
get_price这个函数是在哪个库的,需要在mylib中import吗?
解决方案
在 JoinQuant 聚宽量化平台中,研究环境和回测环境的默认命名空间有所不同。在研究环境的 Notebook 中,系统默认已经为您导入了常用的 API(如 get_price),因此您可以直接调用。但是,当您将代码封装在自定义的 .py 文件(如 mylib.py)并在回测环境中 import 时,该文件拥有自己独立的命名空间,如果不显式导入聚宽的 API,就会报 name 'get_price' is not defined 的错误。
解决方法
您需要在您的自定义库文件 mylib.py 的开头,显式地导入聚宽的 API 库。聚宽官方推荐的导入方式如下:
方法一:导入 jqdata 库(推荐)
在 mylib.py 的最上方添加:
# -*- coding: utf-8 -*-
import jqdata
from jqdata import *
def analyze_stock(security):
# 现在可以正常使用 get_price 了
df = get_price(security, count=5, end_date='2023-01-01', frequency='daily')
return df
方法二:导入 kuanke.user_space_api
根据聚宽 API 文档关于“自定义私人 Python 库文件”的说明,您也可以导入用户空间 API:
# -*- coding: utf-8 -*-
# 如果要兼容研究使用,可以使用 try except 导入
try:
from kuanke.user_space_api import *
except ImportError:
pass
def analyze_stock(security):
df = get_price(security, count=5, end_date='2023-01-01', frequency='daily')
return df
总结
get_price 等获取数据的函数属于聚宽的内置 API。在自定义的模块中,必须通过 from jqdata import * 或 from kuanke.user_space_api import * 将这些 API 引入到当前模块的命名空间中,这样在回测环境中调用时就不会再出现未定义的错误了。