> ## 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-Hant/trading/scale-orders)會在一個價格區間上掛出限價單。

<Warning>
  TWAP 不保證全部執行。分片是受滑價邊界約束的市價單，在持續單邊的行情裡可能反覆成交不足。追趕有上限，所以窗口收尾時市場已經走反的話，訂單可能剩下相當大一部分沒完成。
</Warning>

<h2 id="where-to-go-next">
  後續閱讀
</h2>

<CardGroup cols={2}>
  <Card title="階梯訂單" href="/zh-Hant/trading/scale-orders">
    拆到價格上而不是時間上。
  </Card>

  <Card title="市價單" href="/zh-Hant/trading/market-to-limit">
    每一片所受的滑價邊界。
  </Card>

  <Card title="訂單簿" href="/zh-Hant/trading/order-book">
    判斷你的訂單相對深度是否偏大。
  </Card>

  <Card title="手續費" href="/zh-Hant/programs/fees">
    每一片都是吃單訂單，都付吃單費率。
  </Card>
</CardGroup>
