1. 准备工作

先打开同花顺智能交易 SuperMind版,确保需要使用交易接口的账户处于已登录状态. 没有购买想体验?可以下载仿真版本创建模拟账户:http://zjcmpp.hexin.com.cn/download/lhjy3/Free/THS_Qstudio_Setup_Mfjy.exe 注意:只支持win系统。登录账号用同花顺账号登陆即可。如没有账号点击登录框左下角注册。

再进入量化交易标签下的研究环境

2. 账户信息查询

导入包

In [1]:
from tick_trade_api.api import TradeAPI
import pandas as pd

连接账户 创建trade_api对象

注意资金账户必须是在客户端已经登录!!

In [2]:
trade_api = TradeAPI(account_id='69271711') #填入已登录的资金账号

查询账户资金状况

In [ ]:
portfolio = trade_api.portfolio

返回一个NameDict对象,其中变量的意义可查询下面的表格。需要注意的是Namedict对象仅可以根据键值获取数值,并不具备字典可迭代等其他的特性

In [ ]:
portfolio
In [ ]:
portfolio['market_value']
变量 释意
available_cash 可用资金
market_value 证券市值
frozen_cash 冻结资金
total_value 总资产

由于网络波动,极小概率出现查询超时报错,可以通过try、except等函数捕获该错误,操作如下:

In [ ]:
for _ in range(3):
    try:
        positions = trade_api.positions
        break
    except:
        continue

查询账户持仓信息

In [ ]:
positions = trade_api.positions

返回一个字典对象,键值为证券代码;对应的数据为一个Namedict对象, 包含证券的各种信息。对应变量的意义可查询下面的表格。需要注意的是Namedict对象仅可以根据键值获取数值,并不具备字典可迭代等其他的特性

In [ ]:
positions
In [ ]:
positions['000001.SZ']['name']
变量 释意
name 股票名
available_amount 可用证券数量
cost_basis 成本
last_price 最新价
amount 证券数量
profit_rate 收益率
frozen_amount 冻结数量
market_value 证券市值
symbol 证券代码
pnl 盈亏金额

以下提供一个将持仓信息转化为DataFrame对象的方法,可供进一步分析使用

In [ ]:
vb_list = ['symbol', 'name', 'amount', 'available_amount', 'frozen_amount', 'cost_basis', 'last_price', 'market_value', 'pnl', 'profit_rate']
In [ ]:
positions_df = pd.DataFrame()
for symbol, info in positions.items():
    temp = pd.DataFrame([[info[vb] for vb in vb_list]], columns=vb_list, index=[0])
    positions_df = pd.concat([positions_df, temp], ignore_index=True)
positions_df

3. 下单、撤单及信息查询函数

市价单

当amount为负数时为卖出指令,下单成功后返回委托ID('order_id'),委托ID可用于撤单函数进行撤单。

In [ ]:
trade_api.order(symbol='300033.SZ', amount=100)

限价单

当amount为负数时为卖出指令,下单成功后返回委托ID('order_id'),委托ID可用于撤单函数进行撤单。

In [ ]:
trade_api.order(symbol='000001.SZ', amount=100, price=13.4)

智能下单

可以通过指定pricetype实现更多样化的下单需求

pricetype 意义 pricetype 意义
0 指定价 1 涨停价
2 跌停价 3 最新价
4 卖一价 5 卖二价
6 卖三价 7 卖四价
8 卖五价 9 买一价
10 买二价 11 买三价
12 买四价 13 买五价

当pricetype为0时,以price的价格下单;
当pricetype为1-13时,price表示pricetype指定价格的浮动价,最终下单委托价格pricetype指定价格+price,若最终价格大于涨停价,最终价格取涨停价 , 若小于跌停价,最终价格取跌停价

In [ ]:
trade_api.order(symbol='002109.SZ', amount=100, price=0.3, pricetype=8)

以卖五价上浮0.3元挂100股002109的买单

撤单

传入委托ID即可撤销指定未成交委托

