Ptrade获取L2逐笔数据,免费,券商提供
本月初国金的Ptrade做了一次大版本的升级,内置的python版本从老旧的python3.5一下子升级到了python3.11。
并且还发现居然可以免费使用L2逐笔数据,分时逐笔委托队列等高频毫秒级的数据
Ptrade接口文档已更新: https://ptradeapi.com
Python 3.5是2015 年发布,Python 3.11是2022 年发布。
性能上来说是有很大的提升,尤其对做回测和高频策略。
如果本身策略很简单或者日线交易的,影响可以忽略不计。
不过这个升级并不是个人可选的,只要你的Ptrade的券商升级了,就只能使用升级后的版本接口格式,旧代码需要做的修改来适配。
性能对比示例(Python 3.5 vs 3.11) By 豆包
以下是部分操作在 Python 3.5 和 3.11 中的性能对比(仅供参考):
并且相应的第三方库版本亦做了升级。
接口变动影响比较大的是pandas在 Python3.11 中,Pandas已不再支持Panel格式。
pandas里的Pannel类型是用于存储三维或以上的矩阵数据。
而升级后就不支持之前的多维行情数据格式。但笔者觉得现在更加统一和简单。
以前不同入参,有时候返回的是dataframe,有时候返回的是panel,比较混乱。
现在统一返回的dataframe. (或者返回dict,可以自己设定)
影响的API有get_history,get_price ,get_individual_transaction ,get_fundamentals等。
比如通过get_history获取的历史日线数据
返回的dataframe数据格式如下
如果要提取 000695.SZ的数据,只需要
然后dataframe提取收盘价或者开盘价
再拿收盘价来计算MACD:
同理get_price,get_individual_transaction ,get_fundamentals与之类似。
并且在get_histroy的入参里面,多了一个is_dict的参数,默认是False,返回的是dataframe数据,如果设置为True,则返回的dict数据。
返回的有序字典(OrderDict)类型数据:(省略了部分类型)
但感觉这种列表形式下,提取数据反而没有使用dataframe方便和直观,它获取数据时需要用下标提取。
但官网说,返回dict类型数据的速度比DataFrame,Panel类型数据有大幅提升,对速度有要求的,建议使用is_dict=True 读取上述数据格式。
获取L2逐笔数据
L2逐笔委托数据接口函数
参数:
data_count: 数据条数,默认为50,最大为200(int);
start_pos: 起始位置,默认为0(int);
虽然一次只能获取200条,但配合start_pos游标可遍历获取全部数据。
示例代码:
获取股票001367.SZ封涨停时的最新的逐笔委托行情。
输出数据如下,因数据列太多,为了美观只取了其中的4列:
时间戳,委托价格,委托数量,委托编号
因为当前已经是收盘状态,是从14:59:57.020往前取50条数据
可以看到上面的有些1秒内有多个的委托单,每单的委托量和委托编号。
逐笔成交
同理,L2的逐笔成交数据函数的用法一样,但返回字段不同,成交的时候有成交方向,可以通过程序计算资金流入或流出。
同样用上面的股票例子获取到的数据如下:
business_direction是 成交方向,0是卖出,1是买入,从而判断该笔成交的资金是流入还是流出。
获取分时成交
这个分时成交函数可获取到当前和历史某个毫秒下,该笔总成交量下有多少笔子订单。
比如用上面的涨停股001367.SZ做示例
最后一刻3点的时候,成交了21348股,里面共有14笔成交。
get_gear_price 获取当前时刻的逐笔委托队列
这个函数的功能:获取委买/卖1 至 委买/卖10 10档行情的价格与委托量,但现在发现它可以获取到委托1档下逐笔委托队列。
比如当前的股票是涨停状态,你下了一笔订单有8888股去排板,那么这个函数可以获取当前委1档下的委托队列(前50名),比如下面返回的数据,可以看到你的8888手排在第9个委托队列,还有前后的单子的逐笔数量。
所以这次ptrade的升级除了python版本的升级,还带来了更多粒度的数据,有利于高频策略的开发。
还有一些新功能的函数就等下次继续更新,记得点赞关注+收藏哦~
待续......
关注公众号:
并且还发现居然可以免费使用L2逐笔数据,分时逐笔委托队列等高频毫秒级的数据
Ptrade接口文档已更新: https://ptradeapi.com
Python 3.5是2015 年发布,Python 3.11是2022 年发布。
性能上来说是有很大的提升,尤其对做回测和高频策略。
如果本身策略很简单或者日线交易的,影响可以忽略不计。
不过这个升级并不是个人可选的,只要你的Ptrade的券商升级了,就只能使用升级后的版本接口格式,旧代码需要做的修改来适配。
性能对比示例(Python 3.5 vs 3.11) By 豆包
以下是部分操作在 Python 3.5 和 3.11 中的性能对比(仅供参考):
并且相应的第三方库版本亦做了升级。
接口变动影响比较大的是pandas在 Python3.11 中,Pandas已不再支持Panel格式。
pandas里的Pannel类型是用于存储三维或以上的矩阵数据。
而升级后就不支持之前的多维行情数据格式。但笔者觉得现在更加统一和简单。
以前不同入参,有时候返回的是dataframe,有时候返回的是panel,比较混乱。
现在统一返回的dataframe. (或者返回dict,可以自己设定)
影响的API有get_history,get_price ,get_individual_transaction ,get_fundamentals等。
比如通过get_history获取的历史日线数据
count = 10
code_list = ['000695.SZ','001367.SZ']
df = get_history(count, frequency='1d', field=['open','close'], security_list=code_list, fq=None, include=False, fill='nan',is_dict=False)
print(type(df))
print(df)
返回的dataframe数据格式如下
<class 'pandas.core.frame.DataFrame'>
code open close
2025-05-15 000695.SZ NaN NaN
2025-05-16 000695.SZ NaN NaN
2025-05-19 000695.SZ 10.34 10.34
2025-05-20 000695.SZ 11.37 11.37
2025-05-21 000695.SZ 12.51 12.51
2025-05-22 000695.SZ 13.76 13.76
2025-05-09 001367.SZ 29.89 29.58
2025-05-12 001367.SZ 29.70 29.60
2025-05-13 001367.SZ 30.11 29.96
2025-05-14 001367.SZ 29.96 29.83
2025-05-15 001367.SZ 29.80 30.18
2025-05-16 001367.SZ 30.13 30.39
2025-05-19 001367.SZ 30.46 30.01
2025-05-20 001367.SZ 20.25 20.08
2025-05-21 001367.SZ 20.05 20.70
2025-05-22 001367.SZ 20.98 22.77
如果要提取 000695.SZ的数据,只需要
df[df['code']=='000695.SZ']就可以了。
code open close
2025-05-09 001367.SZ 29.89 29.58
2025-05-12 001367.SZ 29.70 29.60
2025-05-13 001367.SZ 30.11 29.96
2025-05-14 001367.SZ 29.96 29.83
2025-05-15 001367.SZ 29.80 30.18
2025-05-16 001367.SZ 30.13 30.39
2025-05-19 001367.SZ 30.46 30.01
2025-05-20 001367.SZ 20.25 20.08
2025-05-21 001367.SZ 20.05 20.70
2025-05-22 001367.SZ 20.98 22.77
然后dataframe提取收盘价或者开盘价
# 收盘价
df[df['code']=='001367.SZ']['close']
# 开盘价
df[df['code']=='001367.SZ']['open']
再拿收盘价来计算MACD:
# 计算 MACD 值
def MACD(series):
ema_short = series.ewm(span=12).mean()
ema_long = series.ewm(span=26).mean()
macd_series = ema_short - ema_long
return macd_series.iloc[-1]
close_price_series = df[df['code']=='001367.SZ']['close']
macd_val = MACD(close_price_series)
同理get_price,get_individual_transaction ,get_fundamentals与之类似。
并且在get_histroy的入参里面,多了一个is_dict的参数,默认是False,返回的是dataframe数据,如果设置为True,则返回的dict数据。
返回的有序字典(OrderDict)类型数据:(省略了部分类型)
{'001367.SZ', array([(20250509, 29.89, 29.58), (20250512, 29.7 , 29.6 ),
(20250513, 30.11, 29.96), (20250514, 29.96, 29.83),
(20250515, 29.8 , 30.18), (20250516, 30.13, 30.39),
(20250519, 30.46, 30.01), (20250520, 20.25, 20.08),
(20250521, 20.05, 20.7 ), (20250522, 20.98, 22.77)]
}
但感觉这种列表形式下,提取数据反而没有使用dataframe方便和直观,它获取数据时需要用下标提取。
但官网说,返回dict类型数据的速度比DataFrame,Panel类型数据有大幅提升,对速度有要求的,建议使用is_dict=True 读取上述数据格式。
获取L2逐笔数据
L2逐笔委托数据接口函数
get_individual_entrust(stocks=None, data_count=50, start_pos=0, search_direction=1, is_dict=False)
参数:
data_count: 数据条数,默认为50,最大为200(int);
start_pos: 起始位置,默认为0(int);
虽然一次只能获取200条,但配合start_pos游标可遍历获取全部数据。
示例代码:
获取股票001367.SZ封涨停时的最新的逐笔委托行情。
code_list = ['001367.SZ']
df = get_individual_entrust(code_list)
print(df[['business_time','hq_px','business_amount','order_no']])
输出数据如下,因数据列太多,为了美观只取了其中的4列:
时间戳,委托价格,委托数量,委托编号
因为当前已经是收盘状态,是从14:59:57.020往前取50条数据
business_time(时间戳) hq_px(委托价格) business_amount(委托数量) order_no(委托编号)
20250523145702150 24.60 100 32493957
20250523145714840 24.95 100 32505581
20250523145718430 25.05 1000 32509041
20250523145719840 25.05 1000 32510350
20250523145721750 25.05 400 32512000
20250523145727610 25.05 200 32517007
20250523145730270 25.05 400 32519085
20250523145730330 25.04 1600 32519133
20250523145732330 25.05 2900 32520779
20250523145740780 25.05 500 32527204
20250523145743550 25.05 400 32529290
20250523145743810 25.05 200 32529474
20250523145749460 25.05 4300 32533295
20250523145749910 25.05 1000 32533630
20250523145749960 25.05 300 32533666
# 省略若干.....
20250523145926790 25.05 100 32589496
20250523145927480 25.05 1200 32589844
20250523145936090 25.05 200 32594134
20250523145946600 25.05 300 32601758
20250523145946800 25.05 49100 32601865
20250523145950800 25.05 36800 32607381
20250523145953780 25.05 55200 32611265
20250523145954240 25.05 500 32611713
20250523145956830 25.05 55300 32614479
20250523145957020 25.04 8500 32614683
可以看到上面的有些1秒内有多个的委托单,每单的委托量和委托编号。
逐笔成交
同理,L2的逐笔成交数据函数的用法一样,但返回字段不同,成交的时候有成交方向,可以通过程序计算资金流入或流出。
get_individual_transaction(stocks=None, data_count=50, start_pos=0, search_direction=1, is_dict=False)
同样用上面的股票例子获取到的数据如下:
business_time hq_px business_amount business_direction
20250523145648440 0.00 2500 1
20250523145648970 0.00 3200 1
20250523145649300 0.00 100 1
20250523145649370 0.00 900 1
20250523145649880 0.00 1800 1
20250523145650150 0.00 800 1
20250523145650360 0.00 200 1
20250523145650400 0.00 500 1
20250523145650420 0.00 100 1
20250523145652050 0.00 800 1
# 省略若干.....
20250523145659220 0.00 24100 1
20250523145659550 0.00 700 1
20250523145659600 0.00 400 1
20250523150000000 25.05 100 0
20250523150000000 25.05 100 0
20250523150000000 25.05 1600 0
20250523150000000 25.05 800 0
20250523150000000 25.05 1730 0
20250523150000000 25.05 670 0
20250523150000000 25.05 2430 0
20250523150000000 25.05 1200 0
20250523150000000 25.05 9270 0
20250523150000000 25.05 148 0
20250523150000000 25.05 100 0
20250523150000000 25.05 200 0
20250523150000000 25.05 1000 0
20250523150000000 25.05 2000 0
business_direction是 成交方向,0是卖出,1是买入,从而判断该笔成交的资金是流入还是流出。
获取分时成交
get_tick_direction(symbols=None, query_date=0, start_pos=0, search_direction=1, data_count=50, is_dict=False)
这个分时成交函数可获取到当前和历史某个毫秒下,该笔总成交量下有多少笔子订单。
比如用上面的涨停股001367.SZ做示例
最后一刻3点的时候,成交了21348股,里面共有14笔成交。
time_stamp hq_px business_amount business_count
20250523143721000 25.05 100 1
20250523143724000 25.05 200 1
20250523143745000 25.05 444 1
20250523143809000 25.05 10000 2
20250523144024000 25.05 100 1
20250523144048000 25.05 1500 1
20250523144106000 25.05 300 1
20250523144112000 25.05 11692 2
20250523144124000 25.05 100 1
20250523144142000 25.05 100 1
20250523144157000 25.05 100 1
20250523144200000 25.05 2360 1
# 省略若干.....
20250523145415000 25.05 1381 1
20250523145421000 25.05 480 1
20250523145439000 25.05 100 1
20250523145451000 25.05 1753 1
20250523145521000 25.05 5384 3
20250523145539000 25.05 3600 2
20250523145557000 25.05 1000 1
20250523145609000 25.05 400 2
20250523145615000 25.05 100 1
20250523150000000 25.05 21348 14
get_gear_price 获取当前时刻的逐笔委托队列
这个函数的功能:获取委买/卖1 至 委买/卖10 10档行情的价格与委托量,但现在发现它可以获取到委托1档下逐笔委托队列。
比如当前的股票是涨停状态,你下了一笔订单有8888股去排板,那么这个函数可以获取当前委1档下的委托队列(前50名),比如下面返回的数据,可以看到你的8888手排在第9个委托队列,还有前后的单子的逐笔数量。
{'bid_grp': {1: [13.68, 15225900, 4905, {1: 33200, 2: 104800, 3: 1000, 4: 100, 5: 51800, 6: 6300, 7: 777800, 8: 184000, 9: 8888, 10: 100, 11: 600, 12: 141800, 13: 100, 14: 141800, 15: 2700,
16: 900, 17: 58600, 18: 2900, 19: 800, 20: 133800, 21: 2800, 22: 900, 23: 2900, 24: 800, 25: 400, 26: 400, 27: 48200, 28: 51800, 29: 99400, 30: 26600, 31: 81800, 32: 493000, 33: 427300, 34: 27700, 35: 2800, 36: 460500,
37: 170200, 38: 166500, 39: 24100, 40: 800, 41: 29300, 42: 500, 43: 500, 44: 500, 45: 2800, 46: 1300, 47: 61700, 48: 27000, 49: 500, 50: 78900}],
2: [13.67, 30200, 32],
3: [13.66, 11100, 16],
4: [13.65, 134400, 11],
5: [13.64, 8500, 7],
6: [13.63, 1000, 3],
7: [13.62, 200, 2],
8: [13.6, 7300, 17],
9: [13.59, 600, 2],
10: [13.58, 10700, 7]},
# 因为是涨停,所以委卖是空的,挂单就立马成交,委托队列是空的
'offer_grp': {1: [0.0, 0, 0, {}],
2: [0.0, 0, 0],
3: [0.0, 0, 0],
4: [0.0, 0, 0],
5: [0.0, 0, 0],
6: [0.0, 0, 0],
7: [0.0, 0, 0],
8: [0.0, 0, 0],
9: [0.0, 0, 0],
10: [0.0, 0, 0]}
}
所以这次ptrade的升级除了python版本的升级,还带来了更多粒度的数据,有利于高频策略的开发。
还有一些新功能的函数就等下次继续更新,记得点赞关注+收藏哦~
待续......
关注公众号:
