Setyembre 4, 2026 · backtesting

Parehong nasa loob ng iisang bar ang stop at target mo. Alin ang pinili ng backtest mo?

Parehong nasa loob ng iisang bar ang stop at target mo. Alin ang pinili ng backtest mo?

Long mula 84,120. Stop sa 84,036, target sa 84,271. Dumating ang bar para sa susunod na minuto: open 84,118, high 84,290, low 84,010, close 84,240.

Nasa loob ng bar na iyon ang parehong level. Naabot ang stop at naabot din ang target, pero walang kahit anong impormasyon ang apat na OHLC number kung alin ang nauna. Nagbalik pa rin ng numero ang backtest mo. May linya sa loop na nagpasya—malamang, linya iyon na hindi mo itinuring na palagay sa pagmomodelo noong isinulat mo ito.

Ito ang pinakamalaking pinagmumulan ng pekeng performance na nakikita ko sa mga short-horizon strategy, mas malaki kaysa fees at slippage, dahil hindi ito mukhang palagay. Mukha lang itong plumbing.

Maling paraan 1: hayaang magpasya ang if-chain

Karaniwang ganito ang ayos:

if bar.high >= target:
    exit(target, "tp")
elif bar.low <= stop:
    exit(stop, "sl")

Walang pumili ng “maunang ma-resolve ang target kaysa stop.” Nauna lang na-type ang pag-check sa target dahil iyon ang masayang senaryo at iyon ang iniisip mo. Baligtarin ang dalawang branch at magbabago ang equity curve; sapat na dapat iyon para ipakitang bahagi ng P&L ng strategy mo ay katangian ng editor mo.

Nagpatakbo ako ng sadyang pangkaraniwang mean-reversion scalper sa BTCUSDT perp gamit ang 3 buwan ng 1-minute bars at 4,812 trade; stop na 0.10% at target na 0.18% mula sa entry. Parehong signal, parehong fees, tie-break convention lang ang binago.

12.6%ng mga trade ay tumama sa parehong level sa iisang bar
2.31Sharpe, target ang unang ma-resolve
0.18Sharpe, stop ang unang ma-resolve
0.94Sharpe, ni-resolve gamit ang 1-second bars

Nasa isang ikawalo ng mga trade ang buong resulta. Ganoon ang matematika kapag dikit ang pares ng stop at target: ang mga malabong trade ang mga kasong gumalaw ang presyo sa magkabilang direksyon, na siyang karamihan sa mga kawili-wiling trade, at katumbas ng buong distansya mula stop hanggang target ang bawat isa depende sa coin flip. 12.6% ng mga trade × 0.28% ng pagitan = 3.5% ng gross notional turnover bawat yunit ng sample, na mas malaki kaysa aktuwal na edge ng strategy.

Nakadepende ang rate sa laki ng bar kumpara sa pagitan ng mga level mo, at mabilis itong lumalala habang humahaba ang mga bar. Parehong stop at target, parehong signal, ni-resample:

Agwat ng barMga trade na nasa loob ng iisang bar ang parehong levelSharpe (target ang una)
1s0.3%0.91
1m12.6%2.31
5m34%3.60
15m49%4.42
1h71%5.88

Tingnan kung ano talaga ang sinasabi ng talahanayang iyon. Mas maganda ang naging backtest sa mas malalawak na bar. Ipinapalagay ng kutob ng bawat researcher na mas konserbatibo ang hourly bars: mas kaunting ingay, mas kaunting overfitting sa microstructure. Pero kung pabor sa iyo ang paraan ng pag-resolve ng intrabar, mas malaking kahon lang ang mas malawak na bar kung saan maaari mong ipalagay na sinuwerte ka. Sa 1h bars, puro convention ang 7 sa bawat 10 trade. Hindi strategy ang sinusubok ng backtest na iyon; sinusubok nito ang pagkakasunod-sunod ng dalawang `if` statement nang 3,400 beses.

Maling paraan 2: ipagpalagay na napunan ang stop sa presyo ng stop

Ipagpalagay na inayos mo na ang pagkakasunod-sunod. Stop ang unang na-resolve, itinala mo ang luging eksaktong 0.10% dagdag ang taker fee, at pakiramdam mo ay naging masusi ka. May 2 magkahiwalay na bagay pa ring mali.

