系列导读:欢迎来到《自动化交易从入门到进阶》系列。本系列将基于QMT极速策略交易系统,带你逐步掌握量化交易的核心技能。第一篇我们从零开始,了解QMT Python API的基本框架,并编写你的第一个策略。后续我们会深入指标计算、回测优化、资金管理、实盘注意事项等,助你构建自己的交易系统。关注本公众号,与我们一起探索量化的魅力!
自动化交易,又称量化交易或程序化交易,是指利用计算机程序根据预设的交易策略自动执行买卖指令的过程。它能够克服人性的贪婪与恐惧,实现纪律性的交易,并且可以同时监控多个品种、多周期,大幅提高交易效率。在国内的量化交易平台中,QMT极速策略交易系统(以下简称QMT)是一个功能强大、门槛适中的选择。QMT不仅提供了丰富的历史数据接口、回测系统,还支持使用Python编写策略,极大地降低了普通投资者进入量化领域的门槛。
本文将带你从零开始,了解QMT的Python API基本概念,并编写你的第一个自动化交易策略。无论你是刚接触编程的交易员,还是有一定Python基础的投资者,都能通过本文快速上手。
QMT是一款专业的量化交易终端,它集成了行情显示、策略编写、历史回测、模拟交易和实盘交易等全流程功能。与普通的股票软件不同,QMT的核心在于“模型”——用户可以将自己的交易思路转化为代码,形成策略模型,然后让计算机自动执行。
QMT支持多种编程语言,其中Python因其简洁易学和强大的数据分析库(如NumPy、Pandas)而成为主流选择。QMT自带的Python环境已经预装了常用的第三方库(如TA-Lib、SciPy等),并且允许用户安装自己需要的库。更重要的是,QMT的Python API是底层C++封装的高性能接口,获取行情数据和下单的速度都非常快。
在QMT中,任何一个Python策略都必须包含两个函数:init 和 handlebar。这是框架规定的入口,缺一不可。
# coding:gbkdef init(ContextInfo):passdef handlebar(ContextInfo):passinit 初始化函数init 在整个策略生命周期中只会被执行一次。通常我们在init中做一些初始化工作,例如:
即使不需要初始化,也必须有一个空的init函数。
handlebar 行情处理函数handlebar 是策略的核心,它会在每一根K线上被执行一次。如果运行在实时行情模式下,每一根历史K线都会依次调用一次handlebar,之后每当收到一个新的tick(分笔数据),最后一根K线会更新,同时handlebar再次被调用。也就是说,在盘中,handlebar会被频繁调用,你可以在这里编写你的交易逻辑:读取行情数据、计算指标、判断买卖条件、下单。
ContextInfo 上下文对象ContextInfo 是策略运行时的上下文环境,它包含了大量有用的属性和方法。例如:
ContextInfo.barpos:当前正在处理的K线的索引号(从0开始)。ContextInfo.is_last_bar():判断当前K线是否为最后一根(最新)K线。ContextInfo.get_market_data():获取行情数据。ContextInfo.set_universe():设定股票池。你还可以在ContextInfo上自定义属性,在init和handlebar之间共享数据。但需要注意,ContextInfo在每根K线切换时会“回滚”到上一根K线的状态,因此如果需要保存跨K线的变量,建议使用全局变量(如Python模块级别的变量)或利用ContextInfo的属性(但要注意赋值时机)。
让我们按照QMT文档中的例子,编写一个最简单的策略,它只在初始化时打印“hello init”,并在每一根K线上打印“hello handlebar”。
# coding:gbkdef init(ContextInfo):print('hello init')# 可以在这里设置股票池,例如取“上证50”成分股 stock_list = ContextInfo.get_stock_list_in_sector("上证50", "") ContextInfo.set_universe(stock_list)def handlebar(ContextInfo):print('hello handlebar')# 获取当前K线的索引和时间 index = ContextInfo.barpos timetag = ContextInfo.get_bar_timetag(index)print('当前K线索引:', index, '时间戳:', timetag)将这个代码输入到QMT的策略编辑器中(新建一个Python模型),然后点击“运行”。你会看到输出窗口中交替打印出hello init和多次hello handlebar。这是因为模型运行时会先调用init,然后针对主图上的每一根历史K线依次调用handlebar。
注意:QMT的策略编辑器代码编码必须指定为
#coding:gbk,否则可能出现乱码。
理解QMT的运行机制对于编写正确的策略至关重要。文档中提到,QMT的模型是根据行情驱动,逐K线运行的。这意味着:
handlebar,直到最新的一根K线。handlebar会被频繁调用(每个tick一次)。ContextInfo.is_last_bar()为True)的handlebar中调用了交易函数,且该K线已经确定(即这是该K线的最后一次调用)。此时信号会被记录,并在下一根K线开始时发送委托。如果希望信号立即触发下单,可以设置quickTrade参数为1或2。例如,passorder函数支持quickTrade参数:
quickTrade=1:当在非历史K线(即最后一根K线)上调用时,立即触发下单。quickTrade=2:无论在任何K线上调用,立即触发下单(历史K线也会触发,需谨慎)。对于一些特殊的函数(如make_option_combination),默认就是立即触发。
理解这些概念后,你就能更好地控制策略的交易时机,避免盘中频繁虚假信号。
在QMT中运行一个Python策略很简单:
如果你在“行情”界面打开了一个K线图,点击运行后策略会叠加在该主图上运行。如果是在“模型研究”界面直接运行,则会使用基本信息中设置的默认品种和周期。
在真正实盘之前,我们通常需要对策略进行历史回测,以评估其绩效。QMT提供了完整的回测功能。
在策略编辑器的“回测参数”面板中,可以设置:
也可以在init函数中通过ContextInfo.start、ContextInfo.end、ContextInfo.capital等属性设置,代码中的设置优先级更高。
点击“回测”按钮,系统会按照设定的参数,在历史数据上逐K线运行策略,并记录买卖点,最终生成绩效报告。回测完成后,你可以看到年化收益率、夏普比率、最大回撤、交易明细等丰富的数据。同时,在主图上会用箭头标记出买卖点。
回测是检验策略有效性的关键步骤,但要注意:历史表现不代表未来,且回测中可能忽略滑点、流动性等现实因素。因此,回测结果需要谨慎解读。
get_market_data在策略中,我们经常需要获取K线数据来计算指标。QMT提供了ContextInfo.get_market_data函数,功能非常强大。
最简单的用法是获取当前主图的最新收盘价:
def handlebar(ContextInfo):# 获取当前主图最近一根K线的收盘价 close = ContextInfo.get_market_data(['close'], count=1)print(close)更常用的用法是指定股票代码、周期、时间范围等。例如,获取平安银行最近5天的收盘价和开盘价:
def handlebar(ContextInfo): df = ContextInfo.get_market_data( fields=['close', 'open'], stock_code=['000001.SZ'], period='1d', dividend_type='front', # 前复权 count=5 )print(df)返回的结果根据传入参数的不同,可能是数值、pandas.Series、pandas.DataFrame或pandas.Panel。文档中有详细的示例说明,你可以根据需要进行操作。
获取历史数据是编写任何策略的基础。例如,你可以结合talib库计算MACD、RSI等技术指标,然后根据指标值生成买卖信号。
passorder虽然第一篇我们可能还不需要真实下单,但了解一下交易函数有助于理解策略的完整流程。最通用的下单函数是passorder,它可以完成股票、期货、期权等多种品种的交易。
例如,以最新价买入100股平安银行:
passorder(23, 1101, '你的资金账号', '000001.SZ', 5, -1, 100, ContextInfo)参数解释:
23:操作类型,股票买入。1101:下单方式,单股单账号,按股/手。资金账号:需要先在init中通过ContextInfo.set_account()设置,或者直接传入字符串。'000001.SZ':合约代码。5:价格类型,5表示最新价。-1:价格,当价格类型为指定价时才有效,这里填-1忽略。100:数量(股)。ContextInfo:上下文对象。在实际策略中,我们通常不会直接使用passorder,而是使用更简洁的封装函数如order_lots、order_value等。例如,order_lots('000001.SZ', 1, ContextInfo, '资金账号')表示买入1手(100股)。
通过本文,你已经了解了QMT Python策略的基本框架、运行机制以及如何编写和运行一个简单的策略。你学会了如何获取行情数据,也对交易函数有了初步认识。这为后续编写更复杂的策略打下了坚实的基础。
在下一篇文章中,我们将深入探讨如何构建一个完整的交易策略,包括设置股票池、计算技术指标、生成交易信号,并进行回测评估。我们还将讲解如何处理信号过滤、资金管理以及风险控制等实战问题。
量化交易的世界广阔而有趣,QMT为我们提供了便捷的入口。希望你能动手实践,将书中的代码敲入编辑器,感受自动化交易的魅力。记住:纸上得来终觉浅,绝知此事要躬行。
本文内容基于QMT官方文档整理,旨在分享学习心得。如需更详细的API说明,请参考文档《QMT极速策略交易系统_模型资料_Python_API_说明文档_Python3.pdf》。
对量化实盘感兴趣的朋友可扫码添加,全程指导搞定QMT账号!



