> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# TWAP

> 把大额订单拆到时间上，在订单簿逐步回补的同时取走流动性——分片成交不足时追赶补量，并用随机化避免被预判。

大单一次性成交，就要为自己造成的冲击买单：它吃穿订单簿，每一档都比上一档更差。TWAP 订单把同样的数量铺在时间上，按固定间隔取走一片，让订单簿在两片之间有时间回补。

代价很明确：你承担**执行窗口内的价格风险**——慢慢做的过程里，市场可能走向不利方向——换来的是避开一次性完成的冲击。

<h2 id="parameters">
  参数
</h2>

| 参数       | 含义                      |
| -------- | ----------------------- |
| **总数量**  | 要执行的全部数量，可按资产计价或按结算货币计价 |
| **持续时间** | 铺开多长时间——5 分钟到 24 小时     |
| **间隔**   | 两片之间的时间                 |
| **随机化**  | 让每片数量有所变化，而不是发出完全相同的订单  |
| **只减仓**  | 限制该订单只能平掉已有仓位           |

由持续时间和间隔可得：

$$
N = \frac{\text{持续时间}}{\text{间隔}} + 1 \qquad
\text{基础分片} = \frac{Q}{N}
$$

启动时立即发出一片，之后每隔一个间隔发出一片，窗口结束时再发一片。

<h2 id="validation-before-it-starts">
  启动前的校验
</h2>

如果一笔 TWAP 按指定参数根本不可能完成，它会在一开始就被拒绝：

* 每片必须大到能构成有效订单——总量按计划切分后不能低于市场最小值
* 每片不得超过市场的最大订单数量
* 全部数量必须满足起始保证金
* 若为只减仓，总量不得超过你当前的仓位

提前失败很重要。TWAP 要是跑到一半才发现分片低于最小值，你会被留在部分执行的状态里，还没有干净的收尾办法。

<h2 id="execution-and-catch-up">
  执行与追赶
</h2>

每一片都作为带 **3% 滑点边界**的市价单提交。执行由链上驱动，不看挂钟，所以每一片落在间隔走完之后的第一个区块上。

某一片成交低于预期——订单簿薄、顶到滑点边界——缺口不会丢。计划表会对照此刻本应到达的位置：

$$
\text{目标} = \frac{t_{\text{已用}}}{t_{\text{总时长}}} \times Q
$$

当实际成交落后于该目标时，后续分片会被放大以追赶：

