一、获取K线数据

get_price(API说明)和get_candle_stick(API说明)函数支持获取实时K线数据,以下是一些使用说明:

  • T日日级数据,数据标签为T日;HH:MM:00-HH:MM+1:00分钟级数据,数据标签为HH:MM+1:00
  • 二者均支持分钟级、日级频率,月线及以上级别K线get_price不支持,get_candle_stick支持
  • K线合成方式不同,比如get_price(["600000.SH"],None,"20220118 14:04","5m",["open","close"],bar_count=5)是以截止时间向前推,每5条1分钟数据合成1条数据;get_candle_stick(["600000.SH"],"20220118 14:04","5m",["open","close"],bar_count=5)则是最后4条1分钟数据合成1条数据,再向前推,每5条1分钟数据合成1条数据,合成方式与行情软件的K线图一致
  • 在T日9:25之后,get_priceget_candle_stick能够获取数据标签为T日的日级数据,由当日开盘到当前时间的数据合成,截止于最新tick数据,所以在取当日行情时,不同时间取到的数据可能是不一样的
In [9]:
get_price("600000.SH", "20231001", "20231016", "1d", ["open", "high", "low", "close"])
Out[9]:
open high low close
2023-10-09 7.08 7.08 7.00 7.03
2023-10-10 7.13 7.14 7.01 7.01
2023-10-11 7.06 7.08 7.01 7.02
2023-10-12 7.09 7.17 7.06 7.14
2023-10-13 7.11 7.15 7.08 7.10
2023-10-16 7.12 7.13 7.04 7.06
In [23]:
get_candle_stick("600000.SH", end_date='20231016 1500', fre_step='1m', fields=["open", "high", "low", "close"], bar_count=5)
Out[23]:
open high low close
2023-10-16 11:11:00 7.06 7.07 7.06 7.07
2023-10-16 11:12:00 7.07 7.07 7.06 7.06
2023-10-16 11:13:00 7.07 7.07 7.06 7.06
2023-10-16 11:14:00 7.06 7.07 7.06 7.06
2023-10-16 11:15:00 7.06 7.07 7.06 7.07

二、获取高频数据

1. get_tick(API说明)函数支持获取实时tick数据

In [32]:
get_tick(["601012.SH"],"20231016 09:30","20231016 09:30:20",["current","volume"])
Out[32]:
id_stock trade_date current volume
0 601012.SH 2023-10-16 09:30:02 26.68 793600
1 601012.SH 2023-10-16 09:30:05 26.68 1071700
2 601012.SH 2023-10-16 09:30:08 26.70 1193060
3 601012.SH 2023-10-16 09:30:11 26.71 1346140
4 601012.SH 2023-10-16 09:30:14 26.75 1447340
5 601012.SH 2023-10-16 09:30:17 26.75 1594540
6 601012.SH 2023-10-16 09:30:20 26.77 1631340

2. get_current(API说明)函数支持获取最新一笔tick数据中的指定字段信息

In [27]:
get_current("600000.SH", ["current"])
Out[27]:
id_stock current
0 600000.SH 7.08

三、接收高频数据推送

以上接口为主动获取行情数据,结果立即返回,可在策略框架内使用。除此之外,研究环境还支持通过DataFeed来接收高频数据推送,包括证券快照、逐笔成交、逐笔委托、委托队列等数据。

DataFeed的工作模式是:客户端将订阅信息(包括需要哪些股票、哪些数据类型)发送到服务端,等待服务端推送数据;服务端在接收到交易所给出的数据后,即时分发给需要这部分数据的客户端,因此函数不是立刻返回行情数据的。需要注意的是,DataFeed的工作模式与策略框架会产生冲突,请勿一起使用。

DataFeed的使用说明详见 Datafeed数据接口使用教程.ipynb

In [ ]:
from tick_trade_api import DatafeedHqGenerator
g1 = DatafeedHqGenerator(stock=['300033.SZ'])
for d in g1:
    print(d)
    print('\n')
    
    print('通过属性获取成交金额:%s' % d['turnover'])
    print('通过属性获取成交金额:%s' % d.turnover)
    break

