问题描述
get_individual_transaction返回的Pandas Panel对象包含哪些字段,如何解析这些数据?
解决方案
在 ptrade 量化交易平台中,get_individual_transaction 接口用于获取当日的逐笔成交行情数据。当在 Python 3.5 环境下且未指定 is_dict=True 时,该接口默认返回一个 Pandas Panel 对象(在 Python 3.11 环境下则返回 DataFrame)。
以下是针对 Pandas Panel 返回数据结构的详细解析:
1. Pandas Panel 数据结构解析
返回的 Pandas Panel 对象包含三个维度(Axes):
- Items axis (0轴): 股票代码列表(字符串类型,如
'000001.SZ')。 - Major_axis axis (1轴): 数据索引,通常为自然数列(表示第几笔成交)。
- Minor_axis axis (2轴): 具体的逐笔成交字段信息。
2. Minor_axis 包含的字段说明
Minor_axis 包含了每笔成交的详细信息,具体字段如下:
business_time: 时间戳(毫秒级,numpy.int64)hq_px: 成交价格(numpy.float64)business_amount: 成交数量(numpy.int64)trade_index: 成交编号(numpy.int64)business_direction: 成交方向(numpy.int64,0 – 卖,1 – 买)buy_no: 叫买方编号(numpy.int64)sell_no: 叫卖方编号(numpy.int64)trans_flag: 成交标记(numpy.int64,0 – 普通成交,1 – 撤单成交)trans_identify_am: 盘后逐笔成交序号标识(numpy.int64,0 – 盘中,1 – 盘后)channel_num: 成交通道信息(numpy.int64)
3. 如何解析和使用这些数据
要从 Panel 对象中提取特定股票的数据,可以通过股票代码作为键来获取对应的 DataFrame。然后,就可以像操作普通 DataFrame 一样提取具体的字段。
代码示例
def initialize(context):
g.security = "000001.SZ"
set_universe(g.security)
def before_trading_start(context, data):
g.flag = False
def handle_data(context, data):
if not g.flag:
# 获取当前股票池逐笔成交数据 (Python 3.5 环境下默认返回 Panel)
transaction_panel = get_individual_transaction()
if transaction_panel is not None:
# 1. 提取特定股票的 DataFrame
# 注意:在 Python 3.11 中返回的是 DataFrame,需要用 query 过滤
# 以下是针对 Panel (Python 3.5) 的解析方式:
try:
df_000001 = transaction_panel['000001.SZ']
log.info("000001.SZ 的逐笔成交数据:\n%s" % df_000001)
# 2. 提取特定字段,例如成交量
business_amount = df_000001["business_amount"]
log.info("000001.SZ 的成交量序列:\n%s" % business_amount)
# 3. 获取最新一笔成交的价格
if len(df_000001) > 0:
latest_price = df_000001.iloc[-1]["hq_px"]
log.info("最新成交价:%s" % latest_price)
except Exception as e:
log.error("解析数据失败,可能当前环境返回的不是 Panel 对象:%s" % e)
g.flag = True
性能优化建议:
如果您的策略对速度要求较高,或者需要处理大量股票的逐笔数据,强烈建议在调用接口时传入 is_dict=True。返回字典类型数据的速度比返回 DataFrame 或 Panel 类型数据有大幅提升。