pineforge
開始使用
工程

兩套 Pine 引擎不同調:PineForge 與 PyneCore 的交叉驗證

每個 release 都會跑一輪對 TradingView 與 PyneCore 的對齊掃描。這裡是最新數字,以及為什麼「第二個可信引擎」是我們最好的除錯工具。

約 9 分鐘閱讀#pinecore#pineforge#parity#engineering

我們所知的、TradingView 之外的成熟 Pine 引擎只有兩個:我們的,以及 PyneCore。PyneSys 的 PyneComp 把 Pine 編譯成 Python;PyneCore 是執行它的開源 Python 執行時。語言不同、執行時不同,但要尊重的同一份 Pine 原始碼與同一份 API 契約。

我們把 PyneCore 當作 第二來源的參照。每一次 PineForge 發布都會跑對齊掃掠:一邊是 TradingView 的「交易清單」CSV 匯出,一邊是 PyneCore 的執行輸出。三者一致,我們才敢相信結果;二對一時,掉隊的那一側幾乎總有 bug——多數時候是我們。

下面是最近一次公開掃掠的數字長什麼樣。

語料

公開掃掠裡有 50 支參照策略(更廣的 162 支語料本體不公開;這個子集出現在交易比對報告裡)。對每一支:

頭條數字

50 支裡,47 支在 PineForge 與 PyneCore 上落在 同一 tier。兩邊相對 TV CSV 都是 ≥95% 成交匹配的 excellent 的有 47 支;其中 2 支 PineForge 記成 strong——來自 PineForge 程式碼 diff 記帳方式在少數邊界策略上的產物。

tier 不一致的 3 支都有意思:全都是 PineForge 更高

StrategyPineForgePyneCore備註
49-partial-exit-qty-percent🟢 excellent🟠 weakPyneCore 過度發射平倉成交
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)

翻譯一下:進場兩邊都對在同一根 K 線上(entry p90 都是 0%)。分歧在 平倉。PyneCore 相對 TradingView 大約多出 的平倉成交——很像同一個 qty_percent 子句在 TV 訂單處理器認定「完成」之前就 再次武裝的那類角落。

這不是給 PyneCore 打分。它是 Pine strategy.exit() 語意裡的尖角;對齊掃掠先把我們揍醒,我們才貼回 TV。找 bug 的遊戲是雙向的——不止一次 PyneCore 與 TV 一致而我們不一致。

另外兩支

06-liquidity-sweep07-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__)

丟進 .pypip install pynecore,指向你的 OHLCV,就得到第二引擎輸出與 PineForge diff。

為什麼重要

只有一台回測引擎報「測試視窗內報酬 12.4%」,那只說明 它那麼聲稱。沒有對照就只能信它。

兩台獨立引擎在同一腳本、同一資料上給出相同結果,證據力度完全不同。若不一致,不一致本身就是假設:其一有 bug、Pine 語意在某尖角含糊、或測試資料有二者都沒處理的邊。三種都值得知道。

我們 每個發布都這樣用。你若要把真金白銀押在策略上,也該如此。

本文未涵蓋

自己試交叉驗證

兩台引擎,一份原始碼,三份輸出可對。 全一致再上強度;不一致也在 出錢之前學到東西。