🚀 AI 一键生成 ptrade 策略代码

PTrade 编程小贴士:处理 get_fundamentals 返回的百分比字符串

ptrade | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

get_fundamentals 获取的换手率是字符串带百分号,怎么转成数字?

解决方案

PTrade中将换手率字符串转换为数字的方法

在 PTrade 量化交易平台中,使用 get_fundamentals 接口获取的 换手率 (turnover_rate)滚动股息率 (dividend_ratio) 字段,默认返回的是带有百分号 % 的字符串格式(例如 '4.20%')。

要在策略中进行数值计算,您需要先去除百分号,将其转换为浮点数,通常还需要除以 100 以还原为小数形式(例如 0.042)。

以下是具体的处理方法和代码示例。

核心处理逻辑

由于 get_fundamentals 返回的是 pandas.DataFrame 对象,推荐使用 Pandas 的向量化字符串操作方法,这样效率最高。

步骤如下:

  1. 使用 .str.strip('%') 去除字符串末尾的百分号。
  2. 使用 .astype(float) 将字符串转换为浮点数。
  3. 除以 100 将百分数转换为小数(可选,视您的计算需求而定)。

代码示例

以下是一个完整的策略示例,展示了如何在 before_trading_starthandle_data 中获取数据并进行转换:

def initialize(context):
    # 设置股票池,例如平安银行
    g.security = ['000001.SZ']
    set_universe(g.security)

def handle_data(context, data):
    # 获取估值表中的换手率数据
    # 注意:get_fundamentals 在回测中默认获取前一交易日数据
    df = get_fundamentals(g.security, 'valuation', fields=['turnover_rate'])
    
    if df is not None and not df.empty:
        # 打印原始数据查看格式
        log.info("转换前的数据类型: %s" % type(df['turnover_rate'].iloc[0]))
        log.info("转换前的值: %s" % df['turnover_rate'].iloc[0])
        
        # 【核心代码】进行转换
        # 1. 去除 '%'
        # 2. 转为 float
        # 3. 除以 100 (例如 '1.5%' -> 1.5 -> 0.015)
        df['turnover_rate'] = df['turnover_rate'].str.strip('%').astype(float) / 100
        
        # 打印转换后的数据
        log.info("转换后的值: %f" % df['turnover_rate'].iloc[0])
        
        # 示例逻辑:如果换手率大于 1% (即 0.01),则打印日志
        if df['turnover_rate'].iloc[0] > 0.01:
            log.info("今日换手率活跃")

注意事项

  1. 空值处理:如果获取的数据中包含 NaN 或空值,直接进行字符串操作可能会报错。建议在转换前先处理空值,例如使用 df.dropna()df.fillna('0%')
  2. 适用字段:此方法同样适用于 滚动股息率 (dividend_ratio) 字段,因为它的返回格式也是带 % 的字符串。
  3. Python 版本:PTrade 支持 Python 3,上述 Pandas 语法在 Python 3.5 及以上版本均可正常运行。

Q&A 常见问题解答

Q: 为什么要除以 100?
A: 原始字符串如 '4.20%' 代表的是百分数。去掉 % 后变成数字 4.20。在数学计算中,4.20% 等于 0.042。如果您习惯直接用百分位数值(如 4.2)进行比较,可以不除以 100,但需确保您的策略逻辑中阈值设定也是按百分位设定的(例如 > 4.2 而不是 > 0.042)。

Q: 如果 get_fundamentals 返回 None 怎么办?
A: 网络波动或数据缺失可能导致接口返回 None。代码中应始终包含 if df is not None and not df.empty: 的判断保护,防止策略因空指针异常而中断。

Q: 还有哪些财务字段是字符串格式?
A: 在 valuation 表中,turnover_rate(换手率)和 dividend_ratio(滚动股息率)是典型的带 % 字符串。其他大部分字段如 pe_ttmpb 等通常直接返回 float 类型,但在使用前建议通过 log.info 打印类型进行确认。