问题描述
解决方案
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)
关键点说明
x.strip('%'): 移除字符串末尾的百分号。float(...): 将剩余的字符串(如 "2.5")转换为浮点数。/ 100: 将百分数转换为小数(如 2.5 变为 0.025)。如果不除以 100,请确保您的策略逻辑中比较的阈值也是百分数数值(如 2.5)。- 异常处理: 代码中加入了
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 参数。