Ang una: trigger ang stop, hindi fill. Sa Binance USDⓈ-M, nagiging market order ang STOP_MARKET order sa mismong sandaling matugunan ang trigger condition, at kinakain nito ang anumang nasa order book. Sa tahimik na minuto, isa o dalawang tick lang ang slippage. Pero sa mismong minutong nag-trigger ng stop mo—iyong may 40-point candle body at liquidation cascade sa ilalim nito—manipis ang order book sa mismong panig na tinatawid mo. Sa sample ko, nang itugma ko ang mga stop trigger sa tick tape, 1.4 bps lagpas sa trigger ang median fill at 11 bps ang ika-95 na percentile. Kung 10 bps ang stop mo, dagdag na ikasampu ng risk na akala mong itinakda mo ang halaga ng buntot ng distribusyon.

Mas banayad ang ikalawang mali at partikular ito sa perps: aling presyo ang nagti-trigger dito. Mark price ang default na gamit ng Binance para sa mga stop order, at binubuo ang mark price mula sa index at pinakinis na basis, hindi mula sa huling trade sa venue na iyon. Last price ang nasa OHLC series mo. Magkaibang series ang mga ito, at pinakamalaki ang agwat nila sa mismong mga pangyayaring nagti-trigger sa mga stop.

Last price (klines mo)Mark price (default na trigger)
Pinagmulanmga trade sa venue na itoindex ng ilang venue + basis
Galaw ng wickbuong galaw ng presyolubhang pinapahina
Karaniwang agwat1–3 bps kapag kalmado, 20–35 bps sa minutong may cascade
Epekto sa backtestmga stop na nag-trigger kahit hindi dapat, at kabaliktaran

Kaya kung may 25 bps wick sa last-price tape, matatamaan ang stop mo sa backtest kahit hindi man lang lumapit nang 10 bps sa trigger mo ang live mark price. O kabaliktaran, sa araw na gumalaw ang index at nahuli ang venue mo. Kung itatakda mo ang workingType sa CONTRACT_PRICE, itinutugma mo kahit paano ang live na asal sa data mo, at kadalasan iyon ang tamang pasya para sa researcher, dahil para tapat na gayahin ang mark-price trigger, kailangan mong magdala ng ikalawang series sa buong fill engine mo.

Ito ang pinakatumatak na halimbawa sa akin: may isang tao sa team namin na “nagpahusay” ng strategy sa pamamagitan ng paglipat ng take-profit mula 0.18% sa 0.21%. Mula 2.3 naging 3.1 ang Sharpe. Walang bagong edge. Lumayo lang ang target sa bahaging pinakamaraming wick sa 1-minute distribution, kaya nabawasan ang mga trade na napunta sa malabong kategorya kung saan tahimik na ibinibigay ng code ang panalo sa kanila. Ang na-optimize pala nila ay ang tie-breaker.

Maling paraan 3: palaging ipagpalagay ang pinakamasamang mangyayari at tawagin itong konserbatibo

Ang agarang solusyon ay maging pesimistiko. Kapag parehong nahawakan ang mga level, stop ang piliin. Tapos na; wala nang optimismo, handa nang ilabas.

Dati, ganito rin ang ginagawa ko. Mas mabuti ito kaysa sa alternatibo, pero mali pa rin sa 2 dahilan.

Pinapatay nito ang mga strategy na maayos naman. Dahil sa pesimistikong pag-resolve sa 12.6% ng mga trade, nabawasan ng 2.1 Sharpe point ang resultang ito kumpara sa 0.94 na na-resolve gamit ang tick. Kung 0.94 ang tunay na numero pero 0.18 ang ipinapakita ng convention mo, itatapon mo ang ideya at gagawa ng mas masamang bagay. Kung lumilihis nang 2 Sharpe point ang konserbatibong palagay, hindi iyon konserbatibo; ingay iyon na may mapagpanggap na tindig na moral.