注意事项:

  • 接收到服务端推送数据之后,存储在DatafeedHqGenerator的属性queue:queue.Queue中,用户逐一取出后进行计算
  • 高频行情数据数据量极大,需要保证每条数据处理的效率,否则会导致数据堆积,一方面后续接收的数据不能及时处理,造成延时,另一方面会使内存占用逐步升高,造成程序崩溃

DataFeed应用实例

In [34]:
import pandas as pd
import datetime
from tick_trade_api import DatafeedHqGenerator
from tick_trade_api.api import TradeAPI

def symbol_convert(x):
    if x >= '600000':
        return x + '.SH'
    else:
        return x + '.SZ'
    
trade_api = TradeAPI(account_id='58035826') #填入已登录的资金账号
symbol_list = ['000932.SZ', '600801.SH']   # 设置股票池
shares = 200 # 设置统一的最大交易股票数量
up_per = 0.07  # 设置触发买入的涨幅阈值

g1 = DatafeedHqGenerator(stock=symbol_list)
date_str = datetime.date.today().strftime('%Y%m%d')
print(date_str)
print('启动涨幅监控')
print('\n')
for d in g1:
    print(d.trade_time.strftime('%H:%M:%S'))
    symbol = d.code
    symbol = symbol_convert(symbol)
    # 在每一条行情推送计算股票涨幅
    ret = d.new_price / d.pre_price - 1.0
    # 打印涨幅
    print('%s 涨幅为 %.2f%%' % (symbol, ret * 100))
    if ret >= up_per:
        print('%s 超过预警涨幅 %.2f%% 正在检查剩余量' % (symbol, up_per * 100))
        # 检查是否还有待委托的股票余量
        order_list = trade_api.get_orders()
        order_list = [x for x in order_list if x['symbol'] == symbol]
        order_list = [x for x in order_list if x['status'] != '全部撤单']
        order_left = shares - np.sum([x['amount'] for x in order_list])
        # 存在余量时下单交易
        if order_left > 0:
            print('    剩余委托量%s,正在下单' % order_left)
            trade_api.order(symbol, order_left)
        # 不存在余量时不执行
        else:
            print('    委托余量不足')
    print('\n')
2023-10-16 14:52:30.554432 - INFO - 行情接口登录成功
2023-10-16 14:52:30.863612 - INFO - 开始监听行情数据
20231016
启动涨幅监控


14:52:31
600801.SH 涨幅为 -1.01%


14:52:30
000932.SZ 涨幅为 0.51%


14:52:34
600801.SH 涨幅为 -1.01%


14:52:33
000932.SZ 涨幅为 0.51%


14:52:37
600801.SH 涨幅为 -1.01%


14:52:36
000932.SZ 涨幅为 0.51%


14:52:40
600801.SH 涨幅为 -0.81%


14:52:39
000932.SZ 涨幅为 0.34%


---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-34-40f039548495> in <module>
     20 print('启动涨幅监控')
     21 print('\n')
---> 22 for d in g1:
     23     print(d.trade_time.strftime('%H:%M:%S'))
     24     symbol = d.code

/opt/conda/lib/python3.8/site-packages/tick_trade_api/api/datafeed_api.pyc in __next__(self)

/opt/conda/lib/python3.8/site-packages/tick_trade_api/api/datafeed_api.pyc in get_next_bar(self, block)

/opt/conda/lib/python3.8/queue.py in get(self, block, timeout)
    168             elif timeout is None:
    169                 while not self._qsize():
--> 170                     self.not_empty.wait()
    171             elif timeout < 0:
    172                 raise ValueError("'timeout' must be a non-negative number")

/opt/conda/lib/python3.8/threading.py in wait(self, timeout)
    300         try:    # restore state no matter what (e.g., KeyboardInterrupt)
    301             if timeout is None:
--> 302                 waiter.acquire()
    303                 gotit = True
    304             else:

KeyboardInterrupt: 
In [ ]: