🚀 AI 一键生成 joinquant 策略代码

为什么 JoinQuant 中 get_valuation 获取的换手率与炒股软件不一致?

joinquant | 发布时间: 2026/5/21
以下内容由 EasyQuant 生成。

问题描述

get_valuation取换手率有的不准确,请问是何原因?

df = get_valuation('300654.XSHE', end_date='2025-01-24', count=2, fields=['turnover_ratio', 'circulating_cap']).dropna()

上述查出300654.XSHE在这两天的换手率为:
code day turnover_ratio circulating_cap
0 300654.XSHE 2025-01-23 5.7370 32622.3824
1 300654.XSHE 2025-01-24 15.4703 32622.3824

这与在股票软件中查到的这两日换手率有些差异,如图:
Img
Img
请问是什么原因呢,该如何解决?

谢谢!

解决方案

您好!在使用 JoinQuant 的 get_valuation 接口获取换手率(turnover_ratio)时,发现与同花顺、通达信、东方财富等常见炒股软件的数据存在差异,这在量化数据分析中是一个非常常见的现象。产生这种差异的核心原因在于**“流通股本”的统计口径不同**。

差异原因分析

换手率的计算公式为:换手率 = 当日成交量 / 流通股本

  1. JoinQuant 的统计口径(总流通股本)
    在 JoinQuant 的 get_valuation 表中,circulating_cap 指的是总流通股本。因此,其换手率 turnover_ratio 是严格按照 当日成交量 / 总流通股本 来计算的。

  2. 炒股软件的统计口径(自由流通股本/实际流通股本)
    市面上大多数主流炒股软件(如通达信、同花顺等)为了更真实地反映市场的交易活跃度,通常采用自由流通股本(或称为实际流通股本)作为分母。自由流通股本会剔除掉那些虽然已经解禁流通,但实际上被大股东、战略投资者、高管等长期持有且极少在二级市场抛售的股份(通常是持股比例大于5%的股东持股)。

    结论:因为 自由流通股本 < 总流通股本,所以炒股软件上显示的换手率通常会大于 JoinQuant 提供的换手率

解决方法与建议

如果您在量化策略中对换手率的绝对数值非常敏感,或者需要严格对齐炒股软件的数据,可以参考以下解决思路:

1. 保持策略内部的一致性(推荐)

在量化回测中,最重要的是数据口径的前后一致性。只要您在历史回测和模拟实盘中都统一使用 JoinQuant 的 turnover_ratio,这种系统性的偏差并不会破坏策略的逻辑(例如:您可以将策略中的换手率阈值相应调低,以适应总流通股本口径)。

2. 手动计算基于“自由流通股本”的换手率

如果您必须使用类似炒股软件的“实际换手率”,可以通过获取成交量和自由流通股本自行计算。虽然 get_valuation 中没有直接提供自由流通股本,但您可以通过其他基本面数据或因子库来近似替代:

from jqdata import *

# 1. 获取当日成交量 (volume)
df_price = get_price('300654.XSHE', end_date='2025-01-24', count=1, frequency='daily', fields=['volume'])
volume = df_price['volume'][0]

# 2. 获取总股本或流通股本等数据进行自定义调整
# 注意:JoinQuant 因子库中可能包含更精细的股本因子,或者您可以通过财务数据剔除大股东持股来估算自由流通股本。

3. 检查数据复权与单位

另外,请注意核对单位:get_valuation 中的 circulating_cap 单位是万股,而 get_price 获取的 volume 单位是。在自行计算时,务必将单位统一(例如将 volume 除以 10000 再除以 circulating_cap)。

总结来说,这种差异是由于金融数据行业对“流通股本”的定义不同造成的,并非数据错误。理解其背后的口径差异后,在策略中统一标准即可。