<div className="dg" data-dg="twap-catchup">
  <div className="dg-c" style={{aspectRatio:"720 / 286"}}>
    <svg className="dg-w" viewBox="0 0 720 286" aria-hidden="true">
      <path className="dg-rule dg-dash" d="M 400 24 L 400 250" />
    </svg>

    <div className="dg-b dg-plain dg-left" style={{left:"57.2222%",top:"35.6643%",width:"18.8889%",height:"9.7902%"}}><span className="dg-s dg-ink--orange">成交不足</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"57.2222%",top:"48.2517%",width:"18.8889%",height:"9.7902%"}}><span className="dg-s dg-ink--sky">追赶补量</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"77.7778%",top:"16.0839%",width:"22.2222%",height:"61.5385%"}}><span className="dg-t">为什么设上限</span><span className="dg-s">策略拿越发越大的订单去应付流动性缺失，最后会变成它本想避开的那种冲击。</span><span className="dg-n">目标 = 已用时间 ÷ 总时长 × 总量</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"0.0000%",width:"61.1111%"}}><div className="dg-n">六片，总量 6.0 — 第 3 片在薄簿里成交不足</div></div>
    <div className="dg-bar" style={{left:"0.0000%",top:"10.4895%",width:"55.5556%",height:"9.7902%"}}><span className="dg-bar-lead" style={{width:"15.5000%"}}>第 1 片</span><span className="dg-bar-track"><span className="dg-bar-fill dg--blue" style={{left:"0%",width:"33.333%"}} /><span className="dg-bar-val" style={{left:"33.333%"}}>1.00</span></span></div>
    <div className="dg-bar" style={{left:"0.0000%",top:"23.0769%",width:"55.5556%",height:"9.7902%"}}><span className="dg-bar-lead" style={{width:"15.5000%"}}>第 2 片</span><span className="dg-bar-track"><span className="dg-bar-fill dg--blue" style={{left:"0%",width:"33.333%"}} /><span className="dg-bar-val" style={{left:"33.333%"}}>1.00</span></span></div>
    <div className="dg-bar" style={{left:"0.0000%",top:"35.6643%",width:"55.5556%",height:"9.7902%"}}><span className="dg-bar-lead" style={{width:"15.5000%"}}>第 3 片</span><span className="dg-bar-track"><span className="dg-bar-fill dg--orange" style={{left:"0%",width:"13.333%"}} /><span className="dg-bar-val" style={{left:"13.333%"}}>0.40</span></span></div>
    <div className="dg-bar" style={{left:"0.0000%",top:"48.2517%",width:"55.5556%",height:"9.7902%"}}><span className="dg-bar-lead" style={{width:"15.5000%"}}>第 4 片</span><span className="dg-bar-track"><span className="dg-bar-fill dg--sky" style={{left:"0%",width:"40.000%"}} /><span className="dg-bar-val" style={{left:"40.000%"}}>1.20</span></span></div>
    <div className="dg-bar" style={{left:"0.0000%",top:"60.8392%",width:"55.5556%",height:"9.7902%"}}><span className="dg-bar-lead" style={{width:"15.5000%"}}>第 5 片</span><span className="dg-bar-track"><span className="dg-bar-fill dg--sky" style={{left:"0%",width:"40.000%"}} /><span className="dg-bar-val" style={{left:"40.000%"}}>1.20</span></span></div>
    <div className="dg-bar" style={{left:"0.0000%",top:"73.4266%",width:"55.5556%",height:"9.7902%"}}><span className="dg-bar-lead" style={{width:"15.5000%"}}>第 6 片</span><span className="dg-bar-track"><span className="dg-bar-fill dg--sky" style={{left:"0%",width:"40.000%"}} /><span className="dg-bar-val" style={{left:"40.000%"}}>1.20</span></span></div>
    <div className="dg-lbl" style={{left:"55.5556%",top:"90.2098%"}}>3× 基础数量 — 上限</div>
  </div>
</div>

上限才是关键。追赶是好事，无限制的追赶不是——策略拿“越发越大的订单”去应付流动性缺失，最后会变成它本想避开的那种冲击。**任何一片都不超过基础数量的三倍**，所以恢复是渐进的。

彻底失败的一片会被跳过并上报。策略不会暂停——流动性稀薄的某个瞬间里的一片坏单，不该拖住整笔订单的其余部分。

<h2 id="randomization">
  随机化
</h2>

打开随机化，各片就不再相同。每发一片之前，策略先算出剩余量的平均值，再在它周围一个安全区间里取一个数量。

固定间隔上的固定数量是一种模式，而订单流中的模式对任何盯着看的人都是信息。随机化去掉这种规律，同时不改变计划表的总量。

剩余数量的算术仍然是硬约束。随机化只改变每片的大小；它不会让策略超发，也不会在最后留下残量。

<h2 id="when-twap-is-the-right-tool">
  什么时候 TWAP 是对的工具
</h2>

**该用**：订单相对可见深度偏大，你又有时间，而且“窗口内的平均价格”是个可以接受的目标。

**不该用**：你现在就要这个仓位——TWAP 和紧迫性正好相反。心里有一个具体价格时也不该用：TWAP 没有价格目标，只有时间计划表。价格比即时性更重要的话，[阶梯订单](/zh/trading/scale-orders)会在一段价格区间上挂出限价单。

<Warning>
  TWAP 不保证全部执行。分片是受滑点边界约束的市价单，行情持续单边时可能反复成交不足。追赶又有上限，所以一个以“市场已经走反”收尾的窗口，可能让订单剩下相当大一部分没做完。
</Warning>

<h2 id="where-to-go-next">
  后续阅读
</h2>

<CardGroup cols={2}>
  <Card title="阶梯订单" href="/zh/trading/scale-orders">
    拆到价格上而不是时间上。
  </Card>

  <Card title="市价单" href="/zh/trading/market-to-limit">
    每一片所受的滑点边界。
  </Card>

  <Card title="订单簿" href="/zh/trading/order-book">
    判断你的订单相对深度是否偏大。
  </Card>

  <Card title="手续费" href="/zh/programs/fees">
    每一片都是吃单订单，都付吃单费率。
  </Card>
</CardGroup>
