Toda-Yamamoto vs Differenced Granger: Does the BTC Lead-Lag Survive?
Криптовалюта бойынша жарияланған Грейнджер себептілігінің дерлік бәрі логарифмдік кірістіліктерде есептеледі. Бұл таңдау тегін емес. Дифференциалдау стандартты F-тест талап ететін қатарды стационар етеді, бірақ деңгейлер арасындағы байланысты да жояды. Егер екі монета коинтеграцияланған болса, айырмаларға құрылған VAR қате сипатталады және тест бастапқы сұрақтан сәл өзгеше сұраққа жауап береді.
Тода және Ямамото (1995) шығудың жолын ұсынады: VAR-ды қосымша артта қалулары бар деңгейлерге орнатыңыз, тек түпнұсқасын сынаңыз және жарамды баға алыңыз. бірлік түбірлерге немесе коинтеграцияға қарамастан. Ол эконометрикада жақсы белгілі және ешқашан криптовалютаның артта қалуына қолданылмайды.
Бұл мақала бір нәрсеге назар аударады: бірдей жұптар мен бірдей терезе үшін екі тестті де іске қосып, олардың нәтижелері алшақтай ма, соны көрсету. Содан кейін алынған матрицаға корреляцияланған тесттер отбасы үшін множестволық тестілеу түзетуін қолданып, жылжымалы p-мән арқылы "маңызды" лагтың саудаға жеткілікті тұрақты екенін немесе шектен кездейсоқ өтіп тұрғанын тексереміз.
Төмендегі теория салыстыруды түсінікті ету үшін қажет болғанша ғана. Блог қазірдің өзінде бірлік түбірлерін, коинтеграцияны, деректерді жүктеуді, өлшемдерді және шығындарды қамтиды; бұл бөлімдер емес, сілтемелер.
Гранджердің себептілік дәлелі

Грейнджер себептілігі — механизм емес, болжамдық басымдық: Грейнджер бойынша -тің себебі болады, егер өткен мәндері болжамы қатесінің дисперсиясын өткен мәндері түсіндіретіннен артық азайтса.
Гренжер-себептер егер
Ортақ жасырын фактор басқаратын екі қатар олардың арасында тікелей байланыс болмаса да, Грейнджер себептілігін көрсетуі мүмкін. Крипто нарығында бұл жай академиялық ескерту емес: BTC бүкіл альткоиндер кешеніндегі басым фактор, сондықтан альткоиндер арасындағы себептіліктің көбі бір BTC шокына әртүрлі жылдамдықпен жауап берудің артефакті болуы мүмкін.
VAR жүйесі
Сынақ векторлық авторегрессияда өмір сүреді. бар екі айнымалы үшін артта қалулар:
Матрицалық пішінде VAR(p) бар айнымалылар:
Тексеру Гренжер-себептер бірлескен шектеуді сынап жатыр бірінші теңдеуде. Стандартты бағыт квадраттардың шектелген және шектелмеген қалдық қосындылары бойынша F-сынағы,
асимптоталық эквивалентті Вальд формасымен . Әрі қарай шектеу қандай коэффициенттерге қолданылатыны және VAR қандай деректерге орнатылғаны туралы сұрақ туындайды.
Таңдау кеші
Көптеген жазбалар мойындағаннан да маңыздырақ: тым аз лагтар динамикадан айырылады, тым көп еркіндік дәрежелері жанып, қуатты бұзады.
Ақылға қонымды іздеу диапазоны: екінші деректерде 1-60, минуттық деректерде 1-30, сағат сайын 1-48. BIC бұл жерде дұрыс әдепкі — бұл неғұрлым ұтымды критерий, ал сұйық крипто жұптарындағы жетекші кешігу қысқа жады құбылысы болып табылады. Төмендегі әрбір нәтиже BIC таңдалғанын хабарлайды Әлемдегі бір лагты бекітудің орнына жұп үшін, өйткені бекітілген лаг лаг таңдау таңдауын мәнділік мәлімдемесіне үнсіз түрлендіреді.
Неліктен айырмашылық сынағы дұрыс емес әдепкі болып табылады

Крипто бағаларының қатарлары I(1) болады. Кәдімгі түзету — логарифмдік кірістілікке көшу — коинтеграцияланған деңгейлер арасындағы байланысты жоғалту есебінен стационарлық береді. Егер жұптың ұзақ мерзімді тепе-теңдігі болса, айырмаларға құрылған VAR қате сипатталған болады. Бұл тұжырымның негізіндегі бірлік түбірі мен коинтеграция әдістері (ADF, Монте-Карлоның критикалық мәндері бар Энгл-Грейнджер және VAR жүйесіне арналған Йохансен тесті) статистикалық арбитраж және жұптық сауда мақаласында түсіндірілген; мұнда оны дайын нәтиже ретінде қабылдаймыз. Маңыздысы: "алдымен айырмала, содан кейін тестіле" — салдары бар модельдік шешім, ал Тода-Ямамото одан бас тартуға мүмкіндік береді.
Тода-Ямамото процедурасы
VAR параметрін орнатыңыз кешігулер, қайда оптималды кешігу реті болып табылады және серияның максималды интеграциялық реті, содан кейін сынақ шектеулері тек біріншісінде артта қалулар. Қосымша лагтар стационарлық еместікті сіңіреді; біріншісінде Уолд статистикасы коэффициенттер стандартқа сәйкес келеді қатарлар I(0), I(1) немесе коинтеграцияланғанына қарамастан.
- Анықтаңыз — Әрбір сериядағы ADF және KPSS. Крипто бағалары үшін әрқашан дерлік.
- Таңдау — деңгейлерге VAR сәйкестендіру, BIC бойынша таңдау.
- Толықтырылған VAR мәнін бағалаңыз() деңгейлер бойынша, ешқандай айырмашылық жоқ.
- Вальд-сынақ бірінші елемей, тек артта қалады қосымшалар. Нәтижесі .
Төлем: коинтеграцияның алдын ала сынағы жоқ, айырмашылық жоқ және дұрыс сынақ өлшемі — нөлден төмен қабылдамау коэффициенті интеграциялық сипаттар қандай болса да номиналдыға жақын қалады. Құны - бұл 4-қадам емес test_causality әдепкі бойынша жасайды, бұл жерде көптеген енгізулер тыныш қателеседі.
Іске асыру

DataFrame ішінде минуттық барлар синхрондалған деп алайық. ccxt арқылы дерек алу және индекстеу үлгісі HMM көмегімен режимді анықтау мақаласында, ал бірінші қадамға арналған ADF қабы статистикалық арбитраж және жұптық сауда мақаласында берілген.
Осылардың кез келгеніне дейін бір нұсқа ескертпесі: grangercausalitytests(..., verbose=False) ескірген, содан кейін 0,15 статистикалық үлгілерде жойылған. Аргументті тастаңыз (функция бұдан былай әдепкі бойынша басып шығармайды) немесе бекітіңіз statsmodels<0.15. Төмендегі код заманауи қолтаңбаны болжайды.
Тода-Ямамото, дұрыс орындалды
Шектеуді қолмен салу керек. VARResults.test_causality барлық себепші айнымалының кешігулерін орнатылған модельде сынайды — кеңейтілген VAR() соның ішінде шектеуден артта қалу, бұл Тода-Ямамото жасамау керектігін айтады. Түзету - айқын толық коэффиценттік ковариацияға қарсы матрица:
import numpy as np
from scipy.stats import chi2
from statsmodels.tsa.api import VAR
def toda_yamamoto_test(data, target, predictor, max_lag=15, d_max=1,
significance=0.05):
"""
Toda-Yamamoto Granger causality on levels (no differencing).
Fits VAR(p + d_max) and applies a Wald test to the predictor's
coefficients at lags 1..p ONLY, leaving the d_max augmenting lags
unrestricted. Statistic is chi2(p).
"""
pair = data[[target, predictor]].dropna()
n_vars = pair.shape[1]
target_idx = list(pair.columns).index(target)
pred_idx = list(pair.columns).index(predictor)
model = VAR(pair)
p = model.select_order(maxlags=max_lag).bic or 1
res = model.fit(p + d_max)
beta = res.params.values.ravel(order="F")
cov = res.cov_params()
cov = cov.values if hasattr(cov, "values") else np.asarray(cov)
n_per_eq = res.params.shape[0]
idx = [target_idx * n_per_eq + 1 + lag * n_vars + pred_idx
for lag in range(p)] # first p lags only
R = np.zeros((p, beta.size))
R[np.arange(p), idx] = 1.0
Rb = R @ beta
V = R @ cov @ R.T
wald = float(Rb @ np.linalg.solve(V, Rb)) # no pinv: V must be PD
p_value = float(chi2.sf(wald, df=p))
return {
"target": target, "predictor": predictor,
"p": p, "augmented_lag": p + d_max, "d_max": d_max,
"wald_stat": wald, "p_value": p_value,
"significant": p_value < significance,
}
Қателесу оңай және қателессеңіз, сынақты жарамсыз ететін екі мәліметтер. Біріншіден, индекс арифметикасы статистикалық модельдердің тегістелу жолына сәйкес келуі керек params — орнатылған үлгіде растаңыз beta[target_idx * n_per_eq + 1] тең res.params.iloc[1, target_idx] кез келген p-мәніне сенбес бұрын. Екіншіден, пайдалану np.linalg.solve, жоқ pinv: егер сингулярлық болса, шектеу нашарлайды және жүгіру дұрыс көрінетін санды қайтарудың орнына қатты орындалмауы керек. Псевдо-кері бұл жерде бұзылған Уолд сынақтары кодты тексеруден қалай аман қалады.
Салыстыру үшін стандартты айырмашылық Granger
Салыстырудың базалық нұсқасы — логарифмдік кірістіліктер, сол жұптар және BIC бойынша таңдалған сол лаг:
from statsmodels.tsa.stattools import grangercausalitytests
def differenced_granger(data, target, predictor, p):
"""Standard Granger test on log-returns at a fixed lag p."""
pair = data[[target, predictor]].dropna() # returns, not levels
out = grangercausalitytests(pair, maxlag=[p]) # statsmodels >= 0.15
f_stat, p_value = out[p][0]["ssr_ftest"][:2]
return {"target": target, "predictor": predictor, "lag": p,
"f_stat": f_stat, "p_value": p_value}
Ескерту maxlag=[p] қарағанда maxlag=p: int өту 1-ден 1-ге дейінгі әрбір лагты орындайды және сізді ең жақсысын хабарлауға итермелейді, ол қазірдің өзінде іске қосылған бірнеше сынақтың үстіне тіркеуден шығарылған бірнеше сынақ.
Салыстыру
Әрбір жұп үшін BIC таңдалған бірдей деңгейде қайтарулар бойынша және Toda-Yamamoto деңгейлері бойынша әртүрлі сынақты орындаңыз. , және екеуі келіспеген жерлерді кестеге келтіріңіз. Келіспеушілік - бұл қызықты ұяшық: деңгейлерде емес, айырмашылықтар бойынша маңызды жұп коинтеграциялық қатынасты ажыратуға үміткер артефакт болып табылады; керісінше деңгей қатынасы қайтару сынағы көре алмайтын ақпаратты береді.
Себеп-салдарлық матрицадағы бірнеше салыстыру

Толық матрица қауіпті болатын жер осы. 20 актив пен 10 лагтан тұратын перебор 3800 гипотезалық тест береді, ал Bonferroni мұндай өзара корреляцияланған отбасы үшін дұрыс түзету емес: тесттер бір деректерді және ортақ BTC факторын пайдаланады, сондықтан тәуелсіз емес. Bonferroni жалпы алғанда тым консервативті болып, қай ұяшықтардың шектен өтетінін де бұрмалайды. Дәл осы жағдайға арналған тиімді N механизмін дефляцияланған Шарп коэффициенті туралы мақалада пайдаланыңыз: корреляцияланған тесттер отбасын кластерлеңіз, бастапқы тесттер санын емес, тәуелсіз сынақтар санын есептеңіз және шекті соған қатысты қойыңыз.
def granger_matrix(data, max_lag=15, d_max=1):
"""Toda-Yamamoto p-value matrix. Entry (i, j): does col_j cause col_i?"""
cols = list(data.columns)
out = pd.DataFrame(np.nan, index=cols, columns=cols, dtype=float)
for target in cols:
for predictor in cols:
if target == predictor:
continue
r = toda_yamamoto_test(data, target, predictor,
max_lag=max_lag, d_max=d_max)
out.loc[target, predictor] = r["p_value"]
return out
Маңыздысы 0,05-тен төмен ұяшықтардың саны емес, олардың қаншасы тиімді-N түзетілген шегінен аман қалғаны.
Тірі қалған матрицаны ұяшық бойынша емес, құрылымдық түрде оқыңыз: бір актив көптеген басқаларды тудыратын жолдар ақпарат иерархиясын растайды; Ештеңеден туындаған баған ашылымнан гөрі идиосинкратикалық, таңбалауыштық динамикасын көрсетеді.
Адал тест: уақыт бойынша тұрақтылық

