🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

为什么 JoinQuant 获取的市值数据 (market_cap) 与实盘软件不一样?

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

问题描述

market_cap得到的市值数据跟实盘软件不一样

一句简单的代码:
q=query(valuation.market_cap,valuation.code).filter(valuation.code=='300143.XSHE')
df=get_fundamentals(q,'2022-04-22')
df
可是,valuation.market_cap得到的市值数据,为什么跟实盘软件显示的市值不一样呢?

解决方案

在使用 JoinQuant (聚宽) 平台获取财务数据时,发现 valuation.market_cap 得到的市值与同花顺、东方财富等实盘软件不一致,通常是由以下几个原因造成的:

1. 数据单位的差异(最常见原因)

JoinQuant 平台中 valuation.market_cap(总市值)和 valuation.circulating_market_cap(流通市值)的单位都是“亿元”。而实盘软件上显示的单位可能是“元”、“万元”或“亿元”。请先检查是否是因为单位换算导致了视觉上的数值差异。

2. 时间节点的差异

  • 静态 vs 动态get_fundamentals(q, '2022-04-22') 获取的是 2022-04-22 收盘后 的静态市值数据。如果您在交易时间段内(盘中)与实盘软件对比,实盘软件显示的是根据最新股价实时变动的动态市值,两者自然不同。
  • 避免未来函数:如果在回测中不指定 date 参数,get_fundamentals 默认获取的是 context.current_dt前一天的数据(因为当天的财务数据要在收盘后才能确定)。

3. 总股本计算口径的差异

市值的基本计算公式是:总市值 = 总股本 × 收盘价
不同数据提供商对“总股本”的定义可能存在细微差别:

  • 多市场上市:如果该股票同时在 A股 和 H股(或 B股)上市,有些软件的 A股总市值只计算 A股股本,而有些软件(包括 JoinQuant)的总市值通常是按照 全部总股本(A股+H股+B股等)× A股收盘价 来计算的。
  • 限售股解禁:总股本中包含流通股和限售股,限售股的变动、增发、配股等企业行为在不同数据源的更新生效时间可能存在 1-2 天的延迟差异。

4. 价格复权的影响

市值计算使用的是不复权的实际收盘价。如果您在对比时,参考了前复权或后复权的价格去手动计算市值,就会产生误差。


💡 如何验证 JoinQuant 的市值数据?

您可以提取当天的不复权收盘价总股本,手动相乘来验证 JoinQuant 的市值数据逻辑:

from jqdata import *

# 1. 获取市值数据和总股本数据 (单位:万股)
q = query(valuation.code, valuation.market_cap, valuation.capitalization).filter(valuation.code=='300143.XSHE')
df_val = get_fundamentals(q, '2022-04-22')

# 2. 获取当天的真实收盘价 (不复权)
close_price = get_price('300143.XSHE', end_date='2022-04-22', count=1, fields=['close'], fq=None)['close'][0]

# 3. 提取数据
market_cap_jq = df_val['market_cap'][0] # 聚宽给出的总市值 (亿元)
capitalization = df_val['capitalization'][0] # 总股本 (万股)

# 4. 手动计算市值 (亿元) = 总股本(万股) * 收盘价(元) / 10000
calculated_market_cap = capitalization * close_price / 10000

print(f"聚宽直接获取的市值: {market_cap_jq:.4f} 亿元")
print(f"手动计算的市值: {calculated_market_cap:.4f} 亿元")

通过上述代码,您可以清晰地看到 JoinQuant 内部市值的计算逻辑。如果手动计算的结果与 market_cap 一致,说明数据逻辑是自洽的,差异仅仅来源于与外部软件的计算口径或单位不同。