Eugen Soloviov

Eugen Soloviov

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.

Articles

정직한 부정적 결과: 수만 번의 백테스트, 메이저 다섯 개, 견고한 엣지는 없다

정직한 부정적 결과: 수만 번의 백테스트, 메이저 다섯 개, 견고한 엣지는 없다

서치와 과적합 아크의 정점이며, 부정적 결과로 끝납니다 — 그것이 올바른 결과입니다. ETHUSDT에 대한 단일 심볼 듀얼 타임프레임 서치는 아웃오브샘플 테스트 +16.35%, 손대지 않은 홀드아웃 +2.62%짜리 구성을 찾아냈습니다; ~37,000번의 시행을 반영한 디플레이티드 샤프 비율은 이를 0.00으로 디플레이트했습니다. 아웃오브샘플 중앙값으로 선택하는 메이저 다섯 개(ETH/BTC/SOL/BNB/XRP, 각 ~1.18M개의 1분봉)에 대한 종목 간 패스가 이를 완전히 끝장냅니다: 듀얼 DSR 0.24 / PBO 0.264, 트리플 DSR 0.14 / PBO 0.327 — 둘 다 게이트에서 탈락합니다. 챔피언은 5개 심볼 중 1개에서만 수익을 내고 나머지에서는 손실입니다. 이것이 반과적합 장치의 존재 이유입니다: 노이즈의 최선을 알파로 배포하는 것을 막기 위해서입니다.

멀티 타임프레임 백테스트에서 선행 참조(look-ahead) 없음을 증명하기: 미래를 흔들어 과거가 그것을 볼 수 없음을 증명한다

멀티 타임프레임 백테스트에서 선행 참조(look-ahead) 없음을 증명하기: 미래를 흔들어 과거가 그것을 볼 수 없음을 증명한다

멀티 타임프레임 백테스트는 아직 최종 종가가 존재하지 않는, 형성 중인 상위 타임프레임 봉을 통해 미래를 누출한다. 코드 리뷰만으로는 확신을 얻을 수 없다 — 직접 테스트해야 한다. 우리는 라이브 봇의 마감 봉(closed-bar) 규칙을 정확히 재현한 뒤, 미래 이동(shifted-future) 프로브로 누출이 없음을 증명한다: 미래의 모든 봉을 교란시키고 과거의 모든 시그널과 트레이드가 비트 단위로 변하지 않음을 확인한다. 25개 항목 중 25개 정합성 검사를 통과했으며, 이 프로브는 실질적인 검증력을 갖추고 있다.

GPU가 값어치를 하는 순간: 파라미터 스윕의 루프라인, 헤드라인 167배는 사실 27배 알고리즘 곱하기 6.2배 하드웨어다

GPU가 값어치를 하는 순간: 파라미터 스윕의 루프라인, 헤드라인 167배는 사실 27배 알고리즘 곱하기 6.2배 하드웨어다

GPU가 CPU에 대해 갖는 우위는 배치 크기와 함께 커집니다 — 우리의 멀티 타임프레임 지표 사전 계산에서 호출당 콤보 하나일 때 54.5배부터 예순한 개일 때 359.6배까지 — 작은 스윕은 커널 실행과 전송 오버헤드를 상각할 수 없기 때문입니다. 헤드라인 167배를 CPU에도 도움이 되는 27배의 알고리즘 승리와 6.2배의 하드웨어 승리로 분해하고, 진짜 GPU 대 최선의 CPU 우위는 단일 타임프레임에서 겨우 3.2배, 멀티에서 6.2배임을 보이며, GPU를 사들일 값어치가 생기려면 스윕이 얼마나 넓어야 하는지에 대한 결정 가이드를 제시합니다.

GPU 정밀도 함정: Apple Metal에서 fp32 백테스트가 조용히 쓰레기 값을 반환하는 방법

GPU 정밀도 함정: Apple Metal에서 fp32 백테스트가 조용히 쓰레기 값을 반환하는 방법

Apple의 Metal GPU에는 float64가 없습니다. 벡터화된 백테스트를 순진하게 이식하면, 유혹적인 접두사 합(prefix-sum) WMA가 fp32에서 오버플로를 일으킵니다 — 최대 상대 오차 211배 — 그런데도 코드는 멈추지 않고 그럴듯한 숫자를 계속 반환합니다. 해법은 더 높은 정밀도가 아니라 다른 방식의 합산입니다: 직접 윈도우 컨볼루션은 fp32에서 8×10⁻⁷까지 안전하며 단일 스레드 numba보다 55.9배 빠릅니다. 이 함정의 정체, 그 산술적 원인, 그리고 여러분이 거기 빠지지 않았음을 증명하는 방법을 다룹니다.

