3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
get_open_date 计算股票上市天数在量化投资中,新股和次新股(通常指上市未满一年的股票)由于上市初期波动剧烈、历史数据较少、估值溢价较高,往往不符合大多数稳健型选股策略的要求。因此,在策略初始化或选股阶段过滤掉次新股是一个非常常见的需求。
QMT(迅投极速量化交易系统)提供了 ContextInfo.get_open_date() 接口,可以非常方便地获取个股的上市日期。结合当前 K 线的时间戳,我们就可以动态计算出股票的已上市天数,从而实现次新股的精准过滤。
ContextInfo.get_open_date()ContextInfo.get_open_date(stockcode)stockcode 为股票代码,如 '000001.SZ'。number 类型的上市日期,格式通常为 YYYYMMDD(例如 19910403)。ContextInfo.get_bar_timetag()ContextInfo.get_bar_timetag(index)index 为 K 线索引号,通常传入当前索引 ContextInfo.barpos。timetag_to_datetime()timetag_to_datetime(timetag, format)ContextInfo.get_open_date(stock) 得到 YYYYMMDD 格式的数字,并将其转换为 Python 的 datetime 对象。datetime 对象。days)。以下是一个完整的 QMT 选股过滤示例,展示了如何在 handlebar 中动态过滤掉上市不满 365 天的次新股:
#coding:gbk
import datetime
def init(ContextInfo):
# 1. 设定初始股票池(包含老股和次新股作为对比)
# 300919.SZ 属于较新的股票,000001.SZ 为老股
ContextInfo.set_universe(['000001.SZ', '300919.SZ', '600000.SH'])
# 2. 设定过滤阈值:上市天数必须大于 365 天(即过滤掉上市一年内的次新股)
ContextInfo.min_listed_days = 365
print("初始化完成,次新股过滤阈值设定为:", ContextInfo.min_listed_days, "天")
def handlebar(ContextInfo):
# 获取当前 Bar 的时间戳并转换为 datetime 对象
bar_time = ContextInfo.get_bar_timetag(ContextInfo.barpos)
bar_date_str = timetag_to_datetime(bar_time, '%Y%m%d')
current_date = datetime.datetime.strptime(bar_date_str, '%Y%m%d')
# 获取当前股票池
stock_list = ContextInfo.get_universe()
filtered_list = []
for stock in stock_list:
# 获取上市日期(返回如 19910403.0 或 19910403)
open_date_num = ContextInfo.get_open_date(stock)
if open_date_num <= 0:
continue
# 将浮点数或整数安全转换为 YYYYMMDD 字符串
open_date_str = str(int(open_date_num))
try:
open_date = datetime.datetime.strptime(open_date_str, '%Y%m%d')
# 计算当前 K 线日期与上市日期的天数差
listed_days = (current_date - open_date).days
# 判断是否满足上市天数要求
if listed_days >= ContextInfo.min_listed_days:
filtered_list.append(stock)
print(f"【保留】股票: {stock}, 上市日期: {open_date_str}, 已上市: {listed_days} 天")
else:
print(f"【过滤】股票: {stock}, 上市日期: {open_date_str}, 已上市: {listed_days} 天 (属于次新股)")
except Exception as e:
print(f"解析股票 {stock} 上市日期 {open_date_str} 失败: {e}")
# 输出过滤后的股票池,后续交易逻辑可基于 filtered_list 进行
print(f"当前交易日 {bar_date_str} 过滤后的有效股票池: {filtered_list}")
print("-" * 50)
get_open_date 可能会返回默认值或 0。