问题描述
解决方案
PTrade中将换手率字符串转换为数字的方法
在 PTrade 量化交易平台中,使用 get_fundamentals 接口获取的 换手率 (turnover_rate) 和 滚动股息率 (dividend_ratio) 字段,默认返回的是带有百分号 % 的字符串格式(例如 '4.20%')。
要在策略中进行数值计算,您需要先去除百分号,将其转换为浮点数,通常还需要除以 100 以还原为小数形式(例如 0.042)。
以下是具体的处理方法和代码示例。
核心处理逻辑
由于 get_fundamentals 返回的是 pandas.DataFrame 对象,推荐使用 Pandas 的向量化字符串操作方法,这样效率最高。
步骤如下:
- 使用
.str.strip('%')去除字符串末尾的百分号。 - 使用
.astype(float)将字符串转换为浮点数。 - 除以
100将百分数转换为小数(可选,视您的计算需求而定)。
代码示例
以下是一个完整的策略示例,展示了如何在 before_trading_start 或 handle_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("今日换手率活跃")
注意事项
- 空值处理:如果获取的数据中包含
NaN或空值,直接进行字符串操作可能会报错。建议在转换前先处理空值,例如使用df.dropna()或df.fillna('0%')。 - 适用字段:此方法同样适用于 滚动股息率 (
dividend_ratio) 字段,因为它的返回格式也是带%的字符串。 - 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_ttm、pb 等通常直接返回 float 类型,但在使用前建议通过 log.info 打印类型进行确认。