🚀 AI 一键生成 ptrade 策略代码

PTrade 避坑指南:处理 valuation 表中带百分号的换手率数据

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

问题描述

为什么获取到的换手率数据是字符串(带%),该怎么转成数字?

解决方案

PTrade API 换手率数据格式说明及转换方法

在 PTrade 量化交易平台中,获取到的换手率(turnover_rate)数据为带 % 的字符串格式,这是 API 接口规范决定的

根据 PTrade 官方文档中关于 财务数据 -> valuation-估值数据 的说明:

“换手率(turnover_rate)和滚动股息率(dividend_ratio)两个字段数据源返回的是带%的字符串。比如 turnover_rate:20%,用户需要自行转换成 0.2 的 float 格式。”

转换方法

您可以使用 Python 的字符串处理方法 strip() 去除百分号,然后使用 float() 转换为数字,最后除以 100 得到小数形式。

以下是具体的代码示例,展示如何在获取财务数据后进行清洗和转换:

def initialize(context):
    g.security = ['600570.SS', '000001.SZ']
    set_universe(g.security)

def handle_data(context, data):
    # 1. 获取估值表中的换手率数据
    # 注意:get_fundamentals 返回的是 pandas DataFrame
    df = get_fundamentals(g.security, 'valuation', fields=['turnover_rate'])
    
    if df is not None and not df.empty:
        # 打印原始数据查看格式
        log.info("原始数据示例: %s" % df['turnover_rate'][0])
        
        # 2. 数据转换逻辑
        # 使用 apply 和 lambda 函数批量处理整列数据
        # 逻辑:如果数据不为空,去除 '%',转为 float,再除以 100
        try:
            df['turnover_rate'] = df['turnover_rate'].apply(
                lambda x: float(x.strip('%')) / 100 if x is not None and x != '' else 0.0
            )
            
            # 打印转换后的数据
            log.info("转换后数据示例: %f" % df['turnover_rate'][0])
            
            # 示例:筛选换手率大于 1% (即 0.01) 的股票
            high_turnover = df[df['turnover_rate'] > 0.01]
            log.info("高换手率股票: %s" % high_turnover.index.tolist())
            
        except Exception as e:
            log.error("数据转换出错: %s" % e)

关键点说明

  1. x.strip('%'): 移除字符串末尾的百分号。
  2. float(...): 将剩余的字符串(如 "2.5")转换为浮点数。
  3. / 100: 将百分数转换为小数(如 2.5 变为 0.025)。如果不除以 100,请确保您的策略逻辑中比较的阈值也是百分数数值(如 2.5)。
  4. 异常处理: 代码中加入了 if x is not None 判断,防止因数据缺失(None)导致 strip 方法报错。

Q&A

Q: PTrade 中除了换手率,还有哪些字段是带 % 的字符串?
A: 在 valuation(估值数据)表中,滚动股息率(dividend_ratio) 也是以带 % 的字符串形式返回的,处理方式与换手率相同。

Q: 为什么 get_fundamentals 返回的数据有时候是 None?
A: 这可能是因为网络请求超时、当日数据尚未更新(特别是在盘中获取当日估值数据时),或者查询的股票在指定日期停牌/未上市。建议在代码中增加 if df is not None: 的判断保护。

Q: 如何在回测中获取准确的历史换手率?
A: 在回测模式下,如果不指定 date 参数,get_fundamentals 默认获取回测当前日期前一交易日的数据(避免未来函数)。如果需要特定日期的数据,请显式传入 date 参数。