Trade markout nedir ve işlem kalitesi nasıl ölçülür
Trade markout kavramının tanımı ve işaret kuralı açıklaması. Bir saniye ile beş dakika arasındaki zaman dilimlerinde markout eğrisi ölçüm yöntemleri ve piyasa analizi.
Trade markout, bir işlem gerçekleştikten sonra sabit bir zaman dilimi boyunca orta fiyatta (mid price) meydana gelen değişimdir ve bu değişim işlemin gerçekleştiği andan itibaren ölçülür. Pozitif değer, piyasanın işlemden sonra lehinize hareket ettiğini gösterir. Negatif değer ise piyasanın aleyhinize hareket ettiğini gösterir; işlem masalarının "ters seçim" (adverse selection) olarak adlandırdığı durum budur. Seçtiğiniz zaman dilimi (bir saniye veya beş dakika), rakamın hangi soruya yanıt verdiğini belirler.
Trade markout nedir?
Orta fiyat ile başlayın: En iyi alış (best bid) ve en iyi satış (best offer) fiyatlarının tam ortası, yani NBBO'nun orta noktası. Bir markout, işleminizden sonra seçilen bir zaman dilimindeki bu orta fiyatı alır, bir referans fiyatı çıkarır ve sonucu işlem yönünüzle işaretler.
**h zaman diliminde markout = yön * (t+h anındaki orta fiyat - referans fiyat)**; burada alış yaptıysanız yön artı bir, satış yaptıysanız eksi birdir.
Kafa karışıklığı genellikle işaret kuralından kaynaklanır. Alış işlemini takiben orta fiyatın düşmesi negatif bir markout üretir: Alış yaptınız, fiyat düştü ve size satış yapan taraf işlemden kârlı çıktı. Bu, rakamlarla ifade edilmiş ters seçimdir. Satış işlemini takiben orta fiyatın düşmesi ise pozitif bir markout üretir, çünkü işaret yönle birlikte değişir. Her işlemin iki tarafı vardır ve bir tarafın markout'u, diğer tarafınkinin ters işaretlisidir.
Üç referans fiyatı
Çıkardığınız referans fiyatı, markout'un neyi ölçtüğünü belirler.
- İşlem fiyatı. Markout bir para birimine dönüşür: Pozisyonun t+h anındaki değeri ile ödediğiniz tutar arasındaki fark. Ödediğiniz veya kazandığınız spread bunun içindedir.
- İşlem anındaki orta fiyat. Bu, spread'i arındırır ve işleminizden sonra piyasanın nasıl hareket ettiğini izole eder; bu da ters seçimin en net okumasıdır.
- İşlem yaptığınız taraftaki kotasyon. İşlem yaptığınız veya verdiğiniz kotasyona göre ölçüm yapmak, gerçekleşen işlemin piyasada fiilen mevcut olan fiyatla nasıl kıyaslandığını yanıtlar.
İşlem kalitesi çalışmaları, ters seçim için ikinci yönteme, kâr ve zarar analizi için ise birinci yönteme odaklanır. Her ikisi de aşağıdaki ilk panelde, bir dizi işlem üzerinde gösterilmektedir.
Markout eğrisi ve şeklinin anlamı
Aynı istatistiği birçok zaman diliminde çalıştırdığınızda bir eğri elde edersiniz. Eğrinin şekli, tek bir rakamdan daha fazlasını ifade eder.
- İlk saniye içinde hızla düşen ve düşük kalan bir eğri, akışın "avlandığını" (picked off) gösterir: Fiyat, işlemden hemen sonra aleyhe hareket eder.
- Dakikalarca düşmeye devam eden bir eğri, fiyatın nereye gittiğine dair gerçek bilgi taşıyan bir akışı tanımlar.
- Sıfıra yakın yatay bir eğri, zararsız bir akışı tanımlar. Beş dakika sonra orta fiyat, işlem anındaki gibidir.
- Negatif başlayıp sıfıra doğru tırmanan bir eğri, rebate (iade) toplayan pasif bir piyasa yapıcının aradığı şekildir. İlk düşüş spread ve ani etkidir, toparlanma ise piyasanın geri dönüşüdür.
Zaman dilimi seçimi, neyi ölçtüğünüze dair bir karardır. Bir saniyenin altındaki sürelerde markout, çoğunlukla gecikme süresini (latency) ve kuyruk pozisyonunu okur. Bir dakikaya çıkardığınızda, akıştaki kısa vadeli bilgiyi okur. Beş dakikadan sonra ise sıradan piyasa sapmaları, işlemin kendisini gölgelemeye başlar.
Gerçek bir markout eğrisi, işlem bazında
Aşağıdaki panel, 10 Haziran 2026 normal seansındaki her INTC işlemini alır, her birini gerçekleşmeden önceki saniyenin son kotasyonuna göre alış veya satış başlatımlı olarak sınıflandırır ve 5 zaman dilimlerindeki işaretli markout'un ortalamasını alır. Aynı işlemler üzerinde iki seri çalışır: biri işlem anındaki orta fiyattan, diğeri işlem fiyatından ölçülmüştür.
Her verinin arkasındaki tam SQL
WITH
mid_by_second AS
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 20:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY sec
),
signed_fills AS
(
SELECT
t.sec AS sec,
t.fill_price AS fill_price,
q.mid AS ref_mid,
if(t.fill_price > q.mid, 1, -1) AS side
FROM
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
sec - 1 AS ref_sec,
toFloat64(price) AS fill_price
FROM global_markets.stocks_trades
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 19:55:00', 'UTC')
AND price > 0
AND size > 0
) AS t
INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
WHERE t.fill_price != q.mid
)
SELECT
multiIf(f.horizon_s < 60,
concat(toString(f.horizon_s), ' sec'),
concat(toString(intDiv(f.horizon_s, 60)), ' min')) AS horizon,
round(avg(f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3) AS mid_basis_bps,
round(avg(f.side * (fut.mid - f.fill_price) / f.fill_price) * 10000, 3) AS fill_basis_bps,
count() AS fill_count
FROM
(
SELECT
sec,
fill_price,
ref_mid,
side,
horizon_s,
sec + horizon_s AS future_sec
FROM signed_fills
ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s
) AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.horizon_s
ORDER BY f.horizon_s900593 sınıflandırılmış işlem genelinde, orta fiyat bazlı seri 1 sec anında 3.068 baz puan, 5 min anında ise 2.977 baz puan okumaktadır. Bir baz puan, fiyatın yüzde birinin yüzde biridir; dolayısıyla tek bir işlem bir yuvarlama hatası kadar hareket ederken, bir milyon hisse gerçek para hareket ettirir.
İşlem bazlı seri -0.488 baz puandan açılır. En kısa zaman diliminde iki seri arasındaki mesafe, efektif yarım spread'dir: İşlemin orta fiyattan ne kadar uzakta gerçekleştiği. Bir alıcı girişte bunu öder, bir piyasa yapıcı ise bunu kazanır. İlk zaman diliminden sonraki her şey piyasa hareketidir.
İşlem büyüklüğü ve eğrinin şekli
Ters seçim, işlemler genelinde eşit dağılmaz. Aynı seansı işlem büyüklüğüne göre ayırmak, küçük işlemler ile bin hisse ve üzeri blok işlemleri aynı eksenlere koyar.
Her verinin arkasındaki tam SQL
WITH
mid_by_second AS
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 20:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY sec
),
signed_fills AS
(
SELECT
t.sec AS sec,
t.fill_size AS fill_size,
q.mid AS ref_mid,
if(t.fill_price > q.mid, 1, -1) AS side
FROM
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
sec - 1 AS ref_sec,
toFloat64(price) AS fill_price,
size AS fill_size
FROM global_markets.stocks_trades
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 19:55:00', 'UTC')
AND price > 0
AND size > 0
) AS t
INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
WHERE t.fill_price != q.mid
)
SELECT
multiIf(f.horizon_s < 60,
concat(toString(f.horizon_s), ' sec'),
concat(toString(intDiv(f.horizon_s, 60)), ' min')) AS horizon,
round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size < 1000) * 10000, 3) AS small_fill_bps,
round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size >= 1000) * 10000, 3) AS block_fill_bps,
countIf(f.fill_size >= 1000) AS block_fill_count
FROM
(
SELECT
sec,
fill_size,
ref_mid,
side,
horizon_s,
sec + horizon_s AS future_sec
FROM signed_fills
ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s
) AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.horizon_s
HAVING countIf(f.fill_size < 1000) > 0
AND countIf(f.fill_size >= 1000) > 0
ORDER BY f.horizon_s5 min zaman diliminde, bin hissenin altındaki işlemler ortalama 2.983 baz puan iken, bin hisse ve üzerindeki 11588 işlem ortalama 2.495 baz puan gerçekleşir. Aynı toplam hacmi bu iki gruba karşı gerçekleştiren iki kotasyon, günü aynı yerde bitirmez.
Markout'lar işlem raporlarındaki spread rakamlarına nasıl dönüşür?
Markout, standart spread ayrıştırmasındaki eksik terimdir. Efektif spread, bir alıcının fiilen ödediği tutardır: Orta fiyattan işlem fiyatına olan işaretli mesafenin iki katı. Bunu ikiye bölün. Bir parça gerçekleşen spread'dir, yani piyasa hareket ettikten sonra piyasa yapıcının elinde kalan kısımdır. Diğer parça ise ters seçimdir, yani orta fiyat bazlı markout'un iki ile çarpımıdır. Eşitlik kesindir: efektif spread = gerçekleşen spread + ters seçim.
Her verinin arkasındaki tam SQL
WITH
mid_by_second AS
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 20:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY sec
),
signed_fills AS
(
SELECT
t.sec + 60 AS future_sec,
t.et_time AS et_time,
t.fill_price AS fill_price,
q.mid AS ref_mid,
if(t.fill_price > q.mid, 1, -1) AS side
FROM
(
SELECT
dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
sec - 1 AS ref_sec,
toFloat64(price) AS fill_price,
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), toIntervalMinute(30)), '%H:%i') AS et_time
FROM global_markets.stocks_trades
WHERE ticker = 'INTC'
AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 19:55:00', 'UTC')
AND price > 0
AND size > 0
) AS t
INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
WHERE t.fill_price != q.mid
)
SELECT
f.et_time AS et_time,
round(avg(2 * f.side * (f.fill_price - f.ref_mid) / f.ref_mid) * 10000, 3) AS effective_spread_bps,
round(avg(2 * f.side * (f.fill_price - fut.mid) / f.ref_mid) * 10000, 3) AS realized_spread_bps,
round(avg(2 * f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3) AS adverse_selection_bps,
count() AS fill_count
FROM signed_fills AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.et_time
ORDER BY f.et_timeDoğu saatiyle 09:30'de başlayan yarım saatlik dilimde, efektif spread ortalama 10.651 baz puandır; bunun 8.313'ü altmış saniyelik zaman dilimindeki ters seçim terimi, 2.338'ü ise piyasa yapıcının elinde tuttuğu kısımdır. Panel 13 yarım saatlik dilimi kapsamaktadır.
Bu bileşenler, Rule 605 ve 606 işlem raporlarında mekan bazında özetlenen miktarlardır ve sub-penny kuralı ve fiyat iyileştirmesi üzerinde yer alan fiyat iyileştirme iddialarının arkasındaki aritmetiktir. Rebate, hisse başına sabit bir kredidir. Ters seçim ise bir kotasyonun fiilen aldığı işlemlerde hisse başına değişken bir maliyettir. Birini diğerine karşı ölçülmüş bir eğri üzerinde tartmak, manşet oran kartı üzerinden değerlendirmekten ziyade, piyasa yapıcı ücretleri ve iadeleri arkasındaki denetimdir ve piyasa yapıcıların neden para kaybettiği mekaniğinin yanında yer alır.
Bu rakamlar nasıl hesaplandı?
Her panel, 10 Haziran 2026 normal seansındaki (Doğu saatiyle 09:30 - 16:00) INTC kotasyonlarını ve işlemlerini okur. Kotasyonlar, o saniye içinde basılan sonuncusu olacak şekilde saniyede bir orta fiyata indirgenir. Bir işlem, önceki saniyenin orta fiyatının üzerinde gerçekleştiğinde alış başlatımlı, altında gerçekleştiğinde ise satış başlatımlı olarak sınıflandırılır; bu standart kotasyon kuralıdır. Tam olarak orta fiyatta gerçekleşen işlemler tahmin edilmek yerine örneklem dışı bırakılır, bu nedenle orta nokta işlemleri örneklemde yer almaz. Referans olarak bir önceki saniyenin orta fiyatını kullanmak, referansın geleceğe bakmasını engeller. Zaman dilimleri, işlemin gerçekleştiği saniyeden itibaren sayılan tam saniyelerdir ve bir işlem, ancak hedef saniyede bir kotasyon mevcutsa zaman dilimine dahil edilir.
SSS
İşlemde markout nedir?
Markout, bir işlem gerçekleştikten sonra sabit bir zaman dilimi boyunca orta fiyatta meydana gelen işaretli değişimdir. Pozitif değer, işlem gerçekleştikten sonra piyasanın işleminiz yönünde hareket ettiği anlamına gelir. Negatif değer ise piyasanın ters yönde hareket ettiği anlamına gelir ki bu da ters seçimin tanımıdır.
Negatif markout her zaman kötü bir işlem midir?
Hayır. Pazarlanabilir bir emirde bir saniyedeki negatif markout, çoğunlukla o emrin ödediği spread'dir; bu da hemen işlem görmenin bedelidir. Önemli olan, eğrinin daha uzun zaman dilimlerinde düşmeye devam edip etmediği veya düzleşip düzleşmediğidir.
Markout ile slippage arasındaki fark nedir?
Slippage, bir işlemi karar fiyatı veya varış fiyatı ile karşılaştırır, bu nedenle emrin tüm yolculuğunu puanlar. Markout ise bir işlemi, işlemden sonraki bir zaman dilimindeki orta fiyatla karşılaştırır, bu nedenle işlemden sonra ne olduğunu puanlar. Biri ana emri, diğeri ise bireysel işlemi puanlar.
Markout hangi zaman dilimini kullanmalıdır?
Bu, işlemin ne için yapıldığına bağlıdır. Bir saniyenin altındaki zaman dilimleri gecikmeye duyarlı işlemleri puanlarken, bir dakika likit isimlerdeki ters seçim için yaygın varsayılandır. Rakamın yanına zaman dilimini yazmak, iki markout'u kıyaslanabilir kılan şeydir.
Markout, efektif spread ile nasıl ilişkilidir?
Efektif spread, gerçekleşen spread artı bir ters seçim bileşenine ayrılır ve bu bileşen, orta fiyat bazlı markout'un iki ile çarpımıdır. Zaman dilimini değiştirdiğinizde, ikisi arasındaki ayrım da onunla birlikte değişir; bu yüzden yayınlanan bir spread istatistiği, zaman dilimi eklenmeden eksiktir.
Buradaki her panel, onu üreten SQL koduyla birlikte sunulmaktadır. Birini açın, ticker'ı veya tarihi değiştirin; aynı markout eğrisi Strasmore terminalinde sıfırdan yeniden oluşturulacaktır.