拆单函数介绍

芝麻大魔王
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

TWAP/VWAP/ 冰山算法拆单手法及在 PTrade 与 QMT 中的实现方式

在量化交易拆单函数介绍中,拆单算法是大额订单执行的核心工具,通过将大额订单拆分为多个小额订单分批执行,可有效降低对市场价格的冲击,减少交易成本。以下先详细解析 TWAP、VWAP、冰山算法三种经典拆单手法的原理与特点,再分别说明其在PTradeQMT(XtQuant) 中的实现逻辑及核心函数。

一、三种经典拆单手法解析

1. TWAP(时间加权平均价格拆单函数介绍算法)

核心原理

TWAP(Time-Weighted Average Price)以时间为权重,将大额订单在预设的交易时间段内(如 1 小时、1 个交易日)均匀拆分为若干小额订单,按固定时间间隔(如 1 分钟、5 分钟)依次执行,最终使得订单成交均价接近该时间段内的市场时间加权平均价。

适用场景

· 流动性中等的个股或 ETF,订单规模适中(不超过当日成交量拆单函数介绍的 5%-10%)。

· 追求 “平稳执行”,对成交均价与市场均价的偏差(跟踪误差)要求较低,不刻意追求成交量集中时段。

特点

· 逻辑简单,易实现,无需依赖复杂的成交量预测。

· 缺点是在成交量波动大的时段(如开盘 / 收盘),可能因市场冲击导致实际成交均价偏离目标。

2. VWAP(成交量加权平均价格算法)

核心原理

VWAP(Volume-Weighted Average Price)以成交量为权重,先通过历史数据或实时数据预测交易时间段内的成交量分布(如开盘 30 分钟占当日成交量 20%、盘中占 50%、收盘 20% 等),再根据成交量占比拆分订单 —— 在成交量大的时段多下单,成交量小的时段少下单,最终使得成交均价接近该时间段内的市场成交量加权平均价。

适用场景

· 流动性较好的大盘股、指数成分股,订单规模较大(占当日成交量 10%-20%)。

· 追求 “贴合市场流动性”,优先在市场活跃时段执行订单,降低冲击成本,是机构交易的主流算法。

特点

· 需依赖成交量数据(历史或实时)动态调整拆单节奏,对行情数据获取能力要求较高。

· 跟踪误差通常小于 TWAP,尤其在成交量波动较大的市场环境中更优。

3. 冰山算法(Iceberg Algorithm)

核心原理

冰山算法将大额订单拆分为 “可见单” 和 “隐藏单”:仅在盘口暴露少量 “可见单”(如总订单量的 5%-10%),当可见单成交后,自动补充新的可见单,直至整个大额订单执行完毕。隐藏部分订单不对外展示,避免被市场察觉大额交易意图,从而减少价格被推高(买入)或压低(卖出)的风险。

适用场景

· 超大额订单(占当日成交量 20% 以上),或对市场价格敏感的交易(如重仓建仓 / 减仓)。

· 流动性较差的个股,需避免因大额订单暴露导致市场流动性枯竭。

特点

· 核心是 “隐藏订单深度”,通过控制可见单规模降低市场冲击。

· 需实时监控盘口订单状态(如可见单是否成交),对订单回调和状态跟踪能力要求较高。

二、PTrade 中的实现方式

PTrade 通过其策略框架的定时调度、行情获取、订单执行三类核心函数组合,可实现上述三种拆单算法。其核心逻辑是:通过定时函数控制拆单节奏,通过行情函数获取执行所需数据(时间、成交量、盘口),通过下单函数执行小额订单。

1. TWAP 算法实现

核心逻辑

1. 设定总交易时间(如 9:30-11:30)和拆单时间间隔(如 5 分钟),计算拆单次数(如 24 次,每 5 分钟 1 次)。

2. 按时间间隔均匀拆分订单量(总订单量 / 拆单次数)。

3. 定时执行小额订单,直至全部完成。

核心函数

· run_interval(context, func, seconds):定时执行函数,控制拆单时间间隔(如seconds=300表示每 5 分钟执行 1 次)。

· order(security, volume) / order_target(security, target_volume):执行小额订单(前者按数量下单,后者按目标持仓下单,适合分批调整)。

· get_trading_day():获取当前交易日,确认交易时间段(避免非交易时间下单)。

实现流程示例

· 用run_interval设定每 5 分钟执行一次下单函数。

· 在下单函数中,计算单次下单量(总订单量 ÷ 拆单次数),调用order执行。

· 通过get_trading_day判断是否为交易日,避免无效执行。

2. VWAP 算法实现

核心逻辑

1. 用历史数据(如过去 10 个交易日)分析目标时段(如 9:30-15:00)的成交量分布(如各时段成交量占比)。

2. 根据实时成交量动态调整下单量(成交量占比高的时段,单次下单量增加)。

3. 定时(如 1 分钟)获取实时成交量,更新下单节奏,执行小额订单。

核心函数

· get_history(count, frequency, field, security_list):获取历史成交量数据(field='volume'),用于分析成交量分布。

· get_price(security, start_date, end_date, frequency, fields):获取实时或近期成交量(fields='volume'),动态调整拆单量。

· run_interval(context, func, seconds):高频(如 1 分钟)执行函数,更新成交量数据并下单。

· order_value(security, value):按金额下单(适合按成交量占比动态调整下单规模)。

实现流程示例

· 用get_history获取过去 10 个交易日的 5 分钟级成交量,计算各时段(如 9:30-9:35、9:35-9:40)成交量占比。

