行情数据查询函数(免费)
last_tick - 查询已订阅的最新 Tick (多标的)
查询已订阅的最新 Tick
函数原型:
last_tick(symbols, fields="", include_call_auction = False)
参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbols | str or list | 查询代码,如有多个代码, 中间用 , (英文逗号) 隔开, 也支持 ['symbol1', 'symbol2'] 这种列表格式 ,使用参考symbol。非必填,默认为订阅代码:与 subscribe 订阅了 frequency='tick' 的标的代码 symbols 一致,也可以从订阅 tick行情 的 symbol 中选择所需标的代码。 |
| fields | str | 查询字段, 默认所有字段 具体字段见:Tick |
| include_call_auction | bool | 包含集合竞价, 实时模式,是否包含集合竞价的tick,默认是False |
返回值:
list[dict]
示例:
def init(context):
context.symbol_list = ['SZSE.000002', 'SHSE.600000']
context.index_symbol = 'SHSE.000001'
subscribe(symbols=context.symbol_list + [context.index_symbol], frequency='tick')
schedule(schedule_func=algo, date_rule='1d', time_rule='14:50:00')
def on_tick(context, tick):
symbol = tick['symbol']
if symbol == context.index_symbol:
# 每次收到指数行情,获取订阅股票的最新tick,避免每个股票的tick都触发,多次查询占用资源
data = last_tick(symbols=context.symbol_list, fields='symbol,price,open,created_at')
print(data)
# 或者定时任务里调用
def algo(context):
data = last_tick(symbols=context.symbol_list, fields='symbol,price,open,created_at')
print(data)
输出:
[{'symbol': 'SZSE.000001', 'price': 16.559999465942383, 'created_at': datetime.datetime(2020, 10, 15, 15, 0, 3, tzinfo=tzfile('PRC'))}]
注意:
1. 输入的 symbols 必须先订阅 tick,如果 last_tick 查询的标的代码不在 tick 行情订阅范围内,则返该代码的 tick 字典,除 symbol 外其他字段均为 空字符串/0
2. 若输入代码有效,在 tick 行情订阅范围内,但查询字段 fields 中包括错误字段,返回的列表仍包含对应数量的dict,但每个dict中除有效字段外,其他字段的值均为空字符串/0
3. 回测只有 symbol、price 和 created_at 字段有效,其余字段为0,实时模式全部字段有效。
4. 实时模式获取集合竞价的tick数据,需要指定include_call_auction=True,注意集合竞价阶段没有成交,有效字段只有报价quotes。
5. 回测模式,先订阅标的行情 frequency='tick' 再调用 last_tick ,会返回回测当前时刻最新的 tick.price,如果超出历史行情权限会报错中止回测。
current_price - 查询当前最新价
查询当前最新价
函数原型:
current(symbols, fields='')
参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbols | str or list | 查询代码,如有多个代码, 中间用 , (英文逗号) 隔开, 也支持 ['symbol1', 'symbol2'] 这种列表格式 ,使用参考symbol |
返回值:
list[dict]
示例:
current_data = current_price(symbols='SZSE.000001')
输出:
[{'symbol': 'SZSE.000001', 'created_at': datetime.datetime(2025, 7, 29, 15, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), 'price': 12.34}]
注意:
1. 若输入包含无效标的代码,则返回的列表只包含有效标的代码对应的dict
2. 回测模式,如果订阅标的行情 frequency='tick' 或 frequency='60s' 再调用 current ,会返回回测当前时刻最新的 tick.price(订阅 tick)或 bar.close(订阅分钟bar),超出历史行情权限会报错中止回测。
3. 回测模式,如果订阅标的行情日线 frequency='1d' 或 不订阅行情,直接调用 current ,会根据 run() 函数指定的 backtest_intraday 参数返回:(python SDK版本 >= 3.0.178起)
- backtest_intraday=0,返回回测当前时刻的历史最新日线收盘价(T日盘中为T-1日收盘价,T日盘后为T日收盘价);
- backtest_intraday=1,返回回测当前交易日的日线收盘价(T日盘中和盘后均为T日收盘价)
history - 查询历史行情
查询标的在指定时间段的历史行情数据
函数原型:
history(symbol, frequency, start_time, end_time, fields=None, skip_suspended=True,
fill_missing=None, adjust=ADJUST_NONE, adjust_end_time='', df=True)
参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码,若要获取多个标的的历史数据,可以采用中间用 , (英文逗号) 隔开的方法,但不能是list类型的输入参数,使用时参考symbol |
| frequency | str | 频率, 支持 'tick', '1d', '60s'等, 默认 '1d', 详情见股票行情数据 |
| start_time | str or datetime.datetime | 开始时间 (%Y-%m-%d %H:%M:%S 格式), 也支持datetime.datetime格式, 其中日线包含start_time数据, 非日线不包含start_time数据 |
| end_time | str or datetime.datetime | 结束时间 (%Y-%m-%d %H:%M:%S 格式), 也支持datetime.datetime格式 |
| fields | str | 指定返回对象字段, 如有多个字段, 中间用, 隔开, 默认所有, 具体字段见:Tick对象或者Bar对象 |
| skip_suspended | bool | 是否跳过停牌, 默认跳过 |
| fill_missing | str or None | 填充方式, None - 不填充, 'NaN' - 用空值填充, 'Last' - 用上一个值填充, 默认None |
| adjust | int | ADJUST_NONE or 0: 不复权, ADJUST_PREV or 1: 前复权, ADJUST_POST or 2: 后复权 默认不复权 |
| adjust_end_time | str | 复权基点时间, 默认当前时间 |
| df | bool | 是否返回 dataframe格式, 默认 False, 返回list[dict] |
当df = True时, 返回
| 类型 | 说明 |
|---|---|
| dataframe | tick的dataframe 或者 bar的dataframe |
示例:
history_data = history(symbol='SHSE.000300', frequency='1d', start_time='2010-07-28', end_time='2017-07-30', fields='open, close, low, high, eob', adjust=ADJUST_PREV, df= True)
输出:
open close low high eob
0 2796.4829 2863.7241 2784.1550 2866.4041 2010-07-28 00:00:00+08:00
1 2866.7720 2877.9761 2851.9961 2888.5991 2010-07-29 00:00:00+08:00
2 2871.4810 2868.8459 2844.6819 2876.1360 2010-07-30 00:00:00+08:00
3 2868.2791 2917.2749 2867.4500 2922.6121 2010-08-02 00:00:00+08:00
4 2925.2539 2865.9709 2865.7610 2929.6140 2010-08-03 00:00:00+08:00
当df = False时, 返回
| 类型 | 说明 |
|---|---|
| list | tick 列表 或者 bar 列表 |
注意:
history_data = history(symbol='SHSE.000300', frequency='1d', start_time='2017-07-30', end_time='2017-07-31', fields='open, close, low, high, eob', adjust=ADJUST_PREV, df=False)
输出:
[{'open': 3722.42822265625, 'close': 3737.873291015625, 'low': 3713.655029296875, 'high': 3746.520751953125, 'eob': datetime.datetime(2017, 7, 31, 0, 0, tzinfo=tzfile('PRC'))}]
1. 返回的list/DataFrame是以参数eob/bob的升序来排序的,若要获取多标的的数据,通常需进一步的数据处理来分别提取出每只标的的历史数据
2. start_time和end_time中月,日,时,分,秒均可以只输入个位数,例:'2010-7-8 9:40:0'或'2017-7-30 12:3:0',但若对应位置为零,则0不可被省略,如不可输入'2017-7-30 12:3: '
获取数据目前采用前后闭区间的方式,即会获取前后两个时间节点的数据,使用时务必注意这点
3. 若输入无效标的代码,返回空列表/空DataFrame
4. 若输入代码正确,但查询字段包含无效字段,返回的列表、DataFrame只包含eob、symbol和输入的其他有效字段
5. skip_suspended 和 fill_missing 参数暂不支持
6. 单次返回数据量最大返回33000, 超出部分不返回
7. start_time和end_time输入不存在日期时,会报错details = "failed to parse datetime"
history_n - 查询历史行情最新n条
函数原型:
history_n(symbol, frequency, count, end_time=None, fields=None, skip_suspended=True,
fill_missing=None, adjust=ADJUST_NONE, adjust_end_time='', df=False)
参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码(只允许单个标的的代码字符串),使用时参考symbol |
| frequency | str | 频率, 支持 'tick', '1d', '60s'等, 默认 '1d', 详情见股票行情数据 |
| count | int | 数量(正整数) |
| end_time | str or datetime.datetime | 结束时间 (%Y-%m-%d %H:%M:%S 格式), 也支持datetime.datetime格式 |
| fields | str | 指定返回对象字段, 如有多个字段, 中间用, 隔开, 默认所有,具体字段见:Tick对象或者Bar对象 |
| skip_suspended | bool | 是否跳过停牌, 默认跳过 |
| fill_missing | str or None | 填充方式, None - 不填充, 'NaN' - 用空值填充, 'Last' - 用上一个值填充, 默认 None |
| adjust | int | ADJUST_NONE or 0: 不复权, ADJUST_PREV or 1: 前复权, ADJUST_POST or 2: 后复权 默认不复权 |
| adjust_end_time | str | 复权基点时间, 默认当前时间 |
| df | bool | 是否返回dataframe 格式, 默认False, 返回list[dict] |
当df = True时,返回
| 类型 | 说明 |
|---|---|
| dataframe | tick的dataframe 或者 bar的dataframe |
示例:
history_n_data = history_n(symbol='SHSE.600519', frequency='1d', count=100, end_time='2020-10-20 15:30:00', fields='symbol, open, close, low, high, eob', adjust=ADJUST_PREV, df=True)
输出:
symbol open ... high eob
0 SHSE.600519 1350.2278 ... 1350.3265 2020-05-22 00:00:00+08:00
1 SHSE.600519 1314.6434 ... 1350.8010 2020-05-25 00:00:00+08:00
2 SHSE.600519 1354.0629 ... 1354.1321 2020-05-26 00:00:00+08:00
3 SHSE.600519 1343.3086 ... 1344.2970 2020-05-27 00:00:00+08:00
4 SHSE.600519 1322.5214 ... 1331.3878 2020-05-28 00:00:00+08:00
当df = False时, 返回
| 类型 | 说明 |
|---|---|
| list | tick 列表 或者 bar 列表 |
示例:
history_n_data = history_n(symbol='SHSE.600519', frequency='1d', count=2, end_time='2020-10-20 15:30:00', fields='symbol, open, close, low, high, eob', adjust=ADJUST_PREV, df=False)
输出:
[{'symbol': 'SHSE.600519', 'open': 1725.0, 'close': 1699.0, 'low': 1691.9000244140625, 'high': 1733.97998046875, 'eob': datetime.datetime(2020, 10, 19, 0, 0, tzinfo=tzfile('PRC'))}, {'symbol': 'SHSE.600519', 'open': 1699.989990234375, 'close': 1734.0, 'low': 1695.0, 'high': 1734.969970703125, 'eob': datetime.datetime(2020, 10, 20, 0, 0, tzinfo=tzfile('PRC'))}]
注意:
1. 返回的list/DataFrame是以参数eob/bob的升序来排序的
2. 若输入无效标的代码,返回空列表/空DataFrame
3. 若输入代码正确,但查询字段包含无效字段,返回的列表、DataFrame只包含eob、symbol和输入的其他有效字段
4. end_time中月,日,时,分,秒均可以只输入个位数,例:'2017-7-30 20:0:20',但若对应位置为零,则0不可被省略,如不可输入'2017-7-30 20: :20'
5. skip_suspended 和 fill_missing 参数暂不支持
6. 单次返回数据量最大返回33000, 超出部分不返回
7. start_time和end_time输入不存在日期时,会报错details = "Can't parse string as time: 2020-10-40 15:30:00"
context.data - 数据滑窗
函数原型:
context.data(symbol, frequency, count)
参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码(只允许单个标的的代码字符串),使用时参考symbol |
| frequency | str | 频率, 支持 'tick', '1d', '15s', '30s' 等,需和subscribe函数中指定的频率保持一致。详情见股票行情数据 |
| count | int | 滑窗大小(正整数),需小于等于subscribe函数中count值 |
| fields | str | 指定返回对象字段, 如有多个字段, 中间用, 隔开, 默认所有,具体字段见:Tick对象或者Bar对象 |
返回值:
当subscribe的format="df"(默认)时,返回dataframe
| 类型 | 说明 |
|---|---|
| dataframe | tick 的 dataframe 或者 bar 的 dataframe |
示例:
def init(context):
subscribe(symbols='SHSE.600519', frequency='60s', count=50, fields='symbol, close, eob', format='df')
def on_bar(context,bars):
data = context.data(symbol=bars[0]['symbol'], frequency='60s', count=10)
print(data.tail())
输出:
symbol close eob
5 SHSE.600519 1629.96 2024-01-22 14:56:00+08:00
6 SHSE.600519 1627.25 2024-01-22 14:57:00+08:00
7 SHSE.600519 1627.98 2024-01-22 14:58:00+08:00
8 SHSE.600519 1642.00 2024-01-22 15:00:00+08:00
9 SHSE.600519 1632.96 2024-01-23 09:31:00+08:00
subscribe的format ="row"时,返回list[dict]
| 类型 | 说明 |
|---|---|
| list[dict] | 当frequency='tick'时,返回tick列表:[{tick_1}, {tick_2}, ..., {tick_n}],列表长度等于滑窗大小,即n=count, 当frequency='60s', '300s', '900s', '1800s', '3600s'时,返回bar列表:[{bar_1}, {bar_2}, {bar_n}, ..., ] ,列表长度等于滑窗大小,即n=count |
示例:
def init(context):
subscribe(symbols='SHSE.600519', frequency='tick', count=50, fields='symbol, price, quotes,created_at', format='row')
def on_tick(context, tick):
data = context.data(symbol=tick['symbol'], frequency='tick', count=3)
print(data)
输出:
[{'symbol': 'SHSE.600519', 'price': 1642.0, 'quotes': [{'bid_p': 1640.0, 'bid_v': 100, 'ask_p': 1642.0, 'ask_v': 4168}, {'bid_p': 1634.52, 'bid_v': 300, 'ask_p': 1642.01, 'ask_v': 100}, {'bid_p': 1633.0, 'bid_v': 100, 'ask_p': 1642.06, 'ask_v': 100}, {'bid_p': 1632.96, 'bid_v': 100, 'ask_p': 1642.08, 'ask_v': 200}, {'bid_p': 1632.89, 'bid_v': 100, 'ask_p': 1642.2, 'ask_v': 200}], 'created_at': datetime.datetime(2024, 1, 22, 15, 1, 51, 286000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))}, {'symbol': 'SHSE.600519', 'price': 1642.0, 'quotes': [{'bid_p': 1640.0, 'bid_v': 100, 'ask_p': 1642.0, 'ask_v': 4168}, {'bid_p': 1634.52, 'bid_v': 300, 'ask_p': 1642.01, 'ask_v': 100}, {'bid_p': 1633.0, 'bid_v': 100, 'ask_p': 1642.06, 'ask_v': 100}, {'bid_p': 1632.96, 'bid_v': 100, 'ask_p': 1642.08, 'ask_v': 200}, {'bid_p': 1632.89, 'bid_v': 100, 'ask_p': 1642.2, 'ask_v': 200}], 'created_at': datetime.datetime(2024, 1, 22, 15, 1, 54, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))}, {'symbol': 'SHSE.600519', 'price': 0.0, 'quotes': [{'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}], 'created_at': datetime.datetime(2024, 1, 23, 9, 14, 1, 91000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))}]
subscribe的format ="col"时,返回dict
| 类型 | 说明 |
|---|---|
| dict | 当frequency='tick'时,返回tick数据(symbol为str格式,其余字段为列表,列表长度等于滑窗大小count),当frequency='60s', '300s', '900s', '1800s', '3600s'时,返回bar数据(symbol和frequency为str格式,其余字段为列表,列表长度等于滑窗大小count) |
示例:
def init(context):
subscribe(symbols='SHSE.600519', frequency='tick', count=10, fields='symbol, price, bid_p, created_at', format='col')
def on_tick(context, tick):
data = context.data(symbol=tick['symbol'], frequency='tick', count=10)
print(data)
输出:
{'symbol': 'SHSE.600519', 'price': [1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 0.0], 'bid_p': [1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 0.0], 'created_at': [datetime.datetime(2024, 1, 22, 15, 1, 12, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 21, 277000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 24, 278000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 33, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 36, 282000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 39, 279000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 48, 283000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 51, 286000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 54, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 23, 9, 14, 1, 91000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))]}
注意:
1. 只有在订阅后,此接口才能取到数据,如未订阅数据,则返回报错。
2. symbol 参数只支持输入一个标的。
3. count 参数必须小于或等于订阅函数里面的 count 值。
4. fields 参数必须在订阅函数subscribe里面指定的 fields 范围内。指定字段越少,查询速度越快,目前效率是row > col > df。
5. 当subscribe的format指定col时,tick的quotes字段会被拆分,只返回买卖一档的量和价,即只有bid_p,bid_v, ask_p和ask_v。