QMT:量化交易的新一代引擎!
发布时间:18小时前阅读:59
在量化交易领域,每一次行情跳动都蕴含着机会,每一毫秒的延迟都可能意味着损益的差异。迅投QMT极速策略交易系统,正是为捕捉这些稍纵即逝的机会而生。它不仅是一个软件,更是一个集行情数据、策略研究、历史回测、实盘交易于一体的全流程量化平台,正重新定义着专业量化交易的边界。
一体化量化解决方案
官方文档开宗明义地指出:“QMT极速策略交易系统内置了3.6版本的python运行环境,提供行情数据与交易下单两大核心功能。”这一简洁的陈述背后,是一个完整的量化生态。通过编写Python脚本,用户可以实现从指标计算、策略编写到回测验证、实盘执行的全流程操作。
一体化设计消除了传统量化工作中不同环节间的“断层”。研究人员无需在多个软件间切换,策略开发者不必为数据接口和交易通道的对接而烦恼。这种高度集成化的架构,使得策略想法能够以前所未有的效率转化为实际交易结果,大大缩短了从研究到实践的路径。⏱️
回测与实盘
回测被定义为“在历史K线上,自左向右逐根遍历K线,以模拟的资金账号记录每日的买卖信号,持仓盈亏”。这一过程是量化策略的“炼金炉”,在投入真实资金前检验策略的含金量。
回测并非简单的历史数据复盘。QMT系统实现了精细的撮合规则:“指定交易价格在当前K线高低点间的,按指定价格撮合;超过高低点的,按当前K线收盘价撮合。”这种机制更贴近真实交易环境,避免回测结果过于乐观。
实盘则处理“接收未来K线的数据,生成策略信号,进行交易下单”的实际任务。值得注意的是,QMT系统将实盘进一步细分为模拟柜台模拟交易和真实柜台实盘交易两种,为策略上线提供了风险缓冲带。
从回测到实盘的过渡,是量化策略开发者迈入实盘的“关键一跃”。QMT通过统一的数据接口和函数调用,确保两个环境的高度一致性,最大程度减少“回测幻觉”。
三大引擎驱动策略运行
QMT系统的核心优势之一是其灵活多样的运行机制,适应不同策略类型的需求。系统提供三种运行机制,构成策略执行的“动力系统”。
handlebar机制支持逐K线驱动,同时兼容历史回测和盘中运行。在实盘模式下,它实现了“盘中分笔驱动,但逐K线生效”的精细控制,每根K线只执行一次有效交易,完美模拟回测环境。
subscribe订阅推送机制则更加敏捷,盘中订阅指定品种的分笔数据,新分笔到达时立即触发指定的回调函数,适合对市场瞬时变化极为敏感的高频策略。⚡
run_time定时运行机制则以固定时间间隔触发函数调用,适合不需要对每笔行情都做出反应的策略类型,如日内定时调仓、固定时间段的批量交易等。⏲️
三种机制如同量化策略的“变速器”,允许开发者根据策略逻辑和市场特性选择最合适的执行频率,在速度与稳定性间找到最佳平衡点。
技术细节决定策略成败 ️
编码规范方面,系统明确要求“在代码的最前一行写上:#coding:gbk 统一脚本的编码格式是GBK”,同时强调“缩进需要统一”。这些看似基础的要求,实则是保障策略稳定运行、便于团队协作的重要前提。
数据管理上,QMT提供了完善的历史数据下载和更新机制。首次使用需“下载完整历史行情”,之后可设置“每日定时更新”。系统特别建议在盘后下载数据(如16:00),既保证了数据的完整性,又避免了对交易时段的网络冲击。
交易执行层面,QMT区分了“逐K线生效”和“立即下单”两种模式。通过passorder函数的快速交易参数(quicktrade)进行控制,为不同交易逻辑提供了灵活性。
系统也明确警示实盘交易中的风险点:“价格不能超过2%的价格笼子否则废单。数量超过可用数量时会废单。”⚠️
从双均线策略看QMT的应用
在QMT官方文档中,双均线策略作为经典示例,清晰展示了系统的工作流程。这个简单却完整的策略,涵盖了从数据获取、指标计算到交易信号生成、订单执行的全链路。
策略中,handlebar函数作为核心执行引擎,在每根K线(回测)或每个新分笔(实盘)到达时被触发。通过get_market_data_ex函数获取历史价格数据,计算快慢均线值,再根据金叉死叉条件生成交易信号。
值得注意的是,回测与实盘版本在代码结构上高度相似,但关键处理有所不同。回测版本使用“subscribe=False”参数读取本地数据,而实盘版本则处理实时行情;实盘版本还需增加交易时间判断、委托状态跟踪等风控逻辑。️
#coding:gbk # 导入包
import pandas as pd
import numpy as np
import datetime
""" 示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出 """
class a(): pass
A = a() #创建空的类的实例 用来保存委托状态
def init(C):
A.stock= C.stockcode + '.' + C.market #品种为模型交易界面选择品种
A.acct= account #账号为模型交易界面选择账号
A.acct_type= accountType #账号类型为模型交易界面选择账号
A.amount = 10000#单笔买入金额 触发买入信号后买入指定金额
A.line1=17 #快线周期
A.line2=27 #慢线周期
A.waiting_list = [] #未查到委托列表 存在未查到委托情况暂停后续报单 防止超单
A.buy_code = 23if A.acct_type == 'STOCK'else33#买卖代码 区分股票 与 两融账号
A.sell_code = 24if A.acct_type == 'STOCK'else34
print(f'双均线实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}')
def handlebar(C): #跳过历史k线
ifnot C.is_last_bar():
return
now = datetime.datetime.now()
now_time = now.strftime('%H%M%S') # 跳过非交易时间
if now_time < '093000'or now_time > "150000":
return
account = get_trade_detail_data(A.acct, A.acct_type, 'account')
if len(account)==0:
print(f'账号{A.acct} 未登录 请检查')
return
account = account[0]
available_cash = int(account.m_dAvailable) #如果有未查到成交 查询成交
if A.waiting_list:
found_list = []
deals = get_trade_detail_data(A.acct, A.acct_type, 'deal')
for deal in deals:
if deal.m_strRemark in A.waiting_list:
found_list.append(deal.m_strRemark)
A.waiting_list = [i for i in A.waiting_list if i notin found_list]
if A.waiting_list:
print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单")
return
holdings = get_trade_detail_data(A.acct, A.acct_type, 'position')
holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}
#获取行情数据
data = C.get_market_data_ex(["close"],[A.stock],period = '1d',count = max(A.line1, A.line2)+1)
close_list = data[A.stock].values
if len(close_list) < max(A.line1, A.line2)+1:
print('行情长度不足(新上市或最近有停牌) 跳过运行')
return
pre_line1 = np.mean(close_list[-A.line1-1: -1])
pre_line2 = np.mean(close_list[-A.line2-1: -1])
current_line1 = np.mean(close_list[-A.line1:])
current_line2 = np.mean(close_list[-A.line2:])
#如果快线穿过慢线,则买入委托 当前无持仓 买入
vol = int(A.amount / close_list[-1] / 100) * 100#买入数量 向下取整到100的整数倍
if A.amount < available_cash and vol >= 100and A.stock notin holdings and pre_line1 < pre_line2 and current_line1 > current_line2:
#下单开仓 ,参数说明可搜索PY交易函数 passorder
msg = f"双均线实盘 {A.stock} 上穿均线 买入 {vol}股"
passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 2 , msg, C)
print(msg)
A.waiting_list.append(msg)
#如果快线下穿慢线,则卖出委托
if A.stock in holdings and holdings[A.stock] > 0and pre_line1 > pre_line2 and current_line1 < current_line2:
msg = f"双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股"
passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 2 , msg, C)
print(msg)
A.waiting_list.append(msg)
对于那些渴望将投资理念转化为可执行策略、将市场洞察转化为稳定收益的投资者而言,QMT提供了一个严谨而开放的舞台。在这里,每一行代码都可能成为捕捉市场机会的罗网,每一个策略都可能是通向阿尔法收益的路径。
VIP账户开户、低利率两融及免费量化方面问题,欢迎随时交流!!
温馨提示:投资有风险,选择需谨慎。
-
比黄金还疯狂,白银到底还能投资吗?
2026-02-02 14:15
-
多项政策利好+春节景气上升,【交通+旅居】主线可关注哪些指数?
2026-02-02 14:15
-
美联储2026年第一次议息结束,美股、A股、黄金等资产之后将怎么走?
2026-02-02 14:15


问一问

+微信
分享该文章