· 用run_interval(seconds=60)每分钟执行一次函数,通过get_price获取当前时段实时成交量,修正下单量占比。

· 调用order_value按修正后的金额执行小额订单。

3. 冰山算法实现

核心逻辑

1. 设定 “可见单规模”(如总订单量的 5%,不超过盘口最优档位的挂单量)。

2. 先提交可见单,通过订单状态回调或定时检查确认是否成交。

3. 若可见单成交,立即补充新的可见单;重复执行,直至总订单完成。

核心函数

· get_gear_price(sids):获取盘口数据(买卖一档至五档的价格和挂单量),确定可见单的合理规模(避免可见单过大冲击盘口)。

· get_order(order_id) / get_open_orders():查询单个订单状态或所有未完成订单,判断可见单是否成交。

· order(security, volume):提交可见单(每次仅提交总订单量的 5%-10%)。

· on_order_response(context, order_list):订单状态回调函数,实时接收订单成交反馈,触发下一个可见单提交。

实现流程示例

· 用get_gear_price获取目标个股的买一 / 卖一挂单量,设定可见单规模(如挂单量的 80%)。

· 调用order提交可见单,通过on_order_response回调函数监控成交状态。

· 若回调显示可见单成交,计算剩余订单量,重复提交新的可见单,直至总订单执行完毕。

三、QMT(XtQuant)中的实现方式

QMT(基于 XtQuant 库)通过行情订阅、异步订单、回调函数三类核心接口实现拆单算法,核心逻辑是:通过行情订阅获取实时数据,通过异步下单接口执行小额订单,通过回调函数监控订单状态并调整拆单节奏。

1. TWAP 算法实现

核心逻辑

1. 订阅目标标的行情,确认交易时段(如 9:30-15:00)。

2. 计算拆单时间间隔(如 5 分钟)和单次下单量(总订单量 / 拆单次数)。

3. 通过定时任务或行情回调,按时间间隔执行小额订单。

核心函数

· xtdata.subscribe_quote(stock_code, period, callback):订阅标的行情,通过callback函数触发定时逻辑(或结合time.sleep控制间隔)。

· xttrader.order_stock(account, stock_code, order_type, volume, price_type, price):同步下单接口,执行小额订单。

· xttrader.run_forever():维持策略运行,确保定时任务持续执行。

· xtdata.get_trading_calendar(market):获取交易日历,确认交易时间范围。

实现流程示例

· 用xtdata.get_trading_calendar('SH')确认当日交易时段(9:30-11:30、13:00-15:00)。

· 计算拆单次数(如 24 次,每 5 分钟 1 次)和单次下单量。

· 用xtdata.subscribe_quote订阅标的 1 分钟行情,在回调函数中加入时间判断,每 5 分钟调用xttrader.order_stock执行小额订单。

· 调用xttrader.run_forever()维持策略运行,确保定时下单不中断。

2. VWAP 算法实现

核心逻辑

1. 订阅标的实时行情,获取分钟级成交量数据。

2. 用历史成交量数据(如过去 10 天)建立成交量分布模型,结合实时成交量动态调整下单量。

3. 高频(如 1 分钟)更新成交量占比,执行对应规模的小额订单。

核心函数

· xtdata.get_market_data(field_list=['volume'], stock_list, period, start_time, end_time):获取历史 / 实时成交量数据(field_list=['volume'])。

· xtdata.subscribe_whole_quote(code_list, callback):订阅全市场或单标的实时行情,高频获取成交量。

· xttrader.order_stock_async(account, stock_code, order_type, volume, price_type, price):异步下单接口,避免阻塞行情接收。

· xtdata.get_period_list():获取行情周期(如 1 分钟、5 分钟),匹配成交量数据粒度。

实现流程示例

· 用xtdata.get_market_data获取过去 10 个交易日的 1 分钟级成交量,计算各时段(如 9:30-9:31、9:31-9:32)成交量占比。

· 用xtdata.subscribe_whole_quote订阅标的实时行情,在回调函数中每分钟获取当前成交量,修正当日成交量分布。

· 根据修正后的占比计算单次下单量,调用xttrader.order_stock_async异步执行,避免影响行情接收。

3. 冰山算法实现

核心逻辑

1. 订阅标的盘口数据(买一 / 卖一挂单量),确定可见单最大规模。

2. 提交可见单后,通过订单回调函数监控成交状态。

3. 可见单成交后,立即补充新的可见单,直至总订单完成。

核心函数

· xtdata.get_gear_price(stock_code):获取标的盘口数据(各档位挂单量),设定可见单规模(如不超过买一挂单量的 50%)。

· xttrader.on_order_response(context, order_list):订单状态回调函数,实时接收成交反馈。

· xttrader.order_stock(account, stock_code, order_type, volume, price_type, price):执行可见单(单次量较小)。

· xttrader.get_stock_orders(account, cancelable_only=False):查询未完成订单,避免重复下单。

实现流程示例

· 用xtdata.get_gear_price获取标的买一挂单量,设定可见单规模(如挂单量的 50%,且不超过总订单量的 10%)。

· 调用xttrader.order_stock提交可见单,通过on_order_response回调函数监控是否成交。

· 若回调显示可见单成交,用xttrader.get_stock_orders确认无未完成订单后,计算剩余订单量,重复提交新的可见单。

(注:点我红色头像旁边有个咨询TA,加我微或者电话联系我)



温馨提示:投资有风险,选择需谨慎。