Бір ғана іріктеме ішіндегі p-мән сауда үшін дерлік пайдасыз. Маңызды сұрақ — маңыздылық сақтала ма. Криптовалютадағы активтер арасындағы байланыс режимге тәуелді: тыныш және дүрбелең кезеңдеріндегі корреляция құрылымы қатты өзгереді, ал режимнің өзін HMM арқылы бағалауға болады. Сондықтан бір терезеде өлшенген лаг тек сол терезе туралы тұжырым болып қалады.
def rolling_granger(data, target, predictor, window=500, lag=5, step=50):
"""Rolling-window p-value: when is the lead-lag active vs dormant?"""
rows = []
for start in range(0, len(data) - window, step):
chunk = data.iloc[start:start + window][[target, predictor]].dropna()
if len(chunk) < window * 0.8:
continue
try:
out = grangercausalitytests(chunk, maxlag=[lag])
f_stat, p_value = out[lag][0]["ssr_ftest"][:2]
except Exception:
f_stat, p_value = np.nan, np.nan
rows.append({"timestamp": data.index[start + window - 1],
"f_stat": f_stat, "p_value": p_value})
return pd.DataFrame(rows).set_index("timestamp")
Осы сериядан екі нәрсені хабарлаңыз: 0,05-тен төмен терезелер үлесі және табалдырықты асулар саны. Үш қиылысуы бар терезелердің 80%-ында маңызды болатын қатынас, біріктірілген p-мәні бірдей болса да, қырық қиылысуы бар терезелердің 55%-ындағы маңызды бір нысаннан басқа нысан болып табылады. Екіншісі саудаланбайды — бар болуы бірнеше жүз жолақ сайын өзгеретін сигналдағы позицияны өлшей алмайсыз және қайта бағалау кідірісі әрқашан бұрынғы режиммен сауда жасайтыныңызға кепілдік береді.
Гранджерге тән деректер тұзағы

Криптовалюта деректерінің жалпы тазалығы басқа мақалаларда қарастырылған: бос орындар мен жетіспейтін шамдар бэктест пен нақты сауда сәйкестігі туралы, уақыт белгілерінің тәртібі look-ahead bias таксономиясында, ал таймфреймдер арасында болашаққа қараудың жоқтығын дәлелдеу осында берілген. Бірақ бір проблема Грейнджер тестіне тән және оны бөлек атауға тұрарлық:
Алға толтыру нәтиже береді. Алға толтырылған шам алдыңғы жабуды қайталайды, ол серияға таза автокорреляцияны енгізеді — және лаг-1 автокорреляция механикалық түрде сәйкестендіріледі бір лагтық себепті байланыстан F-сынағы бойынша ажыратылмайды. Бұл барлық орындарда да қолданылады: минуттық жолақтардағы 1 секундтық сағаттың екі алмасу арасындағы ығысуы лаг-1 маңыздылығын тікелей тудыруы немесе жоюы мүмкін, себебі ол қозғалыс жолақ шекарасының қай жағына түсетінін ауыстырады. Осының кез келгенін іске қоспас бұрын, бос орындар толтырылғанның орнына түсірілгенін және екі серияның бір сағаттан мөр басылғанын тексеріңіз.
Әдебиеттердегі артта қалу нәтижелері туралы хабарланды

