兩套 Pine 引擎不同調:PineForge 與 PyneCore 的交叉驗證
每個 release 都會跑一輪對 TradingView 與 PyneCore 的對齊掃描。這裡是最新數字,以及為什麼「第二個可信引擎」是我們最好的除錯工具。
我們所知的、TradingView 之外的成熟 Pine 引擎只有兩個:我們的,以及 PyneCore。PyneSys 的 PyneComp 把 Pine 編譯成 Python;PyneCore 是執行它的開源 Python 執行時。語言不同、執行時不同,但要尊重的同一份 Pine 原始碼與同一份 API 契約。
我們把 PyneCore 當作 第二來源的參照。每一次 PineForge 發布都會跑對齊掃掠:一邊是 TradingView 的「交易清單」CSV 匯出,一邊是 PyneCore 的執行輸出。三者一致,我們才敢相信結果;二對一時,掉隊的那一側幾乎總有 bug——多數時候是我們。
下面是最近一次公開掃掠的數字長什麼樣。
語料
公開掃掠裡有 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 上落在 同一 tier。兩邊相對 TV CSV 都是 ≥95% 成交匹配的 excellent 的有 47 支;其中 2 支 PineForge 記成 strong——來自 PineForge 程式碼 diff 記帳方式在少數邊界策略上的產物。
tier 不一致的 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)翻譯一下:進場兩邊都對在同一根 K 線上(entry p90 都是 0%)。分歧在 平倉。PyneCore 相對 TradingView 大約多出 4× 的平倉成交——很像同一個 qty_percent 子句在 TV 訂單處理器認定「完成」之前就 再次武裝的那類角落。
這不是給 PyneCore 打分。它是 Pine strategy.exit() 語意裡的尖角;對齊掃掠先把我們揍醒,我們才貼回 TV。找 bug 的遊戲是雙向的——不止一次 PyneCore 與 TV 一致而我們不一致。
另外兩支
06-liquidity-sweep 與 07-scalping-strategy 是同形的小號版本:進場 100% 對齊;平倉 PyneCore 側大約 1–2 個百分點漂移,而 PineForge 低於 0.05%。移動停損式平倉與部分成交語意,是 Pine 參考實作文件最薄的地方;兩台引擎都只能 從可觀察成交行為反推。
呼叫 PyneCore 編譯 API
PyneSys 用 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%」,那只說明 它那麼聲稱。沒有對照就只能信它。
兩台獨立引擎在同一腳本、同一資料上給出相同結果,證據力度完全不同。若不一致,不一致本身就是假設:其一有 bug、Pine 語意在某尖角含糊、或測試資料有二者都沒處理的邊。三種都值得知道。
我們 每個發布都這樣用。你若要把真金白銀押在策略上,也該如此。
本文未涵蓋
- 指標級漂移。 另有報告追蹤 PineForge、PyneCore 與 TradingView 參考值的一致性,位於引擎儲存庫
benchmarks/results/indicator_comparison.md。 - 公開掃掠之外的內部語料約 110 支。 用來壓測 Pine 尖角(UDT 方法、多週期、
request.security、OCA 出場組等);內部仍會跑對齊掃掠。方法論整理後會另發文。
自己試交叉驗證
- 領取 PineForge 免費 codegen API key
- 領取 PyneSys API key
- 挑一支 Pine。同一 OHLCV CSV 跑兩條管線,diff 交易清單。
兩台引擎,一份原始碼,三份輸出可對。 全一致再上強度;不一致也在 出錢之前學到東西。