量化交易的库
hdf5:兼容pandas的dataframe合适量化的存储格式。
通用库
vnpy
PyAlgoTrade
Backtrader
Zipline
TA-Lib
backtrader_copilot: https://github.com/LukasWesemann/backtrader_copilot
https://github.com/jrothschild33/learn_backtrader
https://zhuanlan.zhihu.com/p/95990069
加密货币
https://github.com/Dave-Vallance/bt-ccxt-store
https://github.com/ccxt/ccxt
https://www.freqtrade.io/en/stable/
https://zhuanlan.zhihu.com/p/374012763
对于第一次接触量化交易的朋友来说,经常会问到的几个问题,比如,QMT和iQuant,miniQMT有什么区别。
首先,QMT和iQuant都是由迅投开发的。miniQMT是在QMT子模块下运行的一个极简模式。
接下来将详细的讲讲。
QMT vs iQuant
一般券商采购了迅投的QMT软件后,接入行情数据服务器和交易服务器,管理 自家的用户的资金账户,就可以让它成为可以实盘的的量化交易软件。(这里为了通俗易懂,简化了很多细节,实际要复杂一些)
QMT里面行情和交易服务器连接设置
而iQuant是由国信证券定制开发的,算是QMT的套壳。iQuant它的大部分功能和其他券商的QMT的功能基本一样。但也有不同的地方:
iQuant移除了VBA模型
下图是国金QMT主界面,在新建策略下面,会看到有VBA模型和python模型
国金QMT
而在国信的iQuant的策略开发模式下,只支持python模型,VBA编写模型的功能被移除了。
国信QMT
对于VBA而言,算是一门古老的语言了,至少在互联网领域,已经没见过有几个人在用的了。
不过我查询了一下它在QMT里面的实盘交易代码,其实它还是挺适合熟悉通达信公式的朋友使用,很多语法是从通达信的公式演变而来的。有些指标直接可以拿去用的了。截取其中一个例子如下:
QMT vb编写交易代码
iQuant支持投资研究模块,可使用jupyter notebook逐行运行,便于调试。
而其他的券商QMT均没有这个功能。不过这个功能我试了下,它只调用我windows系统的jupyter notebook,且它有严重的bug,居然运行不了任何代码?!。(ptrade也有个类似这样的功能,可以逐行调用内置的获取行情的函数,ptrade的是可以正常运行的)
iQuant投资研究功能
少数券商的QMT无法在虚拟机运行
大部分券商的QMT可以在虚拟机里面运行,这意味可以在云主机服务器上运行,比如阿里云,腾讯云,在云服务器上网络和系统稳定性都有保证,比你在家里放台电脑要稳定,至少不会被家里的小孩倒腾拔了网线。
但也有少数券商的QMT无法在虚拟机里面运行。比如下图这个QMT登录提示
提示虚拟机运行
之前笔者粗略地对比了下不同券商QMT读取的系统信息,异同点在于磁盘序列号,如果想要硬刚的读者朋友可以尝试修改虚拟机(vmware)的硬盘序列号。
磁盘序列号为空
其他:
在python编写策略的代码层面,QMT和iQuant的接口文档也基本一致的,可能在一些功能函数上会有些少出入。二者写的python代码可互相在彼此上运行,区别不大。
QMT 与 miniQMT
miniQMT属于QMT的一个子功能,一个精简功能的自动交易框架,默认安装了QMT之后就可以使用miniQMT,只支持实盘交易,不支持回测。
在miniQMT模式下,你的策略代码将不再禁锢自带的QMT软件下的内置编辑器编写,而是可以自由地选择pycharm,vscode等编辑器,运行的时候直接使用 python xxxx.py 这样的形式启动。且有多个python版本可选。
只是券商很少对它进行宣传,以致于用它的人并不多。
进入miniQMT的方法:双击QMT程序,登录时勾选极简模式
进入极简模式
注意:极简模式下,需要一直保持这个miniQMT的程序在运行,这意味者miniQMT也只能在windows系统下运行,因为启动的程序只有exe格式的可执行文件。
XtQuant
而miniQMT的核心是XtQuant,XtQuant又是什么呢?
XtQuant是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的行情和交易相关的API接口。
XtQuant运行依赖环境
XtQuant目前提供的库包括Python3.6、3.7、3.8版本,不同版本的python导入时会自动切换。根据群友最新反馈,最新的版本的QMT可以支持到python3.11。
在运行使用XtQuant的程序前需要先启动MiniQMT客户端。
然后把你的QMT目录下的\bin.x64\Lib\site-packages\xtquant复制到你系统python目录下的site-packages。
xtquant
然后就可以在你的代码里面导入miniQMT的函数,包括获取行情数据函数,下单函数。
xtquant包含两个主要模块,xttrade和xtdata,一个负责控制交易流程,一个负责数据行情获取同步。
简单的python示例如下:
python代码
下面的是入口函数。
python代码
它的帮助文档藏在bin.x64\Lib\site-packages\xtquant\doc 目录下。
从它的帮助文档来看,它是一套和QMT接口函数完全不一样的交易框架。
xtquant接口文档
所以QMT的代码,无法直接拷贝到miniQMT中使用。虽然名字叫miniQMT,但感觉它提供的很多函数功能,要比QMT更为丰富,用户可以掌控的流程更多,更灵活。
iQuant版虽然也有精简版的miniQMT,但它对个人用户不提供下单功能呢,只对机构开放,所以个人只有获取行情数据,财务数据等的数据权限。
另外还有一个与之配套的xtdata库,是专门用来获取行情数据的,而上面的xttrade是专门用来交易下单的。
xtdata文档
因为xtdata可以获取很多股票,可转债,ETF等等历史数据,所以即使你不用miniQMT做交易,你也可以白嫖它的数据,这比用积分的tushare简直不要太爽。比如可以获取到股票或可转债的日线,分钟线,甚至tick数据。
比如下面的代码可获取 众信转债 的某个时间的历史tick数据,并保存到文件。(只要稍微改造下,就可以获取全市场的转债的tick数据。)
import pandas as pd
import datetime
def get_tick(code, start_time, end_time, period='tick'):
from xtquant import xtdata
xtdata.download_history_data(code, period=period, start_time=start_time, end_time=end_time)
data = xtdata.get_local_data(field_list=[], stock_code=[code], period=period, count=10)
result_list = data[code]
df = pd.DataFrame(result_list)
df['time_str'] = df['time'].apply(lambda x: datetime.datetime.fromtimestamp(x / 1000.0))
return df
def process_timestamp(df, filename):
df = df.set_index('time_str')
result = df.resample('3S').first().ffill()
# result = result[(result.index >= '2022-07-20 09:30') & (result.index <= '2022-07-20 15:00')]
result = result.reset_index()
result.to_csv(filename + '.csv')
def dump_single_code_tick():
# 导出单个转债的tick数据
code='128022'
start_date = '20210113'
end_date = '20210130'
post_fix = 'SZ' if code.startswith('12') else 'SH'
code = '{}.{}'.format(code,post_fix)
filename = '{}'.format(code)
df = get_tick(code, start_date, end_date)
dump_single_code_tick()
把上面保存为main.py, 然后执行python main.py , 片刻就可以看到生成的文件数据了
https://zhuanlan.zhihu.com/p/628512551
界面
以国金版为例,其登录界面如下,不同券商登录界面略有区别(不一定有极简模式)
进入软件以后的界面如下,主要分为行情、交易、模型研究、模型交易几个模块,各个券商的QMT界面大同小异。
二、为什么使用QMT
以前,自动化交易一直是散户的痛,大部分的自动化接口,都只针对机构,散户可以使用的方法很少,虽然有类似easyTrader的开源库解决过类似的问题,但是通过模拟按键的方式,我也尝试改造过,但不是很稳定。
而QMT,是直接调用券商接口,这就打通了量化交易最后这一环,暴露python API,可以用程序直接调用,这就很大程度上提升了自动化交易的稳定性,可编程性也很高。
三、QMT vs miniQMT(极简模式)
miniQMT是QMT的极简模式,这个模式一些券商有,一些券商没有。如何分辨有没有,就是看登录界面上有没有极简模式这个选项,当客户端以极简模式启动时,界面如下:
miniQMT与QMT最大的不同就是:
QMT模式需要将程序写在QMT客户端软件里运行;
而miniQMT模式,直接可以使用xtquant这个python包,在软件之外,写python程序与QMT客户端连接,进行程序化下单。聪明的朋友们应该看懂了,这样QMT客户端就完全变成一个交易终端了,我们的量化程序,完全可以独立于QMT运行,只要保证极简客户端运行着就好了。这就很大的释放了变成能力。
三、代码实战
多说无益,上代码,这里以miniQMT(极简模式)进行演示
下载xtquant
首先我们需要下载xtquant这个python包,我推荐从迅投官网下载,下面是下载链接
xtquant下载:http://docs.thinktrader.net/vip/pages/633b48/
下载最新版本即可,下载之后,将这个包放在你自己的python项目里,保证使用import可以引到。
官网的例子还是相对复杂,这里还是从最简单的示例开始,抽丝剥茧
创建交易对象
创建xt_trader对象需要两个参数:
path:路径,就是安装QMT软件的文件下下的/userdata_mini文件夹。
session_id: 回话id,当创建多个xt_trader对象时,需要不同,这里我们用6位随机数字生成。
连接QMT客户端
执行xt_trader.connect(),需要保证已登录QMT极简模式并保持客户端运行状态,即可连接成功。非极简模式进入客户端,是连接不成功了,亲测。
订阅账户
这一步是用来订阅资金账户的,xxxxx替换成你正在登录的资金账户号,订阅成功subscribe_result会是0,不成功是-1
下单
xtconstant.STOCK_BUY表单下单类型是买入,xtconstant.FIX_PRICE代表报价类型是限价,执行成功后,在miniQMT终端里,就直接可以看到委托记录,这就可以确认,我们的委托成功了。方法会返回订单变化,即下图中的订单编号。
撤单
四、如何开通
目前,QMT需要找券商公司开通,具体开通方法及要求,可以参看《QMT开通规则分享》
五、总结
本文介绍了QMT的基本概念和使用方法,并用miniQMT模式进行了实战,感觉相当好用,程序化交易不再是瓶颈了。后面会持续使用分享用法。
支付宝扫一扫捐赠
微信公众号: 共鸣圈
欢迎讨论,邮件: 924948$qq.com 请把$改成@
QQ群:263132197
QQ: 924948