왜 만들었는가 PineForge.
가지 않은 세 갈래. 2년 동안 붙잡은 strong 티어 두 건. 한 가지 명제 — PineScript에는 제대로 된 런타임이 필요합니다.
왜 오프라인 재현성인가
대부분의 Pine 전략은 TradingView에 살아 있습니다. 차트 옆에서 즉시 돌려보고, 커뮤니티가 크고, 공유도 쉽기 때문이죠. 하지만 오프라인 런타임은 없습니다. 엔진 버전을 고정할 수 없고, CI에서 백테스트를 돌릴 수 없으며, 다른 머신에서 트레이드 목록을 비트 단위로 재현하기도 어렵습니다.
차트 아이디어만 훑을 땐 문제없습니다. 실제 돈을 걸 전략을 만들 땐 전부 중요합니다. "브라우저에서 숫자를 봤다"와 "감사 추적이 있다" 사이의 간격을 좁히려 했습니다 — Pine 언어를 버리지 않고.
왜 PyneCore에 기여하지 않았나
PyneCore는 가장 야심 찬 오픈 소스 PineScript 엔진입니다. 우리도 제2의 레퍼런스 오라클로 씁니다. 만든 걸 전부 업스트림할지도 고민했습니다. 안 한 이유는 두 가지입니다.
- 런타임 모델. PyneCore는 Pine을 Python으로 해석합니다. PineForge는 Pine을 C++로 트랜스파일해 `.so`로 컴파일합니다. 속도·패리티 트레이드오프·배포 스토리가 다릅니다. 누가 맞다가 아니라 — 둘을 그냥 이어붙이려면 둘 다 다시 짜야 합니다.
- 배포. 컴파일된 `.so`는 소스를 노출하지 않고 구매자에게 전략을 실을 수 있게 합니다. 그게 마켓플레이스 테제(2027 설계)입니다. PyneCore 로드맵에 없고 있어서도 안 됩니다 — 다른 제품이니까요.
PyneCore는 세컨드 소스로 둡니다. PineForge 릴리스마다 PyneCore와 TradingView 양쪽에 패리티 스윕을 돌립니다. excellent 비율이 높아서 두 엔진이 어긋나면 거의 항상 한쪽 버그이고 — 보통은 우리 쪽입니다.
왜 Backtrader를 확장하지 않았나
Backtrader는 Python 알고 트레이딩의 일꾼입니다. 단단하고 사랑받지만 이 일의 형태와는 안 맞습니다. 커스텀 전략 클래스를 지원하는 Python 네이티브 백테스터죠. Pine은 다른 언어이고 다른 의미를 가집니다 — Python을 더 써서 `request.security()` 룩어헤드, 인트라바 주문 처리, `oca_name` 청산 그룹을 흉내 낼 수 없습니다.
그리고 Backtrader 전략은 Python 소스로 배포됩니다. 컴파일 바이너리 마켓플레이스에는 배포 가능한 아티팩트를 만드는 트랜스파일 단계가 필요합니다. Backtrader 표면에는 그게 없습니다.
245/246을 쫓은 이야기
9개 전략·엄격 패리티 76%에서 시작했습니다. 2년 뒤 246개 전략, 245개 strict. 76%에서 99.6%로 가는 길은 codegen을 더 써서가 아니라, 소수점 넷째 자리까지의 분기를 몇 주씩 한 건씩 추적한 결과였습니다.
그 시간 대부분은 TradingView만의 "청산", "체결", "트레일" 정의를 맞추는 데 썼습니다. Pine 문서는 API를 설명하지만 주문 처리의 정확한 의미는 트레이드 목록을 바별로 디프해야 보입니다. 그렇게 했고, 왜 다른지 계속 물었으며 차이를 하나씩 다듬었습니다.
남은 1건은 심층 분석된 TV-side anomaly입니다 — 특정 4월 5일~14일 구간의 chart-state 비결정성(Supertrend의 <code>var direction</code>). 기존 3건 중 2건(broker margin-boundary 오버슛, session 경계에서 <code>time()</code>이 na 반환)은 클린룸 재작성으로 해결했습니다. TradingView까지 추적되고 TV 자체 상태에서도 재현됩니다. 실제 engine bug는 0건.
다음은
2026년 3분기: Optuna 통합 출시. 한 줄 목적 함수면 무엇이든 — Sharpe, 낙폭, profit factor, 직접 짠 Python 람다 — 로 전략 최적화. 워크포워드 분석 내장, OOS(표본 외)가 기본입니다.
2026년 4분기: 호스팅 Studio 론치. 프로젝트 워크스페이스·백테스트·최적화·비교·페이퍼 트레이드 — 전부 브라우저에서, 오늘 CLI로 로컬에서 도는 것과 같은 `.so` 위에서. Wave-1은 얼리 액세스 대기자 명단 우선.
2027: 마켓플레이스 오픈. 판매자가 시간·머신·브로커·심볼·입력 범위를 정한 라이선스로 컴파일 `.so`를 게시합니다. 구매자는 내 데이터에서 돌리고 소스는 못 봅니다. MQL5에서 통했던 배달 모델 — 전략은 Pine으로, 런타임은 감사 가능하고 라이선스는 철회 가능하게.
손으로는 못 쓰는 1%
읽어 본 패리티 엔진은 대개 90%에서 지루해진 누군가가 만들다 버립니다. 마지막 10%는 반복적이고 공이 많고 화려하지 않습니다 — 두 트레이드 목록이 0.0001% 왜 다른지 설명하는 일에 진심으로 신나는 사람들이 해야 합니다.
그게 이 팀입니다. 그게 규율입니다. 그래서 이 런타임에 돈을 걸 만합니다.