Toda-Yamamoto vs Differenced Granger: Does the BTC Lead-Lag Survive?
Kriptoyla ilgili yayınlanan hemen hemen her Granger nedensellik sonucu, log getirileri üzerinden hesaplanır. Bu seçim bedava değil. Fark alma, standart F testinin gerektirdiği gibi seriyi durağan hale getirir, ancak aynı zamanda seviye ilişkisini de göz ardı eder - ve eğer iki madeni para eş bütünleşikse, farkı VAR yanlış belirtilir ve test, sorduğunuzdan biraz farklı bir soruyu yanıtlıyor demektir.
Toda ve Yamamoto (1995) bir çıkış yolu önermektedir: VAR'ı ekstra gecikmeli seviyelere oturtun, yalnızca orijinal olanları test edin ve geçerli bir sonuç elde edin. birim kök veya eşbütünleşmeden bağımsız olarak Ekonometride iyi bilinir ve neredeyse hiçbir zaman kripto gecikmesine uygulanmaz.
Yani bu makale tek bir şey yapıyor: aynı çiftler üzerinde, aynı pencere üzerinden her iki testi de çalıştırın ve aynı fikirde olup olmadıklarını bildirin. Daha sonra dürüst bir takip uygulayın - ortaya çıkan matris üzerinde ilişkili aile çoklu test düzeltmesi ve "önemli" gecikmenin ticaret için yeterince istikrarlı olup olmadığını veya sadece eşik boyunca titreşip titreşmediğini görmek için yuvarlanan bir p değeri.
Aşağıdaki teori, karşılaştırmayı okunaklı hale getirmek için gereken kadardır. Blog zaten birim kökleri, eş bütünleşmeyi, veri yüklemeyi, boyutlandırmayı ve maliyetleri kapsıyor; bunlar bağlantılardır, bölümler değil.
Granger nedenselliğinin gerçekte iddia ettiği şey

Granger nedenselliği tahmin edici önceliktir, mekanizma değil: Granger nedenleri eğer geçmişse tahmin hatası varyansını azaltır hangi geçmişin ötesinde zaten açıklıyor.
Granger nedenleri eğer
Ortak bir gizli faktörün yönlendirdiği iki seri, aralarında doğrudan bir bağlantı olmaksızın Granger nedenselliğini gösterebilir. Kriptoda bu uyarı akademik değildir — BTC, tüm altcoin kompleksinde tek baskın faktördür, dolayısıyla neredeyse tüm alt-alt "nedensellik", aynı BTC şokuna farklı yanıt hızlarının aday bir eseridir.
VAR çerçevesi
Test bir Vektör Otoregresyonunun içinde yaşar. İki değişken için gecikmeler:
Matris formunda bir VAR(p) değişkenler:
olup olmadığını test etmek Granger nedenleri eklem kısıtlamasını test ediyor ilk denklemde. Standart rota, sınırlı ve sınırsız artık kareler toplamları üzerinde bir F testidir,
asimptotik olarak eşdeğer Wald formuyla . Bundan sonra gelecek her şey kısıtlamanın hangi katsayılara uygulandığı ve VAR'ın hangi verilere dayandığı ile ilgili bir sorudur.
Gecikme seçimi
çoğu yazının kabul ettiğinden daha önemlidir: çok az gecikme dinamikleri kaçırır, çok fazla gecikme özgürlük derecelerini yakar ve gücü yok eder.
Makul arama aralıkları: saniyelik verilerde 1-60, dakikalık verilerde 1-30, saatlik verilerde 1-48. BIC burada doğru varsayılandır; daha cimri bir kriterdir ve likit kripto çiftlerindeki gecikme, kısa hafıza olgusudur. Aşağıdaki her sonuç BIC tarafından seçilenleri rapor eder Evren genelinde bir gecikmeyi sabitlemek yerine çift başına, çünkü sabit bir gecikme, gecikme seçimi seçimini sessizce bir önem iddiasına dönüştürür.
Fark testi neden yanlış varsayılan testtir?

