3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资中,新上市的股票(次新股)往往由于上市时间短、历史数据不足、估值波动剧烈以及容易受到市场情绪炒作,通常不适合作为稳健策略的标的。因此,在构建股票池时,过滤掉上市时间不足(如小于1年或2年)的次新股是一项非常实用的选股技巧。
QMT 平台提供了 ContextInfo.get_open_date() 接口,可以非常方便地获取个股的上市日期。本文将详细介绍该接口的使用方法,并提供完整的过滤次新股的 Python 选股源码。
根据股票代码返回对应股票的上市时间。
ContextInfo.get_open_date(stockcode)
stockcode:字符串,股票代码,例如 '000001.SZ'。若缺省或传入空字符串 '',则默认为当前主图代码。number:返回一个整型数值,格式通常为 YYYYMMDD(例如 20120606 表示2012年6月6日上市)。要过滤掉上市不足一年的次新股,我们可以通过以下步骤实现:
YYYYMMDD 格式的日期。ContextInfo.get_open_date(stock) 获取股票的上市日期。datetime 对象,计算时间差。以下是一个可以直接在 QMT 策略编辑器中运行的选股与过滤示例:
#encoding:gbk
import datetime
def init(ContextInfo):
# 设定初始股票池(以沪深300成分股为例)
# 实际使用中,可以先通过 get_stock_list_in_sector 获取全市场股票
ContextInfo.raw_universe = ['600000.SH', '000001.SZ', '688001.SH', '300750.SZ']
ContextInfo.set_universe(ContextInfo.raw_universe)
print("初始股票池:", ContextInfo.raw_universe)
def handlebar(ContextInfo):
# 仅在最后一根K线执行选股逻辑
if not ContextInfo.is_last_bar():
return
# 获取当前K线的时间戳并转换为datetime对象
bar_timetag = ContextInfo.get_bar_timetag(ContextInfo.barpos)
# timetag_to_datetime 是 QMT 内置函数,将毫秒转换为日期字符串
current_date_str = timetag_to_datetime(bar_timetag, '%Y%m%d')
current_date = datetime.datetime.strptime(current_date_str, '%Y%m%d')
filtered_universe = []
filter_days = 365 # 过滤上市不足365天的股票
for stock in ContextInfo.raw_universe:
# 获取上市日期 (格式如 20200101)
open_date_num = ContextInfo.get_open_date(stock)
if open_date_num > 0:
open_date_str = str(int(open_date_num))
open_date = datetime.datetime.strptime(open_date_str, '%Y%m%d')
# 计算上市天数
days_since_listing = (current_date - open_date).days
if days_since_listing >= filter_days:
filtered_universe.append(stock)
else:
print(f"股票 {stock} 上市时间为 {open_date_str},上市仅 {days_since_listing} 天,已过滤。")
else:
print(f"无法获取股票 {stock} 的上市日期,默认过滤。")
# 重新设定过滤后的股票池
ContextInfo.set_universe(filtered_universe)
print("过滤次新股后的股票池:", filtered_universe)
get_open_date 之前,请确保通过 QMT 客户端的 “数据管理” 补充了对应品种的基础信息和历史行情数据,否则可能返回 0 或获取失败。current_date 会随着历史 K 线的推进而变化,该策略能够完美模拟在历史任意时间点动态剔除当时属于“次新股”的标的,避免前瞻偏差。