Kwa nini market makers hupoteza pesa kwa adverse selection
Elewa jinsi adverse selection inavyosababisha hasara kwa market makers. Jifunze kutumia markout curves kupima hatari ya inventory na gharama za nafasi kwenye queue.
Market makers hupoteza pesa kutokana na adverse selection: mfanyabiashara anayechukua ofa mara nyingi ni yule ambaye tayari anajua kuwa ofa hiyo imepitwa na wakati. Kila fill huanza na mkopo mdogo, takribani nusu ya spread, na sekunde zinazofuata huamua ni kiasi gani cha mkopo huo kitasalia. Zana ya kupimia ni markout, mabadiliko ya bei yaliyotiwa alama katika muda maalum baada ya fill, na paneli zilizo hapa chini zinajenga mikondo halisi ya markout kutokana na prints za biashara na nukuu. Makala yetu ya ziada kuhusu jinsi market makers wanavyotengeneza pesa inashughulikia upande wa mapato wa leja hiyo hiyo.
Adverse selection katika biashara ni nini?
Market maker huweka bei mbili kwa wakati mmoja: bid ya kununua na ofa ya kuuza, kila moja ikiwa na kiasi kilichotajwa. Pengo lililopo kati yao ni bid ask spread, na biashara hii ni ya kihisabati. Nunua kwa bid, uza kwa ofa, rudia mara makumi ya maelfu kwa siku, na wastani wa mzunguko mzima hukusanya kiasi kinachokaribia spread.
Hesabu hiyo inadhani kuwa pande zote mbili zinafika kwa usawa. Sivyo ilivyo. Nukuu iliyopo ni chaguo (option) ambalo mtu yeyote anaweza kulitumia wakati wowote anaouchagua, na wafanyabiashara wanaozingatia zaidi huchagua nyakati bora zaidi. Mfuko unaoshughulikia oda kubwa ya mzazi huendelea kununua wakati ofa ikiwa nafuu. Mfumo ambao tayari umeona chombo kinachohusiana kimebadilika huchukua upande ambao bado haujabadilisha bei.
Adverse selection ni jina la mwelekeo huo katika mchanganyiko huo: fills anazopokea maker huelekea kwa wafanyabiashara waliyozitaka zaidi. Dalili yake ni pengo kati ya spread anayonukuu maker na spread anayohifadhi.
Markout katika market making ni nini?
Markout hujibu swali moja, linaloulizwa baada ya kila fill: bei ilikuwa wapi sekunde kadhaa baadaye, ikipimwa kutoka upande niliokuwa nao? Tuseme maker anauza hisa 100 kwa $50.02 wakati midpoint ikiwa $50.00. Fill hiyo huanza na senti mbili kwa kila hisa kama mkopo, yaani 20 mils katika vitengo vya desk, ambapo mil moja ni sehemu ya kumi ya senti. Ikiwa midpoint imehamia $50.04 sekunde sitini baadaye, markout ya sekunde 60 ni minus 20 mils. Mkopo wa awali umepotea, na kiasi hicho hicho kimepotea pamoja nao.
Pata wastani wa hilo katika kila fill kwenye dirisha na uichore dhidi ya muda, na matokeo yake ni mkondo wa markout. Paneli iliyo hapa chini inajenga mmoja kwa ajili ya AAPL katika dirisha la saa tatu mchana siku ya Alhamisi, Mei 14, 2026. Kila print inatiwa alama dhidi ya midpoint ya sekunde iliyochapishwa: print iliyo juu ya midpoint huhesabiwa kama taker anayenunua, jambo linalomweka maker upande wa kuuza.
SQL halisi nyuma ya kila namba
WITH
qs AS (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:06:00'
AND bid_price > 0 AND ask_price > bid_price
GROUP BY ts
),
fills AS (
SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
if(t.px > q.mid, 1, -1) AS taker_side
FROM (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
toFloat64(price) AS px, toUInt64(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:00:00'
AND size > 0
) AS t
INNER JOIN qs AS q ON q.ts = t.ts
WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
)
SELECT
concat('+', toString(e.secs), 's') AS horizon,
round(1000 * avg(e.taker_side * (e.px - e.mid_at_fill)), 2) AS edge_at_fill_mils,
round(1000 * avg(e.taker_side * (e.px - f.mid)), 2) AS edge_after_mils
FROM (
SELECT toUInt32(ts + secs) AS future_ts, secs, px, mid_at_fill, taker_side
FROM (SELECT *, arrayJoin([1, 5, 15, 30, 60, 300]) AS secs FROM fills)
) AS e
INNER JOIN qs AS f ON f.ts = e.future_ts
GROUP BY e.secs
ORDER BY e.secsMfululizo wa kwanza ni mkopo katika muda wa fill, umbali kati ya print na midpoint, kwa wastani wa 19.66 mils kwa kila hisa. Mfululizo wa pili ni thamani ya fills hizo mara tu midpoint inapopata muda wa kuhama: 20.5 mils sekunde moja baadaye, na 9.81 mils dakika tano baadaye. Umbali kati ya mfululizo huo miwili katika muda wowote ni markout, na hutoka kwenye spread aliyonukuu maker.
Mkondo unaoshuka haraka na kisha kusawazika unaelezea maker anayelipia mabadiliko ya bei ya haraka na kuhifadhi salio. Mkondo unaoendelea kuteremka kwa njia ile ile katika kila muda unaelezea fills zinazotua upande mbaya wa bei inayoendelea kubadilika. Sura ya kwanza ni gharama ya kufanya biashara. Ya pili ni nukuu inayohitaji kubadilika.
Ni fills zipi ni toxic flow?
Neno toxic linafanya kazi ya kiufundi hapa. Flow ni toxic wakati mkondo wake wa markout unapoelekea dhidi ya maker aliyeijaza, katika kila muda, juu ya sampuli kubwa. Madawati hupanga fills kwa kila lebo wanayoweza kuiona: ukubwa wa print, ukumbi, aina ya oda, kitambulisho cha mshirika. Ukubwa ni lebo inayobebwa kwenye kanda ya umma.
SQL halisi nyuma ya kila namba
WITH
qs AS (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:06:00'
AND bid_price > 0 AND ask_price > bid_price
GROUP BY ts
),
fills AS (
SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
if(t.px > q.mid, 1, -1) AS taker_side
FROM (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
toFloat64(price) AS px, toUInt64(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:00:00'
AND size > 0
) AS t
INNER JOIN qs AS q ON q.ts = t.ts
WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
)
SELECT
multiIf(s.shares < 100, 'under 100 shares',
s.shares < 500, '100 to 499',
s.shares < 1000, '500 to 999',
'1,000 or more') AS size_bucket,
count() AS fills_count,
round(1000 * avg(s.taker_side * (s.px - s.mid_at_fill)), 2) AS edge_at_fill_mils,
round(1000 * avg(s.taker_side * (s.px - f.mid)), 2) AS edge_after_60s_mils
FROM (SELECT *, toUInt32(ts + 60) AS future_ts FROM fills) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY size_bucket
ORDER BY min(s.shares)Fills chini ya hisa 100 huanza na 19.47 mils kwa kila hisa ya mkopo na zina thamani ya 15.22 mils dakika moja baadaye. Prints za hisa 1,000 na kuendelea huanza na 36.26 mils na zina thamani ya 21.34 mils katika muda huo huo. Chombo kile kile, saa tatu zile zile, uchumi tofauti kwa kila hisa. Oda kubwa zaidi mara nyingi huepuka foleni ya umma kabisa, jambo ambalo block trade hupangwa kufanya.
Hatari ya orodha (inventory risk), nafasi ambayo haiwezi kulindwa kwa wakati
Muda wa markout pia ni saa. Maker anayenunua hisa 5,000 kwa bid anashikilia hisa 5,000, na hadi nafasi hiyo ilindwe au kuuzwa, inakabiliwa na chochote ambacho bei itafanya baadaye. Hedging mara chache huwa ya papo hapo: nafasi ya hisa moja inaweza kufidiwa na ETF inayohusiana au nafasi ya options, na kila moja ya hizo hubeba spread yake ya kuvuka. Hatari ya orodha ni ukubwa wa mabadiliko yanayotoshea ndani ya dirisha hilo, na hupimwa kwa njia ile ile kwa jina lolote. Bei husafiri umbali gani kwa kawaida katika dakika inayofuata, na katika saa inayofuata?
SQL halisi nyuma ya kila namba
WITH
bars AS (
SELECT ticker, window_start,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
toFloat64(close) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'NVDA')
AND window_start >= '2026-05-01 00:00:00'
AND window_start < '2026-06-01 00:00:00'
AND transactions >= 50
AND close > 0
),
starts AS (
SELECT ticker, et_date, px, mins,
window_start + toIntervalMinute(mins) AS future_start
FROM (SELECT *, arrayJoin([1, 2, 5, 15, 30, 60]) AS mins FROM bars)
)
SELECT
concat(toString(s.mins), ' min') AS hold_horizon,
round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'SPY'), 1) AS spy_drift_bps,
round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'NVDA'), 1) AS nvda_drift_bps
FROM starts AS s
INNER JOIN bars AS f
ON f.ticker = s.ticker AND f.et_date = s.et_date AND f.window_start = s.future_start
GROUP BY s.mins
HAVING countIf(s.ticker = 'SPY') > 0 AND countIf(s.ticker = 'NVDA') > 0
ORDER BY s.minsKatika mwezi wa Mei 2026, wastani wa mabadiliko kamili katika SPY kwa dakika moja ulikuwa 1.9 basis points, ambapo basis point ni sehemu ya mia moja ya asilimia moja. NVDA ilipima 5.5 katika dakika hiyo hiyo. Panua saa hadi saa moja na takwimu hizo mbili zinakuwa 14.1 na 40.4. Maker anayeweza kusawazisha ndani ya dakika moja huishi na jozi ya kwanza. Maker anayeshikilia kwa saa moja huishi na jozi ya pili, na mkopo uliokusanywa kwenye fill ni sawa kwa njia yoyote ile.
Kwa nini market makers hupoteza pesa mwishoni mwa foleni
Masoko ya hisa hulinganisha oda zilizopo kwa bei moja katika mpangilio zilizofika: bei kwanza, kisha muda. Oda iliyo mwishoni mwa foleni ya hisa 40,000 kwenye bid husubiri hisa 40,000 zilizo mbele yake ziishe, na kukadiria nafasi ya foleni ni nidhamu ya kipekee.
Sehemu ngumu ni nini maana ya kuisha. Foleni huisha kwa njia mbili. Wauzaji huendelea kugonga bid hadi kiwango kimeisha, au bei hushuka kupitia kiwango na kukiacha nyuma. Oda iliyo karibu na mbele hushiriki katika zote mbili. Oda iliyo nyuma hujazwa zaidi kwenye njia ya pili, wakati kiwango kinakaribia kuwa bei ya zamani. Makers wawili wanaweza kufanya biashara ya chombo kimoja kwa bei moja na kuhifadhi kiasi tofauti chake. Nafasi ya foleni haionekani kamwe kwenye spread iliyonukuliwa, kwa kuwa wote wawili walinukuu bei sawa. Inaonekana kwenye mkondo wa markout.
Kwa nini kupanua nukuu si suluhisho la bure
Jibu la wazi kwa mkondo mbaya wa markout ni kunukuu kwa upana zaidi. Nukuu pana hupata zaidi kwa kila fill na hufikia fills chache. Nusu zote mbili za biashara hiyo hukaa kwenye prints za siku hiyo hiyo, zikipangwa kwa jinsi kila print ilivyotua mbali na midpoint.
SQL halisi nyuma ya kila namba
WITH
qs AS (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:06:00'
AND bid_price > 0 AND ask_price > bid_price
GROUP BY ts
),
fills AS (
SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
if(t.px > q.mid, 1, -1) AS taker_side
FROM (
SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
toFloat64(price) AS px, toUInt64(size) AS shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-05-14 14:00:00'
AND sip_timestamp < '2026-05-14 17:00:00'
AND size > 0
) AS t
INNER JOIN qs AS q ON q.ts = t.ts
WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
)
SELECT
multiIf(s.cents <= 0.5, '0.5 cents or less',
s.cents <= 1.0, '0.5 to 1 cent',
s.cents <= 2.0, '1 to 2 cents',
'over 2 cents') AS distance_from_mid,
round(100 * sum(s.shares) / sum(sum(s.shares)) OVER (), 2) AS share_of_volume_pct,
round(1000 * avg(s.taker_side * (s.px - f.mid)), 2) AS edge_after_60s_mils
FROM (
SELECT *, toUInt32(ts + 60) AS future_ts, abs(px - mid_at_fill) * 100 AS cents
FROM fills
) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY distance_from_mid
ORDER BY min(s.cents)Prints ndani ya nusu senti ya midpoint zilichangia 27.58 asilimia ya hisa kwenye dirisha, zenye thamani ya 0.95 mils kwa kila hisa dakika moja baadaye. Prints zilizotua zaidi ya senti mbili nje zilichangia 33.19 asilimia ya hisa, kwa 46.86 mils. Nukuu iliyowekwa mbali zaidi na midpoint hufikiwa na sehemu ndogo ya ujazo wa siku.
Kiwango cha fill ndiyo gharama ya kwanza ya kurudi nyuma. Rejareja za soko (exchange rebates) ni ya pili, kwa kuwa kumbi nyingi humlipa maker kwa kila hisa iliyojazwa na mapato hayo huongezeka kulingana na hisa badala ya upana wa nukuu. Viwango vya ujazo vinavyoweka kiwango cha rejareja huhesabiwa kila mwezi, kwa hivyo mwezi mtulivu hubadilisha bei ya kila fill katika mwezi unaofuata. Kuacha nafasi ya foleni ndiyo gharama ya mwisho, inayolipwa wakati wa kutoka na kulipwa tena mwishoni mwa mstari wakati wa kuingia. Kila maker hukaa mahali fulani kwenye mkondo huu, na wale wanaopima markouts zao kwa usahihi zaidi wanaweza kukaa karibu zaidi na mguso na bado kuhifadhi mkopo. Upimaji huo ndio faida ambayo market makers wakubwa zaidi wanaitetea.
Maswali Yanayoulizwa Mara Kwa Mara
Je, market makers hupoteza pesa kwenye biashara binafsi?
Mara kwa mara. Kitabu cha kutengeneza soko ni usambazaji wa faida ndogo na hasara ndogo, na fills zinazopoteza hujikusanya katika nyakati kabla tu ya bei kubadilika. Biashara inategemea wastani katika mamilioni ya fills.
Markout katika biashara ni nini?
Markout ni mabadiliko ya bei ya soko katika muda maalum baada ya fill, yaliyotiwa alama kutoka kwa mtazamo wa upande mmoja, ambapo namba chanya inamaanisha upande huo umepata faida. Madawati ya hisa hunukuu markouts katika mils kwa kila hisa, na madawati ya options katika ticks kwa kila mkataba.
Toxic order flow inamaanisha nini?
Inaelezea mtiririko wa oda ambao mkondo wake wa markout huelekea kwa kudumu dhidi ya market maker anayeijaza, ikimaanisha bei inaendelea kuhama baada ya kila fill. Lebo hiyo ni sifa ya kitakwimu ya mtiririko wa oda, na haina hukumu yoyote kuhusu mfanyabiashara yeyote mmoja.
Kwa nini market makers hupanua spreads badala ya kuondoa nukuu zao?
Nukuu pana humweka maker sokoni kwa bei inayolipa kwa mkondo mbaya zaidi wa markout. Kuondoa nukuu hakupatii chochote na kunasalimisha nafasi ya foleni pamoja nayo. Madawati hufanya yote mawili, na chaguo hutegemea muda gani nukuu inatarajiwa kubaki imepitwa na wakati.
Adverse selection hupimwaje?
Kwa markouts. Tia alama kila fill kwa upande ambao maker alikuwa nao, kisha pata wastani wa mabadiliko ya midpoint katika muda maalum baadaye. Pengo kati ya mkopo kwenye fill na thamani katika kila muda ni gharama ya adverse selection, katika vitengo sawa na spread.
Jinsi namba hizi zilivyojengwa
Kila paneli ya AAPL inasoma rekodi mbili za umma: kanda ya biashara na kanda ya nukuu. Kila print kati ya 14:00 na 17:00 UTC mnamo Mei 14, 2026 inalinganishwa na wastani wa national best bid and offer midpoint ya sekunde iliyochapishwa, kisha inatiwa alama. Print iliyo juu ya midpoint hiyo huhesabiwa kama taker buy, ambayo humweka maker upande wa kuuza. Prints zilizopo kwenye midpoint hazibebi upande na huondolewa, pamoja na print yoyote iliyo zaidi ya asilimia 2 kutoka midpoint. Rekodi za nukuu ambapo bid inakutana au kuvuka ofa hazijumuishwi, kwa kuwa locked or crossed market haina midpoint inayoweza kutumika.
Ulinganishaji wa kiwango cha pili hukadiria nukuu inayotawala katika microsecond ya fill, na inalainisha masasisho ya haraka zaidi. Bei za muda hutoka kwenye midpoints zile zile za kiwango cha pili. Paneli ya orodha hutumia baa za dakika moja na huhifadhi tu baa zenye angalau prints 50, jambo linalozingatia sampuli katika saa zenye shughuli nyingi zaidi za siku.
Kila paneli hapa inabeba SQL iliyoizalisha, kwa hivyo hesabu ya markout iko wazi kwa ukaguzi mstari kwa mstari. Ili kujenga upya mkondo kwa jina tofauti au siku tofauti, iombe kwa Kiingereza rahisi kwenye terminal ya Strasmore.