Tartib oqimi nomutanosibligi: Cont-Kukanov-Stoikov hodisasining parchalanishi
Ushbu blogdagi kitobdan olingan signallarning aksariyati * oniy suratlar*: hozir har ikki tomonda qancha hajm mavjud. Buyurtma oqimining nomutanosibligi boshqa ob'ektdir. Bu ikki lahzali surat oʻrtasidagi yangilanishlar oqimining bitta imzolangan miqdorga boʻlinishi boʻlib, bu taklifning bekor qilinishini bozordagi sotuvni hisoblagandek hisoblaydi.
Ushbu parchalanish ushbu maqolaning mavzusidir. Xususan: uni belgilaydigan Cont-Kukanov-Stoikov (2014) hodisasi ko‘rsatkichlari, Xu-Gould-Howison (2019) ko‘p darajali kengaytmasi va uning asosiy komponentlarini qisqartirish hamda tasmangiz savdo yo‘nalishini belgilamasa, sizga kerak bo‘ladigan Li-Ready va Bulk Volume tasnifi qoidalari.
Oldinda bitta ramkali eslatma, chunki u quyida keltirilgan har bir raqamni qanday oʻqish kerakligini boshqaradi. CKS qogʻozidagi mashhur 50-65% R kvadrati zamonaviy regressiyadir: oraliqdagi narx oʻzgarishi bir xil oraliqdagi buyurtmalar oqimida regressiyaga uchradi. Bu ularning prognozi emas, balki narxlar harakatining parchalanishi. Kundalik kapital daromadlilik modeli buni 1-2% dispersiya bilan solishtirish, olma va apelsin ekanligini tushuntiradi va bu blog uzoq vaqt davomida bahslashdi. DeepLOB va bashorat-profit farqi va ichida halol salbiy natija - bu ikkalasini birlashtirganda, darsliklar tuzoqqa aylanadi. Qattiq kechikkan OFI regressiyasi qonuniy va ancha kichikroq raqamdir. Ushbu maqola bitta haqida xabar bermaydi.
Nima uchun savdo emas, buyurtma oqimi

