我们如何在 TradingView 之外,把 PyneCore 当作第二来源引擎;2026 年 5 月那次扫描显示了什么;以及为什么一个友好的第二引擎,是我们手里最有用的调试工具。
本文中的数据测于 2026年5月5日,现保留原样。最新结果请参阅我们如何衡量一致性。
2026 年 5 月,我们所知道的、能在 TradingView 平台之外回测 Pine 策略的引擎有两个:我们自己的,以及 PyneCore。PyneSys 的 PyneComp 把 Pine 转译成 Python;PyneCore 则是执行转译结果的开源 Python 运行时。语言不同,运行时不同,但面对的是同样的源材料,要遵循的也是同样的 API 定义。
我们把 PyneCore 当作第二来源的参照(oracle)。2026 年 5 月,我们的一致性扫描同时对照了 TradingView 的「交易列表」导出和 PyneCore 的执行输出。三者对某个策略的交易结果一致时,我们就相信这个结果;两方一致、一方不同时,我们首先排查不同的那一方。
本文展示那次扫描的数字。当前的对比结果——引擎仓库 2026-09-29 的横评(在引擎 35db01c8 上测得,v1.0.0 已包含该提交)——见引擎对比页面。
语料库
公开扫描包含 50 个参照策略(更大的、包含 162 个策略的语料库当时并未公开;这个子集就是我们在交易对比报告中公布的部分,即引擎提交 7e526c1a 里的 benchmarks/results/trade_comparison.md)。每个策略都经过以下处理:
- 由 PyneComp 编译为 Python,再由 PyneCore 在标准 OHLCV 上执行
- 由 PineForge codegen 编译为 C++,再由
pineforge-engine在同一份 OHLCV 上运行 - 两者都与 TradingView 的 CSV 导出做 diff,时间窗口裁剪为
[OHLCV span] ∩ [TV entry span] ∩ [engine entry span] - 按 5 档评级确定匹配程度(excellent / strong / moderate / weak / minimal,即优秀 / 良好 / 中等 / 偏弱 / 最弱)
核心数字
扫描中的 50 个策略里,有 47 个在 PineForge 和 PyneCore 上落在同一等级:两个引擎都在 45 个策略上达到 excellent,在 2 个策略上达到 strong。这 2 个策略是 13-parabolic-asr 和 17-bos-curv:两个引擎给出的交易完全相同,交易笔数也都与 TV 相差 1.8%~2.8%。按当时的评级标准,excellent 意味着:交易笔数差异低于 1%,入场价和出场价的 p90 偏差均低于 0.01%,P&L p90 低于 1%(trail_* 类出场的出场和 P&L 阈值更宽松),并且 TV 在窗口内的交易至少有 95% 得到匹配。
等级不一致的 3 个策略都很有意思:3 个都是 PineForge 的等级更高。
| 策略 | PineForge | PyneCore | 备注 |
|---|---|---|---|
49-partial-exit-qty-percent | excellent | weak | PyneCore 多发了出场成交 |
06-liquidity-sweep | excellent | moderate | Pyne 一侧出场时机漂移 |
07-scalping-strategy | excellent | moderate | Pyne 一侧 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%:对比 harness 会用两者之差除以较大的那个笔数,也就是窗口内的 2,805 笔(TV 为 725 笔)。PineForge 的偏差是 0%。再看 p90 指标:
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)
换句话说:在能与 TV 配对上的交易里,两个引擎都以 TV 的价格入场(两者的 entry p90 都是 0%),只是 PyneCore 在 TV 的 725 笔中只配对上了 582 笔。分歧出在出场上。对同一个策略,PyneCore 产生的交易大约是 TradingView 的 4 倍(窗口内 2,805 笔对 725 笔)——最可能的原因是部分平仓循环触发过度:同一个 qty_percent 子句在 TV 的订单处理器认定其完成之前,就再次上膛了。
这并不是在评判 PyneCore 的质量——这是 Pine strategy.exit() 语义中的一个边角情况。这种对照是双向的:如果 PyneCore 与 TV 一致而 PineForge 不一致,那 bug 就出在我们这边。
另外两个
06-liquidity-sweep 和 07-scalping-strategy 是同一类问题的小幅度版本。两者的入场对齐率都是 100%;出场价的 p90 漂移在 PyneCore 上分别为 1.65%(06)和 0.48%(07),在 PineForge 上则分别只有 0.0005% 和 0.029%。移动止损类出场和部分成交语义,是 Pine 参考实现中文档最少的地方;两个引擎都只能从可观察的交易行为中反推。
调用 PyneCore 编译 API
PyneSys 通过 api.pynesys.io 以 HTTP 形式提供编译步骤,可以直接用 curl 调用:
curl -X POST https://api.pynesys.io/compiler/compile \
-H "Authorization: Bearer $PYNESYS_API_KEY" \
--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 文件。下面是它在 2026 年 5 月时的样子;较新的 PyneComp 版本会在文件头里写上各自的版本号,并把文件标记为 @pyne edge:
"""
@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__)
把它存成一个 Python 文件,执行 pip install pynesys-pynecore,再指向你的 OHLCV,就能得到第二个引擎的输出,用来与 PineForge 做 diff。
为什么这很重要
单个回测引擎报告「你的策略在测试窗口内收益 12.4%」,只能告诉你一件事:这个引擎声称得到了这个结果。如果没有可以对照的东西,你就只能相信它的一面之词。
两个独立的引擎在同一个脚本上报告相同的结果,证据就强得多。当它们不一致时,不一致本身就是一个假设:要么其中一个有 bug,要么 Pine 语义在这个边角情况上本身有歧义,要么测试数据里有一个两个引擎都没处理的边界条件。这三种情况都值得知道。
我们就是这样使用 PyneCore 的:引擎仓库的基准测试如今在同样的 200 个策略上,对照 TradingView 为 PineForge 和 PyneCore 评级(PineForge 还多跑一个策略,它的源码会被 PyneSys 编译器拒绝)。如果你要上线一个愿意押上真金白银的策略,也应该用第二个引擎来验证。
本文没有涵盖的内容
- 指标层面的漂移。 另有一份报告,逐个指标比较 PineForge、PyneCore 和 PineTS 的数值:是引擎与引擎之间的对照,而不是与 TradingView 对照。报告位于引擎仓库的
benchmarks/results/indicator_comparison.md。 - 当时内部语料库中另外约 110 个策略,它们不在公开扫描之列。这些策略检验的是 Pine 的边角情况(UDT 方法、多周期取值、OCA 出场组)。相关方法后来已发布在评测方法页面上。
亲手试试交叉验证
- 在本地或通过 AI 助手运行 PineForge
- 获取 PyneSys API 密钥
- 挑一个 Pine 策略,在同一份 OHLCV CSV 上跑两条流水线,再对比生成的交易列表。
两个引擎,一份源码,三份输出可供比对。如果全部一致,就放心上线;如果不一致,你也在真金白银押上去之前,学到了有用的东西。