🚀 AI 一键生成 ptrade 策略代码

PTrade 行情快照:如何利用实时换手率 (turnover_ratio) 捕捉异动股?

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

问题描述

如何获取股票的实时换手率数据?

解决方案

在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(估值表)。

注意

  1. valuation 表中的 turnover_rate 通常是基于前一交易日收盘数据计算的,或者在当日收盘后更新。
  2. 返回的数据是字符串格式的百分比(例如 '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_historyget_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 需根据实际市场列表调整)。