问题描述
我分别用以下两个指数分别获取了成分股
get_index_stocks('000002.XSHG')
get_index_stocks('399107.XSHE')
000002即上证A股获取到的数量为1439
399107即深圳A股2122
但实际在同花顺等软件中查看上证A股的总数量是1752,深证A股总数为2303(不含今日新上市的金龙鱼)
请问这个差异在哪里?还是我用的指数不对?
我的目的是获取所有上证A股+深证A股的股票(即上述1752+2303),后边再进行别的计算,但是目前第一道数据源就有差异,难以继续啊。
谢谢!
解决方案
您好!您遇到的数据差异是非常正常的现象,这主要是因为**“指数成分股”与“全市场挂牌股票”在定义上的区别**。
差异原因解析
- 指数编制规则的限制:您使用的
000002.XSHG(上证A股指数)和399107.XSHE(深证A股指数)是由指数公司编制的。指数在纳入成分股时,通常会有一定的规则限制。例如:新上市的股票通常需要经过一段时间(如3个月或半年)才会被纳入指数;某些长期停牌、ST/ *ST 股票、或者存在重大违规的股票可能会被剔除出指数。因此,指数成分股的数量总是会少于交易所实际挂牌交易的股票总数。 - 同花顺等软件的统计口径:同花顺等行情软件显示的“上证A股”和“深证A股”数量,通常是指当前在交易所所有挂牌上市的A股总数(包含刚上市的新股、ST股、停牌股等)。
如何正确获取所有上证A股 + 深证A股?
如果您的目的是获取全市场所有的A股股票列表,不应该使用 get_index_stocks,而应该使用 get_all_securities 函数。
get_all_securities 可以获取平台支持的所有标的信息。通过指定 types=['stock'],您可以获取到指定日期下所有上市的A股股票。
Python 代码示例
在 JoinQuant 的研究环境或回测策略中,您可以使用以下代码获取所有A股:
from jqdata import *
# 获取当前日期(或指定日期,如 '2020-10-15')所有上市的股票信息
# 返回的是一个 pandas.DataFrame
all_stocks_df = get_all_securities(types=['stock'], date=None)
# 提取所有股票代码组成列表
all_a_shares = list(all_stocks_df.index)
print(f"全市场A股总数: {len(all_a_shares)}")
# 如果您需要区分上证和深证,可以通过代码后缀进行过滤:
# .XSHG 代表上交所,.XSHE 代表深交所
sh_stocks = [code for code in all_a_shares if code.endswith('.XSHG')]
sz_stocks = [code for code in all_a_shares if code.endswith('.XSHE')]
print(f"上证A股数量: {len(sh_stocks)}")
print(f"深证A股数量: {len(sz_stocks)}")
总结
- 获取特定指数包含哪些股票,用
get_index_stocks。 - 获取全市场有哪些股票,用
get_all_securities。
使用 get_all_securities 获取的列表将与您在同花顺等软件中看到的挂牌总数基本一致(可能会有极个别退市或刚上市首日的数据同步差异,但总体口径是一致的)。希望这个解答能帮助您顺利进行后续的计算!