Kripto fiyat serisi I(1). Olağan düzeltme - log getirilerinin alınması - eş bütünleşme seviyesi pahasına durağanlığı satın alır ve eğer çift uzun vadeli bir dengeyi paylaşıyorsa, fark edilen VAR yanlış belirtilir. Bu cümlenin arkasındaki birim kök ve eş bütünleşme mekanizması (ADF, Monte-Carlo kritik değerleriyle Engle-Granger, VAR sistemindeki Johansen) zaten istatistiksel arbitraj ve çift ticareti; burada olduğunu varsayalım. Mesele şu ki, alışılagelmiş çare - önce fark, sonra test - sonuçları olan bir modelleme kararıdır ve Toda-Yamamoto bunu yapmaktan kaçınmanın yoludur.
Toda-Yamamoto prosedürü
VAR'ı takın gecikmeler, nerede optimal gecikme sırasıdır ve serinin maksimum entegrasyon sırasıdır, o zaman kısıtlamaları test edin sadece ilkinde gecikmeler. Ekstra gecikmeler durağan olmayışı emer; İlk Wald istatistiği katsayılar bir standardı takip eder serinin I(0), I(1) veya eşbütünleşik olup olmadığına bakılmaksızın.
- Belirleyin — Her seride ADF ve KPSS. Kripto fiyatları için neredeyse her zaman.
- Seçin — seviyelere bir VAR yerleştirin, BIC'e göre seçin.
- Artırılmış VAR'ı tahmin edin() düzeylerde farklılık yok.
- İlkinde Wald testi yalnızca gecikmeler göz ardı edilerek ekstralar. Sonuç: .
Kazanç: eşbütünleşme ön testi yok, fark yok ve doğru test boyutu - entegrasyon özellikleri ne olursa olsun sıfır değeri altındaki ret oranı nominalin yakınında kalıyor. Maliyet şu ki, 4. adım ne değil test_causality varsayılan olarak bunu yapar; bu, çoğu uygulamanın sessizce yanlış gittiği yerdir.
Uygulama

Bir DataFrame'de dakika çubuklarını zaten hizaladığınızı varsayalım; ccxt getirme ve indeksleme metni HMM ile rejim tespiti konumundadır ve 1. adım için kullanacağınız ADF sarmalayıcısı [istatistiksel arbitraj ve çiftler] konumundadır ticaret](/tr/blog/post/statistical-arbitrage-pairs-trading-crypto).
Bunlardan herhangi biri çalıştırılmadan önce bir sürüm notu: grangercausalitytests(..., verbose=False) kullanımdan kaldırıldı ve ardından istatistik modeli 0,15'te kaldırıldı. Argümanı bırakın (işlev artık varsayılan olarak yazdırılmaz) veya sabitleyin statsmodels<0.15. Aşağıdaki kod modern imzayı varsayar.
Toda-Yamamoto, doğru şekilde yapıldı
Kısıtlamanın elle yapılması gerekir. VARResults.test_causality takılan modelde neden olan değişkenin tüm gecikmelerini artırılmış VAR'da test eder () şunları içerir: Toda-Yamamoto'nun yapmamanızı söylediği şey tam da bu. Düzeltme açık bir şekilde tam katsayı kovaryansına karşı matris:
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,
}
Yanlış anlaşılması kolay ve yanlış yapılırsa testi geçersiz kılan iki ayrıntı. İlk olarak, indeks aritmetiğinin istatistik modellerinin düzleşme şekliyle eşleşmesi gerekir params - Takılı bir model üzerinde şunu doğrulayın: beta[target_idx * n_per_eq + 1] eşittir res.params.iloc[1, target_idx] herhangi bir p değerine güvenmeden önce. İkincisi, kullanın np.linalg.solve, Olumsuz pinv: eğer tekilse kısıtlama dejeneredir ve çalıştırma makul görünen bir sayı döndürmek yerine yüksek sesle başarısız olmalıdır. Buradaki sözde tersi, bozuk Wald testlerinin kod incelemesinden nasıl sağ çıktığını gösterir.
Karşılaştırma için standart farklı Granger
Karşılaştırmanın temel noktası — log getirileri, aynı çiftler, aynı BIC gecikmesi:
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}
Not maxlag=[p] yerine maxlag=p: int'yi geçmek 1'den 1'e kadar her gecikmeyi çalıştırır ve sizi, zaten yürütmekte olduğunuz çoklu teste ek olarak günlüğe kaydedilmemiş çoklu test olan en iyi testi bildirmeye teşvik eder.
Karşılaştırma
Her bir çift için, aynı BIC tarafından seçilen getirilerde fark testini ve seviyelerde Toda-Yamamoto'yu çalıştırın. ve ikisinin aynı fikirde olmadığı yerleri tablo haline getirin. Anlaşmazlık ilginç hücredir: Farklılıklar açısından önemli olan ancak düzeyler açısından anlamlı olmayan bir çift, eşbütünleşme ilişkisini farklılaştırmaya aday bir yapıdır; bunun tersi, seviye ilişkisinin geri dönüş testinin göremediği bilgileri taşıdığını gösterir.
Nedensellik matrisinde çoklu karşılaştırmalar

