问题描述
比如示例代码:
def initialize(context):
pass
def handle_data(context, data):
df = get_cb_info()
log.info(df)
最后跑出来的结果如下:
2024-11-20 10:22:00 - ERROR - 用户策略执行异常
2024-11-20 10:22:00 - ERROR - Exception: Traceback (most recent call last):
File /home/fly/sim_backtest/result/29fa7074-a6e6-11ef-b05b-c40778d9af27/user_strategy.py, line 6 in handle_data
df = get_cb_info()
--> data = BarDict(600570.SS)
--> context = <StrategyContext {'recorded_vars': {}, 'commission': <Commission {'cost': 0.0003, 'min_trade_cost': 5.0, 'tax': 0.001}>, 'blotter': <Blotter {'current_dt': date ...
NameError: name 'get_cb_info' is not defined
说明这个函数就根本没有做进去了。
目前我试的券商,国盛ptrade是无法使用的。
解决方案
问题分析
您在 ptrade 平台上调用 get_cb_info() 函数时遇到 NameError: name 'get_cb_info' is not defined 报错,主要原因在于运行环境不匹配。
根据您的报错日志 File /home/fly/sim_backtest/result/... 可以看出,您是在**回测环境(sim_backtest)**中运行该策略的。
查阅 ptrade 官方 API 文档关于 get_cb_info 的说明:
- 使用场景:该函数仅在研究、交易模块可用。
- 权限要求:此 API 依靠可转债基础数据权限,使用前请与券商确认是否有此权限,无权限时调用返回空 DataFrame。
结论:因为 get_cb_info 函数在回测引擎中根本没有被注入(不支持回测),所以在回测模块调用时会直接报 NameError 未定义错误。这与具体是哪家券商(如国盛)无关,而是 ptrade 框架底层的设定。
解决方案
1. 切换到正确的模块运行
如果您只是想获取或查看可转债的基础信息,请将代码放到 研究模块(Jupyter Notebook) 或 模拟/实盘交易模块 中运行。
2. 确认券商数据权限
即使在交易或研究模块中,如果券商没有为您开通“可转债基础数据权限”,调用该函数不会报错,但会返回一个空的 DataFrame。如果您在交易模块测试发现返回为空,请联系您的券商客户经理申请开通该权限。
3. 回测环境中的替代方案(重点)
如果您必须在回测策略中使用可转债的基础信息(如转股价、溢价率等),可以通过“研究模块获取并保存 -> 回测模块读取”的方式来实现。
步骤一:在研究模块中获取并保存数据
在 ptrade 的“研究”模块新建一个 Notebook,运行以下代码将可转债信息保存为 CSV 文件:
import pandas as pd
# 获取可转债基础信息
df_cb = get_cb_info()
if not df_cb.empty:
# 保存到研究环境的根目录
df_cb.to_csv('cb_info.csv', index=False)
print("可转债数据保存成功!")
else:
print("获取数据为空,请检查是否拥有可转债数据权限。")
步骤二:在回测策略中读取数据
在您的回测策略代码中,使用 get_research_path() 获取研究目录路径,并使用 pandas 读取刚才保存的 CSV 文件:
import pandas as pd
import os
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 获取研究目录路径
research_path = get_research_path()
file_path = os.path.join(research_path, 'cb_info.csv')
# 在初始化时读取可转债数据,存入全局变量 g
try:
g.cb_info_df = pd.read_csv(file_path)
log.info("成功加载可转债基础信息,共 %d 条记录" % len(g.cb_info_df))
except Exception as e:
log.error("读取可转债数据失败: %s" % e)
g.cb_info_df = pd.DataFrame()
def handle_data(context, data):
# 在盘中逻辑中使用可转债数据
if not g.cb_info_df.empty:
# 例如:打印前5条数据
# log.info(g.cb_info_df.head())
pass
通过这种方式,您就可以完美绕过 get_cb_info 在回测环境中不可用的限制,顺利完成可转债策略的回测。