如何测试一套交易策略:从观察到考核规则
把你观察到的现象写下来,转成一条规则,带上成本去测试,再看它的资金曲线在明确的考核规则下如何演变。先走完一个交互示例,再决定使用回放、手动执行还是已武装的策略。
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.
- 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.
| Day | Gross | Costs | Net | Balance | Floor |
|---|---|---|---|---|---|
| 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.
三个可以动手做的实验
- 先重置,再把最大回撤降到 600 美元。第 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 自动驾驶路径,但必须由用户显式武装,并且桌面端处于打开状态、连接兼容、账户具备相应权限。