拓冰建站拓冰建站
首页 / 资讯中心 / 正文

迅投QMT量化交易入门:Python双均线策略实盘实战指南

1. 这篇文章真正要解决的问题如果你对量化交易感兴趣但被复杂的编程环境、高昂的软件费用和深奥的API文档劝退那么这篇文章就是为你准备的。很多个人投资者和初级开发者都面临一个困境想用Python写策略进行实盘交易却发现要么是像vn.py、backtrader这样的开源框架需要自己对接券商、处理行情和交易接口工程复杂度极高要么是像聚宽、米筐这样的在线平台虽然易用但策略逻辑和运行环境受限于云端且实盘通常需要付费灵活性不足。迅投QMTQuantitative Market Trading的出现恰好填补了这个市场空白。它是一款由券商直接提供给客户的本地化量化实盘软件。本文的核心判断是QMT是目前国内个人投资者从“策略想法”到“实盘交易”路径最短、门槛最低的工具之一。它不是一个需要你从零搭建的框架而是一个开箱即用、集成了行情、交易、策略编写和回测的“工作站”。本文将解决以下几个关键问题认知问题QMT到底是什么它和通达信、同花顺以及开源量化框架有什么区别门槛问题一个只有基础Python知识的人如何快速上手QMT并写出第一个能运行的策略实战问题从策略编写、历史回测到实盘挂机整个流程中有哪些必须注意的“坑”和最佳实践价值问题QMT适合谁它的优势在哪局限性又在哪帮你判断是否值得投入时间学习。我们将避开空洞的概念介绍直接从一个最简单的双均线策略入手带你走通从环境配置、代码编写、回测验证到模拟实盘的全过程。你会发现借助QMT实现一个自动化交易策略可能比你想象的要简单得多。2. QMT的核心定位为什么它是“低门槛”首选在深入代码之前我们必须先理解QMT的独特定位。市场上量化工具众多我们可以用一个简单的对比表格来厘清QMT的位置工具类型代表产品特点适合人群实盘门槛专业开源框架vn.py, Backtrader, Zipline高度灵活可深度定制但需要自备行情源、交易接口部署维护复杂。专业量化团队、有深厚编程功底的开发者。极高在线量化平台聚宽、米筐、BigQuant提供在线Python环境、丰富数据、社区策略上手快。但策略运行在云端高级功能收费实盘有延迟或费用。量化策略研究者、学生、不想配置本地环境的投资者。中通常需付费传统股票软件通达信、同花顺提供指标公式、条件选股等功能但编程能力弱如通达信公式难以实现复杂逻辑和全自动交易。主观交易者、技术分析爱好者。低但自动化程度低券商本地化终端迅投QMT、Ptrade直接集成券商实盘交易通道提供本地Python/C开发环境数据落地支持复杂策略和全自动交易。个人量化交易者、有一定编程基础的投资者。低通常开户或满足一定条件即可使用QMT的“低门槛”体现在三个层面获取门槛低通常在你开户或资产达到券商要求后即可申请使用无需单独购买昂贵的软件授权。环境门槛低软件内置了Python解释器和必要的量化库如NumPy, Pandas你无需操心Python环境搭建、包依赖冲突等问题安装即用。开发门槛低它封装了行情获取、订单提交、账户查询等所有与交易所/柜台交互的底层复杂逻辑你只需要关注策略逻辑本身。同时它保留了本地运行的特性策略代码、交易数据完全掌握在自己手中无云平台的黑盒和延迟担忧。简单来说QMT把你从“工程师交易员”的双重角色中解放出来让你更专注于“交易员”的策略思考部分。这是它对于个人开发者最核心的价值。3. 环境准备与软件安装在开始编写策略前你需要先准备好QMT环境。请注意QMT是券商提供的服务因此第一步是联系你的客户经理或通过券商官网申请开通QMT权限。不同券商的开通条件如资产要求可能不同。开通后通常会获得一个下载链接和登录账号。以下是标准的安装和初始化步骤3.1 软件下载与安装下载从券商提供的链接下载QMT安装包。安装运行安装程序建议安装路径不要包含中文或特殊字符例如D:\QMT。登录安装完成后使用券商提供的账号资金账号或专用QMT账号和密码登录软件。3.2 认识QMT界面与核心目录首次登录后你会看到一个类似传统股票软件的界面但多了“量化”、“策略交易”等菜单。对于开发者需要重点关注两个地方策略编辑器通常在量化-策略开发或类似菜单下打开。这是一个内置的Python IDE用于编写和调试策略。用户数据目录这是存放你所有策略源码、配置文件、本地数据的地方。路径通常为安装目录\userdata_mini极速模式或安装目录\userdata普通模式。请务必熟悉这个目录你的策略文件都将放在这里。3.3 Python环境确认QMT内置了Python。你可以在策略编辑器中或者通过以下方式验证 打开QMT在策略编辑器中新建一个.py文件输入以下代码并运行# 验证Python环境和基础库 import sys import numpy as np import pandas as pd print(fPython版本{sys.version}) print(fNumPy版本{np.__version__}) print(fPandas版本{pd.__version__})如果能成功打印出版本信息说明内置Python环境工作正常。QMT通常内置了这些基础数据分析库方便你直接使用。4. QMT策略开发的核心概念与流程与在Jupyter Notebook中写分析代码不同在QMT中编写可交易的策略需要遵循其特定的框架。理解以下几个核心概念至关重要策略模型QMT的策略运行基于事件驱动模型。你的策略是一个类需要继承特定的基类如BaseStrategy并实现一些固定的方法。系统会在特定事件如行情推送、定时器触发发生时自动调用你对应的方法。初始化 (initialize): 策略启动时执行一次用于设置初始参数、订阅股票、启动定时器等。行情处理 (handle_data或on_tick): 收到订阅的股票行情数据Tick或Bar时被调用这里是策略逻辑的核心。定时任务 (on_timer): 如果你设置了定时器到了指定时间就会触发此方法用于执行盘前、盘后或固定频率的任务。上下文 (Context): 一个全局对象提供了获取账户信息、持仓、行情数据以及下单接口的核心功能。所有交易操作都通过Context完成。一个策略从开发到实盘的典型流程如下策略编写在策略编辑器中创建Python文件定义策略类实现事件方法。历史回测使用QMT的回测引擎在历史数据上运行策略评估其盈亏、夏普比率、最大回撤等指标。模拟交易在实盘行情环境下用虚拟资金运行策略检验策略在实时市场中的逻辑是否正常避免“实盘踩坑”。实盘交易将策略部署到实盘账户连接真实的交易通道进行自动化交易。务必先经过充分回测和模拟5. 实战编写你的第一个双均线策略我们以最经典的“双均线交叉”策略为例演示完整的开发过程。策略逻辑计算股票的快速均线如5日线和慢速均线如20日线当快线上穿慢线时金叉买入当快线下穿慢线时死叉卖出。5.1 创建策略文件在QMT的策略编辑器中新建一个Python文件命名为ma_cross_strategy.py保存到你的用户数据目录下的策略文件夹中例如userdata_mini\strategies。5.2 编写策略代码以下是完整的策略代码包含了详细的注释# -*- coding: utf-8 -*- # 文件名ma_cross_strategy.py # 双均线交叉策略示例 import talib # QMT通常内置了TA-Lib技术指标库 from qmt import * # 导入QMT的核心库包含Context、BaseStrategy等 class DualMovingAverageStrategy(BaseStrategy): 双均线交叉策略 快线上穿慢线买入快线下穿慢线卖出 def initialize(self, context): 策略初始化函数只在策略启动时运行一次 :param context: 策略上下文对象用于获取数据和交易 # 1. 设置策略参数 context.symbol 000001.SZ # 交易标的平安银行股票代码.市场 context.fast_period 5 # 快线周期 context.slow_period 20 # 慢线周期 context.volume 100 # 每次交易100股 # 2. 订阅行情数据 # 订阅标的的1分钟K线数据用于计算均线 subscribe(context.symbol, frequency1m, countcontext.slow_period10) # 订阅标的的Tick数据可选用于更精细的触发 # subscribe(context.symbol, frequencytick) # 3. 打印初始化日志 log.info(f策略初始化完成交易标的{context.symbol}快线周期{context.fast_period}慢线周期{context.slow_period}) def handle_data(self, context, data): 行情数据处理函数每次收到订阅的K线数据时被调用 :param context: 策略上下文对象 :param data: 包含当前周期所有订阅标的行情数据的对象 symbol context.symbol # 1. 获取该股票的历史K线数据 # data 对象可以获取到订阅的最新K线序列 hist_data data.history(symbol, frequency1m, countcontext.slow_period10, fields[close]) if hist_data is None or len(hist_data) context.slow_period: log.warning(f{symbol} 历史数据不足跳过本次计算) return # 2. 计算收盘价序列和均线 close_prices hist_data[close].values fast_ma talib.SMA(close_prices, timeperiodcontext.fast_period)[-1] # 最新快线值 slow_ma talib.SMA(close_prices, timeperiodcontext.slow_period)[-1] # 最新慢线值 # 3. 获取当前持仓 position context.get_position(symbol) current_pos position.available if position else 0 # 可用持仓 # 4. 交易逻辑判断 # 金叉快线上穿慢线且当前无持仓 if fast_ma slow_ma and current_pos 0: # 市价单买入 order_id context.order(symbol, volumecontext.volume, sideOrderSide.Buy, order_typeOrderType.Market) if order_id: log.info(f[信号金叉] 买入 {symbol} {context.volume}股订单号{order_id}) else: log.error(f买入订单提交失败) # 死叉快线下穿慢线且当前有持仓 elif fast_ma slow_ma and current_pos 0: # 市价单卖出全部持仓 order_id context.order(symbol, volumecurrent_pos, sideOrderSide.Sell, order_typeOrderType.Market) if order_id: log.info(f[信号死叉] 卖出 {symbol} {current_pos}股订单号{order_id}) else: log.error(f卖出订单提交失败) # 其他情况持仓观望 else: # 可以在这里记录日志或指标 pass def on_timer(self, context, event): 定时任务函数可用于盘前准备、盘后清算等 :param context: 策略上下文 :param event: 定时器事件 # 例如每天开盘前运行 if event.tag pre_market: log.info(盘前定时任务执行检查账户状态、初始化变量等) # 可以在这里重置每日计数器或发送通知5.3 代码关键点解析导入与继承from qmt import *导入QMT SDK的所有公开对象。你的策略类必须继承BaseStrategy。subscribe函数这是QMT获取行情数据的关键。你必须通过它订阅标的和频率handle_data函数才会被触发。count参数指定获取的历史数据长度要足够计算最长的指标。data.history方法在handle_data中通过此方法获取订阅标的的历史数据序列用于指标计算。这是回测和实盘统一的数据接口。context.order方法这是下单的核心接口。需要指定标的、数量、买卖方向、订单类型。OrderSide.Buy/Sell和OrderType.Market/Limit是QMT定义的枚举。context.get_position方法获取指定标的的持仓对象从中可以查到持仓数量、成本、盈亏等信息。策略必须根据持仓状态来决定是否开仓/平仓否则可能重复下单。log对象用于输出日志在QMT的日志面板中查看是调试策略最重要的工具。6. 策略回测与绩效分析代码写完后绝不能直接上实盘。QMT提供了强大的本地回测功能。6.1 配置并运行回测在QMT界面找到“量化”-“策略回测”或类似功能。选择策略浏览并选择你刚编写的ma_cross_strategy.py文件。设置回测参数回测时间例如20230101到20231231。初始资金例如100000元。标的代码填入000001.SZ。K线周期选择1分钟与策略中订阅的频率一致。滑点与手续费根据实际情况设置这对回测结果影响很大。通常可以设置单边佣金万分之三0.0003印花税千分之一0.001。运行回测点击开始QMT会加载历史数据逐K线模拟运行你的策略。6.2 解读回测报告回测结束后QMT会生成一份详细的报告重点关注以下指标累计收益率策略的总收益。年化收益率/夏普比率衡量收益与风险调整后收益。最大回撤策略运行期间账户净值从高点回落的最大幅度。这是衡量策略风险承受能力的关键指标回撤过大实盘很难坚持。胜率盈利交易次数占总交易次数的比例。盈亏比平均盈利与平均亏损的比值。交易明细查看每一笔交易的入场、出场时间、价格和盈亏分析策略信号的有效性。如果回测结果不理想如长期亏损、回撤过大你需要回到策略代码中优化参数如均线周期或修改逻辑然后重新回测。这是一个迭代的过程。7. 模拟交易与实盘部署7.1 模拟交易纸交易在实盘前强烈建议进行模拟交易。在QMT中找到“模拟交易”或“仿真交易”功能。创建一个模拟账户注入虚拟资金。将你的策略ma_cross_strategy.py加载到模拟交易中。策略会连接实时行情但使用模拟账户的资金和持仓进行交易。模拟交易的价值在于检验策略在实时行情下的稳定性、网络延迟的影响、以及日志输出是否正常。你可以观察它是否按预期发出买卖信号。7.2 实盘部署经过充分回测和模拟验证后方可考虑实盘。风险检查再次确认策略逻辑确保没有未来函数使用到了未来数据止损机制是否健全。部署策略在QMT的“实盘交易”或“策略交易”模块中添加你的策略。参数配置关联你的真实交易账户设置初始资金、交易标的等。首次实盘建议将交易数量context.volume调至最小如100股以极低仓位试运行。启动与监控启动策略并密切监控日志和账户持仓变化。建议前期人工盯盘确认策略行为符合预期。风控第一一定要设置单独的止损策略可以是另一个监控策略或者在策略逻辑中加入硬止损。永远不要认为一个策略可以永远有效。8. 常见问题与排查思路在QMT策略开发中新手常会遇到以下问题问题现象可能原因排查方式解决方案策略启动失败提示导入错误1. 代码语法错误。2. 使用了QMT不支持的第三方库。1. 在策略编辑器中检查Python语法。2. 注释掉导入语句逐步排查。1. 修复语法错误。2. QMT内置库有限复杂需求需联系券商确认是否支持安装额外包。handle_data函数不执行1. 未正确订阅行情 (subscribe)。2. 订阅的frequency与回测/运行周期不匹配。1. 检查initialize中是否有subscribe调用。2. 检查subscribe的参数是否正确。1. 确保在initialize中订阅了标的和频率。2. 确保回测设置的数据频率与订阅频率一致。回测时data.history()返回None1. 历史数据不足count太大。2. 标的代码格式错误或没有数据。1. 打印len(hist_data)检查数据长度。2. 检查标的代码格式如000001.SZ。1. 确保count小于等于已有数据量在initialize中订阅足够数量的数据。2. 使用QMT的数据浏览器确认标的和周期是否有数据。实盘订单未成交1. 价格不合理市价单除外。2. 账户资金或持仓不足。3. 非交易时间或标的停牌。4. 网络或柜台问题。1. 查看订单状态和日志。2. 检查账户资金和持仓。3. 确认交易时间。1. 使用context.order的返回值order_id查询订单状态。2. 在handle_data中加强条件判断确保资金/持仓充足。3. 添加异常处理try...except并记录日志。策略逻辑错误信号相反1. 买卖方向 (OrderSide) 写反。2. 均线计算或比较逻辑错误。1. 仔细检查context.order中的side参数。2. 打印fast_ma和slow_ma的值人工验证金叉死叉判断。1. 使用模拟交易小额验证。2. 在策略中加入更详细的调试日志输出每一步的计算结果。性能问题运行卡顿1. 在handle_data中进行了复杂的循环或计算。2. 订阅了过多标的或过高频率的数据。1. 优化代码逻辑避免在每次触发时进行重计算。2. 检查订阅列表。1. 将一些固定计算移到initialize或on_timer中。2. 减少不必要的订阅按需获取数据。9. 进阶技巧与最佳实践当你掌握了基础策略开发后以下实践能帮助你提升策略的稳健性和工程化水平参数外部化不要将周期、数量等参数硬编码在代码里。使用QMT策略的参数设置界面或在代码开头定义字典方便回测优化。# 在initialize外部定义默认参数 DEFAULT_PARAMS { symbol: 000001.SZ, fast_period: 5, slow_period: 20, volume: 100 } class MyStrategy(BaseStrategy): def initialize(self, context): # 可以通过context.settings获取界面设置的参数或使用默认值 self.fast_period context.settings.get(fast_period, DEFAULT_PARAMS[fast_period])日志分级与持久化合理使用log.debug,log.info,log.warning,log.error。重要的交易信号和错误信息务必记录。定期查看日志文件分析策略运行状态。异常处理网络、数据、交易接口都可能出错。务必用try...except包裹核心逻辑特别是下单操作。try: order_id context.order(...) log.info(f订单提交成功: {order_id}) except Exception as e: log.error(f下单发生异常: {e}) # 可能的补救措施如取消未完成订单等策略状态管理对于复杂的策略需要管理状态机如开仓、持仓、平仓等状态。可以使用context对象的自定义属性来保存状态。def initialize(self, context): context.state WAITING # 自定义状态 def handle_data(self, context, data): if context.state WAITING and 买入条件: # 下单... context.state HOLDING分离策略逻辑与风控不要将所有逻辑堆在一个策略里。可以考虑编写独立的风控策略监控总仓位、单日亏损、连续亏损等并在达到阈值时通过context接口强制平仓或暂停交易。版本控制虽然QMT是本地软件但你的策略代码是宝贵的资产。务必使用Git等工具进行版本管理记录每次的修改和回测结果。迅投QMT为个人量化交易者打开了一扇低成本实践的大门。它降低了从策略研究到实盘交易的技术壁垒让你能将更多精力专注于市场逻辑的挖掘。然而工具只是工具真正的核心永远是策略本身的有效性和你对风险的控制能力。从简单的双均线开始理解每一个环节严格进行回测和模拟再小仓位实盘验证这才是利用QMT进行量化交易的稳妥之道。建议你将本文的示例代码作为起点不断修改和优化探索属于自己的交易策略。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门