📝

Draft article

This draft is visible to admins and superusers only. Sign in with an authorized account.

← Kembali ke artikel
July 23, 2026
5 menit baca

Kurva slippage, bukan konstanta slippage: model biaya yang bertahan saat bersentuhan dengan live trading

Kurva slippage, bukan konstanta slippage: model biaya yang bertahan saat bersentuhan dengan live trading
#slippage
#biaya transaksi
#market impact
#backtest
#eksekusi
#tca
#hukum akar-kuadrat
#model biaya

Baris paling mahal di sebagian besar backtest adalah slippage_bps = 5. Bukan karena angka 5 itu salah — dirata-ratakan sepanjang setahun fill, angka itu bahkan mungkin benar — tetapi karena konstanta itu salah secara kondisional, dan proses seleksi strategi Anda adalah mesin untuk menemukan dan mengeksploitasi kesalahan kondisional. Slippage adalah fungsi dari ukuran order, spread, volatilitas, dan likuiditas yang tersedia. Konstanta adalah fungsi itu yang dievaluasi pada satu titik lalu diekstrapolasi ke mana-mana, termasuk ke cascade likuidasi jam 3 pagi tempat sinyal mean-reversion Anda menyala paling kencang dan buku order hanya sepersepuluh kedalaman biasanya. Backtest tetap mengenakan biaya 5 bps di sana juga. Live trading tidak akan seperti itu.

Artikel ini membahas model biaya di dalam loop backtest: fungsi cost(size, market_state) yang dikurangkan dari setiap trade yang disimulasikan. Ini sengaja bukan tentang memprediksi impact secara ex ante untuk menjadwalkan eksekusi — itu adalah persoalan pendamping, dibahas dari sisi model di pemodelan price impact dan dari sisi penjadwalan optimal di Almgren-Chriss. Di sini pertanyaannya lebih sempit dan, bagi siapa pun yang memilih strategi berdasarkan backtest, lebih mendesak: fungsi apa yang seharusnya berdiri di tempat konstanta Anda saat ini berdiri, bagaimana cara fitting fungsi itu dari data yang benar-benar Anda miliki, dan seberapa besar jawabannya mengubah strategi mana yang akhirnya Anda jalankan. Bagian terakhir punya jawaban empiris yang tajam: rerank 20 varian dari satu keluarga strategi di bawah empat model biaya, dan saksikan leaderboard-nya terbalik.

Tangga model biaya

Tangga model biaya empat tingkat dari bps konstan hingga partisipasi akar-kuadrat

Seperti tangga simulasi fill, model biaya membentuk tangga fidelitas di mana setiap tingkat membutuhkan lebih banyak data dan menghilangkan satu bias sistematis tertentu. Tingkat-tingkat ini bersifat kumulatif: masing-masing mempertahankan suku-suku di bawahnya dan menambahkan satu suku baru.

M0: bps konstan

C0=fee+cC_0 = \text{fee} + c

Satu angka, diterapkan ke setiap trade. Tiga mode kegagalannya, dalam urutan kerusakan yang meningkat:

  1. Buta ukuran. Clip 10kdanparentorder10k dan parent order 5M membayar biaya yang sama. Perbandingan strategi lintas level kapasitas jadi tidak bermakna.
  2. Buta regime. Selasa siang yang tenang dan keruntuhan FTX membayar biaya yang sama. Kesalahan ini bukan noise; ia berkorelasi negatif justru dengan kondisi-kondisi tempat strategi event-driven memusatkan trading-nya.
  3. Toksik terhadap seleksi. Saat Anda men-sweep 200 kombinasi parameter, optimizer menemukan bahwa di bawah biaya datar, turnover jadi murah relatif terhadap realita, dan menggeser seluruh pencarian ke arah varian frekuensi tinggi. Kesalahan biaya menjadi gaya terarah pada seleksi model, bukan gaya simetris pada PnL.

M1: proporsional terhadap spread

C1=fee+st2C_1 = \text{fee} + \frac{s_t}{2}

Kenakan half-spread yang terukur pada timestamp keputusan (ditambah fee, yang deterministik dan sebaiknya selalu jadi item baris sendiri). Ini adalah model pertama yang benar-benar merespons pasar: spread melebar saat ada berita, saat sesi buka, di altcoin tipis, sehingga biaya kini bergerak bersama setidaknya satu variabel likuiditas. Yang masih terlewat: spread menghargai fill dari satu clip top-of-book. Apa pun yang lebih besar akan menembus buku order lebih dalam, dan penetrasi itu tidak terlihat oleh sts_t.

