vectorbt 리뷰 — 백테스트 속도는 진짜, Commons Clause가 상업화를 막는다
이동평균 크로스오버 파라미터 1만 조합을 스윕으로 던졌더니, 커피를 내리러 갔다 오기 전에 결과 행렬이 떠 있었습니다. vectorbt 의 벡터화 백테스트가 실제로 만들어 내는 장면이 이렇습니다. 그런데 같은 주에 이 라이브러리를 사내 유료 리서치 서비스에 얹으려던 계획은 접었어요. 개인 연구나 팀 내부 퀀트 스크리닝 용도라면 지금도 1순위로 권합니다. 반대로 백테스트 엔진 자체가 과금 근거가 되는 유료 제품이라면 넣지 마세요. 라이선스가 정확히 그 지점을 겨냥해 막고 있거든요.
무엇을 기준으로 평가했나요?
세 가지만 봤습니다. 파라미터 스윕 처리량, 결과를 읽는 데 드는 인지 비용, 마지막으로 라이선스 적합성이죠. 제 환경은 램 16GB 리눅스 노트북이고 용도는 일봉 기준 규칙형 전략의 사전 스크리닝입니다. 실제 주문 집행은 별도 시스템이 담당해요. 그래서 체결 정밀도보다 "가망 없는 아이디어를 얼마나 빨리 버리나"를 더 무겁게 뒀습니다. 라이선스를 부록이 아니라 1차 관문에 둔 이유는 뒤에서 풀게요.
파라미터 1만 조합을 한 번에 던져봤습니다
같은 이동평균 크로스오버 실험을 두 방식으로 돌려 비교했습니다. 루프형 백테스터는 조합 하나마다 바를 순서대로 훑죠. vectorbt 는 접근이 다릅니다. 조합을 NumPy 배열 축으로 쌓아 놓고 뜨거운 경로를 Numba 로 컴파일해 한꺼번에 계산해요. 제 실측으로는 첫 호출에서 JIT 컴파일 대기가 몇 초 붙고, 그 뒤 같은 형태의 스윕은 체감상 즉시 끝났습니다. 컴파일 대기가 거슬리면 설치 옵션에 rust extra 를 붙여 사전 컴파일된 Rust 엔진을 쓸 수 있습니다(출처: vectorbt 공식 GitHub 문서, 제가 확인한 시점 기준).
기대와 달랐던 지점도 분명했습니다. 첫째는 메모리였어요. 배열 크기가 조합 수 × 심볼 수 × 바 개수로 곱해지니, 일봉에서 멀쩡하던 스윕이 분봉으로 바꾸자 커널을 통째로 날려 먹었습니다. 조합을 청크로 쪼개는 작업이 결국 필수더라고요.
둘째는 사고방식 전환 비용입니다. 루프 백테스터에서 조건문 한 줄로 끝나던 트레일링 스톱 같은 경로 의존 로직을 벡터화 문법으로 다시 짜야 했어요. 이 재작성에 든 시간이 스윕에서 아낀 시간을 상당 부분 되가져갔습니다.
셋째는 예제 수치의 함정입니다. 공식 저장소에는 비트코인 보유 시 총손익을 출력하는 짧은 예제가 있어요. 숫자가 커서 눈에 띄지만, 수수료와 슬리피지 인자를 지정하지 않으면 이상적인 체결을 가정한 값입니다. 백테스트 결과를 성과처럼 인용하려면 기간·왕복 수수료·슬리피지를 함께 적어야 의미가 생기죠.
무료로 공개된 라이브러리인데 왜 상업화가 막히나요?
저장소 배지에 붙은 라이선스 이름부터 MIT 도 Apache 도 아닙니다. Fair Code 라고 적혀 있어요. 실체는 Apache 2.0 본문에 Commons Clause 를 덧붙인 조합이고, 이 부칙이 "해당 소프트웨어가 주된 가치를 이루는 제품이나 서비스의 판매"를 금지합니다. 판매의 범위에 지원·컨설팅·호스팅까지 포함됩니다(출처: VectorBT 공식 라이선스 페이지). 저는 변호사가 아니라 문서를 읽은 실무자 관점입니다.
경계선이 어디쯤인지가 관건입니다. 자기 자금을 굴리는 팀이 내부에서 백테스트를 돌리는 건 판매가 아니라 조항의 정면 대상이 아니에요. 반면 남의 돈을 받고 "백테스트 대시보드"를 제공하는 SaaS 는 정확히 걸립니다. 유료 강의나 리서치 리포트처럼 vectorbt 가 부수적 도구인 경우는 회색지대로 남고요. 여기서 놓치기 쉬운 사실 하나 — 이 라이선스는 OSI 기준 오픈소스 정의를 만족하지 않습니다. 스타가 많고 pip 로 즉시 깔린다고 해서 사용 자유가 보장되지는 않아요. 저장소 자체도 커뮤니티 에디션임을 밝히고 상업 경로는 유료 PRO 로 안내합니다.
도입 전에 점검할 네 가지
첫째, 내 사업 모델에서 백테스트 엔진이 청구서의 근거 항목인지 따져 보세요. 청구 근거면 빨간불입니다. 둘째, 배포 범위를 적어 보세요. 사내 사용과 용역 납품물은 성격이 완전히 다릅니다. 셋째, 의존성 전이를 확인하세요. 내 퀀트 패키지가 vectorbt 를 필수 의존으로 걸면 제약이 하위 사용자에게 따라갑니다. 넷째, 퍼미시브 대안을 프로토타입 단계에서 같이 굴려 두세요. 신호 생성 로직을 순수 pandas 로 분리해 두면 엔진 교체가 하루 작업으로 끝납니다.
제가 용도를 둘로 나눈 순간
납품 견적서를 쓰다가 "백테스트 대시보드 제공" 항목에서 손이 멈췄습니다. 그 대시보드의 계산 엔진이 vectorbt 였거든요. 라이선스 문서를 끝까지 읽은 게 그날 밤이었고, 다음 날 구조를 갈랐습니다. 아이디어 스크리닝과 파라미터 스윕은 계속 vectorbt 로, 고객에게 넘어가는 산출물의 계산부는 직접 짠 얇은 루프 엔진으로요. 느립니다. 대신 견적서에 이 항목을 적을 때 마음이 편해요. 성능을 포기하고 산 것은 속도가 아니라 계약서를 쓸 자유였습니다.
자주 묻는 질문
Q. Rust 엔진을 반드시 설치해야 하나요? A. 기본 설치는 Numba 경로로 동작하고 rust 는 선택 extra 입니다. 같은 형태의 스윕을 하루에 수십 번 반복해 JIT 대기가 누적될 때 값어치가 생겨요.
Q. 분봉 데이터로 1만 조합을 돌리려면 어떻게 하나요? A. 조합 축을 500~1000개 단위 청크로 쪼개고 심볼은 바깥 루프로 돌리세요. 배열이 조합 × 심볼 × 바 수의 곱이라 시간 해상도를 올리면 메모리가 급증합니다.
Q. 백테스트 결과 그래프를 블로그에 올려도 되나요? A. 산출물 공개 자체는 판매 행위가 아니라 조항의 대상이 아닙니다. 다만 축에 기간과 체결 가정을 적지 않으면 독자가 실현 가능한 수익으로 오해하죠.
Q. PRO 로 가면 제약이 풀리나요? A. 유료 PRO 가 상업 경로로 안내되지만 조건은 별도 계약입니다. 문의 전에 우리 제품에서 백테스트 엔진이 차지하는 비중을 문서로 정리해 두면 협의가 빨라져요.