问题描述
解决方案
在PTrade中获取股票的换手率数据,根据您的运行环境(实盘交易 vs 回测)和数据频率需求(实时tick级 vs 日线级),主要有以下两种方式:
1. 实盘/仿真交易环境:获取实时换手率
在实盘交易或仿真交易中,如果您需要获取当前时刻的实时换手率(例如盘中每3秒刷新一次的数据),应使用 get_snapshot 函数。
注意:get_snapshot 函数不支持在回测模式下使用。
代码示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取实时行情快照
snapshot = get_snapshot(g.security)
if snapshot and g.security in snapshot:
# 获取换手率字段 'turnover_ratio'
# 注意:返回的数值通常是百分比格式,例如 1.5 代表 1.5%
turnover_rate = snapshot[g.security].get('turnover_ratio')
log.info("股票 %s 当前实时换手率为: %s%%" % (g.security, turnover_rate))
# 简单的策略逻辑示例
if turnover_rate > 5.0:
log.info("换手率超过5%,市场活跃")
2. 回测/研究环境:获取日频换手率
在回测环境中,或者您只需要按日更新的换手率数据,应使用 get_fundamentals 函数查询 valuation(估值表)。
注意:
valuation表中的turnover_rate通常是基于前一交易日收盘数据计算的,或者在当日收盘后更新。- 返回的数据是字符串格式的百分比(例如
'1.5%'),使用前通常需要转换为浮点数。
代码示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取当日(回测中为当前回测日期)的估值数据
# 注意:回测中如果不传 date,默认取回测当前日期
q = get_fundamentals(g.security, 'valuation', ['turnover_rate'])
if q is not None and not q.empty:
# 获取换手率字符串,例如 '2.56%'
tr_str = q['turnover_rate'][0]
# 数据清洗:去掉百分号并转为浮点数
if isinstance(tr_str, str) and '%' in tr_str:
turnover_rate = float(tr_str.strip('%'))
else:
turnover_rate = float(tr_str)
log.info("股票 %s 的日换手率为: %f%%" % (g.security, turnover_rate))
3. 回测环境:手动计算分钟级换手率
如果您在回测中需要分钟级别的换手率(get_snapshot 不可用),可以通过“当前分钟成交量 / 流通股本”来手动计算。
代码示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取当前分钟的成交量 (Volume)
current_volume = data[g.security]['volume']
# 2. 获取流通股本 (Circulating Shares)
# 从 valuation 表获取 'a_floats' (可流通A股,单位:万股)
# 注意:财务数据查询比较耗时,建议在 before_trading_start 中缓存,不要每分钟查
q = get_fundamentals(g.security, 'valuation', ['a_floats'])
if q is not None and not q.empty:
# a_floats 单位是万股,需要乘以 10000 转换为股
circulating_shares = float(q['a_floats'][0]) * 10000
if circulating_shares > 0:
# 计算当前分钟的换手率 (%)
minute_turnover_rate = (current_volume / circulating_shares) * 100
log.info("当前分钟换手率: %f%%" % minute_turnover_rate)
总结
| 场景 | 推荐函数 | 字段名 | 备注 |
|---|---|---|---|
| 实盘/仿真 | get_snapshot |
turnover_ratio |
实时更新,不支持回测 |
| 回测 (日频) | get_fundamentals |
turnover_rate |
表名 valuation,需处理百分号 |
| 回测 (分钟) | 手动计算 | volume / a_floats |
需自行获取流通股本进行除法运算 |
Q&A
Q: get_snapshot 返回的 turnover_ratio 是什么类型的?
A: 根据PTrade文档和实测,它通常返回一个数值(浮点数),代表百分比。例如返回 2.5 表示换手率为 2.5%。但在某些券商版本中可能存在差异,建议在策略中先打印 type() 确认。
Q: 为什么我在回测中使用 get_snapshot 报错或返回 None?
A: PTrade 的回测引擎不支持 get_snapshot 函数,因为它模拟的是历史环境,无法提供“实时快照”。回测中请使用 get_history 或 get_fundamentals。
Q: 如何获取换手率排名前10的股票?
A: 在实盘中,可以使用 get_sort_msg 函数。
例如:get_sort_msg(sort_type_grp='XBHS.A', sort_field_name='turnover_ratio', sort_type=1, data_count=10) 可以获取A股市场换手率最高的10只股票(注意:具体板块代码 XBHS.A 需根据实际市场列表调整)。