问题描述
解决方案
问题原因分析
您在本地 Anaconda 的 Spyder 中无法引用 attribute_history 函数,根本原因是:attribute_history 是 JoinQuant(聚宽)平台云端回测/模拟交易环境的专用 API。
这个函数高度依赖于聚宽云端服务器的上下文环境(如 context 对象、云端数据库连接等)。当您在本地独立的 Python 环境(如 Spyder、Jupyter Notebook 等)中编写代码时,并没有这些云端环境的支持,因此 Python 解释器会报错提示找不到该函数(NameError: name 'attribute_history' is not defined)。
解决方案
如果您希望在本地环境(Spyder)中获取聚宽的数据进行量化研究,您需要使用聚宽提供的本地数据接口库 JQData (jqdatasdk),并使用对应的本地 API 来替代 attribute_history。
1. 安装并登录 JQData
首先,您需要在 Anaconda 环境中安装 jqdatasdk:
pip install jqdatasdk
然后在您的 Spyder 脚本中导入并登录(需要您在聚宽官网申请 JQData 账号):
import jqdatasdk as jq
# 使用您的聚宽账号和密码登录
jq.auth('您的手机号', '您的密码')
2. 使用 get_price 或 get_bars 替代 attribute_history
在本地 jqdatasdk 中,没有 attribute_history 函数。您应该使用 get_price 或 get_bars 来获取历史行情数据。
示例:获取平安银行过去5天的收盘价
在聚宽云端回测中(使用 attribute_history):
# 云端回测代码
close_data = attribute_history('000001.XSHE', 5, '1d', ['close'])
在本地 Spyder 中(使用 get_price 替代):
import jqdatasdk as jq
import datetime
jq.auth('账号', '密码')
# 本地获取数据需要明确指定结束时间 (end_date)
# 获取平安银行截至今天的前5个交易日数据
df = jq.get_price('000001.XSHE', count=5, end_date=datetime.datetime.now(), frequency='daily', fields=['close'])
print(df)
3. 核心区别总结
| 特性 | attribute_history (云端回测) |
get_price / get_bars (本地 jqdatasdk) |
|---|---|---|
| 运行环境 | 仅限聚宽官网回测/模拟交易 | 本地 Python (Spyder, PyCharm 等) |
| 时间上下文 | 自动根据回测的当前逻辑时间 (context.current_dt) 往前推算,无未来函数 |
需要手动传入 end_date,如果不传默认取最新数据 |
| 是否包含当天 | 按天获取时,不包含回测当天的数据 | 包含 end_date 指定时间之前的数据 |
总结
如果您只是想在本地做数据分析和策略研究,请使用 jqdatasdk 配合 get_price。如果您想利用聚宽的回测引擎测试策略逻辑(包含 initialize、handle_data 等框架),请直接在**聚宽官网的“我的策略”**中编写和运行代码,那里可以直接使用 attribute_history。