如何测试一套交易策略:从观察到考核规则

把你观察到的现象写下来,转成一条规则,带上成本去测试,再看它的资金曲线在明确的考核规则下如何演变。先走完一个交互示例,再决定使用回放、手动执行还是已武装的策略。

Senzoukria · 学习 · 更新于 2026 年 9 月


一条向上的资金曲线只回答了一个狭窄的问题:在产生它的那些假设下发生了什么?它不会告诉你规则是否在测试之前就已写定,成交是否可以真正拿到,账户是否熬过了这条路径。把这些问题分开处理。

你要产出的东西:一条写下来的假设、一条带版本号的规则、一次成本明确的测试、一份考核规则报告,以及下一步查什么的决定。亏损的结果同样有用,只要它指出是哪个假设失效了。

从可验证的观察开始

例如:「在一个事先标注的价位上,主动性卖出增加,而下一根收盘 K 线并没有创出新低。」记录合约、交易所、交易时段、K 线粒度、时区和可用的数据覆盖范围。把前后的 K 线一起保存,而不是只留下那个好看的瞬间。

足迹图按价位和主动方归集已成交的交易。流动性热力图需要另外的深度观测。仅凭成交看不到那些等待、撤走或被补上的挂单。大量卖出却几乎没有下行进展,可以作为吸收的候选;它并不能识别参与者,也不能证明下一步方向。

  • 可得:已收盘 K 线的价格、在 Bid 与 Ask 上成交的量、时间戳,以及实际加载的覆盖范围。
  • 未确立:隐藏储备、某个参与者的意图、未来价格,或历史上的排队位置。
  • 控制:用信号出现之前就已具备的信息去标注价位。用第二天的成交量分布找到的价位会引入未来函数。

要一条可检验的规则,而不是一个必胜的答案

提供观察内容及其局限。让助手把证据和解释分开,然后列出一条规则所需的字段。足迹图助手可以提出图表配置供你应用;热力图助手则解释所选区域已记录的证据。两者的上下文并不相同。

「以下是合约、交易时段、已收盘 K 线和我事先标注的价位。请描述观察到的内容,不要赋予任何隐藏意图。只用这些字段提出一个确定性的入场条件。说明回看窗口、失效条件、入场时点、离场条件,以及哪些缺失数据会让这次测试失效。」

这是一个示例提示词,不是记录下来的模型回答。请把建议拿回数据里核对。脚本助手可以帮你编辑和运行草稿,但草稿能跑通并不等于交易能盈利。

在看结果之前写完整条规则

一份最小的研究规格可以这样写:只在 K 线收盘时评估事先标注的价位;要求该 K 线重新收在价位之上;在下一根 K 线开盘入场;使用固定止损与目标;只允许一笔持仓,并且过了设定的收盘截止时间不再开新仓。测试之前先定好确切的回看窗口和信号阈值。这是一份研究模板,不是推荐的配置。

研究规格 —— 伪代码,并非 Senzoukria API

每当一根新的 K 线收盘:
  确认所需数据齐全
  只使用本根 K 线之前固定下来的价位
  评估已声明的信号与交易时段过滤条件
  若当前空仓且全部条件满足:
    在下一根 K 线开盘时请求入场
    附上已声明的止损、目标与手数

把每一次改动记录为一个新的策略版本。

JavaScript 与 Python 策略在桌面端有历史回测路径。Python 需要其内置运行时。C++ 脚本使用接口受限的 WebAssembly 运行时,没有历史回测。按你要做的事情选语言;它们不是可以互换的执行环境。

先用 Run 在合成 K 线上抓出语法错误、缺失字段和非法输出。然后保存一个版本,在明确声明的历史区间上测试。不要把第一次合成运行称作回测。

把成本和规则边界摆到明面上

历史结果取决于成交模型。桌面端的策略回测在收盘 K 线上做决策,在下一根开盘入场,并用 K 线价格与已配置的成本来模拟离场。它不重建交易所的排队。当止损与目标可能落在同一根 K 线内时,请把采用的假设写清楚。

下面的示例隔离出另一个问题:当每日结果遇上账户约束会发生什么?它的八个交易日是刻意虚构的,既不是上面那条规则生成的,也不来自任何真实账户。

Hypothetical teaching example

Same days. Different constraints.

Eight invented days, two round trips per day. Change the size, costs or rules. The path stops at its first pass or breach.

Account balanceLoss floorProfit target
Hypothetical balance and loss floor after each evaluated day. Values are available in the table below.49.25k50.00k52.00kDay 1Day 2Day 3Day 4Day 5Day 6Day 7Day 8
Pass in this modelEvery modeled condition is met.
Net result
$2,190
Max close drawdown
$670
Costs charged
$160
Days evaluated
8 / 8
Inspect the inputs and day-by-day arithmetic

Gross P&L per one contract: Day 1: $500; Day 2: $450; Day 3: -$650; Day 4: $800; Day 5: -$200; Day 6: $650; Day 7: $350; Day 8: $450. Each day contains two completed round trips. No market data or fitted strategy produced this sample.