In [ ]:
trade_api.cancel_order('11591684178816')

如果该委托已成交或者已撤单则会报错

In [ ]:
trade_api.cancel_order('11591684178816')

可以通过try、except等函数捕获该错误,操作如下

In [ ]:
try:
   trade_api.cancel_order('11591684178816')
except:
   print('撤单失败: 不允许的指令:已完成或取消中的条件单不允许取消')

查询委托结果

委托的结果可以通过get_orders函数查询, 同时也能在智能交易终端查看到

get_orders(order_id=None, start_time=None, end_time=None)

参数解释:

  • order_id:订单编号
  • start_time:历史查询的开始时间
  • end_time:历史查询的截止时间

默认查询当日所有订单

In [ ]:
trade_api.get_orders()

查询某笔订单的状态

In [ ]:
trade_api.get_orders('941297')

查询历史订单

In [ ]:
trade_api.get_orders(None,'20210810','20210819')

支持直接查询柜台的委托情况

In [ ]:
trade_api.secondary_orders()
字段 含义 _ 字段 含义
order_id 委托编号 _ price 委托价格
datetime 时间 _ status 委托状态
symbol 证券代码 _ price_type 委托价格类型
name 证券名称 _ trade_price 成交价格
side 买卖方向 _ trade_amount 成交数量
amount 委托数量 _ secondary_order_id 柜台委托编号

查询成交结果

成交的结果可以通过get_tradelogs函数查询, 同时也能在智能交易终端查看到

In [ ]:
trade_api.get_tradelogs()
字段 含义 _ 字段 含义
datetime 时间 _ trade_price 成交价格
secondary_order_id 柜台委托编号 _ amount 成交数量
symbol 证券代码 _ side 买卖方向
name 证券名称 _ commission 费用

委托成交情况主动推送

设定下列回调函数后,再下达委托函数,即可主动推送成交情况

In [3]:
def order_push(order):
    print("接收到订单推送: ", order)
trade_api.register_push(orderpush=order_push)

4. 算法交易

自动撤追单算法

trade_api.NEW_RECHASE(reprice=None, spread=0, entrustcnt=3, revoke=True, timeout=60)

参数解释:

  • reprice:设定追单的价格,设置为None时追单算法不生效,设置为0时以最新价格追单1次,且后续不再追单,设置为大于0时以reprice价格追单
  • spread:价差比。|(追单价格-第一次下单价格)/第一次下单价格|≤spread时,以追单价格下单,否则以第一次下单价格*(1±spread)下单,且后续不再追单。
  • entrustcnt:交易次数,默认3次。
  • revoke: 是否撤单,默认撤单。
  • timeout: 撤单间隔,默认60s。

创建一个自动追单下单对象 设置追单价格为82元,价差比为0.15,交易次数为3次,自动撤单,撤单时间为30秒

In [23]:
rechase_api = trade_api.NEW_RECHASE(reprice=82, spread=0.15, entrustcnt=3, revoke=True, timeout=5)
rechase_api.order('601012.SH',amount=100, price=79)
2021-08-23 15:30:19,188 - INFO - {'detail': 'Symbol 601012.SH 已委托, 委托时间 2021-08-23 15:30:19.188076, 委托编号 948491', 'process': 'main', 'log_id': '93d1fa48-99f1-4549-b4b7-6483cf76bad2'}
Out[23]:
'948491'

设置好追单参数以后, 自动下单追单对象的使用方法和普通下单api一样

此接口另有一隐藏参数repricetype,repricetype含义等同pricetype,指定repricetype时,reprice等同price,参考智能下单

In [24]:
rechase_api = trade_api.NEW_RECHASE(reprice=0.01, spread=0.15, entrustcnt=3, revoke=True, timeout=5, repricetype=10)
rechase_api.order('601012.SH', amount=200, price=79)
2021-08-23 15:31:50,795 - INFO - {'detail': 'Symbol 601012.SH 已委托, 委托时间 2021-08-23 15:31:50.795702, 委托编号 948492', 'process': 'main', 'log_id': '93d1fa48-99f1-4549-b4b7-6483cf76bad2'}
Out[24]:
'948492'

