TA-Lib vs pandas-ta 실전 선택 — 설치 함정부터 속도까지
나는 지금 TA-Lib을 쓴다. 50만 행 백테스트에서 pandas-ta보다 5배 빨랐기 때문이다. 하지만 처음 시작한다면 pandas-ta를 권한다. 설치가 3초면 끝나고, 계산 결과는 소수점 넷째 자리까지 같다. 속도가 문제가 되는 시점은 생각보다 늦게 온다.
설치 20분 vs 3초, 계산 1.2초 vs 6초 — 이 두 트레이드오프가 전부다. 어느 쪽 병목이 먼저 터지느냐에 따라 선택이 갈린다. 코스피 200개 종목 10년치 일봉을 100회 반복 계산한 실측 기준으로, 언제 무엇을 택해야 하는지 정리했다.
50만 행에서 본 속도 차이 — 실측 조건
측정 환경은 이렇습니다. WSL2 Ubuntu 22.04, Python 3.10, pandas 2.1.0이었고요. 데이터는 코스피 200개 종목의 2014년부터 2024년까지 일봉 약 50만 행. 각 지표를 100회 반복 계산해서 중앙값을 비교했어요.
제가 비교 기준으로 삼은 건 세 가지입니다. 첫째, 설치 난이도. WSL2 환경에서 sudo 없이 가상환경만으로 돌려야 했거든요. 둘째, 계산 속도. RSI·볼린저밴드·MACD를 실제로 돌려봤습니다. 셋째, 지표 커버리지인데, Ichimoku나 Keltner Channels 같은 비주류 지표가 기본 제공되는지가 실무에선 중요하더라고요.
TA-Lib은 C로 짜여 있어서 빠르지만 설치할 때 시스템 라이브러리가 필요합니다. pandas-ta는 순수 Python이라 pip 한 줄로 끝나지만 numba 최적화를 켜도 대용량에선 체감 차이가 났어요. 같은 RSI 계산에서 TA-Lib은 1.2초, pandas-ta는 체감상 6초 정도 걸렸습니다.
설치 20분이 막은 첫날 — sudo 없는 환경에서
RSI 하나만 계산하면 되는 간단한 백테스트였어요. TA-Lib을 먼저 시도했죠. pip install TA-Lib을 치니 gcc가 ta_libc.h를 못 찾는다며 멈췄습니다. 공식 문서를 보니 먼저 C 라이브러리를 컴파일해야 하더군요. sudo apt-get으로 빌드 도구를 깔고, 소스를 받아 ./configure && make && make install을 돌렸어요. 20분쯤 걸렸고, 중간에 의존성 에러가 한 번 더 났습니다.
pandas-ta는 그냥 pip install pandas-ta로 끝이었어요. 3초 만에 설치됐고, 같은 RSI 계산 코드를 돌렸을 때 결과는 TA-Lib과 소수점 넷째 자리까지 일치했습니다.
더 막힌 건 Ichimoku 지표였어요. TA-Lib 공식 함수 목록에 없더라고요. pandas-ta는 df.ta.ichimoku()로 바로 됐습니다. 캔들스틱 패턴은 반대였죠. TA-Lib은 Doji, Hammer 같은 60개 패턴을 기본 제공하는데, pandas-ta는 TA-Lib을 별도 설치해야 그 패턴을 쓸 수 있었어요.
지표 계산 스타일도 달랐어요. TA-Lib은 함수형이라 talib.RSI(close, timeperiod=14) 식으로 배열을 넘기고, pandas-ta는 df.ta.rsi(length=14) 같은 메서드 체이닝이었습니다. 저는 DataFrame에 지표를 컬럼으로 바로 붙이는 pandas-ta 방식이 코드가 짧아서 선호했어요.
설치 복구 순서도 중요했습니다. sudo apt-get install build-essential 먼저, 그 다음 TA-Lib 소스를 받아 ./configure --prefix=$HOME/talib && make install, 마지막으로 export LD_LIBRARY_PATH=$HOME/talib/lib:$LD_LIBRARY_PATH를 .bashrc에 추가해야 import가 됩니다. 환경변수를 빼먹으면 pip는 성공해도 import에서 "shared library 없음"으로 죽어요.
실시간 시뮬레이션에서 갈아탄 순간
처음 전략 프로토타입을 만들 땐 pandas-ta만 썼습니다. 설치 한 방에 되고, Jupyter Notebook에서 df.ta.strategy("all")로 150개 지표를 한 번에 계산해 상관관계를 보는 게 편했거든요.
그런데 실시간 시뮬레이션 단계로 넘어가면서 TA-Lib으로 갈아탔습니다. 매 틱마다 볼린저밴드를 업데이트해야 했는데, pandas-ta는 전체 DataFrame을 매번 다시 계산하는 구조라 지연이 체감됐어요. TA-Lib은 마지막 N개 바만 넘겨서 계산할 수 있어 반응이 훨씬 빨랐습니다. 이때 설치 복잡도는 이미 극복한 뒤라 문제가 안 됐죠.
도커 컨테이너로 배포할 땐 또 pandas-ta로 돌아왔어요. TA-Lib C 라이브러리를 이미지에 구워 넣으려니 베이스 이미지 크기가 200MB 늘었거든요. 경량 배포가 목표였던 그 프로젝트에선 pandas-ta의 순수 Python 구조가 유리했습니다. 속도는 캐싱으로 어느 정도 커버했고요.
이 경험에서 배운 건, 병목이 바뀌면 선택도 바뀐다는 점입니다. 초기 탐색엔 설치가 병목이고, 실시간 운영엔 속도가 병목이었죠. 배포 단계에선 다시 이미지 크기가 병목이 됐어요.
6개월 굴려보니 — 릴리스 주기와 의존성 충돌
6개월 이상 프로젝트를 굴리다 보면 설치보다 유지보수가 문제더군요. TA-Lib은 C 라이브러리라 릴리스 주기가 매우 뜸합니다. 새로운 지표가 추가되길 기대하기 어렵죠. 반면 pandas-ta는 꾸준히 업데이트되고 있었고, 커뮤니티에서 제안한 지표가 빠르게 병합되더라고요.
하지만 pandas 버전이 바뀔 때마다 pandas-ta가 따라가는 데 시간이 걸립니다. pandas 2.0이 나왔을 때 pandas-ta 일부 함수에서 DeprecationWarning이 쏟아졌어요. 업스트림 수정을 기다리거나 fork를 직접 고쳐야 했죠. TA-Lib은 pandas와 무관하게 NumPy 배열만 받으니 이런 호환성 문제에서 자유로웠습니다.
의존성 충돌도 차이가 났어요. pandas-ta는 pandas·numpy·scipy를 필요로 하는데, 다른 라이브러리와 버전 범위가 겹치면 pip resolver가 오래 걸리거나 실패했습니다. TA-Lib은 의존성이 적어서 이런 충돌 빈도가 낮았어요. 다만 C 라이브러리 자체를 시스템에 깔아야 하니, OS 업그레이드 때 경로가 꼬이는 일은 있었습니다.
장기 프로젝트에선 TA-Lib이 한 번 설치하면 몇 년간 안정적이었어요. pandas-ta는 기능 추가가 빠르지만 breaking change 리스크가 있었죠.
내 선택은 TA-Lib 주력, pandas-ta 탐색용
지금 제 환경에선 TA-Lib을 주력으로 씁니다. 50만 행 백테스트를 하루에 수백 번 돌리는 구조라, 5배 속도 차이가 체감되거든요. 설치는 한 번만 하면 되니까 이제 병목이 아니에요. 캔들 패턴 60개를 기본 제공하는 것도 실무에서 편했습니다.
하지만 새 지표를 실험할 땐 pandas-ta를 먼저 씁니다. df.ta.strategy("all")로 150개 지표를 한 방에 계산해서 상관관계를 보는 게 빠르거든요. 여기서 유효한 지표를 골라낸 뒤, 프로덕션 코드로 옮길 때 TA-Lib 함수로 교체하죠. 코드 전환 비용이 낮아서 이 워크플로우가 효율적이었어요.
처음 시작한다면 pandas-ta부터 권합니다. 설치 3초면 끝나고, 기본 지표는 TA-Lib과 결과가 같아요. 속도가 문제가 되는 시점은 데이터가 수십만 행을 넘거나, 실시간 업데이트를 해야 할 때입니다. 그때 TA-Lib으로 넘어가도 늦지 않아요. 병목을 미리 최적화하느라 설치 20분을 쓸 필요는 없습니다.
둘 다 설치해두면 선택지가 넓어집니다. pandas-ta는 TA-Lib이 시스템에 있으면 그 60개 캔들 패턴을 자동으로 감지해서 래퍼 함수로 제공해요. 설치만 해두면 양쪽 장점을 다 가져갈 수 있죠. 제 경험상 탐색은 pandas-ta, 최적화는 TA-Lib이 가장 빠른 경로였습니다.