M2: diskalakan dengan volatilitas

C2=fee+st2+cσσtC_2 = \text{fee} + \frac{s_t}{2} + c_\sigma \, \sigma_t

Tambahkan suku yang proporsional terhadap volatilitas jangka pendek. Justifikasinya bersifat empiris sekaligus struktural: spread dan depth ditentukan oleh market maker yang risiko adverse-selection dan inventory-nya berskala dengan σ\sigma (logika quoting Avellaneda-Stoikov yang dijalankan terbalik), sehingga biaya untuk menuntut likuiditas secara alami dinyatakan dalam satuan volatilitas. Ketika Anda sama sekali tidak punya data buku order — hanya bar harian, riwayat panjang — cσσtc_\sigma \sigma_t dengan cσc_\sigma sekitar 0,05–0,1 dari volatilitas harian sudah menjadi model yang jauh lebih baik daripada konstanta apa pun, karena setidaknya ia "bernapas" mengikuti regime.

M3: akar-kuadrat dalam partisipasi

C3=fee+st2+Yσt(QVt)δ,δ0.40.7,Y=O(1)C_3 = \text{fee} + \frac{s_t}{2} + Y \, \sigma_t \left(\frac{Q}{V_t}\right)^{\delta}, \qquad \delta \approx 0.4\text{–}0.7, \quad Y = O(1)

Suku ukuran. QQ adalah ukuran order Anda, VtV_t volume pasar dalam window yang relevan, σt\sigma_t volatilitas dalam window yang sama. Bentuk fungsional ini bukan sekadar kemudahan; ini salah satu hasil empiris yang paling banyak direplikasi dalam market microstructure, dan layak untuk dijelaskan secara tepat asal-usulnya.

Titik awal teoretisnya adalah Kyle (1985), "Continuous auctions and insider trading" (Econometrica 53(6), 1315–1335). Dalam model Kyle, market maker menetapkan harga sebagai fungsi linear dari net order flow, Δp=λq\Delta p = \lambda q, dengan

λ=12Σ0σu\lambda = \frac{1}{2}\frac{\sqrt{\Sigma_0}}{\sigma_u}

— impact per unit flow yang proporsional terhadap ketidakpastian nilai relatif terhadap volume noise-trading. Kyle's lambda memberi bidang ini satuan likuiditasnya (depth adalah 1/λ1/\lambda) dan klaim pertamanya yang dapat diuji: biaya per dolar yang diperdagangkan bergantung pada rasio informasi terhadap likuiditas, bukan pada suatu konstanta. Tetapi model ini linear terhadap ukuran, dan data mengatakan sebaliknya.

Data mengatakan cekung. Almgren, Thum, Hauptmann and Li (2005), "Direct estimation of equity market impact" (Risk, July 2005), melakukan fitting pada sekitar 700.000 order saham AS dari desk-desk Citigroup dan menemukan impact temporer tumbuh sebagai partisipasi pangkat 3/53/5 — mereka secara eksplisit menguji dan menolak baik bentuk linear maupun akar-kuadrat murni demi δ=0,6\delta = 0,6 — sementara impact permanen keluar pada 0,89±0,100,89 \pm 0,10, secara statistik tidak dapat dibedakan dari linear (yang cukup melegakan, karena Huberman and Stanzl (2004) menunjukkan impact permanen nonlinear membuka celah manipulasi). Tóth et al. (2011), "Anomalous price impact and the critical nature of liquidity in financial markets" (Physical Review X 1, 021006), menggunakan hampir 500.000 metaorder dari Capital Fund Management di pasar futures, menemukan E[ΔP]YσdQ/Vd\mathbb{E}[\Delta P] \approx Y \sigma_d \sqrt{Q/V_d} dengan YY berorde satu — dan memberikan penjelasan yang kini jadi standar: buku order yang terlihat hanyalah pecahan sangat kecil dari likuiditas laten, yang secara lokal linear terhadap harga di sekitar mid, sehingga biaya untuk melahap likuiditas tersebut berskala sebagai akar kuadrat. Riset selanjutnya menghaluskan tepi-tepinya: Zarinelli, Treccani, Farmer and Lillo (2015), "Beyond the square root" (Market Microstructure and Liquidity 1(2)), menunjukkan pada tujuh juta metaorder institusional ANcerno bahwa akar kuadrat cocok dengan baik di sekitar dua orde besaran ukuran order, tetapi bentuk logaritmik meluas hingga lima orde; Bucci et al. (2019, Physical Review Letters 122, 108302) mendokumentasikan crossover dari impact linear (ala Kyle) pada partisipasi sangat kecil ke akar-kuadrat di atasnya. Dan Frazzini, Israel and Moskowitz (2018), "Trading Costs" (SSRN 3229719), menggunakan $1,7 triliun eksekusi live dari AQR selama 19 tahun, menemukan biaya terealisasi satu orde besaran lebih kecil dibanding estimasi akademik sebelumnya — sebuah peringatan bahwa koefisien yang di-fitting pada flow milik orang lain, dengan urgensi dan kandungan informasi yang berbeda, tidak serta-merta berlaku untuk flow Anda sendiri.