Бұл мақаладағы өлшемдер емес, дәйексөздер. Олар жоғарыдағы салыстырудың келісетін немесе келіспейтін бірдеңесі болуы үшін жарияланған жазбаның нені талап ететінін айту үшін осында.
- BTC-ден альткоиндерге. Asia-Pacific Financial Markets журналындағы 2026 жылғы зерттеу (Springer) Bitcoin-нен альткоиндерге жоғары жиілікті баға берілуін көрсетеді: капитализациясы шағын монеталар едәуір кешігумен жауап береді, ал өтімділіктің төмен болуы реакцияның баяулауымен байланысты. Бұл бағыттағы жиі келтірілетін лаг шамалары — BTC-ден ETH-ке шамамен 1-3 минут, орта және шағын капитализациялы активтерде ұзағырақ, капитализация төмендеген сайын барған сайын бір бағытты — осында қайта есептелмеген, дереккөзде келтірілген нәтижелер. Нарықтық капитализация деңгейлері көп символды валидация мақаласындағы баспалдақпен бірдей.
- CEX DEX жетекшілік етеді. Криптографиялық микроқұрылымды зерттеу (MDPI) ақпарат ағыны CEX-DEX арасында жұмыс істейтін және маңызды кері себептілік жоқ, бағаны анықтауда үстемдік ететін орталықтандырылған орындарды хабарлайды — блок-уақыт бойынша есеп айырысуға қарсы миллисекундтық сәйкес келетін қозғалтқыштарға сәйкес.
- ETH тәуелсіз монета ретінде. VAR-SVAR жұмысы (MDPI) Ethereum көз ретінде әрекет ететін режимдерді табады, ал Bitcoin таратушы реципиент ретінде, әсіресе DeFi және NFT арқылы басқарылатын фазалар кезінде.
Айқас алмасу, қысқаша
Бір монетаның екі алаңдағы лагы — нақты сауда қойылымы, бірақ оның экономикасы, комиссия шектері, кідірістер сатысы және лагтың не себепті пайда болатыны статистикалық арбитраж және жұптық сауда пен кимчи премиумы мақалаларында талданған. Грейнджер тек тұрақтылық туралы сұрақ қосады: Binance -> Coinbase себептілігі тұрақты түрде маңызды ма, әлде бәрі сияқты жылт етіп жоғала ма? Алаңдар жұбына жылжымалы тест жүргізіңіз; жауап "иә" немесе "жоқ" емес, p-мәндерінің уақыт қатары болады.
Тірі қалған артта қалуды позицияға айналдыру

Егер жұп түзетілген шекті және айналдыру сынағынан тазартса, сигналдың өзі тривиальды болып табылады: кешігу терезесінен жиынтық болжаушының қайтарылуы, шекті мән.
def lead_lag_signal(btc_returns, alt_returns, lag=5, threshold=0.001):
"""+1 / -1 / 0 on ALT from BTC's cumulative return over `lag` bars."""
btc_cum = btc_returns.rolling(lag).sum()
signal = pd.Series(0, index=alt_returns.index)
signal[btc_cum > threshold] = 1
signal[btc_cum < -threshold] = -1
return signal
Осы мақаланың бөлігі болып табылмайтын үш нәрсе, өйткені олар қазірдің өзінде осында орналасқан:
- Шығындар шешуші рөл атқарады. Альткоиндердегі минуттық лаг сигналы спредті, баға әсерін және комиссияларды жабуы тиіс — сырғу мен шығын модельдерін, maker-taker экономикасын және таңдалған жеңімпазға шығын қолданылғандағы нәтижені қараңыз.
- Позиция өлшемі p-мәнін түрлендіру емес. Экспозицияны Грейнджердің p-мәніне кері пропорционалды масштабтау қате: p-мәні нөлдік гипотезаға қарсы дәлел, бірақ әсер өлшемі емес және іріктеме ұзындығымен өзгереді. Позиция өлшемін бағаланған әсер мен оның белгісіздігіне байланыстырыңыз — Келли бойынша позиция өлшемін қараңыз.
- Валидация алға қарай жүргізіледі. Жылжымалы негізде қайта бағалау және үлгіден тыс бағалау; алға қарай оңтайландыру хаттама болып табылады.
Шектеулер

