🚀 AI 一键生成 ptrade 策略代码

ptrade 平台 get_cb_info 函数无法使用、报 NameError 的原因与解决方案

ptrade | 发布时间: 2026/5/20
以下内容由 EasyQuant 生成。

问题描述

ptrade上的get_cb_info函数无法使用

比如示例代码:
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 在回测环境中不可用的限制,顺利完成可转债策略的回测。