ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python新手量化入门:迅投QMT从安装到双均线策略实战

Python新手量化入门:迅投QMT从安装到双均线策略实战 1. 为什么Python新手也该认真看看迅投QMT很多人一听“量化交易”四个字脑子里立刻浮现出满屏的数学公式、C底层优化、低延迟撮合这些硬核画面觉得自己一个刚学完Python基础语法的人根本没资格碰。我当初也是这么想的。直到真正把迅投QMT跑起来、写完第一个能自动下单的策略之后才发现这条路对Python新手其实比想象中友好得多——前提是你得知道哪些坑必须绕开哪些环节可以走捷径。迅投QMT下文简称QMT是国内券商渠道里比较常见的一套量化交易终端它把行情、交易、策略研究、回测这些模块打包在一个客户端里同时开放了Python接口。也就是说你不需要自己去对接行情源、不需要自己封装下单API、不需要处理账户登录和风控校验只要会写Python函数就能把想法变成能实际运行的策略。这对新手来说省掉了大量“脏活累活”能把精力集中在策略逻辑本身。这篇文章适合三类人第一类是有一定Python基础、想找一条能落地的量化入门路径的第二类是做过程序化交易但一直用其他平台、想横向对比QMT的第三类是完全没接触过量化、但愿意花一个周末把环境搭起来跑通第一个策略的。我会从安装、环境配置、数据获取、策略编写、回测到实盘注意事项一步步拆开讲中间穿插我自己踩过的坑和实测有效的做法。你不需要是数学专业出身也不需要懂什么高频交易只要能把Python的列表、字典、循环、函数写明白就能跟着走完。需要先说明一点QMT的具体版本、券商定制情况、接口细节会随时间变化我下面讲的是基于常见实践总结的通用路径具体到你手上的客户端以官方文档和券商提供的说明为准。但整体思路和关键节点是相通的理解了这套逻辑换个平台也能快速迁移。2. 动手之前把QMT和Python的关系理清楚2.1 QMT到底是个什么东西QMT本质上是一个“客户端Python运行时”的组合体。客户端负责图形界面、行情展示、账户管理、风控拦截Python运行时负责执行你写的策略代码。你的策略代码通过QMT提供的API去拿行情、查持仓、发下单指令QMT再把这些指令转发给券商柜台。整个链路里你只需要关心策略逻辑中间的通信、鉴权、报单格式转换都由QMT处理。这跟纯自己搭一套量化系统有本质区别。自己搭的话你得先找行情源比如某些数据API再找交易接口比如某些柜台API然后自己写一个中间层把两边对接起来还要处理断线重连、心跳保活、订单状态同步这些琐碎但极其重要的事情。QMT把这些都封装好了代价是你得在它的框架里写代码灵活性会受一些限制但对新手来说这个代价完全值得。2.2 为什么选Python而不是其他语言QMT同时支持Python和VBA部分版本还支持C但Python是绝对的主流选择。原因很直接Python的生态太丰富了。你想算个技术指标pandas、numpy一行搞定你想画个资金曲线matplotlib几行代码出图你想做个简单的机器学习预测sklearn直接调用。这些库在QMT的Python环境里基本都能用部分需要手动安装而VBA在这些方面几乎空白。另一个原因是Python的语法门槛低。同样一个双均线策略Python可能二十行写完VBA得写五六十行而且可读性差很多。对于新手来说能把更多时间花在理解策略逻辑上而不是跟语言语法搏斗这一点非常关键。2.3 你需要提前准备的几样东西在开始安装之前先确认你手头有这些东西一台Windows电脑。QMT目前主要运行在Windows环境下Mac和Linux用户需要借助虚拟机或双系统这一点要有心理准备。一个支持QMT的证券账户。不是所有券商都提供QMT你需要先确认自己的券商是否支持并开通相应的量化交易权限。通常需要满足一定的资产门槛具体咨询你的客户经理。基础的Python知识。至少要知道变量、列表、字典、for循环、if判断、函数定义这些概念。如果这些还不熟建议先花几天补一下否则后面看策略代码会很吃力。耐心。环境配置阶段可能会遇到各种报错这是正常的别一遇到问题就放弃。提示开通QMT权限通常需要临柜或线上签署风险揭示书部分券商还要求做知识测评。提前问清楚流程免得白跑一趟。3. 从零开始QMT安装与Python环境配置3.1 下载与安装QMT客户端QMT客户端的下载渠道一般有两个一是券商官网的“软件下载”页面二是你的客户经理直接发给你。建议优先用客户经理提供的版本因为不同券商对QMT做过定制通用版可能无法登录你的账户。下载下来通常是一个压缩包解压后找到安装程序双击运行。安装路径建议选一个没有中文、没有空格的目录比如D:\QMT。这一点很重要后面Python环境配置时路径里有中文或空格经常会导致各种莫名其妙的报错我在这上面浪费过整整一个下午。安装完成后用你的资金账号登录。首次登录可能会提示下载补充数据文件让它下完就行。登录成功后你会看到主界面有行情、交易、策略、回测等几个主要模块。先别急着写策略我们先把Python环境理顺。3.2 找到QMT自带的PythonQMT客户端里内置了一个Python解释器你不需要自己去官网下载安装。通常路径在QMT安装目录下的bin或python文件夹里。你可以在QMT的“策略”模块里找到“Python编辑器”或类似的入口打开后一般能看到一个代码编辑界面里面已经配置好了Python环境。但这里有个关键点QMT自带的Python版本可能比较老比如3.6或3.7而且预装的第三方库有限。如果你需要用到pandas、numpy这些库可能需要手动安装。安装方法是在QMT的Python环境下打开命令行用pip安装。具体操作是找到QMT目录下的python.exe按住Shift右键选择“在此处打开命令窗口”或PowerShell然后执行pip install pandas numpy之类的命令。注意不要用系统全局的Python去装库然后指望QMT能用QMT只认它自己目录下的那个Python环境。这一点新手特别容易搞混。3.3 配置外部编辑器可选但强烈推荐QMT自带的代码编辑器功能比较基础没有代码补全、没有语法高亮、没有调试功能。如果你已经习惯了VS Code或PyCharm可以配置外部编辑器来写策略然后复制回QMT运行。或者更高级一点直接把QMT的Python解释器配置到VS Code里这样就能在VS Code里写代码、在QMT里运行。具体做法是在VS Code里安装Python扩展然后按CtrlShiftP打开命令面板输入“Python: Select Interpreter”选择“Enter interpreter path”找到QMT目录下的python.exe。配置好之后VS Code就能识别QMT环境里的库代码补全和语法检查都能正常工作。但要注意VS Code里只能写代码和做静态检查真正运行策略还是得在QMT客户端里。因为策略运行需要QMT的行情和交易上下文脱离QMT环境很多API调用会失败。3.4 验证环境是否可用在正式写策略之前先跑一个最简单的测试脚本确认环境没问题。在QMT的Python编辑器里新建一个策略文件写入以下代码def init(ContextInfo): print(初始化成功) def handlebar(ContextInfo): print(当前K线时间, ContextInfo.barpos)保存后在QMT里选择这个策略点击“运行”或“回测”。如果能在日志窗口看到“初始化成功”和K线时间输出说明环境基本可用。如果报错最常见的原因是Python路径不对或缺少依赖库根据报错信息逐个排查。4. 搞懂QMT策略的基本骨架4.1 init和handlebar两个必须理解的函数QMT的Python策略有一个固定的骨架核心是两个函数init和handlebar。init函数在策略启动时执行一次用来做初始化工作比如设置标的池、订阅行情、初始化全局变量。你可以把它理解为“开场准备”。handlebar函数在每根K线结束时执行一次具体频率取决于你选择的周期用来写核心策略逻辑。比如你选日线周期那么每个交易日结束后handlebar会被调用一次你选分钟周期那么每分钟结束后调用一次。策略的买卖判断、下单操作都写在这里面。这个设计跟很多回测框架比如backtrader的思路是相通的先初始化然后逐根K线推进。理解了这一点你就理解了QMT策略的运行节奏。4.2 ContextInfo你的策略上下文ContextInfo是QMT传给策略函数的一个对象里面包含了当前策略运行的各种信息比如当前K线位置、账户持仓、行情数据等。你可以通过它来获取你需要的一切。常用的属性和方法包括ContextInfo.barpos当前K线的索引位置。ContextInfo.stockcode当前标的代码。ContextInfo.get_market_data()获取行情数据。ContextInfo.get_trade_detail_data()获取账户和持仓信息。ContextInfo.order_target_percent()按目标仓位比例下单。这些不需要死记用的时候查文档就行。关键是理解ContextInfo是你和QMT之间的桥梁所有跟行情、账户、交易相关的操作都要通过它来完成。4.3 一个最小可运行策略的完整结构下面是一个最简策略的完整代码功能是每天打印当前持仓和可用资金。def init(ContextInfo): # 设置标的池这里以某只股票为例 ContextInfo.stock 600000.SH # 订阅行情 ContextInfo.subscribe_quote(ContextInfo.stock, period1d) def handlebar(ContextInfo): # 获取当前标的的持仓 positions ContextInfo.get_trade_detail_data(account, stock, position) # 获取账户资金 accounts ContextInfo.get_trade_detail_data(account, stock, account) for pos in positions: print(f持仓{pos.m_strInstrumentID}数量{pos.m_nVolume}) for acc in accounts: print(f可用资金{acc.m_dAvailable})这段代码虽然简单但包含了QMT策略的所有基本要素初始化、订阅行情、获取账户信息、在handlebar里执行逻辑。你把这个跑通后面加买卖逻辑就是水到渠成的事。5. 数据获取策略的燃料从哪里来5.1 QMT内置行情数据的调用方式QMT提供了多种获取行情数据的方法最常用的是ContextInfo.get_market_data()。这个函数可以获取指定标的、指定周期、指定字段的历史行情数据。一个典型的调用长这样data ContextInfo.get_market_data( [close, open, high, low, volume], [ContextInfo.stock], period1d, count20, dividend_typefront )参数解释第一个参数是字段列表第二个是标的列表period是周期1d日线、1m分钟线等count是获取的K线数量dividend_type是复权方式front前复权、back后复权、none不复权。返回的数据通常是一个字典或DataFrame结构具体取决于QMT版本。拿到数据后你就可以用pandas做各种计算了。5.2 复权处理一个容易被忽略但极其重要的细节复权这件事新手经常忽略但它直接影响策略回测的准确性。简单说股票分红送股后股价会除权K线图上会出现一个跳空缺口。如果你不复权均线、MACD这些指标会被这个缺口扭曲导致回测结果失真。QMT支持前复权、后复权和不复权三种方式。做回测时一般建议用前复权因为前复权是以当前价格为基准向前调整最新的价格是真实的历史价格被调整这样指标在最近的时间段是准确的。后复权则是以历史价格为基准向后调整适合计算长期收益率。不复权只在特定场景下使用比如你需要知道真实的成交价格。提示不同复权方式下的回测结果可能差异很大尤其是分红送股频繁的标的。建议在策略里明确指定复权方式不要依赖默认值。5.3 数据频率的选择与策略周期的匹配QMT支持多种数据周期tick、1分钟、5分钟、15分钟、30分钟、60分钟、日线、周线等。选择哪个周期取决于你的策略逻辑。如果你做的是趋势跟踪日线或60分钟线比较合适因为趋势需要时间展开太短的周期噪音太多。如果你做的是日内高频那至少得用分钟线甚至tick。但要注意周期越短数据量越大对计算资源的要求越高而且交易成本手续费、滑点对策略收益的侵蚀越严重。新手建议从日线开始逻辑简单、数据量小、回测速度快容易验证策略是否有效。等日线策略跑通了再考虑往短周期迁移。5.4 外部数据源的补充思路QMT内置的行情数据主要覆盖价量数据如果你需要财务数据、宏观经济数据、新闻情绪等另类数据就需要从外部获取。常见做法是用Python的requests库或专门的数据库接口去拉取然后保存到本地文件或数据库策略运行时再读取。但这里有个坑外部数据的更新频率、时间对齐、缺失值处理都需要你自己搞定。比如你用的是季度财务数据但策略是日频运行的那就需要把季度数据“填充”到每个交易日还要注意避免“未来函数”——不能用还没公布的数据去做当天的决策。6. 写出你的第一个完整策略双均线交叉6.1 策略逻辑拆解双均线交叉是最经典的趋势策略逻辑简单到可以用一句话说清楚短期均线上穿长期均线时买入短期均线下穿长期均线时卖出。具体参数短期均线用5日长期均线用20日。当5日均线从下方穿过20日均线时全仓买入当5日均线从上方穿过20日均线时清仓卖出。这个策略不保证赚钱但它足够简单适合用来验证整个流程是否跑通。等你把双均线跑明白了再换成更复杂的逻辑也不迟。6.2 完整代码实现与逐段讲解import pandas as pd def init(ContextInfo): # 设置标的 ContextInfo.stock 600000.SH # 订阅日线行情 ContextInfo.subscribe_quote(ContextInfo.stock, period1d) # 记录上一根K线的均线状态用于判断交叉 ContextInfo.last_short_above None def handlebar(ContextInfo): # 获取最近30根K线的收盘价 data ContextInfo.get_market_data( [close], [ContextInfo.stock], period1d, count30, dividend_typefront ) # 提取收盘价序列 closes data[close][ContextInfo.stock] # 数据不足则跳过 if len(closes) 20: return # 计算均线 ma5 closes[-5:].mean() ma20 closes[-20:].mean() # 判断当前状态 short_above ma5 ma20 # 第一次运行只记录状态不交易 if ContextInfo.last_short_above is None: ContextInfo.last_short_above short_above return # 获取当前持仓 positions ContextInfo.get_trade_detail_data(account, stock, position) current_volume 0 for pos in positions: if pos.m_strInstrumentID ContextInfo.stock.split(.)[0]: current_volume pos.m_nVolume break # 金叉短期均线上穿长期均线买入 if short_above and not ContextInfo.last_short_above: if current_volume 0: # 按目标仓位比例下单这里用90%仓位 ContextInfo.order_target_percent(ContextInfo.stock, 0.9) print(f金叉买入MA5{ma5:.2f}MA20{ma20:.2f}) # 死叉短期均线下穿长期均线卖出 elif not short_above and ContextInfo.last_short_above: if current_volume 0: ContextInfo.order_target_percent(ContextInfo.stock, 0) print(f死叉卖出MA5{ma5:.2f}MA20{ma20:.2f}) # 更新状态 ContextInfo.last_short_above short_above逐段解释一下关键点init里订阅了日线行情并初始化了一个状态变量last_short_above用来记录上一根K线时短期均线是否在长期均线之上。这个变量是判断“交叉”的关键因为交叉是一个“变化”事件你需要知道之前的状态才能判断是否发生了交叉。handlebar里先获取最近30根K线的收盘价然后计算5日和20日均线。注意这里用的是closes[-5:].mean()取最后5个值求平均。数据不足20根时直接返回避免计算错误。判断交叉的逻辑是如果当前short_above为True且上一次为False说明发生了金叉反之则是死叉。第一次运行时last_short_above为None只记录状态不交易避免在策略启动瞬间就误判交叉。下单用的是order_target_percent这个函数会按目标仓位比例自动计算买卖数量比手动算股数方便很多。买入用0.990%仓位卖出用0即清仓。6.3 回测运行与结果解读把上面的代码保存到QMT的策略文件里选择回测模式设置回测时间段比如2020年1月到2023年12月初始资金设为100万然后点击运行。回测结束后QMT会给出资金曲线、收益率、最大回撤、夏普比率等指标。新手最容易犯的错误是只看总收益率忽略最大回撤和交易次数。一个策略如果总收益50%但最大回撤40%那实际运行时你很可能在回撤最大的时候扛不住压力手动干预最终收益远不如回测。另外要注意交易成本。QMT回测默认会计算手续费和印花税但滑点需要你自己设置。滑点是指你下单的价格和实际成交价格之间的差异通常设置成0.01或0.02个点。如果不设滑点回测结果会偏乐观。提示双均线策略在震荡市中会频繁发出买卖信号导致大量无效交易和手续费损耗。这是趋势策略的通病不是代码写错了。7. 回测到实盘那些没人告诉你的坑7.1 回测和实盘的本质差异回测是在历史数据上跑策略实盘是在实时行情中跑策略两者之间隔着好几道鸿沟。第一道鸿沟是数据延迟。回测时你拿到的是完整的、已经确定的K线数据实盘时你拿到的是实时推送的行情可能有延迟、可能丢包、可能重复。你的策略逻辑如果依赖精确的K线收盘价实盘时就要考虑“K线还没走完时信号就变了”的情况。第二道鸿沟是成交假设。回测时假设你的订单一定能成交实盘时可能因为涨跌停、流动性不足、风控拦截等原因无法成交。你的策略如果假设“信号出现就能立刻成交”实盘时可能会错过最佳时机。第三道鸿沟是心理因素。回测时看到最大回撤30%只是一个数字实盘时账户真的亏了30%你还能不能坚持执行策略这个问题没有技术答案只能靠经验和纪律。7.2 实盘前的检查清单在把策略切换到实盘之前逐项确认以下内容策略在模拟盘上至少跑通了一周没有报错、没有异常下单。账户已开通量化交易权限资金已到位。策略里的标的代码、下单数量、仓位比例都确认无误。设置了风控措施比如单笔最大亏损、单日最大交易次数、总仓位上限。知道怎么紧急停止策略。QMT里有停止按钮但你要确认按下去之后策略确实不再发单。记录了券商的客服电话或客户经理联系方式万一出问题能及时联系。7.3 常见报错与排查方法实盘运行中最常见的几类问题报错一AttributeError: NoneType object has no attribute ...通常是某个API返回了None而你没有做空值判断。比如get_market_data在行情未就绪时可能返回None直接取字段就会报错。解决方法是在使用数据前加判断if data is None: return。报错二下单失败提示“可用资金不足”或“可用持仓不足”原因可能是你算错了下单数量或者前一笔订单还没成交就发了下一笔。解决方法是下单前先查账户可用资金和可用持仓确保数量合理。另外order_target_percent在计算数量时可能因为取整导致略微超出建议留一点余量比如用0.95而不是1.0。报错三策略运行了但没有任何输出检查handlebar是否真的被调用了。可以在handlebar第一行加print(handlebar called)如果日志里没有输出说明行情订阅没成功或周期设置有问题。报错四回测结果异常好实盘却亏钱大概率是回测里用了未来函数。比如你在计算均线时用了当天的收盘价但当天还没收盘你就用这个信号去交易这在实盘里是不可能的。检查你的代码确保所有用于决策的数据都是“已经发生”的。7.4 策略上线后的监控与调优策略上线不是终点而是起点。你需要持续监控几个关键指标每日盈亏、持仓变化、交易次数、滑点情况。如果发现策略表现和回测偏差很大先排查数据问题再排查执行问题最后才考虑策略逻辑本身是否需要调整。调优的时候不要过度拟合。什么叫过度拟合就是你为了让回测曲线好看不断调整参数比如把5日均线改成7日、把20日改成18日直到找到一组“完美”的参数。这种参数在历史上表现很好但未来大概率失效。正确的做法是理解策略背后的逻辑参数只要在合理范围内就行不要追求极致。8. 新手最容易踩的五个坑8.1 坑一一上来就写复杂策略很多人刚学会QMT的基本用法就迫不及待想写一个“多因子机器学习动态仓位”的复杂策略。结果代码写了一千行跑起来全是bug调了三天还没跑通最后热情耗尽放弃。我的建议是从双均线开始跑通全流程再逐步增加复杂度。每增加一个功能就单独测试一遍确保没问题再加下一个。这样出问题时容易定位也不会一次性被大量报错淹没。8.2 坑二忽略交易成本回测时如果不设手续费和滑点一个高频策略可能显示年化50%的收益实盘一跑发现手续费吃掉了一大半。A股的手续费包括佣金万分之一到万分之三不等、印花税卖出时千分之一、过户费沪市万分之零点二。滑点取决于流动性和下单方式一般设0.01到0.02个点比较合理。把这些成本算进去之后很多“看起来很美”的策略会现出原形。这是好事早发现早放弃省得实盘亏钱。8.3 坑三不设风控策略里只有买入卖出逻辑没有止损、没有仓位上限、没有单日交易次数限制。这种策略在极端行情下可能一天亏掉大半本金。风控不需要很复杂几个简单的规则就能大幅降低风险单笔交易不超过总资金的20%单日亏损超过5%就停止交易总持仓不超过80%。这些规则写在handlebar里每次交易前检查一遍。8.4 坑四用错复权方式前面提过复权的重要性这里再强调一次。如果你做的是日线级别的趋势策略用不复权数据回测遇到分红送股时均线会跳变产生虚假信号。用前复权数据回测结果更接近实盘。但要注意前复权数据在每次分红后都会重新计算所以你今天回测的结果和一个月后回测的结果可能略有不同。这是正常的不是bug。8.5 坑五不记录交易日志策略跑起来之后你只知道赚了还是亏了但不知道每一笔交易的具体情况什么时候买的、什么价格成交的、当时的信号是什么、滑点多少。没有这些信息你根本无法判断策略的问题出在哪里。建议在策略里加一个简单的日志功能把每笔交易的信号时间、下单价格、成交价格、数量都写到一个CSV文件里。积累一段时间后用pandas分析一下你会发现很多回测里看不出来的问题。9. 从第一个策略到策略体系9.1 策略迭代的合理路径跑通双均线之后下一步可以尝试这几个方向第一个方向是加入过滤条件。比如双均线金叉时如果大盘指数在20日均线以下就不买入。这样可以过滤掉一部分熊市中的假信号。第二个方向是加入仓位管理。不是每次金叉都全仓买入而是根据波动率或趋势强度动态调整仓位。波动率大时仓位小一点波动率小时仓位大一点。第三个方向是尝试多标的。不要只盯着一只股票选一篮子股票每次只在信号最强的几只上开仓。这样可以分散风险也能提高资金利用率。9.2 多策略组合的思路单一策略总会有失效的时候。趋势策略在震荡市亏钱震荡策略在趋势市亏钱。如果你能同时运行几个相关性低的策略整体资金曲线会平滑很多。QMT支持在一个客户端里运行多个策略每个策略独立管理自己的仓位。你可以把资金分成几份分别分配给不同的策略。但要注意多个策略同时交易时要避免它们在同一时间对同一标的发出相反方向的指令否则会互相抵消。9.3 持续学习的方向量化交易是一个需要持续学习的领域。技术层面你需要不断熟悉QMT的API、了解Python的新库、学习数据处理和可视化的技巧。策略层面你需要阅读经典的量化书籍、研究公开的策略论文、复盘自己的交易记录。但最重要的是保持理性。不要因为一个策略回测收益高就盲目上实盘也不要因为一个策略短期亏损就立刻放弃。用数据说话用逻辑判断控制好风险剩下的交给时间。我个人在实际操作中的体会是QMT对Python新手确实友好但“友好”不等于“简单”。安装配置、数据获取、策略编写、回测验证、实盘监控每一个环节都有细节需要注意。把第一个双均线策略完整跑通你就已经超过了大多数停留在“想学量化”阶段的人。后面的事无非是重复这个流程不断迭代而已。
返回列表