问题描述
ADAPTIVE TWAP/VWAP算法中的调整阈值(THRESHOLD)如何设置?
解决方案
在量化交易中,ADAPTIVE TWAP (时间加权平均价格) 和 ADAPTIVE VWAP (成交量加权平均价格) 是常用的高级算法交易策略。与静态的TWAP/VWAP不同,自适应(Adaptive)算法会根据实时的市场盘口和价格波动动态调整下单节奏。
虽然 ptrade 的基础 API 文档中主要提供的是基础的委托接口(如 order, order_target),高级算法单通常由券商的特定算法交易模块提供。但在理解和设置调整阈值 (THRESHOLD) 时,通常遵循以下逻辑,您也可以利用 ptrade 的 tick_data 或 run_interval 自行编写自适应逻辑。
1. 调整阈值 (THRESHOLD) 的核心含义
在 ADAPTIVE 算法中,THRESHOLD 通常用于控制激进程度或风险敞口,主要分为两类:
- 价格偏离阈值 (Price Deviation Threshold):
- 含义:当前市场价格偏离目标均价(或基准价)的百分比或绝对值。
- 设置逻辑:如果当前价格优于基准价(例如买入时价格低于VWAP),算法可能会加速执行(提高参与度);如果价格劣于基准价超过设定的 THRESHOLD(例如买入时价格暴涨),算法会暂停下单或降低参与度,以避免推高成本。
- 量比阈值 (Volume Participation Threshold):
- 含义:算法单笔委托量占市场真实成交量的最大比例(如不超过市场成交量的 15%)。
- 设置逻辑:防止自身订单对市场造成过大的流动性冲击(Market Impact)。
2. 如何在 ptrade 中设置或实现该阈值?
如果您使用的是券商提供的内置算法交易面板,通常会在参数设置中直接输入百分比(如 0.01 表示 1% 的价格偏离阈值)。
如果您希望在 ptrade 策略代码中自行实现一个带有阈值控制的自适应下单逻辑,可以参考以下思路:
实现思路:利用 get_snapshot 和 run_interval
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 设置目标买入总量
g.target_amount = 10000
g.filled_amount = 0
# 设置价格偏离阈值 (例如 1%)
g.price_threshold = 0.01
# 每 10 秒执行一次自适应检查
run_interval(context, adaptive_execution, seconds=10)
def adaptive_execution(context):
if g.filled_amount >= g.target_amount:
return
security = g.security
snapshot = get_snapshot(security)
if not snapshot or security not in snapshot:
return
# 获取最新价和加权平均价(VWAP的近似基准)
current_price = snapshot[security].get('last_px', 0)
vwap_price = snapshot[security].get('wavg_px', 0)
if current_price == 0 or vwap_price == 0:
return
# 计算价格偏离度
deviation = (current_price - vwap_price) / vwap_price
# 自适应逻辑:买入场景
# 如果当前价格比VWAP高出超过阈值,则暂停买入
if deviation > g.price_threshold:
log.info(f"当前价格 {current_price} 高于均价 {vwap_price} 超过阈值 {g.price_threshold},暂停买入")
return
# 如果价格合适,计算本次应下单量(此处简化为固定切片,实际可根据成交量动态计算)
order_qty = 100
if g.filled_amount + order_qty > g.target_amount:
order_qty = g.target_amount - g.filled_amount
# 执行下单
order(security, order_qty, limit_price=current_price)
g.filled_amount += order_qty
log.info(f"自适应买入 {order_qty} 股,当前进度 {g.filled_amount}/{g.target_amount}")
def handle_data(context, data):
pass
3. 设置建议
- 高流动性标的(如大盘蓝筹、ETF):阈值可以设置得较小(如
0.005即 0.5%),因为价格波动小,算法可以紧贴均价执行。 - 低流动性/高波动标的:阈值需要适当放宽(如
0.02即 2%),否则算法可能会因为频繁触发阈值而导致最终无法完成目标数量的建仓。 - 结合
get_gear_price:在 ptrade 中,可以使用get_gear_price获取盘口档位数据,结合阈值判断当前盘口是否有足够的挂单支撑您的自适应切片单,避免击穿盘口。