Tam matris bunun tehlikeli olduğu yerdir. 20 varlıklı, 10 gecikmeli bir tarama, 3.800 hipotez testi anlamına gelir ve Bonferroni, bu şekilde ilişkilendirilen bir aile için yanlış düzeltmedir; testler verileri paylaşır, BTC faktörünü paylaşır ve hiçbir yerde bağımsız değildir; bu nedenle Bonferroni aynı zamanda toplamda aşırı muhafazakardır ve hangi hücrelerin hayatta kalacağı konusunda yanıltıcıdır. Tam olarak bu durum için tasarlanmış deflated Sharpe makalesinden etkin N makinelerini kullanın: ilişkili test ailesini kümeleyin, ham denemeler yerine bağımsız denemeleri sayın ve buna göre eşik alı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
Önemli olan sayı, kaç hücrenin 0,05'in altında olduğu değil, etkili N-düzeltilmiş eşiğinde kaç hücrenin hayatta kaldığıdır.
Hayatta kalan matrisi hücre hücre değil, yapısal olarak okuyun: bir varlığın birçok başkasına neden olduğu satırlar bir bilgi hiyerarşisini doğrular; hiçbir şeyin neden olmadığı bir sütun, bir keşiften ziyade kendine özgü, tokena özgü dinamikleri akla getirir.
Dürüst test: yuvarlanma stabilitesi

Tek bir örnek içi p değeri, ticaret için neredeyse değersizdir. İlgili soru, anlamlılığın devam edip etmediğidir. Kriptodaki çapraz varlıklar ilişkileri rejime bağlıdır - korelasyon yapısı sakin ve panik arasında keskin bir şekilde farklılık gösterir ve rejimin kendisi tahmin edilebilir (HMM rejimi tespiti) - yani bir pencere üzerinden tahmin edilen bir gecikme, o pencere hakkında bir ifadedir.
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")
Bu seriden iki şeyi bildirin: 0,05'in altındaki pencerelerin oranı ve eşik geçişlerinin sayısı. Üç geçişli pencerelerin %80'inde anlamlı olan bir ilişki, birleştirilmiş p değeri aynı olsa bile, kırk geçişli pencerelerin %55'inde anlamlı olan bir ilişkiden farklı bir nesnedir. İkincisi takas edilemez; varlığı birkaç yüz barda bir değişen bir sinyale göre bir pozisyonu ölçemezsiniz ve yeniden tahmin gecikmesi, her zaman önceki rejimde işlem yaptığınızı garanti eder.
Granger'a özel veri tuzağı

Genel kripto veri hijyeni başka yerlerde ele alınmaktadır: backtest-live parity'deki boşluklar ve eksik mumlar, ileriye dönük önyargı sınıflandırmasında zaman damgası disiplini ve ileriye bakmanın olmadığını kanıtlama zaman dilimleri. Ancak bir başarısızlık modu Granger'a özgüdür ve adlandırılabilecek kadar ciddidir:
İleriye doğru doldurma sonucu üretir. İleriye doğru doldurulan bir mum önceki kapanışı tekrarlar, bu da seriye saf otokorelasyonu ve seriye gecikme-1 otokorelasyonunu enjekte eder. mekanik olarak hizalanmış olan F testine göre tek gecikmeli nedensel ilişkiden ayırt edilemez. Aynı durum mekanlar arasında da geçerlidir: dakika çubuklarındaki iki değişim arasındaki 1 saniyelik saat farkı, gecikme-1 önemini doğrudan oluşturabilir veya yok edebilir, çünkü bu, bir hamlenin çubuk sınırının hangi tarafına ineceğini değiştirir. Bunlardan herhangi birini çalıştırmadan önce boşlukların doldurulmak yerine azaltıldığını ve her iki serinin de aynı saatten damgalandığını doğrulayın.
Literatürde bildirilen ilerleme-gecikme bulguları

