엔지니어링

두 Pine 엔진이 엇갈릴 때: PineForge와 PyneCore 교차 검증

모든 릴리스는 TradingView와 PyneCore에 대한 패리티 스윕을 거칩니다. 최신 스윕의 숫자와, 왜 우호적인 제2 엔진이 최고의 디버깅 도구인지 설명합니다.

약 9분 읽기#pinecore#pineforge#parity#engineering

우리가 아는 한 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가 더 위입니다.

StrategyPineForgePyneCore비고
49-partial-exit-qty-percent🟢 excellent🟠 weakPyneCore가 출구 fill 과다
06-liquidity-sweep🟢 excellent🟡 moderatePyne 쪽 출구 타이밍 드리프트
07-scalping-strategy🟢 excellent🟡 moderatePyne에서 PnL p90 높음; 진입은 일치

가장 흥미로운 한 건

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 모서리용입니다. 내부 패리티 스윕에는 포함됩니다. 방법론을 공개할 때 별 글 예정입니다.

패턴을 직접

두 엔진, 하나의 소스, 비교할 출력은 세 개. 전부 맞으면 출하기 쉽습니다. 안 맞으면 돈을 걸기 전에 배운 게 생깁니다.