篮子交易

In [ ]:
basket_api = trade_api.NEW_BASKET()
rechase_api = trade_api.NEW_RECHASE(reprice=None, spread=0, entrustcnt=3, revoke=True, timeout=60)
basket_api.add(symbol='000001.SZ', amount=100, algo_api=rechase_api)  # 添加订单到篮子,可多次添加
basket_api.add(symbol='000001.SZ', amount=100, algo_api=rechase_api)  # 添加订单到篮子,可多次添加
basket_api.add(symbol='000001.SZ', amount=100, algo_api=rechase_api)  # 添加订单到篮子,可多次添加
basket_api.order(balance=1000)  # 指定篮子使用的资金,默认0为全部

TWAP算法

twap_api = trade_api.NEW_TWAP(start_time='09:30', end_time='15:00', order_interval=60, rechase_interval=30, min_order_number=100, max_order_number=10000)

参数解释:

  • start_time: 启动时间,不能大于收盘时间和结束时间,默认09:30。
  • end_time: 结束时间,不能大于收盘时间,默认15:00。
  • order_interval: 下单间隔,最好大于10,给前一笔订单充分成交和撤单时间,默认60s。
  • rechase_interval: 补单间隔,大于等于0,小于order_interval,如果为0则下单间隔内不撤单,默认30s。
  • min_order_number: 最小下单的股票数量,默认100股。
  • max_order_number: 最大下单的股票数量,默认10000股。
  • randprice: 浮动价格,非必填,委托时在price+-randprice范围内波动。

算法说明:
1、算法根据起止时间、下单间隔、最大最小下单数量,来确定订单拆分笔数和每笔订单委托数量;
2、订单拆分完成后,每2笔订单下单时间间隔order_interval秒,每笔订单下单之后如未完成则间隔rechase_interval秒后进行撤补操作,撤补不影响下1笔订单,举例而言,一笔300股的订单,order_interval为60秒,rechase_interval为30秒,下单起止时间t1、t2间隔3分钟,则t1下单100股,t1+30s撤补,t1+60s下单100股,以此类推

创建一个TWAP下单对象,委托价格为最新价上浮0.01元,浮动范围为1元,下单间隔为60秒,撤补间隔为30秒

In [ ]:
twap_api = trade_api.NEW_TWAP(start_time='09:30', end_time='15:00', order_interval=60, rechase_interval=30, min_order_number=100, 
                              max_order_number=10000,randprice=1)
twap_api.order(symbol='000001.SZ', amount=100, price=0.01,pricetype=3) # 限价单,amount为负数代表卖出

VWAP算法

vwap_api = trade_api.NEW_VWAP(start_time='09:30', end_time='15:00', order_interval=60, rechase_interval=30, min_order_number=100, max_order_number=10000, ordercycle=1, sampledays=30)

参数解释:

  • str start_time: 启动时间,不能大于收盘时间和结束时间,默认09:30。
  • str end_time: 结束时间,不能大于收盘时间,默认15:00。
  • int order_interval: 下单间隔,最好大于10,给前一笔订单充分成交和撤单时间,默认60s。
  • int rechase_interval: 补单间隔,大于等于0,小于order_interval,如果为0则下单间隔内不撤单,默认30s。
  • int min_order_number: 最小下单的股票数量,默认100股。
  • int max_order_number: 最大下单的股票数量,默认10000股。
  • int ordercycle: 分段周期,1、5、15、30、60分钟k线,默认1分。
  • int sampledays: 样本天数,默认30天。
  • float randprice: 浮动价格,非必填,委托时在price+-randprice范围内波动。
In [ ]:
vwap_api = trade_api.NEW_VWAP(start_time='09:30', end_time='15:00', order_interval=60, rechase_interval=30, min_order_number=100, max_order_number=10000, ordercycle=1, sampledays=30)
vwap_api.order(symbol='000001.SZ', amount=100) # 最新价下单,amount为负数代表卖出

