Setyembre 2, 2026 · microstructure

Hindi napunan ang limit order mo: isang liham tungkol sa queue position, mga maker backtest, at Sharpe na inimbento mo

Hindi napunan ang limit order mo: isang liham tungkol sa queue position, mga maker backtest, at Sharpe na inimbento mo

Ipinadala mo sa akin ang notebook mo noong nakaraang linggo: parehong signal, parehong universe, parehong 14 na buwan ng BTCUSDT perp data. Execution lang ang binago. Tumigil ka sa pagtawid sa spread at nagsimulang maglagay ng bid na nakaabang, isang tick sa loob, at umakyat ang Sharpe mula 0.42 tungong 2.14. Tinanong mo kung totoo ba iyon o kung may nasira ka.

May nasira ka. Gusto kong ipakita sa iyo kung saan mismo, dahil isang linya lang ang bug pero mas malaki ang aral sa likod nito kaysa sa linyang iyon.

Narito ang fill rule mo, kinopya mula sa engine mo:

if bar.low <= limit_price: fill(limit_price)

Ang sinasabi nito: kung may naitalang trade ang market sa presyong katumbas o mas mababa sa presyo ko sa loob ng minutong ito, napunan ako sa presyo ko. Ang tunay na ipinapakahulugan nito ay nahawakan lang ng presyo ang level mo. Hindi ibig sabihin ng paghawak ay napunan ka. Sa pagitan ng dalawang iyon ay may queue, at itinuring mong walang laman ang queue sa modelo mo.

Ano ang nakapila sa unahan mo

Kapag naglagay ka ng bid sa 84,120.0 sa BTCUSDT perp, pumipila ka sa hulihan ng mga order na nakapuwesto na roon. Sa top-of-book level ng kontratang iyon, karaniwan itong nasa pagitan ng 4 at 30 BTC depende sa oras ng araw; nasa bandang 12 BTC ang median sa sample window mo. 0.4 BTC ang order mo. Para makapag-trade ka, kailangang ibenta ng mga seller sa level na iyon ang sapat na kabuuang laki para malampasan ang lahat ng nauna sa iyo, at kailangan nilang gawin iyon bago makansela ang level sa ilalim mo o umakyat palayo ang market.

Kaya ang dapat itanong ng backtest mo ay hindi “umabot ba ang presyo sa 84,120.0” kundi “may kahit 12.4 BTC ba na market sell na na-execute sa 84,120.0 habang nakapuwesto roon ang order ko.” Magkaibang-magkaiba ang mga pangyayaring iyon. Sa data mo, halos tatlong ulit ang agwat ng mga ito.

12.4 BTCmedian na laki ng nakapila sa unahan mo nang mahawakan ang presyo
100%fill rate na ipinapalagay ng backtest mo
31%ng mga paghawak sa presyo na nakalampas sa queue mo
4,180na trade, naging humigit-kumulang 1,300

Tatlong fill rule, tatlong magkaibang strategy

Muli kong pinatakbo ang signal mo gamit ang parehong entry at tatlong execution model. Parehong alpha, parehong fee, parehong funding. Fill logic lang ang binago.

Fill ruleMga fillMean na 60s edge pagkatapos ng fillSharpe
Hawak lang: low <= limit4,180+2.6 bp2.14
Mahigpit na paglagpas: low < limit - 1 tick1,712+0.4 bp0.61
Queue sim batay sa volume sa level1,306+0.9 bp0.77

Ang gitnang row ang payak na pag-aayos na unang sinusubukan ng lahat: bilangin lang na fill kung talagang nag-trade ang market lampas sa presyo mo, sa palagay na kung lumagpas ito sa iyo, tiyak na naubos ka nito. Tama ang direksiyon ng ideyang iyon at pinapatay nito ang karamihan sa pantasya. May malubha rin itong bias, na tatalakayin ko mamaya.

Ang pinakailalim na row ang dapat mong buuin. Hindi nito kailangan ng L3 feed o rekonstruksiyon ng bawat order. Karamihan ng kailangan mo ay nasa iyo na.

Queue sim na mabubuo mo mula sa aggTrades