Uzluksiz limitli buyurtmalar kitobidagi narx o'zgarishi to'liq to'rtta mexanizm orqali sodir bo'ladi: bozor xaridi dam olish so'rovlarini iste'mol qiladi; bozor savdosi dam olish takliflarini iste'mol qiladi; taklifni bekor qilish qo'llab-quvvatlashni olib tashlaydi va taklif tushishiga imkon beradi; so'rash bo'yicha yangi chegara tartibi qarshilik qo'shadi. Faqat birinchi ikkitasi savdodir. Oxirgi ikkitasi har qanday hajmga asoslangan o'lchovga ko'rinmaydi - VWAP, balansdagi hajm, imzolangan savdo oqimi - va aksariyat joylarda buyurtma-savdo nisbati 10:1 dan oshadi, shuning uchun ko'rinmas qism katta qismdir. OFI ning foydalilikka da'vosi shundaki, u barcha to'rt mexanizmni bir xil miqyosda baholaydi. (Ma'lumotlar tuzilishi va standart sifatida kitob uchun oniy tasvir xususiyati vektori, qarang DeepLOB.)
Cont-Kukanov-Stoikov OFI modeli

Asosiy model Cont, Kukanov va Stoikovning 2014 yildagi "The Price Impact of Order Book Events" (Journal of Financial Econometrics) maqolasidan olingan.
Buyurtma oqimining nomutanosibligini aniqlash
Eng yaxshi taklif narxini ko'rib chiqing , eng yaxshi narxni so'rang , va ularning o'lchamlari va . Ketma-ket kuzatuvlar orasida va :
Bu erda sotib olish va sotish tomonidagi tadbir hissalari:
Oddiy tilda: agar eng yaxshi taklif narxi ko'tarilsa, yangi xarid qiziqishlari paydo bo'ldi - uning to'liq hajmini ijobiy deb hisoblang. Agar u tushib qolsa, sotib olish foizlari g'oyib bo'ldi - eski hajmini olib tashlang. Agar narx o'zgarmagan bo'lsa, faqat o'lchamdagi o'zgarishlarni hisoblang. So'rov tomoni oyna tasviridir.
Nafisligi shundaki, ushbu uchta ko'rsatkich shoxlari kitobning yuqori qismidagi barcha mumkin bo'lgan o'tishlarni qamrab oladi, shuning uchun har bir yangilanish aynan bitta imzolangan raqamga mos keladi. Savdo tasnifi yo'q, yon yorliqlar yo'q, xabar darajasidagi tasma talab qilinmaydi - ikkita ketma-ket surat etarli.
Intervallar ustidan yig'ish
Interval uchun o'z ichiga olgan kitob yangilanishlari:
Chiziqli narx ta'siri modeli
qayerda o'rta narxning o'zgarishi, narx ta'sir koeffitsienti hisoblanadi, va qoldiq shovqin hisoblanadi. AQSh qimmatli qog'ozlari bo'yicha 10 soniyadan 1 daqiqagacha bo'lgan vaqt oralig'ida CKS bir vaqtning o'zida hisobot beradi. har bir aktsiya uchun 50-65%. Yana: bir xil intervalli, oldinga qarab emas.
Kesma masshtablash
CKS shuningdek ta'sir koeffitsienti shkalalarini chuqurlikka teskari ko'rsatdi:
qayerda eng yaxshi taklif va so'rashda o'rtacha dam olish hajmi. Xuddi shu oqim nozik kitobda narxni yanada oshiradi. Bu darajani o'zgartirmasdan joylar bo'ylab uzatiladigan modelning bir qismidir, chunki u raqam emas, balki * munosabatlarni * bashorat qiladi - va u turli xil chuqurlikdagi kripto juftliklarida to'g'ridan-to'g'ri sinovdan o'tkaziladi.
Ko'p darajali buyurtma oqimi nomutanosibligi (MLOFI)

Asl model faqat kitobning yuqori qismidan foydalanadi. Xu, Gould, and Howison (2019) uni kengaytirdi darajalari.
Ta'rif
qayerda ga bir xil uch tarmoqli formulani qo'llaydi -chi taklif/so'rov juftligi.
Ko'p darajali narx ta'siri
Nasdaq aktsiyalari bo'yicha e'lon qilingan xulosa shundan iboratki, har bir qo'shimcha daraja namunadan tashqarida qo'shiladi - taxminan 10-15 foiz punkti bir darajadan beshga o'tadi, marjinal o'sish hali ham o'nta. Koeffitsientlar monoton ravishda pasayadi, : kitobning yuqori qismi ustunlik qiladi, lekin chuqurroq darajalar ahamiyatsiz bo'lmagan qo'shimcha signalga ega.
Bu kripto kitobida omon qoladimi - bu maqoladagi eng qiziqarli ochiq savol. Kripto kitoblar yupqaroq va chuqurroq chayqaladi va Nasdaq buyurtma kitobini tark etganingizdan so'ng, 2-5 darajalar hech narsa qo'shmasligi to'liq ishoniladi.
Asosiy komponentni qisqartirish
Qo'shni darajadagi OFI o'zaro bog'liqligi yuqori (e'lon qilingan kapital natijalarida 0,8 dan yuqori), shuning uchun asosiy komponentning parchalanishi tabiiydir. Xabar qilingan birinchi komponent umumiy dispersiyaning 89% dan ortig'ini qamrab oladi va bitta umumiy signal sifatida xizmat qiladi:
bilan OFI kovariatsiya matritsasining yetakchi xos vektori. Amaliy joziba shundaki, u kollinear regressiyani bitta yaxshi shartli skalerga aylantiradi - hatto sizning ma'lumotlaringizdagi dispersiya ulushi pastroq bo'lsa ham bajarishga arziydi.
Savdolarni tasniflash: Sotib olish va sotish

OFIning o'zi savdo tasnifiga muhtoj emas. Ammo agar siz uni savdoga asoslangan chora-tadbirlar bilan solishtirmoqchi bo'lsangiz yoki sizda faqat yig'ilgan chiziqlar bo'lsa, siz yo'nalish haqida xulosa qilishingiz kerak.
Iqtibos qoidasi
Savdo narxini solishtiring ustun o'rta nuqtaga :
O'rta nuqtadan yuqori bo'lgan savdo, ehtimol, taklifni bekor qilgan xaridor edi; uning ostida, sotuvchi taklifni uradi.
Lee-Ready algoritmi (1991) bu kotirovka qoidasi bo'lib, savdolar uchun to'g'ridan-to'g'ri o'rta nuqtada, kotirovka qoidasi noaniq bo'ladi. Shomil qoidasi - oldingi tomonni nol belgisida oldinga olib boradigan oxirgi narx o'zgarishi belgisi - allaqachon olingan va joriy etilgan. Vaqt chegaralaridan tashqari, qaysi bir ishchi kemalar _tick_sign(). Hisobot qilingan Li-Ready tasnifi aniqligi bozor va davrga qarab 72-85% ni tashkil qiladi.
Ommaviy hajm tasnifi (BVC)
Individual savdolarni belgilash mumkin bo'lmaganda - yig'ilgan barlar, ko'pchilik ommaviy sham API'lari - Easley, Lopez de Prado va O'Hara's Bulk Volume Classification bar hajmining sotib olish qismini uning normallashtirilgan narx o'zgarishidan baholaydi:
bilan standart oddiy CDF va so'nggi narxlardagi o'zgarishlar bo'yicha taxmin qilingan. Shomil darajasidagi tasnifga qaraganda kamroq aniq, lekin u OHLCV da ishlaydi.
OFI nima emas

Uchta qo'shni miqdor OFI bilan chalkashib ketadi. Har biri ushbu blogning boshqa joylarida to'g'ri yoritilgan; farqlar bu erda muhim.
Buyurtmalar kitobining statik nomutanosibligi (OBI) oniy surat versiyasidir — dam olish so‘rovi hajmiga nisbatan dam olish taklifi hajmi, voqea kuzatilmaydi. Qarang DeepLOB an'anaviy LOB xususiyatlari formula va uning ko'p darajali shakli uchun. Qarama-qarshilik OFIning butun nuqtasidir: OBI sizga kitobning holatini aytib beradi, OFI u erga qanday etib kelganini aytadi.
Savdo nomutanosibligi (TI) va uning hajmi bo'yicha o'lchangan variantlari imzolangan savdo oqimi bo'lib, ularda aylanma xususiyat sifatida aniqlanadi va amalga oshiriladi. mashinani o'rganish bilan modellashtirishni yoyish. O'zaro bog'liqlik haqidagi e'lon qilingan natijalardan biri bu erda yuk ko'taruvchidir: OFI va TI o'rta narxlardagi o'zgarishlarda regressorlar sifatida birga kiritilganda, TI statistik jihatdan ahamiyatsiz bo'lib qoladi. Uning mazmuni o'z ichiga oladi. Bu savdolar o'rniga kitob voqealarini kuzatishning empirik holatidir - deyarli savdoga aylangan voqealar xuddi shunday ma'lumotlarni o'z ichiga oladi.
Hajm bo‘yicha o‘lchangan o‘rta bu nomutanosiblik o‘lchovi emas, balki adolatli qiymat hisoblagichidir va u DeepLOB — shu jumladan, nomlash Stoikovning mikro-narxi emasligi haqidagi ogohlantirish, bu martingal bilan tartibga solingan. bashoratchi aniq qurilgan, chunki sodda og'irlikdagi o'rta tarafli.
Python amalga oshirish

CKS parchalanishini to'g'ridan-to'g'ri amalga oshirish, umumlashtirilgan darajalari.
Asosiy OFI hisoblash
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class OrderBookSnapshot:
timestamp: float
bid_prices: np.ndarray # best bid at index 0, descending
ask_prices: np.ndarray # best ask at index 0, ascending
bid_sizes: np.ndarray
ask_sizes: np.ndarray
@dataclass
class OFICalculator:
"""
Computes Order Flow Imbalance from consecutive order book snapshots.
Supports multi-level OFI (MLOFI) up to `n_levels` deep.
"""
n_levels: int = 5
prev_snapshot: Optional[OrderBookSnapshot] = field(default=None, init=False)
def compute_level_ofi(
self,
prev_price: float, curr_price: float,
prev_size: float, curr_size: float,
side: str
) -> float:
"""Compute single-level OFI contribution for bid or ask side."""
if side == "bid":
if curr_price > prev_price:
return curr_size # new level appeared above
elif curr_price < prev_price:
return -prev_size # old level disappeared
else:
return curr_size - prev_size # same level, size changed
else: # ask side
if curr_price < prev_price:
return curr_size # new level appeared below
elif curr_price > prev_price:
return -prev_size # old level disappeared
else:
return curr_size - prev_size # same level, size changed
def update(self, snapshot: OrderBookSnapshot) -> Optional[np.ndarray]:
"""
Process new snapshot, return MLOFI vector of shape (n_levels,).
Returns None on first call (no previous snapshot to compare).
"""
if self.prev_snapshot is None:
self.prev_snapshot = snapshot
return None
prev = self.prev_snapshot
n = min(self.n_levels, len(snapshot.bid_prices), len(prev.bid_prices))
ofi = np.zeros(n)
for level in range(n):
e_buy = self.compute_level_ofi(
prev.bid_prices[level], snapshot.bid_prices[level],
prev.bid_sizes[level], snapshot.bid_sizes[level],
side="bid"
)
e_sell = self.compute_level_ofi(
prev.ask_prices[level], snapshot.ask_prices[level],
prev.ask_sizes[level], snapshot.ask_sizes[level],
side="ask"
)
ofi[level] = e_buy - e_sell
self.prev_snapshot = snapshot
return ofi
Windows-ga yig'ish
@dataclass
class OFIAggregator:
"""
Aggregates raw OFI updates into fixed time windows.
Emits the regression inputs (aggregated MLOFI) and target (delta mid).
"""
window_seconds: float = 10.0
n_levels: int = 5
calculator: OFICalculator = field(init=False)
buffer: list = field(default_factory=list, init=False)
window_start: float = 0.0
def __post_init__(self):
self.calculator = OFICalculator(n_levels=self.n_levels)
def on_snapshot(self, snapshot: OrderBookSnapshot) -> Optional[dict]:
"""
Feed a new order book snapshot.
Returns aggregated window dict when a window completes, else None.
"""
ofi_vec = self.calculator.update(snapshot)
if ofi_vec is None:
self.window_start = snapshot.timestamp
return None
if not self.buffer:
self.window_start = snapshot.timestamp
self.buffer.append({
"timestamp": snapshot.timestamp,
"ofi": ofi_vec.copy(),
"mid": (snapshot.bid_prices[0] + snapshot.ask_prices[0]) / 2,
})
elapsed = snapshot.timestamp - self.window_start
if elapsed >= self.window_seconds:
return self._flush()
return None
def _flush(self) -> dict:
"""Aggregate buffered OFI updates into a single window record."""
ofi_matrix = np.array([b["ofi"] for b in self.buffer])
agg_ofi = ofi_matrix.sum(axis=0) # shape: (n_levels,)
result = {
"window_start": self.window_start,
"window_end": self.buffer[-1]["timestamp"],
"n_updates": len(self.buffer),
"mid_open": self.buffer[0]["mid"],
"mid_close": self.buffer[-1]["mid"],
"delta_mid": self.buffer[-1]["mid"] - self.buffer[0]["mid"],
"ofi_level1": agg_ofi[0],
"ofi_total": agg_ofi.sum(),
"mlofi": agg_ofi,
}
self.buffer.clear()
return result
Agregator nima chiqarishiga e'tibor bering: mlofi va delta_mid * bir xil * oynada. Bu hozirgi regressiya. Bashoratli oynani olish uchun oynani ulang ning mlofi deraza bilan ning delta_mid va sezilarli darajada yomonroq moslashishni kuting.
Savdo tasnifi (Lee-Ready)
def classify_trades_lee_ready(
trades: pd.DataFrame,
quotes: pd.DataFrame
) -> pd.DataFrame:
"""
Classify trades as buy (+1) or sell (-1) using Lee-Ready:
quote rule first, tick rule as fallback at the midpoint.
Parameters
----------
trades : DataFrame with columns ['timestamp', 'price', 'size']
quotes : DataFrame with columns ['timestamp', 'bid', 'ask']
Returns
-------
trades with added 'side' column
"""
trades = trades.sort_values("timestamp").copy()
quotes = quotes.sort_values("timestamp")
trades = pd.merge_asof(
trades, quotes,
on="timestamp",
direction="backward"
)
trades["mid"] = (trades["bid"] + trades["ask"]) / 2
trades["side"] = np.where(
trades["price"] > trades["mid"], 1,
np.where(trades["price"] < trades["mid"], -1, 0)
)
trades["price_diff"] = trades["price"].diff()
tick_sign = np.sign(trades["price_diff"])
tick_sign = tick_sign.replace(0, np.nan).ffill().fillna(1)
midpoint_mask = trades["side"] == 0
trades.loc[midpoint_mask, "side"] = tick_sign[midpoint_mask].astype(int)
return trades
Signalni normallashtirish
class OFISignal:
"""
Rolling z-score normalization of aggregated OFI.
Deliberately does NOT convert OFI into a predicted return: that
requires a fitted beta, and beta is venue-, pair- and regime-specific.
Fit it on your own data before wiring this into anything.
"""
def __init__(self, window_seconds: float = 10.0, n_levels: int = 5,
lookback: int = 100):
self.aggregator = OFIAggregator(
window_seconds=window_seconds, n_levels=n_levels,
)
self.lookback = lookback
self.ofi_history: list[float] = []
def process(self, snapshot: OrderBookSnapshot) -> Optional[dict]:
agg = self.aggregator.on_snapshot(snapshot)
if agg is None:
return None
ofi = agg["ofi_level1"]
self.ofi_history.append(ofi)
if len(self.ofi_history) > self.lookback:
self.ofi_history.pop(0)
if len(self.ofi_history) >= 20:
arr = np.array(self.ofi_history)
mu, sigma = arr.mean(), arr.std()
zscore = (ofi - mu) / max(sigma, 1e-10)
else:
zscore = 0.0
return {**agg, "ofi_zscore": zscore}
OFI qayerga ulanadi

