乐于分享
好东西不私藏

免费又好用的量化软件QMT:手把手教你搭建完整策略,告别情绪化交易!

免费又好用的量化软件QMT:手把手教你搭建完整策略,告别情绪化交易!

同样的行情下,为什么有人大赚,有人一直亏损?区别就是高手靠规则,而新手凭感觉。

散户最大的短板,就是经常被情绪左右,盈利时控制不住贪婪,亏损时疯狂割肉。

量化交易就是解决上面问题最好的办法,量化把买卖规则严格写成代码,触发规则后由计算机严格执行交易,彻底改掉人贪心、害怕导致的胡乱操作。

做量化交易就需要一款合适的量化软件,QMT作为券商主流量化工具,是普通散户做量化的绝佳选择,今天我们详细介绍一下如何用量化软件QMT编写出完整量化交易策略。

一、量化交易为什么要选QMT?

目前市面上有不少量化软件,但绝大多数量化平台缺少金融API接口,因此只提供策略编写、回测功能,无法做模拟盘,更不要说实盘。而量化软件QMT支持量化交易全流程,并且具备下面这些优势:

✅极速交易:单笔交易延时小于1毫秒,能快速执行交易指令;

✅本地运行:策略和数据在本地计算机运行和存储,无泄漏风险;

✅全品种覆盖:支持股票、基金、可转债等全市场交易品种;

✅高效回测:底层由C++实现,支持多核CPU并行计算,回测速度极快;

✅全流程服务:集行情获取、策略编写、回测、实盘、风控于一体;

✅低门槛使用:通过券商开通权限,部分券商门槛较低,且软件本身不收取额外使用费用。

二、如何搭建一个量化策略?

在前面的文章中我们给大家详细介绍了QMT量化策略必备的函数,今天给大家详细说一下如何实际运用这些函数进行策略编写。

1、如何新建策略?

打开QMT量化软件,在【我的】主页,点击新建策略按钮,点击【pyhton策略】模型。

页面会弹出一个策略编辑器框,里面自带了一个完整示例,我们可以在自带策略的基础上进行简单修改或者把无效代码删除,只留下必要的框架部分(包括第三方库、初始化函数、行情事件函数等),其余部分自己写,还可以清空自带的所有策略,从头到尾自己写。

2、策略编译器详解

在正式进行策略编写之前,我们先熟悉一下QMT量化软件的策略编译器。

策略编辑器集成了模型列表、函数列表、函数帮助、模型基本信 息、参数设置、回测参数等多个部分,有代码高亮、自动补全等便捷功能于一体。

我们重点看看函数列表,在这里可以查看QMT的策略函数,例如图中搜索的初始化函数,下面会有初始化函数详细介绍、参数、使用示例等,后续我们写策略会经常用到。

3、如何编写策略

现在我们开始编写策略,QMT策略的大致框架如下:

①  Python 策略开头有定义编码格式 gbk。

②  然后导入策略所需的第三方库,导入的第三方库要在白名单内。

③  Init 方法和 handlebar 方法的定义是必须的。

再给大家强调一下必备函数(init、handlebar)的用法:

① init – 初始化函数

Init 方法会在策略运行开始时调用一次,用于初始订阅行情、订阅账号信息使用、设定股票池等。

② handlebar – 行情事件函数

作为行情驱动的函数,实现指标计算,回测,实盘下单的效果。

释义:每根 K 线运行一次;实时行情获取状态下,先每根历史 K 线运行一次,再在每个 tick 数据来后驱动运行一次

用法:历史k线上,按时间顺序每根K线触发一次调用;盘中,每个新到达的tick数据驱动运行一次。

三、完整示例——双均线策略

看完上面内容,相信大家对QMT量化如何编辑一个量化策略已经有了一定认识,现在基于上面的基础框架,我们来进行实际运用,给大家看一个简单且完整的示例——双均线策略。

#encoding:gbkimport pandas as pdimport numpy as npimport datetime"""示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出"""class a(): passA = a() #创建空的类的实例 用来保存委托状态 #ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号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 = 23 if A.acct_type == 'STOCK'else 33 #买卖代码 区分股票 与 两融账号 A.sell_code = 24 if A.acct_type == 'STOCK'else 34#设置股票池 订阅品种行情 C.set_universe([A.stock])print(f'双均线实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}')def handlebar(C):#跳过历史k线if not 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 = []  orders = get_trade_detail_data(A.acct, A.acct_type, 'order')for order in orders:if order.m_strRemark in A.waiting_list:    found_list.append(order.m_strRemark)  A.waiting_list = [i for i in A.waiting_list if i not in 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_history_data(max(A.line1, A.line2)+1, '1d''close',dividend_type='front_ratio') close_list = data[A.stock]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 >= 100 and A.stock not in 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, '双均线实盘', 1 , msg, C)print(msg)  A.waiting_list.append(msg)#如果快线下穿慢线,则卖出委托if A.stock in holdings and holdings[A.stock] > 0 and 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], '双均线实盘', 1 , msg, C)print(msg)  A.waiting_list.append(msg)

上面策略就是在必备框架的基础上增加了股票池选取、行情订阅、设置快慢均线周期、买卖条件、买入金额等就完成了一个完整量化策略。

在必备框架的基础上,大家把自己的交易思路补充完整就可以成功搭建量化策略了。后续我们再详细介绍如何回测和实盘。

四、如何开通实盘量化软件?

1、QMT、ptrade开通流程

(1)开户成功后入金10万后提交申请流程

(2)申请过程全程线上,预计2个工作日申请完成。

(3)等待开通过程中,可以提供测试账号、安装配置流程、量化会员资料。

(4)开通成功后,会通过邮件发送你软件下载地址,登录账号后就可以使用。

2、VIP服务

3、VIP福利

福利1:惊喜佣金

福利2:领取完整教程

福利3:添加量化讨论群

福利4:提供专业量化问题解答

福利5:量化工具安装使用教程、视频

福利6:极速柜台,量化投资者专用,速度微秒级

福利7:提供服务器托管模式:ptrade+ldp极速柜台+vip定向服务器(限50人)