Mas masama pa, sinisira nito ang optimization. Bigyan ang parameter sweep ng pesimistikong tie-break at matututo ang optimizer na umiwas sa kalabuan, dahil purong parusa na ngayon ang kalabuan. Lilipat ito tungo sa malalawak na stop at malalapit na target, o sa mababagal na bar kung saan bihirang magsabay ang dalawang level. Pagkatapos, magpapakita ito ng mga parameter na pinili ayon sa fill convention mo, hindi ayon sa market. Kapareho ito ng palya ng mapagbigay na bersyon, pero kabaligtaran ang direksyon at kasinghirap mapansin sa tearsheet.

Rule of thumb namin bago ang lahat: kung mas maliit ang stop_distance + target_distance kaysa sa range sa ika-75 na percentile ng agwat ng bar mo, mas malaking bahagi ng P&L mo ang intrabar assumption kaysa sa signal mo. Kuwentahin ang dalawang numero. 4 na linya lang iyon, at mas marami na itong tinapos na strategy review kaysa sa alinmang nag-iisang pagsusuri.

Ano ang talagang gumagana

Data ang dinaanang galaw sa loob ng bar. Kunin mo ito, o lagyan ng hangganan ang hindi mo makuha.

  1. Gamitin sa pag-resolve ang pinakamataas na resolution na mayroon ka. Ilang daang row lang ang Binance aggTrades para sa mga kaugnay na minuto at tuluyan nitong sinasagot ang tanong: aling level ang unang nahawakan, at sa anong presyo napunan ang sweep. Hindi mo kailangan ng tick data para sa buong backtest, sa mga malabong bar lang. Sa sample ko, 606 minuto iyon mula sa 129,600. Maliit na download lang ito, hindi proyektong pang-imprastraktura.
  2. Kung walang ticks, ibaba ang resolution ng timeframe nang 1 o 2 antas para lang sa pag-resolve. Mga signal sa 15m, mga exit na ni-resolve gamit ang 1s o 1m bars. Bumababa ang kalabuan mula 49% tungo sa ilang bahagi lang ng porsiyento, at sapat na kaliit ang natitira para matapat na balewalain.
  3. Palaging iulat ang saklaw. Patakbuhin nang 2 beses ang bawat backtest, gamit ang optimistiko at pesimistiko na pag-resolve, at ilagay ang parehong Sharpe sa tabi ng na-resolve na resulta. Iyan ang intrabar uncertainty mo, at dapat kasama ito sa tearsheet, katabi ng confidence interval na ilalagay mo mismo sa Sharpe. Kung 0.2–2.3 ang saklaw, walang konklusyong nasa loob nito ang tunay.
  4. Ituring na pangunahing metric ang ambiguity rate. Nasa itaas ito ng bawat strategy card namin, katabi ng bilang ng trade at turnover. Kapag lampas sa humigit-kumulang 5% ang rate, exit logic, hindi entry logic, ang sinusubok.
  5. Ihiwalay ang pagmomodelo sa trigger at fill. Gamitin sa trigger ang price series na talagang ginagamit ng venue; sa fill, idagdag sa trigger price ang slippage draw na kinakalibrate mula sa tape, hindi ang trigger price mismo.

Pareho ang problema sa equities, iba lang ang anyo. Kung nakatakda sa 62.00 ang stop sa isang stock na bumagsak sa 58.40 sa magdamag, hindi sa 62.00 ito mapupunan. Mapupunan ito sa presyong mas mababa sa opening print, at masayang magsasabi sa iyo ang daily-bar backtest na nagtatala ng −$0.00 na slippage sa mga gap-through na nagpahusay sa drawdown ng stop-loss overlay mo. Hindi iyon ang nangyari. Hindi lang talaga ito nasubok sa mahahalagang araw. Ganoon din ang mga trading halt: sa reopening auction talaga maipapatupad ang stop mo, sa presyong hindi makikita sa low ng bar.

Walang kakaiba rito. Kailangan lang kilalaning buod ang bar, at pustahan sa pagkakasunod-sunod ng mga pangyayaring itinapon ng buod ang strategy na may stop at target. Kapag sa wakas ay pinatakbo ng paper-trading engine ang strategy laban sa live tape, may sariling pasya ang tape tungkol sa pagkakasunod-sunod na iyon, at wala itong pakialam kung aling branch ng if-statement ang una mong na-type.

mga intrabar fillmga stop orderbacktestingcrypto futuresmicrostructure ng market
← Lahat ng post