Bozor yaratish. OFI adolatli qiymat bo'yicha bashoratli chayqalish atamasi sifatida, allaqachon olingan va kodlangan inventar qiyshiqligi ustiga kiritadi. Avellaneda-Stoikov marketmeykeri: . Ikki atama turli savollarga javob beradi - oqim atamasi narx qayerga ketayotganini aytadi, inventar atamasi siz nimani ushlab turishingiz mumkinligini aytadi - va nashr etilgan maqola ikkinchisini o'z ichiga oladi, shu jumladan ijobiy inventar nega ikkala kotirovkani pastga tushiradi. Katta Katalogda keltirilgan mudofaa javoblari (kengaytirish, kichraytirish, bir tomonni tortish) uchun ham oqilona salbiy tanlov tetikidir. treyder identifikatsiyasining raqamli barmoq izlari va anomaliyalarni aniqlash.
Bajarish. OFI taktika qatlamining to‘ldirish ehtimolini baholashga kirishdir. , alohida shoshilinch nazoratchi emas. O'zaro qarama-qarshilikdan keyingi qaror aniq zararsizlik arifmetikasidir - bilan - va yashaydi bolalar buyrug'ini bajarish taktikasi, bu shuningdek, taktika qatlami hech qachon bozorga nisbatan o'z nuqtai nazaridan shoshilinchlikni qaytarmasligi kerakligini ta'kidlaydi, chunki bu rozi bo'lmagan ikkita nazoratchini yaratadi.
Amaliy mulohazalar