Untuk loop backtest, ringkasan praktisnya ada tiga pernyataan. Impact berskala dengan volatilitas. Impact bersifat cekung terhadap ukuran, dengan eksponen yang sebaiknya Anda anggap 0,50,5 sampai data Anda sendiri mengarah ke 0,60,6. Prefaktor YY berorde satu tetapi bervariasi menurut venue, aset, dan — yang krusial — gaya trading Anda sendiri, itulah sebabnya bagian berikutnya membahas cara fitting-nya, bukan menyalinnya begitu saja. Kalibrasi mendalam (kernel peluruhan, dekomposisi transien vs permanen, cross-impact) menjadi bahasan artikel pemodelan impact; backtest hanya membutuhkan kurvanya.

Sebuah contoh angka, untuk menetapkan orde besaran. BTC perp, volatilitas harian σd=250\sigma_d = 250 bps, volume harian venue V_d = \6M,M, Y = 0,75,, \delta = 0,5$:

Ukuran order QQ Q/VdQ/V_d Q/Vd\sqrt{Q/V_d} Suku impact + half-spread (0,5 bp)
$50k 0.0008% 0.0029 0.5 bp 1.0 bp
$500k 0.008% 0.0091 1.7 bp 2.2 bp
$5M 0.083% 0.0289 5.4 bp 5.9 bp
$50M 0.83% 0.0913 17.1 bp 17.6 bp

Tiga orde besaran dalam ukuran menghasilkan rentang faktor ~18 dalam biaya. Tidak ada konstanta yang mencakup tabel itu, dan setiap perbandingan strategi yang memvariasikan ukuran posisi sambil menahan slippage_bps tetap secara diam-diam membandingkan apel di 50kdenganjerukdi50k dengan jeruk di 5M.

Fitting kurva: fill Anda sendiri, atau tidak sama sekali

Dari fill Anda sendiri

Data yang tepat adalah catatan TCA Anda sendiri: satu baris per parent order dengan mid saat kedatangan, VWAP fill terealisasi, ukuran order, dan kondisi pasar pada saat keputusan diambil — persis dataset yang dihasilkan pengukuran implementation shortfall sebagai produk sampingan. Shortfall dalam bps terhadap arrival, dinormalisasi dengan volatilitas kontemporer, diregresikan terhadap partisipasi, langsung memberikan Anda YY dan δ\delta.

Jebakannya adalah noise. Shortfall satu order tunggal adalah impact ditambah noise harga selama window eksekusi, dan noise-nya mendominasi: untuk eksekusi 10 menit pada volatilitas harian 250 bps, suku noise-nya adalah σd10/144021\sigma_d\sqrt{10/1440} \approx 21 bps terhadap sinyal impact yang mungkin hanya 3 bps. Signal-to-noise sebesar 0,15 per observasi itulah sebabnya Almgren et al. membutuhkan 700 ribu order dan mengapa Anda harus melakukan fitting pada median bucket, bukan pernah pada titik data mentah:

import numpy as np
import pandas as pd