Evaluated days only; later days are not charged after a terminal result.
DayGrossCostsNetBalanceFloor
Day 1$500$20$480$50,480$49,730
Day 2$450$20$430$50,910$50,160
Day 3-$650$20-$670$50,240$50,160
Day 4$800$20$780$51,020$50,270
Day 5-$200$20-$220$50,800$50,270
Day 6$650$20$630$51,430$50,680
Day 7$350$20$330$51,760$51,010
Day 8$450$20$430$52,190$51,440

Fictional $50,000 account; at least three trading days. Equality with a loss limit is a breach. Drawdown uses closed daily balances, with no intraday excursions or trailing-floor freeze. This is a teaching model, not a firm’s rules, a backtest, or a probability of future success.

三个可以动手做的实验

  1. 先重置,再把最大回撤降到 600 美元。第 3 天跌破按收盘计算的移动底线。改用固定底线:同样的前三天仍在底线之上。改变的是规则,不是市场结果。
  2. 先重置,再增加合约数。毛结果和每手成本同时变大。仓位更大时,可能在触及目标之前就先碰到亏损阈值。
  3. 先重置,再打乱交易日顺序。重新排序可能改变首次违规日或通过日。这是对既有结果做敏感性检查,不是预测,也不是经过校准的概率。

核对一下算术

按一手合约、每笔往返 10 美元计算,每个两笔交易的日子花费 20 美元。前三天的净值分别是 480 美元、430 美元和 −670 美元。账户余额先到 50 910 美元,再到 50 240 美元:收盘对收盘的最大回撤为 670 美元。若移动额度为 600 美元,底线是 50 310 美元,第三天跌破它;而 49 400 美元的固定底线不会被跌破。

按日收盘建模的方式无法发现盘中跌破、收盘前又收回的情况。真实规则可能使用浮动权益、移动底线上限、不同的交易时段边界、最低活跃度、一致性条款或出金限制。只录入已核实的规则,并在解读桌面端的考核报告之前标出每一条尚未纳入的条款。

在改规则之前先质疑结果

  • 留出更靠后的数据。在调参之前先划定开发期与评估期。反复在留出期上优化,会把它变成训练数据。
  • 一次只改一个假设。提高成本、调整时段过滤、查看邻近的参数取值,并逐笔检查亏损交易。
  • 保留分母。记录你一共试过多少个策略变体,而不只是最后留下的那一个。多次尝试之后出现的亮眼结果,需要更强的证据。
  • 把余额和现金流分开。考核费用、重置、实盘阶段和出金周期各有自己的规则。上面那个小教学模型并没有把它们建模进去。

桌面端为受支持的历史测试提供参数搜索、walk-forward 和稳健性报告,还有一个带生命周期与成本建模的考核模拟器。这些报告总结的是各自的流程和所提供的数据。一个漂亮的结论标签并不是未来优势的认证。

有意识地选择执行方式

在决定一套策略是否该进入已连接的账户之前,先用回放检查它的决策和模拟账户行为。只做分析、手动执行和已武装的策略,是三种不同的运行选择。

Senzoukria 通过兼容的 Rithmic 账户支持订单路由和可选的策略自动化。自动驾驶需要显式武装、账户权限、已配置的上限、已挂载的图表,以及正在运行的桌面端。请确认你所在公司和账户当前的规则。通用 AI 助手不能替你武装它。加密货币的分析数据流并不意味着可以在 Binance 或 Bybit 路由订单。

STOP 会解除策略武装并请求平仓;请核对经纪商的回执和实际持仓。请求不等于成交保证,应用层的限制也消除不了滑点和连接风险。为断线和被拒订单准备一份书面处置流程。

保留一份研究记录

保存规则版本、数据来源与覆盖范围、测试日期、成本、成交假设、账户规则、未通过的检查,以及你做下一个决定的理由。然后只改一件你说得出名字的事。这份记录比一张写着巨额最终盈亏的截图有用得多。

接着阅读如何核对软件与账户权限,或回到学习路径,把支撑你这条规则的观察打磨得更扎实。

常见问题

这个交互示例是真实的策略回测吗?
不是。它的八天结果是为教学虚构的。它只是把可见的成本和虚构的规则套用到这些结果上。它不使用历史价格,不拟合策略,不指向任何自营公司,也不估计未来的成功概率。
Senzoukria 能回测 JavaScript、Python 和 C++ 策略吗?
桌面端的历史策略回测支持 JavaScript 和 Python。C++ 脚本运行在 WebAssembly 上,没有历史回测路径。在合成 K 线上运行编辑器草稿属于单独的执行检查,不是绩效测试。
模拟考核「通过」意味着什么?
它意味着所提供的结果满足了该次运行中真正被建模的规则。缺失的盘中数据、未建模的公司条款、成本或执行假设都可能改变结论。它不是未来的通过概率,不是账户状态,也不是出金保证。
AI 能下单或武装我的策略吗?
通用 AI 助手读取应用上下文,并可使用已配置的网络工具;它不下单,也不武装自动驾驶。已保存的策略可以走单独的 Rithmic 自动驾驶路径,但必须由用户显式武装,并且桌面端处于打开状态、连接兼容、账户具备相应权限。