충실도 게이트(Fidelity Gate): 저비용 프록시가 고비용 평가와 같은 순위를 매기지 않는 한, 성긴 것에서 정밀한 것으로(Coarse-to-Fine) 진행하는 백테스팅은 당신을 더 빨리 속인다

충실도 게이트(Fidelity Gate): 저비용 프록시가 고비용 평가와 같은 순위를 매기지 않는 한, 성긴 것에서 정밀한 것으로(Coarse-to-Fine) 진행하는 백테스팅은 당신을 더 빨리 속인다

드릴다운/다중 충실도 탐색(ASHA, successive halving, Hyperband)은 수천 개의 설정(config)을 저렴하게 걸러내고, 살아남은 것만 비용이 큰 전체 평가로 승격시킨다. 이는 실질적인 속도 향상이지만, 저충실도 순위가 고충실도 순위와 어긋나면 조용히 무너진다. 우리는 폴드 간 순위 상관관계를 측정했다. 폴드가 1개일 때 스피어만(Spearman) ρ는 0.03까지 낮아질 수 있으며(거의 무작위로 순위를 매기는 수준), 폴드가 누적됨에 따라 0.43, 0.67, 0.78, 0.91로 상승한다. 해결책은 하나의 필수 게이트다. 먼저 ρ(저렴한 것, 전체)를 측정하고, ρ ≥ 0.5가 되는 첫 번째 단계로 최소 충실도를 자동으로 높이는 것이다.

무작위 탐색 vs 스마트 탐색: 교차점은 알고리즘이 아니라 평가 비용에 있다

무작위 탐색 vs 스마트 탐색: 교차점은 알고리즘이 아니라 평가 비용에 있다

백테스트 한 번이 저렴할 때는 단순히 뒤섞은 Sobol 시퀀스가 원시 처리량에서 모든 "스마트" 샘플러를 압도한다 — TPE, CMA-ES, ASHA는 파이썬 ask/tell 세금을 물어 속도가 20배 떨어지고, 동일한 실제 소요 시간에 훨씬 적은 지점을 평가하여 패배한다. 각 평가를 비싸게 만들면(다중 타임프레임 + walk-forward 폴드) 이 교차점은 뒤집힌다. 우리는 두 체제를 모두 측정했고, 폴드 순위 충실도(ρ@1이 0.03→0.43으로 상승)가 왜 가지치기가 효과를 보기 위한 전제 조건인지 살펴본다.

이축 파라미터 공간: 왜 스윕의 대부분은 거의 공짜여야 하는가

이축 파라미터 공간: 왜 스윕의 대부분은 거의 공짜여야 하는가

모든 파라미터가 탐색 비용이 같은 것은 아니다. 전략의 파라미터는 비싼 축(지표 — 전체 시계열에 대해 재계산)과 싼 축(의사결정 임계값 — 미리 계산된 시그널에 대한 O(n) 패스)으로 나뉜다. 지표는 임계값에 대해 불변이므로 한 번만 계산한 뒤 초당 약 5,600개 설정 속도로 수천 개의 임계값 조합을 스윕할 수 있다 — 설정마다 재계산하는 것보다 약 1,600배 저렴하다. 차원의 저주를 다시 가격 매기다.

프레임워크 세금: 백테스트 라이브러리가 순진한 pandas 루프보다 느릴 때

프레임워크 세금: 백테스트 라이브러리가 순진한 pandas 루프보다 느릴 때

8개의 백테스트 엔진을 완전히 동일한 파라미터 스위프로 벤치마크했다 — 150k 바, 80개의 HMA 크로스 조합, 거래 수 패리티를 2707로 고정. 가장 인기 있는 이벤트 기반 프레임워크 중 두 개가 손으로 짠 pandas 루프보다 느린 결과를 냈고, 벡터화/컴파일 엔진은 같은 작업을 약 13,000배 빠르게 실행했다. 인기 라이브러리가 애초에 분할 상각하도록 만들어지지 않은, 바당 오버헤드에 대한 연구.

백테스트 과적합 확률: 당신의 서치는 동전 던지기를 이겼는가?

백테스트 과적합 확률: 당신의 서치는 동전 던지기를 이겼는가?