def fit_sqrt_curve(orders: pd.DataFrame) -> tuple[float, float]:
    """orders: one row per parent order.
       is_bps    -- implementation shortfall vs arrival mid, bps, cost-positive
       sigma_bps -- volatility at arrival (same window used at simulation time)
       q_over_v  -- parent size / market volume over the execution window
    Fits I = Y * sigma * (Q/V)^delta on participation-bucket medians."""
    df = orders.query("q_over_v > 0 and sigma_bps > 0").copy()
    df["i_norm"] = df.is_bps / df.sigma_bps            # impact in vol units
    df["bucket"] = pd.qcut(np.log10(df.q_over_v), 12, duplicates="drop")
    b = (df.groupby("bucket", observed=True)
           .agg(i=("i_norm", "median"), qv=("q_over_v", "median")))
    b = b[b.i > 0]               # noisy buckets can go negative; drop, don't clip
    delta, log_y = np.polyfit(np.log(b.qv), np.log(b.i), 1)
    return float(np.exp(log_y)), float(delta)

Pada beberapa ribu parent order kripto, fitting ini sudah stabil hingga kira-kira ±30% pada YY dan ±0,1 pada δ\delta — kasar, tetapi perbedaan antara kurva hasil fitting dan konstanta tebakan bukanlah 30%, melainkan seluruh bentuknya. Lakukan refit setiap kuartal; drift pada YY itu sendiri adalah diagnostik (kenaikan YY pada partisipasi konstan berarti regime likuiditas venue berubah atau order flow Anda sendiri menjadi lebih informed/lebih mudah terdeteksi).

Cold start: belum ada fill

Sebelum order live pertama, Anda hanya punya data publik, dan ada dua opsi jujur.

Menembus buku order (depth-walk). Rata-ratakan biaya menembus snapshot L2 pada setiap ukuran, persis seperti yang dilakukan simulator fill per-trade, tetapi diagregasikan menjadi kurva. Ini adalah batas bawah dengan tanda yang diketahui: snapshot menunjukkan likuiditas yang bertahan dari flow semua orang lain, dinamika pengisian ulang (refill) tidak terlihat, dan child order Anda sendiri yang lebih awal akan sudah menggerakkan buku order sebelum child order berikutnya tiba.

def curve_from_book(snapshots, sizes_usd, safety=1.75):
    """snapshots: iterable of (mid, asks), asks = [(price, qty), ...] best-first.
    Depth-walk cost is a LOWER bound on realized cost -- scale it."""
    rows = []
    for q_usd in sizes_usd:
        costs = []
        for mid, asks in snapshots:
            rem, paid, got = q_usd / mid, 0.0, 0.0
            for p, q in asks:
                x = min(q, rem)
                paid += x * (p - mid); got += x; rem -= x
                if rem <= 0:
                    break
            if rem <= 0:
                costs.append(paid / got / mid * 1e4)
        rows.append((q_usd, safety * float(np.median(costs))))
    return pd.DataFrame(rows, columns=["q_usd", "cost_bps"])

Menjejaki trade publik (footprint). Kelompokkan trade agresor menurut ukuran, ukur pergerakan mid beberapa detik setelah masing-masing, dan baca kurva impact empiris darinya. Ini memulihkan bentuk cekung dan kira-kira skala-σ\sigma yang benar, tetapi levelnya bias ke arah yang tidak bisa Anda tentukan tandanya di muka: print publik adalah keputusan trader lain, sehingga print besar cenderung informed secara kondisional (membiaskan impact terukur ke atas relatif terhadap rebalance uninformed Anda) sementara trader yang paling sensitif terhadap likuiditas justru memecah order mereka tepat untuk menyembunyikannya (membiaskannya ke bawah). Gunakan ini untuk bentuk, bukan level.

Bagaimanapun, protokol cold-start adalah: ambil kurva dari data publik, terapkan faktor keamanan 1,5–2, trading dalam ukuran kecil, dan mulai mengisi tabel TCA yang akan menggantikannya. Kurva publik adalah perancah, bukan dinding penopang.

Ketergantungan regime: order yang sama, biaya lima kali lipat

Kurva biaya yang melebar di seluruh regime volatilitas tenang, normal, dan stres

Setiap suku dalam C3C_3 bergantung pada kondisi, dan dalam lonjakan volatilitas, semuanya bergerak melawan Anda sekaligus. Spread proporsional terhadap volatilitas jangka pendek, sehingga sts_t melebar 5–10x. σt\sigma_t masuk langsung ke suku impact. Volume VtV_t juga naik — yang secara naif mengurangi partisipasi — tetapi kenaikannya lebih kecil dibanding σ\sigma di pembilang, dan offset ini menyembunyikan efek yang lebih jahat: depth yang di-quote di dekat mid runtuh jauh lebih cepat dibanding volume yang diperdagangkan, sehingga kurva terealisasi mengetat melampaui apa yang diprediksi formula hasil fitting dari input yang tertekan saja.