冰山算法

iceberg_api = trade_api.NEW_ICEBERG(start_time='09:30', end_time='15:00', order_percent=0.05, rechase_interval=30)

  • str start_time: 启动时间,不能大于收盘时间和结束时间,默认09:30。
  • str end_time: 结束时间,不能大于收盘时间,默认15:00。
  • int order_percent: 每单占比,默认0.05。
  • int rechase_interval: 补单间隔,大于等于0,小于order_interval,如果为0则下单间隔内不撤单,默认30s。
  • float randprice: 浮动价格,非必填,委托时在price+-randprice范围内波动。
  • int entrusttype: 委托方式,非必填,0-全成即补(默认)、1-部成即补。
  • float entrusttraderatio: 成交比例,非必填,当entrusttype=1时的成交比例,默认为0,只要部成就补单。
  • int entrusttimeout: 成交超时时间,非必填,当entrusttype=1时的成交超时时间,默认为0,只要部成就补单。

算法说明:
一个母单拆成多个小单。
每笔子单的数量是一定的,子单数量 = 委托数量 每单占比 , 取下整(手)
一笔子单不成交,达到撤单间隔时会撤单,撤单成功后再委托下一笔子单。
5种委托方式:
全成即补:前一个子单全部成交完成,后一个子单才会发单。
部成即补:前一个子单部分成交,后一个子单即委托出去,但是必须等到第一个子单全部成交,第二个子单部分成交,才可以委托第三个子单。
成交占比:比如总委托量是10000,暴露量是1000。当比例是50%,第一次暴露量是1000,然后部分成交了400(1000
40%),是不会到第二次补单的;一直到成交了大于等于500(1000*50%)才会第二次委托。同时,必须等到第一个子单全部成交,第二个子单到50%,才可以委托第三个子单。
成交超时:指超过一定时间,虽未成交,但也自动再补一笔。成交超时的规则:比如900s,指的是如果第一笔委托后900s,仍旧出现未成交or部分成交,就直接开始第二次委托。同时,必须等到第一个子单全部成交,第二个子单到委托后900s,才可以委托第三个子单。
占比和超时同时设置:则只需要并且必须其中任何一个满足条件,才进行委托

In [ ]:
iceberg_api = trade_api.NEW_ICEBERG(start_time='09:30', end_time='15:00', order_percent=0.05, rechase_interval=30)
iceberg_api.order(symbol='000001.SZ', amount=100) # 最新价下单,amount为负数代表卖出

5. 融资融券交易

先打开同花顺智能交易 SuperMind版,确保需要使用交易接口的信用账户处于已登录状态

导入包

In [ ]:
from tick_trade_api.api import TradeCredit as TradeAPI, SIDE

建立连接

In [ ]:
trade_api = TradeAPI(account_id='18771019820')

账号各类资产及委托查询函数

In [ ]:
print("账号信息:", trade_api.portfolio)
print("持仓信息:", trade_api.positions)
print("成交信息:", trade_api.get_tradelogs())
print("委托信息:", trade_api.get_orders()) # 可传入order_id查询指定委托信息
print("柜台委托信息:", trade_api.secondary_orders())
print("可融资标的券:", trade_api.get_stocks()

最新价下单

In [ ]:
trade_api.order(symbol='000001.SZ', amount=100, side=SIDE.BUY) # 最新价下单,担保品买入
trade_api.order(symbol='000001.SZ', amount=100, side=SIDE.FINANCE_BUY) # 最新价下单,融资买入
trade_api.order(symbol='000001.SZ', amount=100, side=SIDE.SALE) # 最新价下单,担保品卖出
trade_api.order(symbol='000001.SZ', amount=100, side=SIDE.STOCK_SALE) # 最新价下单,融券卖出

限价下单

In [ ]:
trade_api.order(symbol='000001.SZ', amount=100, price=10, side=SIDE.BUY) # 限价单

撤单

In [ ]:
trade_api.cancel_order('107828')