问题描述
解决方案
在 JoinQuant(聚宽)平台中,查询一只股票的上市日期主要使用 get_security_info 函数。
核心方法:get_security_info
该函数用于获取单个标的(股票、基金、指数等)的详细信息,返回一个对象,其中包含 start_date 属性,即为上市日期。
代码示例
# -*- coding: utf-8 -*-
def initialize(context):
# 设定要查询的股票代码,例如:平安银行
code = '000001.XSHE'
# 获取标的信息对象
sec_info = get_security_info(code)
# 打印上市日期
# start_date 是一个 datetime.date 对象
print(f"股票 {code} 的中文名称: {sec_info.display_name}")
print(f"股票 {code} 的上市日期: {sec_info.start_date}")
# 如果需要判断是否已上市超过一定天数(例如判断是否为次新股)
# 可以结合 context.current_dt 使用
days_listed = (context.current_dt.date() - sec_info.start_date).days
print(f"截至当前回测时间,已上市天数: {days_listed} 天")
def handle_data(context, data):
pass
替代方法:get_all_securities
如果你需要批量查询多只股票的上市日期,或者筛选特定时间段上市的股票,可以使用 get_all_securities 函数。该函数返回一个 pandas DataFrame,其中包含 start_date 列。
代码示例
# 获取所有股票的信息
all_stocks = get_all_securities(types=['stock'])
# 查看平安银行(000001.XSHE)的上市日期
listing_date = all_stocks.loc['000001.XSHE']['start_date']
print(listing_date)
# 筛选出 2023年1月1日之后上市的股票
import datetime
new_stocks = all_stocks[all_stocks['start_date'] > datetime.date(2023, 1, 1)]
print(new_stocks.head())
Q&A
Q: get_security_info 返回的 start_date 是什么数据类型?
A: 返回的是 Python 标准库中的 datetime.date 对象(例如 2005-01-04),可以直接用于日期计算或比较。
Q: 如果查询的股票代码不存在或已退市,会发生什么?
A: 如果代码格式错误或不存在,get_security_info 可能会返回 None 或报错。对于已退市的股票,只要在平台数据库中存在(通常包含2005年以后的退市股票),依然可以查询到其 start_date 和 end_date(退市日期)。
Q: 如何查询股票的退市日期?
A: 同样使用 get_security_info 函数,访问其 end_date 属性。如果没有退市,end_date 通常显示为 2200-01-01。
Q: get_all_securities 和 get_security_info 哪个效率更高?
A: 如果只查询单只或极少数股票,使用 get_security_info 效率更高且代码简洁。如果需要对全市场或大量股票进行筛选(例如过滤掉上市不满一年的股票),使用 get_all_securities 获取 DataFrame 后进行向量化操作效率更高。