Грейнджер себептілік себеп-салдарлық емес. Шатастырушылар (уақыт белгісінің шамалы тураланбауы бар екі аяқты жылжытатын макрооқиға), жалпы драйверлер (әртүрлі жылдамдықта BTC-тен кейінгі екі балама) және қабылданбаған айнымалылар (жүйеде ETH жоқ BTC-ді DOGE-ге сынау) барлығы тікелей ақпарат ағынынсыз маңызды статистика жасайды. Осы мақалада айтылғандай, екі айнымалы сынақтарды шектеу, түсірілмеген айнымалы мәселені жақсырақ емес, нашарлатады.
Сызықтылық. Тест шартты ортадағы тек сызықтық болжамдық құрылымды көреді. Криптовалютаға құбылмалылық кластерленуі, левередж әсерлері және режим ауысулары тән — екінші ретті моменттерді талдау үшін GARCH құбылмалылығын болжау және DCC-GARCH динамикалық корреляциясын қараңыз. Білуге тұрарлық сызықтық емес баламалар: Дикс-Панченконың (2006) ядролық тесті, ақпараттық-теориялық аналог ретіндегі трансфер энтропиясы және толық бірлескен үлестірімге арналған копулаға негізделген Грейнджер себептілігі.
Құрылымдық үзілістер. Бір терезеде есептелетін кез келген қатынас сол терезенің режиміне байланысты болады; жоғарыдағы жылжыту сынағы ең аз диагностика болып табылады және ол түзету емес, диагностика болып табылады.
Түйіндеме

- VAR-ды деңгейлерге орнатыңыз, таңдаңыз жұпқа BIC бойынша, көбейту , және Wald-тест бірінші тек артта қалады. Шектеу матрицасын қолмен құрастырыңыз — кітапхананың
test_causalityТода-Ямамото емес, артта қалуды да шектейді. - Айырмашылықты қайтару сынағын бірдей жұптар мен кешігулер бойынша базалық сызық ретінде орындаңыз және ** келіспеушіліктер туралы хабарлаңыз**. Бұл кесте қорытынды; жұлдызша матрицасы жоқ.
- Корреляциялық сынақ тобына арналған матрицаны Bonferroni емес, тиімді N арқылы түзетіңіз және қанша жасуша тірі қалғанын хабарлаңыз.
- Оны айналдырыңыз. Маңызды терезелердің үлесін және қиылысу санын хабарлаңыз. Біріктірілген p-мәні қаншалықты аз болса да, жыпылықтау саудаланатын лаг болып табылмайтынының маңыздылығы.
- Кез келген кешігу-1 нәтижесіне сенбес бұрын, алға толтырудың орнына бос орындарды тастаңыз және орындар бойынша сағаттың туралануын тексеріңіз.
Бұл процедураның өте жақсы нәтижесі теріс болып табылады - үлгідегі маңызды, түзетуден аман қалады және әлі де екі бағытта 0,05 сызығын бірнеше жүз жолақты кесіп өтетін BTC-алт қатынасы саудаға қабілеттілік туралы нақты нәтиже болып табылады және бір реттік жариялауға тұрарлық.
Анықтамалар
- Грейджер, C.W.J. (1969). «Эконометриялық модельдер және кросс-спектрлік әдістер арқылы себепті байланыстарды зерттеу». Эконометрика, 37(3), 424-438.
- Бүгін, Х.Ю. және Yamamoto, T. (1995). «Мүмкін интеграцияланған процестері бар векторлық авторегрессиялардағы статистикалық қорытынды». Эконометрика журналы, 66(1-2), 225-250.
- Дикс, C. және Панченко, В. (2006). «Параметрлік емес Гранджер себеп-салдарлық сынағы үшін жаңа статистикалық және практикалық нұсқаулар». Экономикалық динамика және бақылау журналы, 30(9-10), 1647-1669.
- Сифат, И.М., Мохамад, А. (2019). «Биткоин мен Ethereum арасындағы алдыңғы қатарлы байланыс: сағаттық және күнделікті деректерден алынған дәлелдер.» Халықаралық бизнес және қаржы саласындағы зерттеулер, 50, 306-321.
- "Биткойннан альткоиндерге бағаны беру: жоғары жиілікті дәлелдер және сауда стратегиясына әсер ету." Азия-Тынық мұхиты қаржы нарықтары, Springer, 2026 ж.
- "Криптовалюталық нарықтардағы таралу тәуекелдері: VAR-SVAR Granger Causality-тен көзқарас." Тәуекел және қаржылық менеджмент журналы, MDPI.
- "Криптовалютаны қаржыландыру мөлшерлемесі нарықтарының екі деңгейлі құрылымы." Математика, MDPI.
- "Орталықтандырылмаған және орталықтандырылған биржалар: қандай цифрлық токендер жұқтыру қаупін арттырады?" ScienceDirect, 2023 ж.
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.