🚀 AI 一键生成 qmt 策略代码
立即体验

QMT平台如何利用get_open_date获取上市时间并过滤次新股?(附Python选股源码)

qmt | 发布时间: 2026/8/10
以下内容由 EasyQuant 生成。

问题描述

qmt 选股技巧:利用 get_open_date 筛选上市时间与规避次新股
如何在 qmt 中获取股票的上市时间以过滤掉次新股?

解决方案

QMT选股技巧:利用 get_open_date 筛选上市时间与规避次新股

在量化投资中,新上市的股票(次新股)往往由于上市时间短、历史数据不足、估值波动剧烈以及容易受到市场情绪炒作,通常不适合作为稳健策略的标的。因此,在构建股票池时,过滤掉上市时间不足(如小于1年或2年)的次新股是一项非常实用的选股技巧。

QMT 平台提供了 ContextInfo.get_open_date() 接口,可以非常方便地获取个股的上市日期。本文将详细介绍该接口的使用方法,并提供完整的过滤次新股的 Python 选股源码。


1. 核心接口介绍:ContextInfo.get_open_date()

接口释义

根据股票代码返回对应股票的上市时间。

用法

ContextInfo.get_open_date(stockcode)

参数

  • stockcode:字符串,股票代码,例如 '000001.SZ'。若缺省或传入空字符串 '',则默认为当前主图代码。

返回值

  • number:返回一个整型数值,格式通常为 YYYYMMDD(例如 20120606 表示2012年6月6日上市)。

2. 规避次新股的筛选逻辑

要过滤掉上市不足一年的次新股,我们可以通过以下步骤实现:

  1. 获取当前 K 线对应的时间戳,并转换为 YYYYMMDD 格式的日期。
  2. 使用 ContextInfo.get_open_date(stock) 获取股票的上市日期。
  3. 将两个日期转换为 datetime 对象,计算时间差。
  4. 若时间差小于 365 天(或自定义天数),则将该股票从股票池中剔除。

3. 完整的 QMT 过滤次新股 Python 源码

以下是一个可以直接在 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)

4. 避坑指南与注意事项

  1. 数据完整性:在使用 get_open_date 之前,请确保通过 QMT 客户端的 “数据管理” 补充了对应品种的基础信息和历史行情数据,否则可能返回 0 或获取失败。
  2. 科创板与创业板:科创板(688开头)和创业板(300开头)新股上市初期波动极大,利用此方法可以有效将这些高风险次新股排除在常规交易策略之外。
  3. 回测与实盘一致性:在回测模式下,current_date 会随着历史 K 线的推进而变化,该策略能够完美模拟在历史任意时间点动态剔除当时属于“次新股”的标的,避免前瞻偏差。