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

如何在 QMT 中利用 Python 接口实现自动化打新与一键申购?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: QMT 自动化打新:获取当日新股新债信息与一键申购

Question: 如何在 QMT 中利用 get_ipo_data 接口获取新股信息并实现自动申购?

解决方案

如何在 QMT 中利用 get_ipo_data 接口获取新股信息并实现自动申购?

在 QMT(迅投量化交易系统)中,自动化打新(新股与可转债申购)是实现无人值守交易的重要功能。通过 QMT 提供的 Python API,我们可以轻松获取当日发行的新股新债数据、查询账户对应的申购额度,并通过交易函数下发申购指令。


一、核心 API 接口介绍

1. get_ipo_data([type])

  • 功能:获取当日新股新债的发行与申购信息。
  • 参数
    • type(可选):缺省时返回新股和新债;设置为 "STOCK" 时仅返回新股;设置为 "BOND" 时仅返回可转债。
  • 返回值:字典结构,包含申购代码、名称、发行价、最大/最小申购数量等。

2. get_new_purchase_limit(accid)

  • 功能:获取指定账户的打新额度。
  • 参数accid(字符串),资金账号。
  • 返回值:字典结构,包含上海主板、深圳市场、科创板等市场的额度。

3. passorder(...)

  • 功能:用于提交下单委托,打新时通常使用普通买入(opType=23)或信用买入(opType=33)。

二、自动化打新策略实现逻辑

  1. 定时触发:设置每日特定时间(如 10:08)触发打新逻辑。
  2. 数据获取:获取当日申购列表及账户限额。
  3. 额度计算:对比申购上限与账户可用额度,取较小值确定最终申购股数。
  4. 下单申购:调用 passorder 进行委托提交,并记录执行状态,确保当日仅运行一次。

三、完整 Python 代码示例

import datetime

class IpoCBD(object):
    def __init__(self):
        self.is_run = False
        self.ipo_msg = ''
        self.start_ipo_time = '1008' # 设置每天 10:08 执行

IPO = IpoCBD()

def init(ContextInfo):
    # 绑定资金账号,用于接收交易主推回调
    ContextInfo.accID = '你的普通资金账号'
    ContextInfo.accIDCredit = '你的信用资金账号'
    ContextInfo.set_account(ContextInfo.accID)

def handlebar(ContextInfo):
    # 仅在最后一根 K 线(最新行情)时判定
    if not ContextInfo.is_last_bar():
        return
    
    run_ipo_strategy(ContextInfo)

def run_ipo_strategy(ContextInfo):
    now_time = datetime.datetime.now().strftime('%H%M')
    
    # 非交易时间或已运行过则跳过
    if now_time < IPO.start_ipo_time or now_time > '1500' or IPO.is_run:
        return

    print("=== 开始执行自动化打新任务 ===")
    
    # 1. 获取新股信息与额度
    ipo_stock = get_ipo_data("STOCK")
    limit_info = get_new_purchase_limit(ContextInfo.accID)
    
    if ipo_stock:
        stock_vol = {i: ipo_stock[i]['maxPurchaseNum'] for i in ipo_stock}
        stock_price = {i: ipo_stock[i]['issuePrice'] for i in ipo_stock}
        
        for stock in stock_vol:
            market = stock[-2:] # 获取市场后缀代码 SH / SZ
            if market in limit_info:
                stock_vol[stock] = min(stock_vol[stock], limit_info[market])
            
            if stock_vol[stock] > 0:
                # 示例:上交所股票使用普通账号买入
                passorder(23, 1101, ContextInfo.accID, stock, 11, stock_price[stock], stock_vol[stock], '自动打新', 2, stock, ContextInfo)
                IPO.ipo_msg += f"新股申购成功: {stock} 数量: {stock_vol[stock]}股\n"
                print(f"发送新股申购指令: {stock} {stock_vol[stock]}股")

    # 2. 获取可转债信息并申购
    ipo_bond = get_ipo_data("BOND")
    if ipo_bond:
        bond_vol = {i: ipo_bond[i]['maxPurchaseNum'] for i in ipo_bond}
        bond_price = {i: ipo_bond[i]['issuePrice'] for i in ipo_bond}
        
        for bond in bond_vol:
            if bond_vol[bond] > 0:
                passorder(23, 1101, ContextInfo.accID, bond, 11, bond_price[bond], bond_vol[bond], '自动打债', 2, bond, ContextInfo)
                IPO.ipo_msg += f"新债申购成功: {bond} 数量: {bond_vol[bond]}张\n"
                print(f"发送新债申购指令: {bond} {bond_vol[bond]}张")

    IPO.is_run = True
    print("打新任务执行完毕:\n" + (IPO.ipo_msg if IPO.ipo_msg else "今日无无可用申购或额度不足"))

四、注意事项与最佳实践

  1. 运行模式:自动打新接口仅在实盘运行模型交易模式下生效,在历史回测中无效。
  2. 账户绑定:务必在 init 函数中使用 ContextInfo.set_account() 绑定交易账号。
  3. 多账号逻辑:若同时拥有普通账户和信用账户,可根据股票代码后缀(如 SH/SZ)分分流到不同的账号下发 passorder