两个 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 交易列表。
两台引擎,一份源码,三份输出可对。 全一致再上强度;不一致也在 出钱之前学到东西。