Bunlar alıntılardır, bu makalenin ölçümleri değil. Yayınlanan kaydın iddialarını söylemek için buradalar, böylece yukarıdaki karşılaştırmanın kabul edileceği veya edilmeyeceği bir şey var.
- BTC'den altcoinlere. Asya-Pasifik Finansal Piyasalarında 2026 yılında yapılan bir araştırma (Springer) Bitcoin'den altcoinlere yüksek frekanslı fiyat aktarımı olduğunu bildiriyor; küçük değerli koinler, önemli ölçüde gecikmiş yanıtlar ve daha yavaş tepkilerle ilişkili olarak daha düşük likidite gösteriyor. Bu çalışma alanından yaygın olarak alıntılanan gecikme büyüklükleri (BTC'den ETH'ye kabaca 1-3 dakika, orta ve küçük ölçekli şirketler için daha uzun, piyasa değeri düştükçe giderek tek yönlü hale gelen) belirtilen bulgulardır, burada yeniden türetilmemiştir. Dayandıkları piyasa değeri katmanlaması, çoklu sembol doğrulamasında kullanılan merdivenin aynısıdır.
- CEX, DEX'e öncülük ediyor. Kripto mikro yapısı araştırması (MDPI) fiyat keşfinde merkezi mekanların hakim olduğunu, bilgi akışının CEX'ten DEX'e doğru çalıştığını ve anlamlı bir ters nedensellik olmadığını bildiriyor; milisaniyenin altındaki eşleştirme motorları ile blok süresi uzlaşmasıyla tutarlı.
- Bağımsız bir para olarak ETH. VAR-SVAR çalışması (MDPI) özellikle DeFi ve NFT odaklı aşamalarda Ethereum'un kaynak ve Bitcoin'in yayılma alıcısı olarak hareket ettiği rejimleri bulur.
Çapraz değişim, kısaca
Aynı jeton-iki mekan gecikmesi gerçek bir kurulumdur, ancak bunun ekonomisi - ücret eşikleri, gecikme merdiveni, gecikmenin neden var olduğu - zaten istatistiksel arbitraj ve çift ticaretinde ve kimchi premiumunda üzerinde çalışılmaktadır. Granger'ın eklediği tek şey bir istikrar sorusu: Binance'den Coinbase'e nedensellik sürekli önemli mi, yoksa diğer her şey gibi titreşiyor mu? Mekan çiftinde yuvarlanma testini çalıştırın; Cevap, evet değil, p değeri zaman serisidir.
Hayatta kalan gecikmeyi bir pozisyona dönüştürmek

Bir çift düzeltilmiş eşiği ve yuvarlanma testini aşarsa, sinyalin kendisi önemsizdir: gecikme penceresi üzerinden kümülatif tahmin getirisi, eşiklidir.
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
Bu makalenin parçası olmayan üç şey, çünkü bunlar zaten burada yerleşmiş durumda:
- Buna maliyetler karar verir. Altcoin'lerde dakika ölçeğinde bir gecikme sinyalinin yayılmayı, etkiyi ve ücretleri ortadan kaldırması gerekir - bkz. kayma ve maliyet modelleri ve maker-taker Economics ve maliyetler seçilen bir modele uygulandığında ne olur? kazanan.
- Boyutlandırma bir p-değeri dönüşümü değildir. Pozlamayı Granger p-değeriyle ters ölçeklendirmek yanlıştır: p-değeri bir etki büyüklüğü değil, boşluğa karşı bir kanıttır ve örneklem uzunluğuyla birlikte hareket eder. Tahmini etkinin boyutu ve belirsizliği — bkz. Kelly sizesing.
- Doğrulama ileriye dönüktür. Devamlı olarak yeniden tahmin yapın ve örnek dışında değerlendirin; [ileriye doğru ilerleme optimizasyonu](/en/blog/post/ileriye doğru ilerleme optimizasyonu) protokoldür.
Sınırlamalar

