问题描述
解决方案
在PTrade中,获取股票的实时逐笔委托数据(Level-2数据)主要使用 get_individual_entrust 接口。
该接口仅在交易模式(实盘或模拟盘)下可用,且通常需要开通Level-2行情权限。
以下是具体的实现步骤和代码示例。
核心步骤
- 初始化:在
initialize中设置要监控的标的。 - 获取数据:在
handle_data或tick_data中调用get_individual_entrust。建议设置is_dict=True以获得更快的解析速度和更好的兼容性。 - 数据解析:返回的数据包含时间、价格、委托数量、委托方向等。
- 策略分析:根据委托方向(买/卖)和委托数量,计算大单买入或卖出的力度。
策略代码示例
以下代码展示了如何获取逐笔委托,并统计当前返回数据包中的“大单买入”和“大单卖出”数量。
def initialize(context):
# 设置要操作的股票,这里以恒生电子为例
g.security = '600570.SS'
set_universe(g.security)
# 定义大单的阈值(例如:大于10000股)
g.big_order_threshold = 10000
def handle_data(context, data):
# 获取逐笔委托数据
# is_dict=True 返回字典格式,解析速度更快
# 默认获取当前股票池的数据
entrust_data = get_individual_entrust([g.security], is_dict=True)
if entrust_data is None:
log.info("暂无逐笔委托数据")
return
# 获取特定股票的数据列表
# 数据结构: [[时间, 价格, 数量, 订单号, 方向, ...], ...]
records = entrust_data.get(g.security)
if not records:
return
# 初始化统计变量
buy_vol = 0
sell_vol = 0
big_buy_count = 0
big_sell_count = 0
# 遍历每一笔委托进行分析
for row in records:
# 根据文档:
# row[1] -> hq_px (价格)
# row[2] -> business_amount (委托数量)
# row[4] -> business_direction (委托方向: 0-卖, 1-买, 2-借入, 3-出借)
amount = row[2]
direction = row[4]
# 统计买卖总量
if direction == 1: # 买单
buy_vol += amount
# 统计大单
if amount >= g.big_order_threshold:
big_buy_count += 1
log.info("监测到大额买单: 价格 %s, 数量 %s" % (row[1], amount))
elif direction == 0: # 卖单
sell_vol += amount
# 统计大单
if amount >= g.big_order_threshold:
big_sell_count += 1
log.info("监测到大额卖单: 价格 %s, 数量 %s" % (row[1], amount))
# 打印分析结果
log.info("【逐笔委托分析】 标的: %s" % g.security)
log.info("累计买单量: %s, 大额买单笔数: %s" % (buy_vol, big_buy_count))
log.info("累计卖单量: %s, 大额卖单笔数: %s" % (sell_vol, big_sell_count))
# 简单的策略逻辑示例:如果大额买单显著多于卖单,且有资金,则买入
if big_buy_count > big_sell_count and big_buy_count > 0:
# 获取当前现金
cash = context.portfolio.cash
if cash > 0:
# 买入100股
order(g.security, 100)
log.info("大单买入信号触发,执行买入")
代码解析
-
get_individual_entrust([g.security], is_dict=True):- 这是核心函数。使用
is_dict=True返回的数据结构是字典,Key是股票代码,Value是一个列表(List),列表中的每一项代表一笔委托。 - 返回的
fields字段通常为:["business_time", "hq_px", "business_amount", "order_no", "business_direction", "trans_kind"]。
- 这是核心函数。使用
-
字段索引:
- 在代码的循环中,我们通过索引访问数据:
row[2]是委托数量,row[4]是委托方向。 - 委托方向:
0代表卖出委托,1代表买入委托。
- 在代码的循环中,我们通过索引访问数据:
-
兼容性:
- 代码使用了
%s格式化字符串,而不是 f-string,以确保在 Python 3.5 环境下也能正常运行。
- 代码使用了
注意事项
- 权限要求:逐笔委托属于 Level-2 高频数据,必须确认您的 PTrade 账号已开通 Level-2 行情权限,否则该函数返回
None。 - 数据量:逐笔数据量非常大,如果在
handle_data(分钟级)中调用,它会返回该分钟内(或最近一批)的数据。如果在tick_data(3秒级)中调用,数据更新会更频繁。 - 回测限制:该函数通常仅在交易模块(实盘/仿真)可用。普通的回测环境通常不支持逐笔数据的回放(除非券商提供了专门的高频回测环境)。
Q&A
Q: get_individual_entrust 和 get_individual_transaction 有什么区别?
A: get_individual_entrust 获取的是逐笔委托(挂单),即投资者下单但尚未成交(或正在等待成交)的记录,反映的是市场意愿;get_individual_transaction 获取的是逐笔成交,即已经撮合成交的记录,反映的是真实的市场交易行为。
Q: 为什么我在回测中调用此函数返回 None?
A: PTrade 的普通回测环境通常只支持分钟线或日线数据,不支持 Level-2 的逐笔数据回放。该函数主要用于实盘或仿真交易策略中。
Q: 如何提高处理逐笔数据的速度?
A: 务必在调用接口时设置 is_dict=True。如果不设置,默认返回 DataFrame (Python 3.11) 或 Panel (Python 3.5),在大数据量下,Pandas 对象的构建和索引会比原生字典和列表慢很多。
Q: business_direction 中的 2 和 3 代表什么?
A: 2 代表借入(通常指融券借入),3 代表出借(通常指转融通出借)。在普通的股票交易分析中,主要关注 0(卖)和 1(买)。