Signalning yarim yemirilish davri va aylanishni qayta kalibrlash. Bu OFIga xos qism. OFI ning bashoratli tarkibi suyuq asboblarda millisekunddan soniyagacha bo'lgan vaqt oralig'ida pasayadi, ya'ni yig'ish oynasi bepul parametr emas - bu ufqdagi pul tikish. Va doimiy emas: u kun davomida, chuqurlikda va rejalashtirilgan voqealar atrofida harakatlanadi, shuning uchun har qanday ishlab chiqarish moslamasi orqa sinovdan qiymatni mahkamlashdan ko'ra, uni aylantiruvchi oynalarda qayta baholaydi.
Bu erda hamma narsa boshqa joyda yoritilgan. Kechikish byudjetlari va birgalikda joylashish / FPGA / yadroni aylanib o'tish narvonlari: DeepLOB ishlab chiqarish bo'limi. U shaklidagi kunlik likvidlik sxemasi va o'zgaruvchan normalizatsiya statistikasi: yoyilgan modellashtirish. Har bir joy uchun qayta kalibrlash va nima uchun Nasdaq-ga o'rnatilgan model tegilmagan kripto juftligiga o'tmaydi: DeepLOB yana parchalanish tomoni bilan aqlli buyurtma marshrutlash.
Manipulatsiya. Bitta oqibat bu modelga xos bo‘lib, uni ochiq aytishga arziydi: CKS dekompozitsiyasi har bir hodisani faqat o‘lcham bo‘yicha baholaydi, maqsad yoki qat’iylik tushunchasisiz. Shuning uchun o'lchamni o'rnatish va bekor qilish uchun parda to'g'ridan-to'g'ri signalga to'liq og'irlikda, konstruktsiyasi bo'yicha kiritiladi. Aniqlash evristikasi - bekor qilish stavkalari, buyurtma muddati, narx yaqinlashganda devor harakati - mavjud navbat holati va buyurtma kitob devori tahlili; o'zaro fantom likvidligi mavjud aqlli buyurtma marshrutlash.
Asosiy xulosalar

-
OFI oniy tasvir emas, voqea dekompozitsiyasidir. Uch tarmoqli indikator formulasi har bir kitobning yuqori qismiga o‘tishni xaritada ko‘rsatadi - narxning ko‘tarilishi, arzonlashishi, o‘lchamining o‘zgarishi - ikkita ketma-ket suratdan bitta imzolangan raqamga va boshqa hech narsa emas.
-
R-kvadrat sarlavhasi bir vaqtning o'zida. CKS 50-65% ko'rsatkichi bir xil oraliqdagi narxlar o'zgarishlarini parchalaydi; bu prognoz emas va uni istiqbolli qaytish modellari bilan taqqoslash kerak emas.
-
Ko'p darajali OFI darajalarni qo'shadi va PCA ularni yopib qo'yadi. Chop etilgan qo'shimcha- va 89% variatsiya natijalari Nasdaq aktsiyalaridan. Kripto kitobida chuqurlik hali ham yordam beradimi, bu erda tekshirilmagan.
-
OFI savdo nomutanosibligini o'z ichiga oladi. Birgalikda kiritilgan TI ahamiyatsiz bo'lib qoladi - OFI ko'rgan va TI mumkin bo'lmagan bekor qilishlar farq qiladi.
-
Model o‘z niyatiga bog‘liq emas. Hajmi bo‘yicha bir xil og‘irlikda bo‘lishi aynan uni buzuvchi qiladi.
-
Ushbu maqolada hech narsa o'lchanmaydi. Ko'rsatilgan har bir raqam qimmatli qog'ozlar adabiyotidan olingan. Ushbu signal kapitalga tegishidan oldin u sizning kitobingiz ma'lumotlariga mos kelishi, alohida xabar qilingan kechikish spetsifikatsiyasi va chekka to'lovlar va tarqalishdan omon qolganligini tekshirish kerak.
Qo'shimcha o'qish

- Cont, R., Kukanov, A., & Stoikov, S. (2014). "Buyurtma kitobi voqealarining narxga ta'siri." Journal of Financial Econometrics, 12(1), 47-88.
- Xu, K., Gould, M. va Howison, S. (2019). "Ko'p darajali buyurtma - Limitli buyurtmalar kitobidagi oqim nomutanosibligi". arXiv:1907.06230.
- Kolm, P., Turiel, J. va Westray, N. (2023). "Chuqur tartib oqimi nomutanosibligi: Limit buyurtmalar kitobidan bir nechta ufqlarda alfani olish." Matematik moliya, 33(4).
- Li, C. va Ready, M. (1991). "Bir kunlik ma'lumotlardan savdo yo'nalishini aniqlash." Journal of Finance, 46(2), 733-746.
- Easley, D., Lopez de Prado, M. va O'Hara, M. (2012). "Yuqori chastotali dunyoda oqimning toksikligi va likvidligi". Moliyaviy tadqiqotlar sharhi, 25(5), 1457-1493.
Authors
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.