乐于分享
好东西不私藏

QMT量化软件从安装到实盘完整操作指南(下):量化策略编写、回测与实盘全流程!

QMT量化软件从安装到实盘完整操作指南(下):量化策略编写、回测与实盘全流程!

很多朋友刚接触了量化不知道具体怎么做,昨天的文章中,我们已经详细介绍了量化交易的准备工作,包括下载python库、数据下载等,今天直接上手核心内容:写策略、做回测、对接实盘。

一、QMT重要接口详解

QMT 系统内置了 Python 3.6 运行环境,提供行情数据与交易下单两大核心API接口 。

在编写策略前,我们先来看看QMT的运行机制。

1、QMT运行机制

QMT 量化软件提供了三种运行机制,分别是逐 K 线驱动、事件驱动、定时任务,可以适配于不同的场景需求。

2、QMT量化软件重要函数

在QMT所有策略中,代码必须以 # coding:gbk   开头,并且必须包含以下两个系统函数:

函数
说明
init(C)
策略初始化函数,仅运行一次,用于设置股票池、资金账号、参数等
handlebar(C)
逐K线驱动函数,每根K线调用一次,是策略的主要执行入口

一个简单且完整的示例:

#encoding:gbkdef init(ContextInfo):print('hello init')def handlebar(ContextInfo):print('hello handlebar')

除了上面的必备函数外,我们还可以根据自己的策略加入所需的函数,比如常用的行情函数:

函数
说明
适用场景
download_history_data
下载指定合约、周期、时间范围的行情数据到本地
回测前或实盘前补充历史数据
get_market_data_ex
订阅实时行情或获取下载到本地的历史行情数据
最推荐的行情获取函数,可同时用于回测或实盘
get_full_tick
获取最新全推数据,不能取历史分笔数据
实时监控全市场最新行情
subscribe_whole_quote
向服务器订阅指定品种的行情数据(分笔/1分钟/5分钟/日线)
需要实时更新行情的场景
unsubscribe_quote
按订阅号反订阅行情,释放可订阅数
配合subscribe_quote使用

出了数据获取函数外,一个完整且可以自动下单的策略还需要交易函数。

函数
说明
passorder()
综合交易下单,支持股票、两融、期货、期权等多种操作类型

二、新建策略

认识上面的函数后,现在我们就可以新建一个完整策略,在【我的】主页,点击新建策略按钮,QMT支持Python和VBA双语言,我们选择自己喜欢的语言点进去就可以了。

下面我们来看一个软件自带的双均线策略。

双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出。

#coding:gbk# 导入包import pandas as pdimport numpy as npimport datetime"""示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出"""class a(): passA = 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 = 23 if A.acct_type == 'STOCK'else 33 #买卖代码 区分股票 与 两融账号 A.sell_code = 24 if A.acct_type == 'STOCK'else 34print(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 = []  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 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_market_data_ex(["close"],[A.stock],period = '1d',count = max(A.line1, A.line2)+1) close_list = data[A.stock].valuesif 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, '双均线实盘', 2 , 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], '双均线实盘', 2 , msg, C)print(msg)  A.waiting_list.append(msg)

三、策略回测

策略编写好后,我们可以将量化策略放在历史行情数据中进行模拟运行,评估策略在过去行情中的表现,策略编写好后我们点击【回测】按钮就可以回测了。

回测结束后,QMT量化系统可以提供多维度的分析。

分析维度
说明
收益报表
年化收益、单位净值、夏普比率、下方差、索提诺比率等绩效指标
持仓分析
查看光标所在当天持仓的行业分布(权重、盈利、股票数量),可切换对比基准
历史板块汇总
累计盈亏、累计交易量、累计交易额、持仓天数等
操作明细
每一笔历史交易的买入、卖出记录
日志输出
用于调试模型运行情况

四、策略实盘

策略回测达到自己满足的受益后,我们就可以开始上实盘了。

在 【模型交易】 界面,选择 新建策略交易,添加策略后在 【运行模式】 中选择 【实盘】,这样策略才会发出真实委托。

这里有模拟信号和实盘信号,我们来看看详细区别:

模拟信号:只在客户端生成信号,无论是测试环境还是正式环境,都不会传到券商服务器和柜台,没有真实委托单。相当于Python写的下单指令,只会在QMT软件内走个过场,并不会实际产生交易。

实盘信号:信号会直接发送到券商交易服务器,再传至柜台进行撮合,实盘信号触发的是真实交易,会动用账户实际资金。

以上就是今天的全部内容!