디플레이티드 샤프 비율은 승리한 전략의 값을 매기고, PBO는 그것을 골라낸 서치의 값을 매깁니다. 조합적 대칭 교차검증은 1000x200 성과 행렬에 대해 C(16,8) = 12,870번의 훈련/테스트 분할을 실행하고 묻습니다: 인샘플 승자가 아웃오브샘플에서 하위 절반에 떨어지는가? 거의 모두가 놓치는 함정 — PBO의 null은 1이 아니라 0.5입니다. 제로 엣지 전략 200개에서 최고 인샘플 연율화 샤프 1.98은 아웃오브샘플에서 0.06으로 무너지고 PBO = 0.476: 동전 던지기, 완전한 과적합입니다. 진짜 엣지(연율화 샤프 2.38)를 심으면 PBO는 0.001로 떨어지고, 인샘플 3.73은 아웃오브샘플 2.34로 살아남습니다. 순수한 랜덤 워크 위의 이동평균 그리드 역시 아웃오브샘플 스킬이 전혀 없습니다 — 60개 행렬에 걸쳐 평균낸 PBO 0.463은 통계적으로 null과 구별되지 않습니다 — 그리고 하나의 대표 행렬에서는 그 신기루가 생생합니다: 최고 인샘플 샤프 2.33이 아웃오브샘플 중앙값 -0.22로 무너지고, PBO 0.573, 손실 확률 63%.

IPC 세금: 백테스트 엔진을 소켓 뒤에 두면 13%를 잃는다 — 하지만 그중 거의 전부는 소켓 탓이 아니다

IPC 세금: 백테스트 엔진을 소켓 뒤에 두면 13%를 잃는다 — 하지만 그중 거의 전부는 소켓 탓이 아니다

numba 백테스트 커널을 한 줄 한 줄 Rust로 이식하고, 프로세스 경계 너머로 네 가지 방식으로 호출했습니다. 동치성 게이트가 마지막 트레이드까지 동일한 PnL을 확인해 줍니다. 1.2 MB 가격 시리즈 전체를 Unix 소켓으로 보내는 데 드는 비용은 ~2 ms — 작업 전체의 약 0.1%입니다. 동일한 페이로드를 JSON으로 인코딩하면 raw bytes보다 1348배 더 비싸고, 콤보당 수다형(chatty) 호출은 데이터를 80번 다시 실어 보내며, 바(bar) 단위 호출 패턴은 2.0초짜리 작업에서 순수 IPC에만 2.1초를 지불하게 됩니다. 경계는 저렴합니다. 세금은 그것을 건너는 방식에 있습니다.

디플레이티드 샤프 비율: 백테스트 '승자' 중 다중 검정에서 살아남는 것은 몇 개인가?

디플레이티드 샤프 비율: 백테스트 '승자' 중 다중 검정에서 살아남는 것은 몇 개인가?

파라미터 서치는 운을 제조하는 기계입니다. 순수한 노이즈에서 — 진짜 엣지가 전혀 없는 전략 1,000개 — 최고 연간 샤프는 평균 1.63이고, 나이브 유의성 검정은 100%의 확률로 발견을 선언합니다. 통제된 실측값을 구축하여 디플레이티드 샤프 비율, Harvey-Liu 헤어컷, White의 Reality Check가 정직함을 회복시킨다는 것을 보입니다: 거짓 발견은 1.000에서 0.001-0.057로 떨어지고, 노이즈 천장 위의 진짜 엣지는 검정력 ~1로 유지됩니다 — 그리고 상관된 그리드라는 하나의 진짜 함정에서는 raw DSR이 과잉 디플레이션을 일으키며, 판정은 하나가 아니라 유효 시행 수 추정치 전체 밴드에 걸쳐 읽어야 합니다.

목적함수 설계: 최적화하는 지표가 전략을 은밀하게 고른다

목적함수 설계: 최적화하는 지표가 전략을 은밀하게 고른다

"최선"의 전략을 찾으려면 먼저 "최선"이 무엇인지부터 정의해야 합니다 — 그리고 그 스칼라가 은밀하게 승자를 결정합니다. 알려진 엣지를 가진 합성 데이터(600개 시드, T=2000, 80개 임계값)에서, 나이브한 거래당 샤프는 복권을 승자로 옹립합니다: 56%의 시드에서 노출도 5% 미만인 승자를 고르고 57%에서는 퇴화합니다 — 가장 극단적인 시드에서는 8건의 거래가 인샘플 샤프 21.09를 기록했다가 아웃오브샘플에서 0.13으로 무너집니다. 정직한 수리법은 거의 시시할 정도입니다: 전체 타임라인에서 측정하면 결코 퇴화하지 않습니다(아웃오브샘플 1.71). 거래 수(conf_k) 축소와 노출 하한선으로 거래당 지표를 사후 보강할 수 있지만, 완전히 수리해도 전체 타임라인 샤프와 같아질 뿐입니다(1.70 대 1.71) — 결코 그것을 넘어서지 못합니다. 굿하트의 법칙, 백테스트 안에서, 통제된 실측값과 함께.