Kunin ang aggregate trade stream sa halip na klines. Taglay ng bawat print ang presyo, quantity, timestamp, at maker-side flag, na nagsasabi kung bumibili o nagbebenta ang aggressor. Sapat na iyon para sa maayos na simulation ng sarili mong passive order:

  1. Kapag nailagay na ang order mo, kunan ng snapshot ang resting size sa presyo mo. Kung 100ms na book feed lang ang mayroon ka, gamitin ang pinakahuling snapshot; maliit ang error nito kumpara sa error na inaayos mo.
  2. Itakda ang queue_ahead = resting_size. Magpalagay nang konserbatibo at ipagpalagay na ikaw ang pinakahuli. Ganoon naman talaga, maliban kung ikaw ang lumilikha ng level.
  3. Sundan ang trade stream. Bawat print na sell-aggressor sa presyong katumbas o mas mababa sa presyo mo ay magbabawas ng quantity sa queue_ahead. Kapag naging negatibo ito, napunan ka sa presyo mo, sa timestamp na iyon.
  4. Kung lumayo nang isang tick ang presyo, huwag ibalik sa zero ang queue. Bawasan ito nang paunti-unti. May ilan sa mga order sa unahan mo na kinakansela kapag luma na ang level, at may ilan namang hindi. Mas tumugma sa mga rekonstruksiyon ko ang 30-40% na pagbaba sa bawat buong segundong wala sa presyo kaysa sa alinman sa dalawang sukdulan.
  5. Kung kakansela at maglalagay muli ng order ang strategy mo, imodelo ang bagong order bilang bagong pila sa hulihan ng bagong level. Nilalaktawan ng mga tao ang hakbang na ito, at dito nagtatago ang natitirang pantasya.

Sa Step 2 mo gugustuhing makipagtalo sa akin. Oo, minsan malapit ka sa unahan dahil naglagay ka ng order sa mismong pagbuo ng level. Sige — sukatin mo iyon; huwag mong ipagpalagay. Itala ang resting size sa oras ng paglalagay at hayaang sabihin ng data kung anong bahagi ng mga order mo ang talagang maagang nakapila. Sa strategy mo, 11% iyon dahil lumilitaw ang signal mo pagkatapos ng galaw, ibig sabihin, naroon na ang level na sinasalihan mo at marami nang nakapila rito.

Ang mga fill na nakukuha mo ay ang mga fill na sana'y hindi mo nakuha

Ngayon naman ang bahaging talagang mahalaga, at ang dahilan kung bakit may bias ang mahigpit na paglagpas sa presyo.

Isipin kung kailan lubusang nauubos ang bid mo. Nangyayari ito kapag sapat ang tindi ng selling pressure para maubos ang buong level. Ibig sabihin, likas na nangyayari ito sa mismong sandaling bumababa ang market lampas sa presyo mo. Ang mga fill na pinakatiyak mong makukuha ay ang mga fill na agad naglalagay sa iyo sa lugi.

Paghiwa-hiwalayin ang mga fill mo ayon sa nangyari at sukatin ang 60-segundong mark-out:

Uri ng fillBahagi ng mga fillMark-out pagkalipas ng 60s
Nag-trade sa level, umakyat ang presyo38%+3.1 bp
Nag-trade sa level, hindi gumalaw ang presyo21%+0.2 bp
Lumagpas ang presyo nang 2+ tick41%−2.4 bp

Ibinigay sa iyo ng payak mong backtest ang tatlong bucket at itinuring na libre ang lahat ng ito. Halos puro ikatlong bucket naman ang ibinibigay ng mahigpit na paglagpas sa presyo, kaya mas bumagsak ang edge nito kaysa sa queue sim. Mali ang dalawa. Binibigyan ka ng queue sim ng makatotohanang halo, at iyon ang pinakamahalaga: kumikita ka ng spread sa passive execution, pero sinisingil ka nito sa adverse selection; ang ugnayan ng dalawang iyon ang tunay mong strategy.

Tama pa rin ang lumang pagtingin ng equities desk: ang maker order ay libreng opsiyong isinulat mo para sa market. May mag-eehersisyo nito kapag sulit itong i-exercise. Kinokolekta ng backtest mo ang premium at kinakalimutang may kabayaran ang opsiyon.

Binabago ng mga trade na hindi mo nakuha ang strategy, hindi lang ang gastos