Secara konkret, dengan kurva hasil fitting di atas, order BTC senilai $3M:

  • Hari tenang: σd=150\sigma_d = 150 bps, spread 1 bp, V_d = \6M.BiayaM. Biaya = 0,5 + 0,75 \times 150 \times \sqrt{0,0005} = 0,5 + 2,5 = 3,0$ bps.
  • Hari krisis (level LUNA, FTX): σd=700\sigma_d = 700 bps, spread 6 bps, V_d = \18M.BiayaM. Biaya = 3,0 + 0,75 \times 700 \times \sqrt{0,000167} = 3,0 + 6,8 = 9,8$ bps.

Formula mengatakan 3,3x. TCA terealisasi pada hari-hari stres secara konsisten melebihi formula — keruntuhan depth yang tidak terlihat oleh suku akar-kuadrat — dan di situlah tempat pengali stres terukur berperan. Pada fill kami, residual bucket-krisis berjalan 1,4–1,8x di atas formula dengan input tertekan, mendaratkan total biaya stres pada 4,5–6x biaya hari tenang untuk order yang sama. Itulah asal-usul jujur dari "order yang sama berbiaya 5x lebih mahal saat lonjakan volatilitas": kira-kira 2x dari σ\sigma neto volume, 2x dari spread, dan sisanya dari depth yang menguap lebih cepat daripada yang diakui statistik volume.

Implementasinya adalah model biaya kondisional: fitting kurva per bucket regime, atau secara ekuivalen fitting satu kurva dan tabel pengali yang dikunci pada kuantil volatilitas terealisasi yang dihitung pada saat keputusan (hanya window trailing — label regime yang dihitung dari seluruh sampel adalah look-ahead yang diselundupkan lewat model biaya):

Regime (kuantil volatilitas trailing 1 jam) Frekuensi Pengali spread Pengali kurva (terukur)
Tenang (< p25) 25% 0,6x 0,7x
Normal (p25–p75) 50% 1,0x 1,0x
Elevated (p75–p95) 20% 1,8x 1,6x
Stres (> p95) 5% 5–10x 3–6x

Frazzini, Israel and Moskowitz (2018) mendokumentasikan fenomena yang sama dalam data institusional mereka: biaya terealisasi bergerak bersama secara kuat dengan volatilitas kontemporer, dan model biaya tanpa suku volatilitas yang berubah terhadap waktu justru salah menghargai tepat pada bagian ekor (tail). Alasan mengapa tabel ini lebih penting daripada yang disiratkan baris stres 5%-nya adalah korelasi: strategi tidak men-sampling baris-baris ini secara seragam. Sistem vol-breakout melakukan sebagian besar trading-nya di dua baris paling bawah. Market maker pasar tenang mendapat untung di baris teratas dan stop-out lewat baris terbawah. Membobot trade setiap strategi menurut histogram regime miliknya sendiri — alih-alih mengenakan biaya rata-rata tak bersyarat ke semua orang — adalah koreksi PnL tunggal terbesar di seluruh halaman ini untuk sistem event-driven, bernilai lebih besar daripada perbedaan antara dua tingkat tangga yang bersebelahan mana pun.

Eksperimen sensitivitas: empat model biaya, satu leaderboard yang tersusun ulang

Jika model biaya mengubah PnL dengan offset konstan, tidak ada satu pun dari ini yang penting untuk seleksi — setiap varian akan bergeser secara merata dan argmax-nya akan bertahan. Kenyataannya tidak begitu, karena sensitivitas biaya bervariasi antar varian hingga satu orde besaran. Eksperimen yang membuat ini konkret:

Setup. Satu keluarga strategi — mean reversion z-score dan breakout Donchian pada BTC dan ETH perp, bar 1 menit, 18 bulan — dengan grid pada horizon holding (15m / 1j / 4j / 24j) dan threshold entry: 20 varian, turnover satu sisi dari 0,4x hingga 11x buku per hari, clip $250k dieksekusi selama 5 menit. Setiap varian di-backtest sekali per model biaya:

  • M0: fee saja;
  • M1: fee + konstanta 5 bps;
  • M2: fee + half-spread + 0,08σ5m0,08\,\sigma_{5m};
  • M3: fee + kurva hasil fitting Y=0,75Y=0,75, δ=0,5\delta=0,5 dengan tabel pengali regime di atas.

Fill yang sama, sinyal yang sama, jalur kode yang sama — model biaya diteruskan ke backtester sebagai argumen konstruktor, sebagaimana parameter kelas satu lainnya:

from dataclasses import dataclass

@dataclass(frozen=True)
class SqrtCost:
    y: float = 0.75        # fitted impact coefficient
    delta: float = 0.5     # fitted exponent
    fee_bps: float = 2.5   # taker fee, always separate
    def cost_bps(self, q_usd: float, st) -> float:
        part = q_usd / st.window_volume_usd
        return (self.fee_bps + st.stress_mult *
                (st.spread_bps / 2 + self.y * st.sigma_bps * part ** self.delta))

for model in [ZeroCost(), ConstCost(5.0), VolCost(0.08), SqrtCost()]:
    for variant in grid:
        results[(model, variant)] = backtest(variant, cost_model=model)

Hasil (run representatif; return bersih tahunan):

Varian Turnover/hari M0 M1 (5 bp) M2 M3 (kurva) Rank M1 → M3
MR-15m, z=1.0 11.4x +187% +61% +9% −14% 1 → 17
MR-15m, z=1.5 7.9x +141% +52% +15% −2% 2 → 13
BO-1h, k=2 3.1x +74% +43% +28% +19% 3 → 4
MR-1h, z=2.0 2.4x +58% +38% +25% +21% 4 → 2
BO-4h, k=3 0.9x +39% +33% +29% +26% 7 → 1

Bump chart 20 rank strategi yang terbalik di keempat model biaya

Korelasi rank (Kendall τ\tau) antar leaderboard: τ(M0,M1)=0,79\tau(\text{M0},\text{M1}) = 0,79 — konstanta nyaris tidak mengurutkan ulang apa pun, itu pajak, bukan model. τ(M1,M3)=0,39\tau(\text{M1},\text{M3}) = 0,39 — enam dari sepuluh teratas M1 keluar dari sepuluh besar di bawah M3, dan juara M1 berubah dari +61% menjadi negatif. τ(M2,M3)=0,74\tau(\text{M2},\text{M3}) = 0,74 — suku volatilitas saja sudah memulihkan sebagian besar pengurutan ulang; suku ukuran menyelesaikan sisanya untuk varian yang trading besar relatif terhadap volume window. Mekanismenya persis toksisitas seleksi dari tingkat M0: 5 bps yang datar mensubsidi trade yang sebenarnya berbiaya 15 bps (besar, cepat, dalam kondisi stres) dan mengenakan pajak berlebih pada trade yang berbiaya 2 (kecil, sabar, dalam kondisi tenang), sehingga pengurutan berdasarkan M1 secara sistematis mempromosikan varian yang biaya sebenarnya paling underestimated. Optimizer tidak menemukan alpha; ia menemukan suku kesalahan dari model biaya Anda.

Inilah sebabnya model biaya termasuk dalam kategori mental yang sama dengan split walk-forward atau fungsi objektif: parameter backtest kelas satu yang Anda variasikan, bukan konstanta lingkungan yang Anda tetapkan sekali. Jika rank suatu varian stabil di M2 dan M3, edge-nya nyata relatif terhadap biaya. Jika rank-nya runtuh saat naik tangga, Anda baru saja mengetahui itu adalah artefak model biaya — peristiwa epistemik yang sama dengan strategi yang mati out-of-sample dalam walk-forward optimization, dan layak mendapat respons yang sama. Dan jika Anda memilih argmax dari 200 varian di bawah M1, logika deflated Sharpe berlaku dengan satu twist: Anda menjalankan pencarian multiple-testing di mana statistik uji itu sendiri bias mendukung entry frekuensi tinggi.

Batas yang jujur: PnL sebagai pita (band)

