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

QMT 平台如何批量导入带数量的股票篮子并执行组合交易?(附 Python 源码)

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

问题描述

qmt 组合交易:利用 load_stk_vol_list 导入股票篮子并精准配单
QMT怎么从本地TXT或CSV文件批量导入带数量的股票篮子并执行交易?

解决方案

QMT 组合交易:利用 load_stk_vol_list 导入股票篮子并精准配单

在量化交易中,批量导入外部生成的股票篮子(包含股票代码和对应的交易数量)并一键执行组合交易,是机构和高频交易者非常常见的需求。QMT 平台提供了强大的 ContextInfo.load_stk_vol_list 接口,支持从本地的 TXT 或 CSV 文件中读取股票篮子,并配合 passorder 组合下单功能实现精准配单。


一、 核心 API 介绍

1. 导入股票及数量数据:ContextInfo.load_stk_vol_list()

  • 用法ContextInfo.load_stk_vol_list(filePath, fileName)
  • 释义:从本地指定路径读取包含证券代码和数量的文件。
  • 文件格式要求
    • TXT 文件600000.SH,100,600004.SH,200,(代码与数量成对存在,且最后一个字段后必须增加分隔符)。
    • CSV 文件600000.SH,100,600004.SH,200,(同样,最后一个数量字段后需要有逗号 , 结尾)。

2. 组合交易下单:passorder()

要执行导入的股票篮子交易,需要使用 passorder 的组合交易模式:

  • opType(操作类型)
    • 25:组合买入
    • 26:组合卖出
  • orderType(下单方式)
    • 2101:组合、单账号、普通、按组合股票数量方式下单(此时 volume 的单位为篮子的份数,若设为 1,则严格按照导入的数量执行)。

二、 完整 Python 策略源码

以下是一个完整的 QMT 策略示例。该策略在初始化时设定交易账号,并在 handlebar 中读取本地 D:/data/basket.csv 文件,随后一键对该股票篮子进行组合买入下单。

#encoding:gbk
import os

def init(ContextInfo):
    # 1. 设定交易账号
    ContextInfo.accid = '6000000248' # 请替换为您的实际资金账号
    ContextInfo.set_account(ContextInfo.accid)
    
    # 2. 定义股票篮子文件路径与文件名
    ContextInfo.filePath = 'D:/data/'
    ContextInfo.fileName = 'basket.csv'
    
    # 3. 确保本地目录和测试文件存在(实际使用时可手动创建)
    if not os.path.exists(ContextInfo.filePath):
        os.makedirs(ContextInfo.filePath)
    
    # 创建测试文件,注意格式:代码,数量,代码,数量, 结尾必须有逗号
    test_file_path = os.path.join(ContextInfo.filePath, ContextInfo.fileName)
    if not os.path.exists(test_file_path):
        with open(test_file_path, 'w') as f:
            f.write('600000.SH,100,600004.SH,200,600006.SH,300,')
            
    print("初始化完成,等待最后一根Bar触发组合交易...")

def handlebar(ContextInfo):
    # 仅在最后一根 K 线(或盘中实时 tick)触发一次交易,避免历史回测重复下单
    if not ContextInfo.is_last_bar():
        return
        
    print("开始读取本地股票篮子...")
    # 1. 导入一篮子股票及数量
    basket_data = ContextInfo.load_stk_vol_list(ContextInfo.filePath, ContextInfo.fileName)
    print("成功导入篮子数据:", basket_data)
    
    # 2. 执行组合下单
    # opType = 25 (组合买入)
    # orderType = 2101 (组合、单账号、按组合股票数量方式下单)
    # orderCode 传入篮子名称(在QMT中通常对应导入的文件名或自定义篮子名)
    # prType = 5 (最新价下单)
    # volume = 1 (代表执行 1 份该篮子,即严格按导入的数量下单:浦发银行买100股,白云机场买200股...)
    
    basket_name = ContextInfo.fileName.split('.')[0] # 篮子名称设为 'basket'
    
    passorder(25, 2101, ContextInfo.accid, basket_name, 5, -1, 1, ContextInfo)
    print(f"已向账号 {ContextInfo.accid} 发送组合买入指令,篮子: {basket_name},份数: 1")

三、 避坑指南与注意事项

  1. 文件末尾的逗号:这是最容易出错的地方。无论是 TXT 还是 CSV,文件内容的最后一个数量后面必须有分隔符(逗号)。例如:600000.SH,100, 是正确的;600000.SH,100 会导致解析失败。
  2. 路径斜杠:在 Python 中定义路径时,建议使用正斜杠 /(如 D:/data/),避免反斜杠 \ 引起的转义字符错误。
  3. 实盘与回测:组合交易下单在回测模式下会模拟撮合,若要在实盘中发送真实委托,请务必将策略加入到“模型交易”中,并将运行模式切换为“实盘”模式。