工程

两个 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 支语料本体不公开;这个子集出现在交易对比报告里)。对每一支:

  • 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 更高

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 语义在某尖角含糊、或测试数据有二者都没处理的边。三种都值得知道。

我们 每个发布都这样用。你若要把真金白银押在策略上,也该如此。

本文未覆盖

  • 指标级漂移。 另有报告跟踪 PineForge、PyneCore 与 TradingView 参考值的一致性,位于引擎仓库 benchmarks/results/indicator_comparison.md
  • 公开扫掠之外的内部语料约 110 支。 用来压测 Pine 尖角(UDT 方法、多周期、request.security、OCA 出场组等);内部仍会跑对齐扫掠。方法论整理后会另发文。

自己试交叉验证

两台引擎,一份源码,三份输出可对。 全一致再上强度;不一致也在 出钱之前学到东西。