希望快速开始使用天勤量化(TqSdk)?本页面将介绍如何开始使用TqSdk.
如果您以前曾经使用过其它框架编写过策略程序,这些内容可以快速帮助您了解TqSdk与它们的区别:
注意:TqSdk使用了python3的原生协程和异步通讯库asyncio,部分PythonIDE不支持asyncio,例如:
可以直接运行示例代码,或使用支持asyncio的IDE(例如:pycharm/vscode)
天勤量化的核心是TqSdk开发包,在安装天勤量化(TqSdk)前,你需要先准备适当的环境和Python包管理工具,包括:
你可以选择使用pip命令安装TqSdk,或者下载源代码安装.对于一般用户,我们推荐采用pip命令安装/升级TqSdk:
pipinstalltqsdk-U但是由于pip使用的是国外的服务器,普通用户往往下载速度过慢或不稳定,对于使用pip命令下载速度较慢的用户,我们推荐采用切换国内源的方式安装/升级TqSdk:
在注册完快期账户后,让我们从一个简单的例子开始
通过TqSdk获取实时行情数据是很容易的.
首先,必须引入tqsdk模块:
fromtqsdkimportTqApi,TqAuth创建API实例,并填入自己的快期账户:
api=TqApi(auth=TqAuth("快期账户","账户密码"))获得上期所ni2206合约的行情引用:
quote=api.get_quote("SHFE.ni2206")现在,我们获得了一个对象quote.这个对象总是指向SHFE.ni2206合约的最新行情.我们可以通过quote的各个字段访问行情数据:
print(quote.last_price,quote.volume)要等待行情数据更新,我们还需要一些代码:
很简单,对吗到这里,你已经了解用TqSdk开发程序的几个关键点:
下面我们将继续介绍TqSdk更多的功能.无论使用哪个功能函数,都遵循上面的结构.
你很可能会需要合约的K线数据.在TqSdk中,你可以很方便的获得K线数据.我们来请求ni2206合约的10秒线:
klines=api.get_kline_serial("SHFE.ni2206",10)klines是一个pandas.DataFrame对象.跟api.get_quote()一样,api.get_kline_serial()也是返回K线序列的引用对象.K线序列数据也会跟实时行情一起同步自动更新.你也同样需要用api.wait_update()等待数据刷新.
一旦k线数据收到,你可以通过klines访问k线数据:
我们也可以通过传入一个合约列表作为参数,来获取包含多个合约数据的K线:
到这里为止,你已经知道了如何获取实时行情和K线数据,下面一段将介绍如何访问你的交易账户并发送交易指令
#引入TqSdk模块fromtqsdkimportTqApi,TqAuth#创建api实例,设置web_gui=True生成图形化界面api=TqApi(web_gui=True,auth=TqAuth("快期账户","账户密码"))#订阅ni2010合约的10秒线klines=api.get_kline_serial("SHFE.ni2010",10)whileTrue:#通过wait_update刷新数据api.wait_update()当你运行该程序后,预期会显示如下两条信息:
要获得你的账户资金情况,可以请求一个资金账户引用对象:
account=api.get_account()要获得你交易账户中某个合约的持仓情况,可以请求一个持仓引用对象:
position=api.get_position("DCE.m1901")与行情数据一样,它们也通过api.wait_update()获得更新,你也同样可以访问它们的成员变量:
print("可用资金:%.2f"%(account.available))print("今多头:%d手"%(position.volume_long_today))要在交易账户中发出一个委托单,使用api.insert_order()函数:
order=api.insert_order(symbol="DCE.m2105",direction="BUY",offset="OPEN",volume=5,limit_price=3000)这个函数调用后会立即返回,order是一个指向此委托单的引用对象,你总是可以通过它的成员变量来了解委托单的最新状态:
print("委托单状态:%s,已成交:%d手"%(order.status,order.volume_orign-order.volume_left))要撤销一个委托单,使用api.cancel_order()函数:
在这一节中,我们将创建一个简单的自动交易程序:每当行情最新价高于最近15分钟均价时,开仓买进.这个程序是这样的:
klines=api.get_kline_serial("DCE.m2105",60)whileTrue:api.wait_update()ifapi.is_changing(klines):ma=sum(klines.close.iloc[-15:])/15print("最新价",klines.close.iloc[-1],"MA",ma)ifklines.close.iloc[-1]>ma:print("最新价大于MA:市价开仓")api.insert_order(symbol="DCE.m2105",direction="BUY",offset="OPEN",volume=5)上面的代码中出现了一个新函数api.is_changing().这个函数用于判定指定对象是否在最近一次wait_update中被更新.
自己的交易程序写好以后,我们总是希望在实盘运行前,能先进行一下模拟测试.要进行模拟测试,只需要在创建TqApi实例时,传入一个backtest参数:
fromtqsdkimportTqApi,TqAuth,TqAccount#如果要更换为徽商期货,只需要改为H徽商期货api=TqApi(TqAccount("H宏源期货","412432343","123456"),auth=TqAuth("快期账户","账户密码"))
快期模拟的资金可以通过快期APP、快期专业版的模拟银行进行出入金,也可以通过快期专业版对该账户进行重置:
fromtqsdkimportTqApi,TqAuth,TqKqapi=TqApi(TqKq(),auth=TqAuth("快期账户","账户密码"))特别的,如果创建TqApi实例时没有提供任何TqAcccount账户或TqKq模块,则每次会自动创建一个临时模拟账号,当程序运行结束时,临时账号内的记录将全部丢失: