| Item | Detail |
|---|---|
| Engine | D:\MY\ARGUS\Financial\BINANCE_OPTION_ENGINE (overlay) |
| Status | 🟡 Paper เท่านั้น (--live-orders ถูกปฏิเสธจนกว่าจะ probe บน demo environment) |
| Decisions | ADR-001 (แยกกระเป๋า), ADR-004 (budget ของ put), ADR-005 (cash-backed puts) |
| Last Updated | 2026-10-03 |
📌 สรุป
Overlay ขาย option ระยะสั้น (7-14 วัน) รอบ ETH ที่ grid ถืออยู่ แล้วเก็บ premium เป็น USDT
- ขาย call เหนือโซนขายของ grid โดยใช้ ETH ใน Spot เป็นของค้ำเชิงเศรษฐกิจ
- ขาย put ใต้โซนซื้อถัดไปของ grid โดยกันเงินสดเต็มจำนวน strike ไว้ ถ้าโดน assign ก็ได้ ETH ในราคา strike ลบ premium ซึ่งเป็นราคาที่ grid ตั้งใจจะซื้ออยู่แล้ว
- Binance settle option เป็นเงินสดทั้งคู่ ไม่มีการส่งมอบ ETH
- call ที่ ITM: จ่ายส่วนต่างเป็น USDT และ ETH ยังอยู่ครบ
- put ที่ ITM: เสียส่วนต่างเป็น USDT แล้ว overlay ต้องไปซื้อ ETH เองใน Spot (spot leg)
flowchart LR
GRID[Grid<br/>ถือ ETH + กำหนดโซน] -->|sell_zone_top| CC[ขาย Covered call]
GRID -->|next_buy_zone| PW[ขาย Cash-secured put]
CC -->|premium USDT| OPT[(Options wallet)]
PW -->|premium USDT| OPT
PW -->|ITM: ซื้อ ETH ที่ K - premium| SPOT[(Spot wallet)]
💵 แหล่งเงินสดและต้นทุน
| ประเภท | รายการ | เข้า/ออก | กระเป๋า |
|---|---|---|---|
| รายได้ | Premium จากการขาย call | เข้า | Options |
| รายได้ | Premium จากการขาย put | เข้า | Options |
| มูลค่าเพิ่ม | ได้ ETH ถูกกว่าราคาที่ grid จะซื้อ เมื่อ put ITM | ราคาทุน ETH ต่ำลง | Spot |
| ต้นทุน | ค่าธรรมเนียม option: 0.024% ของ notional ไม่เกิน 10% ของ premium | ออก | Options |
| ต้นทุน | ค่าธรรมเนียม spot 0.1% ตอนซื้อ ETH ของ spot leg | ออก | Spot |
| ต้นทุน | Call ITM: จ่าย (S - K) x qty เป็น USDT |
ออก | Options |
| ต้นทุน | Buyback call ก่อนหมดอายุ (ถ้าเข้าเงื่อนไข) | ออก | Options |
| ต้นทุนแฝง | Slippage ระหว่างราคา settlement กับราคาที่ซื้อ ETH ได้จริง | ออก | Spot |
ℹ️ Note Call ที่ ITM ไม่ได้ทำให้ ETH หายไป เสียแค่เงินสดส่วนต่าง ส่วน ETH ยังอยู่ใน Spot และ grid ขายตามโซนต่อได้
🏗️ สองกระเป๋า: ใครถืออะไร
Binance คิด margin ของ option จาก USDT ในกระเป๋า Options เท่านั้น ETH ในกระเป๋า Spot ไม่นับเป็น collateral สำหรับ Binance แล้ว covered call จึงเป็น naked call ที่ต้องวาง USDT margin เอง (ADR-001)
| กระเป๋า | ถือ | Reservation ที่อยู่ได้ |
|---|---|---|
BINANCE_OPTIONS |
USDT, short options | CC_MARGIN, PUT_SPOT_BUY_BUDGET, PUT_LOSS_BUDGET, buffer |
BINANCE_SPOT |
ETH, USDT float ประมาณ 500 | CC_BACKING (ETH) และ budget ของ put ที่ย้ายมารอซื้อ ETH |
Invariant I7 บังคับตารางนี้:
- ถ้า ledger พบ ETH บน Options หรือ
CC_BACKINGอยู่ผิดกระเป๋า ระบบ halt - คำสั่งโอนที่จะพาของไปลงผิดกระเป๋าถูกปฏิเสธตั้งแต่ก่อนส่งไปที่ exchange
📈 Covered call
เลือกสัญญา
| กฎ | ค่า |
|---|---|
| Strike ขั้นต่ำ | sell_zone_top x 1.02 |
| เลือก | strike ต่ำสุดที่ผ่านเกณฑ์ (premium สูงสุดในกลุ่มที่รับได้) |
| เสมอกัน | strike เท่ากันเลือกวันหมดอายุที่ไกลกว่า |
| อายุ | 7-14 วัน |
| ขนาด | ไม่เกิน 30% ของ ETH ที่ถือ ลบ short call ที่มีอยู่ ปัดลงทีละ 0.01 |
| quote: bid | ห่างจาก mark ไม่เกิน 10% |
| quote: spread | ไม่เกิน 20% ของ mark |
| quote: IV | อย่างน้อย 40% |
| quote: premium | สุทธิหลังค่าธรรมเนียมอย่างน้อย 5 USDT |
เงินที่ถูกกันไว้
CC_BACKING(ETH บน Spot) กัน grid ไม่ให้ขาย ETH ที่ call สัญญาไว้CC_MARGIN(USDT บน Options) คือ initial margin ที่ index ขยับ 15% ไปทางที่แย่กว่า
วงจร
stateDiagram-v2
[*] --> CANDIDATE: ผ่าน risk gates
CANDIDATE --> RESERVED: กัน CC_BACKING + CC_MARGIN
RESERVED --> ORDER_PENDING: ส่ง LIMIT sell
ORDER_PENDING --> OPEN: fill
OPEN --> BUYBACK_PENDING: ต้นทุนซื้อคืน <= 20% ของ premium
BUYBACK_PENDING --> SETTLED: buyback fill
OPEN --> SETTLEMENT_PENDING: หมดอายุ
SETTLEMENT_PENDING --> SETTLED: เห็นผล settlement
SETTLED --> CLOSED: คืน reservation
- ถ้าซื้อคืนได้ที่ราคา ask แล้วต้นทุนไม่เกิน 20% ของ premium ที่รับมา จะปิดก่อนเพื่อเก็บ premium ส่วนใหญ่ไว้และคืนเงินค้ำ ถ้า ask หนีไป ให้หมดอายุตามปกติ
CC_BACKINGคืนตอนSETTLED -> CLOSEDเท่านั้น ไม่คืนตอนหมดอายุ ถ้ายังไม่เห็นผล settlement ถือว่ายังมีภาระอยู่
📉 Cash-secured put
เลือกสัญญา
| กฎ | ค่า |
|---|---|
| Strike สูงสุด | next_buy_zone x 0.98 |
| เลือก | strike สูงสุดที่ผ่านเกณฑ์ |
| เสมอกัน | strike เท่ากันเลือกวันหมดอายุที่ไกลกว่า (premium ต่อวันสูงกว่า) |
| อายุ | 7-14 วัน |
| ขนาด | ค่าที่น้อยกว่าของ 2 ข้อล่าง |
| ขนาด (1) | put notional ไม่เกิน 88% ของ USDT |
| ขนาด (2) | เงินว่างที่เหลือหลังกันพื้น 10% หารด้วย K x 1.02 |
เงินที่ถูกกันไว้ (ADR-004)
| Budget | ขนาด | ใช้ทำอะไร |
|---|---|---|
PUT_SPOT_BUY_BUDGET |
K x qty |
ซื้อ ETH หลัง settle ITM; หดเหลือ S x qty ใน commit เดียวกับ settlement |
PUT_LOSS_BUDGET |
2% x K x qty |
รับราคาที่ขยับระหว่าง settlement กับการซื้อจริง และค่าธรรมเนียม |
ทำไมพอ: (K - S) + S = K ทุกราคา settlement เงิน K จึงจ่ายทั้งส่วนต่างและค่า ETH ได้เสมอ ส่วน 2% เผื่อราคาวิ่งในหนึ่งชั่วโมงที่ IV 50% (ประมาณ 1.6%) บวกค่าธรรมเนียม
วงจรเมื่อ ITM
sequenceDiagram
participant PW as Put strategy
participant L as Ledger
participant CM as Collateral Manager
participant SP as Spot wallet
PW->>L: settlement ITM: หัก (K - S) x qty, สร้าง spot leg
CM->>SP: ย้าย spot-buy + loss budget จาก Options ไป Spot (transfer เดียว)
CM->>SP: ถ้าราคาซื้อเกิน budget: เติมเงินจาก Options ส่วนที่เกิน buffer
PW->>SP: MARKET buy ETH ภายใน 1 ชั่วโมง
SP-->>PW: fill
PW->>L: คืน budget ที่เหลือ, CLOSED
ราคาทุน ETH ที่ได้จริง (section 4.5):
effective_cost = (ราคาซื้อ ETH รวม + ส่วนต่าง settlement + ค่าธรรมเนียม - premium) / ETH ที่ได้
ถ้าซื้อได้ที่ราคา settlement พอดีและไม่มีค่าธรรมเนียม สูตรนี้ลดเหลือ K - premium ต่อ ETH
⚠️ Warning ถ้าซื้อ ETH ไม่ครบภายใน
spot_buy_window(1 ชั่วโมง) ระบบ halt ด้วยSPOT_LEG_OVERDUEและไม่ปิด leg เอง ผู้ดูแลต้องตัดสินใจ
🔄 Collateral Manager: เงินเดินระหว่างกระเป๋า
ทำงานทุก tick ก่อน kill switch และยังทำงานตอนระบบ halt เพราะเป็นการโอนเงินระหว่างกระเป๋าของตัวเอง
flowchart LR
subgraph SPOT[BINANCE_SPOT]
SUSDT[USDT float 500]
ETH[ETH + CC_BACKING]
LEG[Budget ของ spot leg]
end
subgraph OPT[BINANCE_OPTIONS]
OUSDT[USDT ว่าง]
BUF[Buffer 1.5x stressed MM]
end
SUSDT -->|top-up / sweep| OUSDT
OPT -->|rehome budget เมื่อ put ITM| LEG
OUSDT -->|leg fund: ส่วนที่เกิน buffer| LEG
| การโอน | ทิศทาง | เมื่อไร | ขนาด |
|---|---|---|---|
| Top-up | Spot -> Options | เงินว่าง Options ต่ำกว่า target หรือ mm_ratio >= 0.35 | ส่วนที่ขาด (ถึง mm_ratio แล้วโอนทั้งหมดที่โอนได้) |
| Sweep | Spot -> Options | USDT บน Spot เกิน float | ส่วนที่เกิน 500 ลบเงินที่ spot leg ต้องใช้ |
| Rehome | Options -> Spot | Put settle ITM | budget ทั้งสองก้อนของ leg ใน transfer เดียว |
| Leg fund | Options -> Spot | ราคาซื้อ x 1.02 สูงกว่า budget ที่มีบน Spot | ส่วนที่ขาด ใช้ได้เฉพาะเงินที่เกิน target |
- Target =
1.5 xmaintenance margin ของ short ทั้งหมด (รวมที่อนุมัติแล้วแต่ยังไม่ fill) เมื่อ index ขยับ 15% - โอนล้มเหลว 3 ครั้งใน 30 นาที ระบบ halt ด้วย
TRANSFER_RETRIES_EXHAUSTED - โอนค้างเกิน 5 นาที ระบบ halt ด้วย
TRANSFER_UNRESOLVED - เงินไม่พอเติม buffer ระบบ halt ด้วย
COLLATERAL_SHORTFALL - ไม่ขาย ETH เพื่อเติม collateral (flag ปิดไว้)
🚦 Risk gates ก่อนขายทุกครั้ง
ทุกคำขอขายผ่าน evaluate() แล้วต้องผ่านทุกข้อ ระบบรายงานเหตุผลที่ไม่ผ่านครบทุกข้อ ไม่ได้หยุดที่ข้อแรก
| กลุ่ม | เงื่อนไข | Reason |
|---|---|---|
| ข้อมูลสด | snapshot อายุไม่เกิน 30 วินาที, reconcile ตรงกัน | SNAPSHOT_STALE, RECON_NOT_CLEAN |
| ภาระค้าง | ไม่มี spot leg ค้าง | PENDING_SPOT_LEG_BLOCKING |
| Margin | margin usage ไม่เกิน 50%, mm_ratio ไม่เกิน 0.50 | MARGIN_USAGE, MM_RATIO |
| Collateral (gate 3b) | เงินว่าง Options หลังกัน reservation ยังคลุม target รวม short ใหม่ | OPTIONS_COLLATERAL |
| Drawdown | portfolio drawdown ไม่เกิน 20% | MAX_DD_FREEZE |
| Budget | call ไม่เกิน 30% ของ ETH, put ไม่เกิน 88% ของ USDT, เงินว่างเหลืออย่างน้อย 10% | CC_BUDGET, PUT_BUDGET, MIN_FREE_USDT |
| ETH รวมหลัง assign | ไม่เกิน 1.15 เท่าของ ETH ที่ถือ (put ที่มีเงินสดค้ำไม่นับ, ADR-005) | FULLY_ASSIGNED_EXCEEDED |
ℹ️ Note การซื้อ ETH ของ spot leg เป็นภาระที่ต้องจ่าย ไม่ใช่การเพิ่มความเสี่ยง gate ที่บล็อกการขายใหม่จึงไม่บล็อกการซื้อนี้
🧮 ตัวอย่างตัวเลข
ตัวเลขจาก test fixture (tests/test_overlay_put_writing.py) เพื่อดูการคิดเงิน ไม่ใช่ผลตอบแทนที่คาดไว้
Put ITM: strike 3000, 20 สัญญา x 1 ETH, bid 60, settle ที่ 2800
| ขั้น | Options wallet | Spot wallet |
|---|---|---|
| ขาย put: premium | +1,200 | |
| กัน budget | spot-buy 60,000 + loss 1,200 | |
Settle ITM: ส่วนต่าง (3000 - 2800) x 20 |
-4,000 | |
Spot-buy budget หดเหลือ 2800 x 20 |
56,000 | |
| Rehome budget | -57,200 | +57,200 |
| ซื้อ 20 ETH ที่ 2800 | -56,000 / +20 ETH | |
| คืน budget ที่เหลือ | 1,200 กลับเป็นเงินว่าง |
effective_cost = (56,000 + 4,000 - 1,200) / 20 = 2,940 ต่อ ETH ซึ่งเท่ากับ 3000 - 60
Covered call จาก smoke run 2026-10-03: ถือ 2 ETH ขาย ETH-261016-2900-C ได้ 0.60 สัญญา (30% ของ 2 ETH) ที่ 20.80 ได้ premium ประมาณ 12.5 USDT ก่อนค่าธรรมเนียม
⚠️ ความเสี่ยงและข้อจำกัด
| เรื่อง | ผล | สถานะ |
|---|---|---|
| Covered call เป็น naked call ในสายตา exchange | ใช้ USDT margin เพิ่ม ขายได้น้อยกว่า Deribit ที่ทุนเท่ากัน | 🟢 จำลองแล้ว (paper liquidate เมื่อต่ำกว่า MM) |
| Gate 3b ไม่นับ budget ของ put เป็น buffer | ขาย put ด้วยเงินสดอย่างเดียวได้น้อยลงประมาณ 17% เทียบ ADR-005 | 🟢 owner ยอมรับแล้ว |
| ETH ร่วงแรง | put หลายรอบถูก assign, เงินสดกลายเป็น ETH ที่ K | ⚪ คุมด้วย cap 88% และโซนของ grid |
| ETH ขึ้นแรง | call ITM จ่ายส่วนต่างเป็น USDT; ETH ยังอยู่ แต่พลาดกำไรเหนือ strike | ⚪ คุมด้วย cap 30% และ strike เหนือโซนขาย |
| ราคาซื้อ spot วิ่งเกิน budget + เงินว่างที่เกิน buffer | exchange ปฏิเสธการซื้อ, leg ค้างจน SPOT_LEG_OVERDUE |
🟢 มี leg fund (ดูหมายเหตุใต้ตาราง) |
| Live transfer / live order | ยังไม่เคยรันกับบัญชีจริง | 🔴 ล็อกไว้จนกว่าจะ probe บน demo |
| Portfolio Margin ของ Binance | อาจเปลี่ยนกติกา collateral ทั้งหมด | ⚪ revisit เมื่อเปิดใช้ |
Leg fund โอนเงินว่างส่วนที่เกิน buffer ไปผูกเป็น loss budget ของรายการซื้อนั้น และงดโอนเมื่อ mm_ratio ถึงระดับเติมเงินหรือไม่ทราบค่า
📚 อ้างอิง
D:\MY\ARGUS\Financial\BINANCE_OPTION_ENGINE\docs\decisions\001-wallet-separation.mdD:\MY\ETH_CASHFLOW_SYSTEM\docs\decisions\005-gate6-cash-backed-puts.mdD:\MY\ARGUS\Financial\BINANCE_OPTION_ENGINE\src\binance_options_engine\overlay\risk\model.py(RiskLimits,CollateralConfig)D:\MY\ARGUS\Financial\BINANCE_OPTION_ENGINE\src\binance_options_engine\overlay\strategy\(covered call, put writing)