问题描述
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)时,发现与同花顺、通达信、东方财富等常见炒股软件的数据存在差异,这在量化数据分析中是一个非常常见的现象。产生这种差异的核心原因在于**“流通股本”的统计口径不同**。
差异原因分析
换手率的计算公式为:换手率 = 当日成交量 / 流通股本。
-
JoinQuant 的统计口径(总流通股本):
在 JoinQuant 的get_valuation表中,circulating_cap指的是总流通股本。因此,其换手率turnover_ratio是严格按照当日成交量 / 总流通股本来计算的。 -
炒股软件的统计口径(自由流通股本/实际流通股本):
市面上大多数主流炒股软件(如通达信、同花顺等)为了更真实地反映市场的交易活跃度,通常采用自由流通股本(或称为实际流通股本)作为分母。自由流通股本会剔除掉那些虽然已经解禁流通,但实际上被大股东、战略投资者、高管等长期持有且极少在二级市场抛售的股份(通常是持股比例大于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)。
总结来说,这种差异是由于金融数据行业对“流通股本”的定义不同造成的,并非数据错误。理解其背后的口径差异后,在策略中统一标准即可。