두 Pine 엔진이 엇갈릴 때: PineForge와 PyneCore 교차 검증
모든 릴리스는 TradingView와 PyneCore에 대한 패리티 스윕을 거칩니다. 최신 스윕의 숫자와, 왜 우호적인 제2 엔진이 최고의 디버깅 도구인지 설명합니다.
우리가 아는 한 TradingView 밖에서 ‘프로덕션급’ Pine 엔진은 딱 두 개입니다. 우리 것과 PyneCore입니다. PyneSys의 PyneComp가 Pine을 Python으로 transpile하고, PyneCore가 오픈소스 Python 런타임으로 실행합니다. 언어도 VM도 다르지만, 같은 Pine 원본과 같은 API 계약을 존중해야 합니다.
PyneCore는 제2의 오라클입니다. PineForge 릴리스마다 TradingView의 「거래 목록」CSV 내보내기 와 PyneCore 실행 결과 양쪽에 대해 패리티 스윕을 돌립니다. 셋이 맞으면 믿습니다. 둘이 맞고 하나가 틀리면 이탈한 쪽에 버그인 경우가 많고, 대개는 우리입니다.
이 글은 최근 공개 스윕 숫자가 어떻게 보이는지입니다.
코퍼스
공개 스윕의 참조 전략 50개(더 넓은 162개급 코퍼스 본체는 비공개이며, 이 부분집합이 거래 비교 리포트에 실립니다). 각 전략에 대해:
- PyneComp → Python → PyneCore를 동일 OHLCV에서 실행
- PineForge codegen → C++ →
pineforge-engine을 같은 OHLCV에서 실행 - 둘 다 TradingView CSV와 비교. 창은
[OHLCV 구간] ∩ [TV 진입 구간] ∩ [엔진 진입 구간]으로 클립 - 일치 정도는 5단계(excellent / strong / moderate / weak / minimal)
헤드라인
50개 중 47개는 PineForge와 PyneCore가 같은 티어입니다. 둘 다 TV CSV 대비 ≥95% 매치로 excellent인 것이 47개이며, 그중 2개만 PineForge가 strong — 코드 델타 회계 방식의 아티팩트입니다.
티어가 어긋나는 3개는 모두 PineForge가 더 위입니다.
가장 흥미로운 한 건
49-partial-exit-qty-percent가 가장 큰 갭입니다. strategy.exit(qty_percent=...)로 부분 청산을 반복하는 전략입니다.
TV trades (raw, in-window): 725
PineForge engine trades: 852 → 725 in-window → 725 matched (100% of TV)
PyneCore engine trades: 3297 → 2805 in-window → 582 matched (80.3% of TV)PyneCore 카운트 델타는 **+74%**입니다. PineForge는 **0%**입니다.
PineForge: count_delta 0.0000% · entry p90 0.0000% · exit p90 0.0004% · PnL p90 0.1321%
PyneCore : count_delta 74.1533% · entry p90 0.0000% · exit p90 1.0376% · PnL p90 (high)해석: 진입은 둘 다 같은 바에서 발화합니다(entry p90 둘 다 0%). 불일치는 출구입니다. PyneCore는 같은 전략에 대해 TV보다 대략 4배 많은 출구 fill을 냅니다. 같은 qty_percent 절이 TV 주문 처리기가 끝났다고 보기 전에 재무장되는 쪽의 코너일 가능성이 큽니다.
PyneCore 품질 평가가 아닙니다. Pine strategy.exit() 의미의 모서리이며, 스윕이 우리 구현을 두들긴 뒤 TV에 맞췄습니다. 버그 찾기는 양방향입니다 — PyneCore와 TV가 맞는데 우리만 틀렸던 적도 여러 번입니다.
나머지 두 개
06-liquidity-sweep, 07-scalping-strategy는 같은 형태의 소형 버전입니다. 진입 100% 정렬, 출구는 PyneCore에서 1~2p.p. 드리프트 vs PineForge 0.05% 미만. 트레일형 출구와 부분 체결은 Pine 참조 구현에서 문서가 가장 얇습니다. 모든 엔진이 관측 가능한 체결 행동에서 역추적합니다.
PyneSys 컴파일 API
HTTP로 컴파일 단계를 노출합니다. curl로 바로:
curl -X POST https://api.pynesys.io/compiler/compile \
-H "Authorization: Bearer pyne_..." \
--data-urlencode 'script=//@version=6
strategy("ma cross", overlay=true)
if ta.crossover(close, ta.sma(close, 20))
strategy.entry("L", strategy.long)'응답은 오픈소스 pynecore 런타임 대상 Python입니다:
"""
@pyne
This code was compiled by PyneComp v6.0.31 — the Pine Script to Python compiler.
Run with open-source PyneCore: https://pynecore.org
Compile Pine Scripts online at PyneSys: https://pynesys.io
"""
from pynecore.lib import close, script, strategy, ta
@script.strategy("ma cross", overlay=True)
def main():
if ta.crossover(close, ta.sma(close, 20)):
strategy.entry('L', strategy.long)
if __name__ == "__main__":
from pynecore.standalone import run
run(__file__).py로 저장 → pip install pynecore → OHLCV를 넣어 두 번째 엔진 출력을 얻고 PineForge와 diff합니다.
왜 중요한가
한 대의 백테스트 엔진이 「이 테스트 창에서 12.4%」라고 하면, 그건 그 엔진이 그렇다고 주장한다는 뜻 하나뿐입니다. 비교 대상이 없으면 엔진 말을 그대로 받아들일 수밖에 없습니다.
독립된 두 대가 같은 스크립트·같은 데이터에서 같은 결과를 내면 훨씬 강한 증거입니다. 어긋나면 그 자체가 가설입니다 — 버그, 모호한 Pine 코너, 테스트 데이터의 에지.셋 다 알 만한 가치가 있습니다.
우리는 매 릴리스 이렇게 씁니다. 실제 자금을 올릴 전략을 내보낸다면 당신도 그래야 합니다.
이 글에 없는 것
- 인디케이터 단위 드리프트. 별도 리포트가 PineForge·PyneCore·TradingView 참조값 정합을 추적합니다. 엔진 저장소
benchmarks/results/indicator_comparison.md. - 공개 스윕에 없는 내부 코퍼스 ~110개. UDT 메서드, 다중 타임프레임, OCA 출구 그룹 등 Pine 모서리용입니다. 내부 패리티 스윕에는 포함됩니다. 방법론을 공개할 때 별 글 예정입니다.
패턴을 직접
- 무료 PineForge codegen 키
- PyneSys 키
- Pine 전략 하나. 같은 OHLCV CSV로 두 파이프라인 실행 → 거래 목록 diff.
두 엔진, 하나의 소스, 비교할 출력은 세 개. 전부 맞으면 출하기 쉽습니다. 안 맞으면 돈을 걸기 전에 배운 게 생깁니다.