Granger nedenselliği nedensellik değildir. Karıştırıcılar (hafif zaman damgası yanlış hizalaması ile her iki ayağı da hareket ettiren bir makro olay), ortak sürücüler (iki alt'in her ikisi de BTC'yi farklı hızlarda takip etmesi) ve ihmal edilen değişkenlerin (sistemde ETH olmadan BTC'den DOGE'ye test edilmesi) hepsi doğrudan bilgi akışı olmadan önemli istatistikler üretir. Bu makalede olduğu gibi iki değişkenli testlerle kısıtlama, ihmal edilen değişken sorununu iyileştirmek yerine daha da kötüleştirir.
Doğrusallık. Test, koşullu ortalamada yalnızca doğrusal tahmin yapısını görür. Kriptoda volatilite kümelemesi, kaldıraç etkileri ve rejim değişiklikleri bulunur. İkinci an hikayesi için GARCH volatilite tahmini ve DCC-GARCH dinamik korelasyonu'na bakın. Bilmeye değer doğrusal olmayan alternatifler: Diks-Panchenko (2006) çekirdek testi, bilgi-teorik analogu olarak transfer entropisi ve tam ortak dağılım boyunca kopula Granger nedenselliği.
Yapısal kırılmalar. Bir pencerede tahmin edilen herhangi bir ilişki, o pencerenin rejimine bağlıdır; Yukarıdaki yuvarlanma testi minimum tanıdır ve bir düzeltme değil, tanıdır.
Özet

- VAR'ı seviyelere sığdırın, çift başına BIC oranında, artış ve ilkinde Wald testi yalnızca gecikmeler. Kısıtlama matrisini elle oluşturun; kitaplığın
test_causalityToda-Yamamoto olmayan, artan gecikmeyi de kısıtlıyor. - Farklı getiri testini aynı çiftler ve gecikmeler üzerinde temel olarak çalıştırın ve anlaşmazlıkları bildirin. O tablo bulgudur; yıldızlardan oluşan bir matris değildir.
- İlişkili bir test ailesi için matrisi Bonferroni değil, etkili N aracılığıyla düzeltin ve kaç hücrenin hayatta kaldığını bildirin.
- Yuvarlayın. Önemli pencerelerin oranını ve geçiş sayısını rapor edin. Birleştirilmiş p değeri ne kadar küçük olursa olsun, titremelerin önemi takas edilebilir bir gecikme değildir.
- İleriye doğru doldurmak yerine boşlukları bırakın ve herhangi bir gecikme-1 sonucuna inanmadan önce mekanlar arasındaki saat hizalamasını kontrol edin.
Bu prosedürün son derece iyi bir sonucu negatiftir; örnekte anlamlı olan, düzeltmeden sağ çıkan ve hala her birkaç yüz barda bir her iki yönde 0,05 çizgisini geçen bir BTC-alt ilişkisi, ticaret yapılabilirlik hakkında gerçek bir sonuçtur ve tek bir sonuç olarak yayınlanmaya değerdir.
Referanslar
- Granger, C.W.J. (1969). "Nedensel İlişkilerin Ekonometrik Modeller ve Çapraz Spektral Yöntemlerle Araştırılması." Econometrica, 37(3), 424-438.
- Bugün, H.Y. ve Yamamoto, T. (1995). "Muhtemelen entegre süreçlerle vektör otoregresyonlarında istatistiksel çıkarım." Ekonometri Dergisi, 66(1-2), 225-250.
- Diks, C. ve Panchenko, V. (2006). "Parametrik olmayan Granger nedensellik testi için yeni bir istatistik ve pratik yönergeler." Ekonomik Dinamikler ve Kontrol Dergisi, 30(9-10), 1647-1669.
- Sifat, I.M., Mohamad, A. (2019). "Bitcoin ve Ethereum arasındaki Öncülük-Gecikme ilişkisi: Saatlik ve günlük verilerden elde edilen kanıtlar." Uluslararası İşletme ve Finans Araştırması, 50, 306-321.
- "Bitcoin'den Altcoin'lere Fiyat Aktarımı: Yüksek Frekanslı Kanıtlar ve Ticaret Stratejisine Etkileri." Asya-Pasifik Finansal Piyasaları, Springer, 2026.
- "Kripto Para Piyasalarında Yayılma Riskleri: VAR-SVAR Granger Nedenselliğine Bir Bakış." Risk ve Finansal Yönetim Dergisi, MDPI.
- "Kripto Para Fonlama Oranı Piyasalarının İki Katmanlı Yapısı." Matematik, MDPI.
- "Merkezi olmayan ve merkezi borsalar: Hangi dijital belirteçler daha büyük bir bulaşma riski taşıyor?" ScienceDirect, 2023.
Yazarlar
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.