
很多朋友刚接触了量化不知道具体怎么做,昨天的文章中,我们已经详细介绍了量化交易的准备工作,包括下载python库、数据下载等,今天直接上手核心内容:写策略、做回测、对接实盘。
一、QMT重要接口详解
QMT 系统内置了 Python 3.6 运行环境,提供行情数据与交易下单两大核心API接口 。
在编写策略前,我们先来看看QMT的运行机制。
1、QMT运行机制
QMT 量化软件提供了三种运行机制,分别是逐 K 线驱动、事件驱动、定时任务,可以适配于不同的场景需求。

2、QMT量化软件重要函数
在QMT所有策略中,代码必须以 # coding:gbk 开头,并且必须包含以下两个系统函数:
一个简单且完整的示例:
#encoding:gbkdef init(ContextInfo):print('hello init')def handlebar(ContextInfo):print('hello handlebar')除了上面的必备函数外,我们还可以根据自己的策略加入所需的函数,比如常用的行情函数:
出了数据获取函数外,一个完整且可以自动下单的策略还需要交易函数。
二、新建策略
认识上面的函数后,现在我们就可以新建一个完整策略,在【我的】主页,点击新建策略按钮,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软件内走个过场,并不会实际产生交易。
实盘信号:信号会直接发送到券商交易服务器,再传至柜台进行撮合,实盘信号触发的是真实交易,会动用账户实际资金。
以上就是今天的全部内容!
夜雨聆风