Ito ang bahaging pinakagusto kong pag-isipan mo. Kapag mali ang pagmomodelo mo sa taker execution, tama ang mga trade mo pero mali ang presyo, at itinatama ng pag-aayos sa fee ang karamihan dito. Kapag mali ang pagmomodelo mo sa maker execution, lubos na maling hanay ng mga trade ang nakukuha mo. Humigit-kumulang 2,900 sa 4,180 entry mo ang hindi kailanman nangyari. Kabilang dito ang ilan sa pinakamagagandang signal mo, sa mga kandilang biglang tumaas ang presyo at bumaligtad, eksaktong sitwasyon kung saan tumakbo palayo ang market nang hindi ka naisama.

Kaya kailangan ng totoong logic ang sangay para sa mga order na hindi napunan. Ano ang ginagawa ng strategy kapag hindi napunan ang entry bago mawalan ng bisa ang signal? Hahabol gamit ang taker order at babayaran ang spread pati ang impact? Maglalagay muli ng order sa mas mababang presyo at tatanggap ng ibang batayan ng entry? Laktawan ang trade at mananatiling flat? Bawat pagpili ay nagbubunga ng malaking pagkakaiba sa equity curve, at walang isa man sa mga ito ang “ipagpalagay na napunan ka.” Sa mga run namin, nabawi ng tapat na chase rule (tumawid pagkatapos ng 20 segundong walang fill, hanggang 3 bp lang ang slippage) ang humigit-kumulang isang-katlo ng mga nawalang trade at halos kalahati ng agwat sa Sharpe ng payak na modelo at ng queue sim. Talagang kawili-wiling resulta iyon, at lumilitaw lang ito kapag sapat na makatotohanan ang fill model para maging makabuluhan ang tanong.

Mabilis na pagsusuri, sampung minuto: kunin ang live paper-trading log mo at ang backtest sa parehong panahon. Ihambing ang fill rate, hindi ang PnL. Kung napupunan ng backtest ang 100% ng mga nakapuwestong order pero 34% lang sa paper trading, hindi paghahambing ng strategy ang ginagawa mo; may bug sa fill model mo. Ayusin iyon bago tumingin sa kahit isang return figure.

Dalawa pang maliit na bagay habang narito ka

Mga post-only reject. Kung gumagamit ka ng post-only para matiyak ang maker fee tier at gumalaw ang order book sa pagitan ng desisyon mo at ng ack ng exchange, tatanggihan ang order sa halip na mailagay sa pila. Sa mga paper log namin, 3-6% ng mga pagtatangka sa BTCUSDT sa karaniwang oras ang ganito, at lampas 15% sa minutong kasunod ng paglabas ng US CPI. Ang tinanggihang order ay hindi napunang order at hindi rin nakapuwestong order na hindi napunan; isa itong trade na hindi kailanman umiral. Kung wala sa backtest mo ang ganitong estado, napalaki ang bilang ng trade mo mismo sa mga kondisyong pinakamahalaga sa iyo.

Pag-iwas sa self-trade at ang epekto mo sa market. Sa 0.4 BTC, hindi mo nagagalaw ang BTCUSDT, kaya laktawan mo ito. Pero nabanggit mong gusto mong patakbuhin ito sa mid-cap alt perp kung saan madalas wala pang $15k na notional ang top-of-book. Doon, makabuluhang bahagi ng queue ang order mo, at kasama sa bilang ng queue sa unahan mo ang epekto ng presensiya ng huling order mo. Kapag lumampas na sa humigit-kumulang 10% ng resting level ang laki mo, kailangang isaalang-alang ng sim na tumutugon sa iyo ang ibang kalahok. At sa totoo lang, sa puntong iyon mas pagkakatiwalaan ko ang paper trading kaysa sa anumang simulation na kaya mong isulat o kaya kong isulat.

Patakbuhin itong muli gamit ang queue sim at ipadala sa akin ang mark-out table na pinaghati-hati ayon sa uri ng fill. Kung dala pa rin ng bounce bucket ang karamihan ng edge at hindi kinakain ng through bucket ang lahat nito, baka may nahanap kang karapat-dapat subukan sa paper trading. Kung ang buong resulta ay dahil sa 2,900 fill na hindi mo naman makukuha, mas mabuting malaman mo na ngayon kaysa matapos ang apat na linggong pagmamasid sa paper account na hindi ginagawa ang ipinangako ng notebook.

mga limit orderqueue positionadverse selectionbacktestingcrypto futures
← Lahat ng post