Disiplin terakhir mengikuti dari mengakui bahwa model biaya tetap tidak pasti bahkan setelah di-fitting. YY punya interval kepercayaan, pengali stres diestimasi dari segelintir hari ekor, dan masa depan menggambar regime-nya sendiri. Jadi berhentilah melaporkan PnL bersih sebagai satu angka. Laporkan sebagai pita di sepanjang skenario biaya yang bernama:

  • Optimistis: batas bawah depth-walk, tanpa pengali stres. Jangan pernah dilaporkan sendirian; satu-satunya fungsinya adalah membatasi kasus terbaik.
  • Realistis: kurva hasil fitting, pengali regime hasil fitting — estimasi sentral Anda.
  • Pesimistis: Y×1,5Y \times 1,5, spread ×2\times 2, baris stres selalu diterapkan pada nilai \geq p75-nya. Kira-kira: kurva hasil fitting dievaluasi pada tepi yang tidak ramah dari interval kepercayaan setiap parameter.

Dua aturan keputusan membuat pita ini operasional. Pertama: alokasikan berdasarkan pesimistis, laporkan realistis. Strategi yang hanya bertahan di bawah model realistis adalah taruhan bahwa fitting biaya Anda tidak punya kesalahan ke arah yang mahal — taruhan yang tidak Anda pasang secara sadar. Kedua: lacak rasio kerapuhan (fragility ratio) — lebar pita dibagi PnL kotor. Dari eksperimen di atas: BO-4h pada turnover 0,9x menunjukkan kotor +39%, pita [+22%, +29%], fragility 0,44. MR-15m pada 11,4x menunjukkan kotor +187%, pita [−31%, +34%] — fragility 2,2, dan tanda strategi berbalik di dalam pita itu sendiri. Strategi kedua itu tidak punya tanda yang dapat ditentukan pada tingkat pengetahuan biaya Anda saat ini; pernyataan yang jujur adalah "kami tidak tahu" dan "kurangi turnover sampai kami tahu". Backtest yang mencetak +34% dan menghilangkan tepi pita −31% bukanlah optimis, itu tidak dapat difalsifikasi.

Pita ini tidak memerlukan biaya apa pun untuk diproduksi — tiga entri tambahan dalam sweep model biaya yang sudah Anda jalankan — dan ia mengubah percakapan. "Strategi ini menghasilkan 20%" mengundang kepercayaan. "Strategi ini menghasilkan 11–19% di seluruh skenario biaya kami, dan tetap positif di bawah skenario pesimistis" mengundang alokasi.

Di mana ini terhubung

Dalam mesin backtest, model biaya berada tepat di tempat simulator fill mengembalikan kuantitas yang tereksekusi: fill menentukan apa yang Anda dapatkan, kurva biaya menentukan berapa yang Anda bayar untuk itu, dan tingkat-tingkat di atas L2 pada tangga tersebut (depth-walk, model antrean) secara progresif menyerap model biaya ke dalam model fill itu sendiri — kurva adalah pengganti parametrik yang Anda gunakan ketika Anda tidak mensimulasikan buku order secara langsung. Parameternya berasal dari catatan TCA Anda sendiri ketika Anda memilikinya, dan dari data publik berskala keamanan ketika Anda belum memilikinya. Bentuk fungsionalnya berasal dari empat puluh tahun teori dan pengukuran — Kyle (1985) untuk alasan mengapa biaya per dolar bergantung pada likuiditas sama sekali, Almgren et al. (2005) dan Tóth et al. (2011) untuk hukum cekung itu sendiri, dengan Almgren-Chriss sebagai pendamping penjadwalan dan model impact neural sebagai batas depan prediksi. Yang ditambahkan artikel ini adalah alur kerja: fitting kurva, kondisikan pada regime, sweep sebagai parameter, dan laporkan pita-nya. Tidak ada satu pun dari ini yang glamor. Semuanya lebih murah daripada mengetahui, secara live, sisi mana dari slippage_bps = 5 yang sebenarnya menjadi posisi strategi Anda.

Penafian: Informasi yang disediakan dalam artikel ini hanya untuk tujuan edukasi dan informasi serta tidak merupakan nasihat keuangan, investasi, atau trading. Trading mata uang kripto mengandung risiko kerugian yang signifikan.

Penulis

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Selangkah Lebih Maju dari Pasar

Berlangganan newsletter kami untuk wawasan AI trading eksklusif, analisis pasar, dan pembaruan platform.

Kami menghormati privasi Anda. Berhenti berlangganan kapan saja.