学习QMT股票量化系统,从回测到模拟交易
很多人对量化不太了解,甚至有些误解,一提到量化,想到的就是高频交易。其实量化就是用数据来说话,当我们想到了一种交易方法,能否盈利呢?我们可以先用代码把它编写成策略,然后用历史行情数据来进行检验,计算它的胜率、年化收益等,如果满意它的收益,我们再用这个方法来投入实战,如果不经过检验就直接投入实战,万一亏损了,就造成了我们真金白银的损失。高频交易只是量化的一种,量化可以高频,也可以低频。
好了,制度上的事,自有人会操心,我们只谈技术。
当我们在回测中取到满意的效果后,是不是一定能在实战也能取得好的收益呢?不一定的。因为回测我们用的是历史数据,可行情每天都在发展变化,每天都有新的事情发生,有句名言说:“每天的太阳都是新的。”所以,慎重起见,我们回测过后,有必要再进行一段时间的模拟交易,回测效果好,模拟效果也好,我们再投入实战。
另外,模拟交易,还可以检验一下代码有无问题,能否按设想下单,能否成交等等问题。
一、软件版本的选择
要进行模拟交易,我们有两个选择,一个是迅投官方试用版软件,因为是试用版,我们在策略运行时,选实盘模式,依然还是模拟交易。没有跟自己真实交易账户绑定,自然不会是真实交易,但据说目前试用期只有两个星期。
第二个选择是券商的QMT模拟交易软件,模拟交易无时间限制。在此软件上运行策略,依然要选择实盘模式,虽是实盘模式,但账号资金都是模拟的,赚钱也都只是“纸上富贵”。
为什么要运行在实盘模式而不是模拟模式呢?因为在模拟模式下,它只发出买卖信号,不下单交易。
只有运行在实盘模式下,买卖信号发生后,才会下单,成交。
QMT交易端模拟跟真正的实盘交易端,操作上没太大区别。
二、修改代码
首先我们要新建一个类。
classa():passA=a()encoding:gbk'''四周法则策略,股价大于前4日最高价,全仓买入,小于前4日最低价,全仓卖出注意:本策仅用于python量化学习,不用于真实交易'''importpandasaspdimportnumpyasnpclassa():passA=a()设置股票代码和账户=+'.'+='youraccID'_type="stock"_list=[]设置周期_period=4defhandlebar(C):跳过历史k线_last_bar():returnbar_date=timetag_to_datetime(_bar_timetag(),'%Y%m%d%H%M%S')计算四日最大值LOW_4=(low).rolling(window=_period).min()获取账户信息account_info=get_trade_detail_data(,_type,'account')ifnotaccount_info:print("无法获取账户信息")returnaccount_info=account_info[0]available_cash=int(account__dAvailable)全仓买入逻辑ifholding_vol==0andclose[-1]HIGH_4[-2]:print("此时超过了最高价!")下单买入passorder(23,1101,,,5,-1,buy_volume,1,C)print(f"{bar_date}开仓")print("holding_vol=",holding_vol)_text(1,1,'买')获取持仓信息position_info=get_trade_detail_data(,'stock','position')ifnotposition_info:print("无法获取持仓信息")return可用资金print("可用资金为:",available_cash)三、模拟交易
2、然后选择模拟交易账号,在运行周期中,我们选择了5分钟,主要是为了更快速地看到下单及成交效果,并非为了更好地盈利。这个运行周期要跟策略编辑页的运行周期一致。
3、选择"实盘"模式,再点“操作”下小三角按钮运行。
策略开始模拟运行,耐心等待交易信号的发生。
(先喝杯咖啡,然后站起来伸伸腰,看看窗外,嗯,这个世界是多么美好!)
…………
交易信号终于出现了!
下单了,成交了,自动交易功能实现了。至于效益如何,那就需要更长的一段时间来验证了。
总结:今天最容易让人搞糊涂的是,说的是模拟,操作时又选择实盘模式,到底是模拟还是实盘啊?
是模拟,客户端是模拟端,账号是模拟账号,资金也是模拟资金,操作上选实盘模式,是因为模拟模式只提示买卖信号,不下单,实盘模式下会下单成交,但依然是模拟交易。