问题描述
解决方案
在PTrade量化交易平台中,获取股票的实时“委差”数据主要通过调用 get_snapshot 函数来实现。
委差(Entrust Difference)是反映买卖盘强弱的重要指标,其计算公式通常为:委差 = 总委买量 - 总委卖量。正值越大表示买方力量越强,负值越大表示卖方力量越强。
以下是具体的实现方法和策略代码示例。
核心步骤
- 调用接口:使用
get_snapshot(security)获取指定标的的行情快照。 - 获取字段:从返回的字典中提取
'entrust_diff'字段。 - 逻辑判断:根据委差的正负和数值大小,判断当前市场的买卖力量对比,从而执行交易逻辑。
策略代码示例
以下是一个完整的策略示例。该策略在盘中实时监控股票的委差,当委差大于一定阈值(显示买盘强劲)时买入,当委差小于一定负阈值(显示抛压沉重)时卖出。
def initialize(context):
"""
初始化函数
"""
# 设置我们要操作的股票,例如:恒生电子
g.security = '600570.SS'
# 设置股票池
set_universe(g.security)
# 设定委差阈值,根据实际资金量和个股流动性调整
# 例如:委差超过 500 手视为买盘强劲
g.buy_threshold = 500
# 委差低于 -500 手视为卖盘强劲
g.sell_threshold = -500
# 设置运行频率,这里演示使用 run_interval 每10秒检查一次
# 注意:get_snapshot 仅在交易模块(实盘)有效
run_interval(context, check_entrust_diff, seconds=10)
def check_entrust_diff(context):
"""
定时运行函数:检查委差并交易
"""
# 获取行情快照
snapshot = get_snapshot(g.security)
# 检查数据是否获取成功
if snapshot is None:
log.info("获取行情快照失败")
return
# 提取个股数据
stock_data = snapshot.get(g.security)
if stock_data:
# 获取实时委差数据 (entrust_diff)
# 注意:部分券商或行情源可能返回None,需做容错处理
entrust_diff = stock_data.get('entrust_diff')
# 获取最新价,用于下单
current_price = stock_data.get('last_px')
if entrust_diff is None or current_price is None:
return
log.info("股票: %s, 当前价格: %s, 实时委差: %s" % (g.security, current_price, entrust_diff))
# 获取当前持仓
position = get_position(g.security)
curr_amount = position.amount
available_cash = context.portfolio.cash
# --- 交易逻辑 ---
# 1. 买入逻辑:委差 > 阈值 且 资金充足
if entrust_diff > g.buy_threshold:
# 简单示例:每次买入100股
if available_cash > current_price * 100:
log.info("买盘强劲 (委差 %s > %s),触发买入..." % (entrust_diff, g.buy_threshold))
order(g.security, 100)
# 2. 卖出逻辑:委差 < 负阈值 且 有持仓
elif entrust_diff < g.sell_threshold:
if curr_amount > 0:
log.info("抛压沉重 (委差 %s < %s),触发卖出..." % (entrust_diff, g.sell_threshold))
order(g.security, -100)
def handle_data(context, data):
"""
必须实现的函数,此处逻辑已在 run_interval 中处理,故留空
"""
pass
关键注意事项
-
仅限实盘环境:
根据PTrade文档,get_snapshot函数仅在交易模块(实盘)可用。在回测模式下调用该函数通常会返回None或全0数据,因为回测历史数据通常不包含高频的盘口快照信息。 -
数据字段说明:
get_snapshot返回的字典中,除了entrust_diff(委差),还有其他相关字段可辅助判断:entrust_rate: 委比((委买-委卖)/(委买+委卖))total_bidqty: 总委买量total_offerqty: 总委卖量bid_grp/offer_grp: 买卖五档(或十档)详情
-
行情频率:
委差是随Tick变动的高频数据。在handle_data(分钟级)中调用只能获取该分钟结束时的快照。如果需要更灵敏的反应,建议使用run_interval(如上例)或在tick_data函数中编写策略。 -
Python版本兼容性:
代码使用了%s格式化字符串,这是为了兼容 Python 3.5 及以上版本(PTrade旧环境可能不支持 f-string)。
Q&A
Q: 为什么我在回测中调用 get_snapshot 获取到的委差全是0?
A: get_snapshot 函数仅在**交易(实盘)**模块可用。回测环境通常只提供K线数据(开高低收量),不包含历史时刻的盘口快照(如委差、五档行情等),因此无法在回测中获取该数据。
Q: 除了委差,还有什么指标可以判断买卖盘力量?
A: 可以使用 委比 (entrust_rate)。委比是相对指标,范围在 -1 到 1 之间,计算公式为 (委买量 - 委卖量) / (委买量 + 委卖量)。相比委差,委比更能消除盘子大小的影响,直观反映买卖强弱的比例。
Q: 如何获取买一和卖一的价格进行更精确的下单?
A: 在 get_snapshot 返回的数据中,可以通过 bid_grp 和 offer_grp 获取。
- 买一价:
snapshot[code]['bid_grp'][1][0] - 卖一价:
snapshot[code]['offer_grp'][1][0]
注意检查字典是否存在以及索引是否越界。