MES 系统化交易 · 初学者手册
MES 系统化交易 · 初学者手册
零基础请先读 课程目录(15 课渐进课程,概念先定义后使用)。 本手册是读完课程后的进阶参考:每个部件的详细档案 + 术语速查,随查随用,不必顺读。
怎么读这本手册:三个部分难度递进。第一部分是市场常识,不懂它后面都是天书; 第二部分逐个讲我们造的七个部件,每个部件按固定格式:它是什么 → 为什么需要它 → 我们怎么确认它没做错 → 它的局限;第三部分讲研究方法论——这部分决定你最终赚不赚钱。 所有例子都来自你自己的数据和这个项目的真实经历。术语第一次出现会加粗并解释, 忘了就翻附录 A 的速查表。
第一部分 · 预备知识
1. 我们交易的东西:MES 微型标普期货
期货是一纸标准化合约:”在未来某天按成交价结算某个东西”。我们交易的 MES(Micro E-mini S&P 500)追踪标普 500 指数,是 CME 交易所 2019 年 5 月推出的 “微型”版本,大小是 ES(E-mini)的 1/10。
几个必须背下来的数字:
| 项目 | 数值 | 含义 |
|---|---|---|
| 点值 | $5 / 点 | 指数每涨跌 1 点,1 手赚亏 $5 |
| 最小跳动(tick) | 0.25 点 = $1.25 | 价格只能按 0.25 的整数倍变动 |
| 名义价值 | 指数×$5 ≈ $34,000(指数 6800 时) | 你实际”控制”的资产规模 |
| 隔夜保证金 | 约 $2,000 多 | 押金;名义/保证金 ≈ 十几倍杠杆 |
| 到期月份 | 3、6、9、12 月(代码 H / M / U / Z) | MESM25 = 2025 年 6 月合约 |
杠杆的直觉:两千多美元的押金控制三万多美元的资产,指数跌 1%(约 68 点 = $340), 你的押金就缩水约 15%。杠杆不改变期望,只放大结果——这就是为什么第 18 节的仓位数学 比任何指标都重要。
到期与移仓(roll):每个合约都有寿命。6 月合约到期前约 8 天,交易量会整体搬家到 9 月合约——这一天叫移仓日。做长周期研究必须把一段段合约”缝”起来,缝法见第 12 节。
2. 市场如何成交:订单簿、点差与三种订单
把市场想象成一个菜市场的公告板(订单簿):
卖方挂单(ask,卖一价 6800.25,挂着 120 手)
─────── 点差 spread = 0.25 点 ───────
买方挂单(bid,买一价 6800.00,挂着 95 手)
- 限价单:把你的价格挂上公告板等别人来吃。优点是不付点差,缺点是可能永远轮不到你 ——价格到了但队伍前面的人先成交,行情就走了。
- 市价单:不挂单,直接吃对面挂着的单。买就付 6800.25(卖一价),卖就收 6800.00 (买一价)。保证成交,但每次都付点差。
- 止损单:一个”条件市价单”——价格触及某个水平后自动变成市价单。用于认输离场。
主动买 / 主动卖(aggressor):每笔成交必然是一方”忍不住”吃了另一方的挂单。 吃卖一价成交 = 主动买;砸买一价成交 = 主动卖。我们的数据里每笔成交都带这个标记, 把一段时间的主动买量减主动卖量,就得到 delta——普通 K 线图上看不到的”攻击方向”信息。
3. 看不见的对手:交易成本
每做一个来回(一买一卖,1 回合 / RT),你付出:
| 成本 | 金额(MES,1 手) | 说明 |
|---|---|---|
| 佣金 | ≈ $1.40 / 回合 | 券商 + 交易所 + 监管费,全包 |
| 点差 | ≈ $1.25 / 回合 | 两次市价单,相对”中间价”各亏半个 tick |
| 滑点 | 0 ~ 数美元 | 想要的价和实际成交价的差;行情快时更大 |
合计每回合约 $2.5 ~ $4 的摩擦。听起来小,算笔账就不小了:一个典型的日内短线打法, 平均盈利 $13、平均亏损 $12——摩擦占单笔盈亏幅度的两三成。要在这种盈亏比下打平, 胜率需要约 53%,而随机进出的胜率不会超过 50%。 这就是”短线是逆水行舟”的数学含义:持仓越短、交易越频,摩擦占比越大,需要的真本事越强。
4. 数据长什么样:从逐笔到 K 线
市场的”原始录像”是逐笔数据(tick):每一笔真实成交的时间(精确到微秒)、价格、 手数、主动方向,外加成交瞬间的买一/卖一价。我们硬盘里约 1.5 亿条这样的记录。
K 线(bar)是压缩摘要:把一段时间(如 1 分钟)的所有成交压成四个价格—— 开盘价 Open、最高 High、最低 Low、收盘 Close(合称 OHLC),加上总量。
高 ┬ 6801.50
│ 一根 1 分钟 K 线 = 这一分钟内
收 ┌─┴─┐ 6801.00 几百笔成交的"缩略图"
开 └─┬─┘ 6800.25
低 ┴ 6799.75
压缩必然有损:K 线知道这分钟最高到过 6801.50,但不知道先到高点还是先到低点—— 这个”不知道”直接影响回测怎么算止损(见第 13 节)。所以原则是:存档用逐笔(无损), 研究用 K 线(够用且快),拿不准时回到逐笔验证。
5. 时间的三套坐标:UTC、芝加哥、北京
同一笔成交,有三个”几点了”:
| 坐标系 | 谁在用 | 例:同一笔成交 |
|---|---|---|
| UTC(世界协调时) | 我们的数据文件、所有代码内部 | 13:30:00 |
| 芝加哥时间(CME 所在地,America/Chicago) | 交易所规则:开盘、收盘、结算 | 08:30:00 |
| 北京时间(UTC+8) | 你的 SC 界面和交易日志 | 21:30:00 |
铁律:内部一律 UTC,只在”边界”处转换(判断日盘、显示给人看)。为什么不能用
“芝加哥时间减 13 小时=北京时间”这种死算?因为美国有夏令时:夏天芝加哥=UTC−5、
冬天=UTC−6,一年切换两次。交给时区库(America/Chicago)处理,永不手算。
两个交易所概念:RTH(日盘)= 芝加哥 08:30–15:00,即美股现货开市时段,成交最厚、 行为最规律;交易日从前一天 17:00(芝加哥)开始——所以北京时间周二早上 6 点的成交, 属于”周二”这个交易日。
第二部分 · 我们造的机器
6. 全局地图与”层层设卡”
.scid 原始档案 → [7]解析器 → Parquet 粮仓[10] → [11]K线聚合 → [12]连续合约
(SC落地) (翻译官) (列式仓库) (显微镜→镜头) (缝合线)
▲ │
[8]实证校验 ───┘ 质量关卡 ◄─── [9]盘点审计 [13]回测引擎 → 统计
核心哲学是层层设卡:每一层都有独立的方式证明自己没错,因为回测结论的可信度 = 它脚下最不可信的那一层。这台机器每层的”卡”:
| 层 | 怎么验证的 | 结果 |
|---|---|---|
| 解析器 | 合成文件往返测试 + 165 笔交易日志交叉匹配 | 100% 匹配 |
| K 线聚合 | 手工算好答案的合成数据测试 | 精确一致 |
| 连续合约 | 同一合约两个独立下载文件的拼接价差 | 恰好 0.00 |
| 回测引擎 | 7 个手算场景的单元测试 | 分毫不差 |
7. 解析器 scid.py:翻译官
它是什么:SC 把行情存成 .scid 二进制文件——固定 56 字节文件头,然后每 40 个字节
一条记录,字段排布是死的:
| 字节 | 字段 | 含义(逐笔文件中) |
|---|---|---|
| 0–7 | DateTime | 自 1899-12-30 起的微秒数(UTC) |
| 8–11 | Open | 0(或”拆分子成交”哨兵值) |
| 12–15 | High | 成交瞬间的卖一价 |
| 16–19 | Low | 成交瞬间的买一价 |
| 20–23 | Close | 成交价 |
| 24–39 | 四个计数 | 笔数、总量、主动卖量、主动买量 |
解析器就是拿着这张字节表,把二进制翻译成程序能算的表格。
为什么需要它:这是整条流水线的地基,而且它让我们不开 SC、不花订阅费就能用 全部历史数据。
做法的讲究:用 memmap(内存映射)读文件——不是把 2GB 搬进内存,而是告诉 操作系统”把文件当成一个大数组,我摸哪页你读哪页”。于是”取 10 月 16 日那一段”是 毫秒级操作(二分查找只摸几十页)。另外 SC 历史上有过两种时间格式(老版存”天数”、 新版存”微秒”),解析器读首尾两条记录,看哪种解释落在合理年份——用合理性判断代替猜。
局限与提升:还不支持 SC 的盘口深度文件;未来接新数据源时要重写字段映射。
8. 实证校验:一次侦探工作
写完解析器,怎么知道翻译没错?不能用代码验证代码(同一个人出题又阅卷)。
我们找到一条独立证据链:你 2025-10-16 的交易日志。SC 在每笔模拟成交旁记下了当时的
买一/卖一价快照(Bid: 6713.50 Ask: 6713.75)——这份快照与 .scid 文件来源独立。
侦探推理:如果解析器的字节表、时间纪元、字段语义全对,那么应该存在一个固定的时区 偏移,使日志里 165 笔成交在逐笔数据中±2 秒内都能找到一模一样的 (bid, ask)。我们把 ±14 小时内所有候选偏移都试了一遍:
| 候选偏移(相对 UTC) | 匹配率 |
|---|---|
| −8 小时(即日志=UTC+8,北京时间) | 100.0% |
| 次优候选 | 3.0% |
100% 对 3%,一锤定音。副产品:确认你的 SC 界面显示北京时间——日志里 20:30 那波 剧烈成交,正是美东 08:30 经济数据发布(北京 20:30 = 美东 08:30)。 原则带走:每个自制部件,都要找一条它管不着的独立证据链来审它。
9. 盘点 inventory.py:库存审计
它是什么:把 38 个数据文件全部扫一遍,输出每个文件的时间范围、逐日覆盖、缺口、 买卖盘可用率、时间戳是否有逆序。
为什么需要:把”我以为有的数据”变成”我确认有的数据”。它抓出了三件事:
① 2025 年 7–9 月前月数据是空洞;② MES-202512 文件开头混入了 28,723 条 K 线记录
(混着用会污染回测!);③ 好消息——CME 文件质量极好,时间逆序每文件只有 0~3 次。
局限与提升:目前是手动跑;以后新数据落地应自动重盘点并报警差异。
10. Parquet:研究粮仓
它是什么:把 12GB 的 .scid 转存成 1.29GB 的 Parquet 文件——数据分析生态的
标准列式格式。
行式 vs 列式:.scid 按行存(一条记录的所有字段挨着),像流水账;Parquet 按列存
(所有价格连在一起、所有时间连在一起),像把同类货物打包上架。研究查询几乎都是
“只要价格和数量这两列”——列式只搬这两包货,行式要把整个仓库翻一遍。加上同类数据
压缩率高(压到 11%)和”行组统计”(文件自带每段的最大最小时间,”只要 9 月以后”可以
整段跳过),研究读取快一个量级。
审计痕迹原则:转换时剔除的 28,723 条混入记录被逐一记数、写进报告—— 数据清洗必须留痕,”静默修复”是数据工程的大忌,因为你永远会想知道”这个数和原始档案 差在哪”。
局限与提升:还没做按月分区和校验和清单。
11. bars.py:从显微镜到常用镜头
它是什么:把逐笔聚合成任意周期的 K 线,附带三样普通 K 线没有的东西: delta(主动买−主动卖)、VWAP(成交量加权均价)、每根 K 线的成交笔数。
做法的讲究——向量化:直觉写法是”for 每笔成交:更新当前 K 线”,6000 万笔在 Python
里要跑几分钟。我们改用 numpy 的”按段聚合”(reduceat):先一次性算出每笔成交属于
第几根 K 线,再让底层 C 代码按段一刀切地求最大/最小/求和——几秒完事。
快不是舒适问题而是方法论问题:研究=大量试错,迭代速度决定你能试多少个想法。
一个重要约定:没有成交的时段不造”空 K 线”。假日、停盘、数据空洞在输出里就是 “缺一段”,策略代码不许假设 K 线等间隔——宁可让下游明确面对缺口,也不用假数据填平。
局限与提升:还没做成交量 bar / tick bar(按”每 1000 手切一根”而不是按时间切—— 信息流更均匀,很多统计性质更好);聚合结果还没做正式缓存管理。
12. continuous.py:把合约缝成一条线
基差(basis):同一时刻,9 月合约比 6 月合约贵一点,因为持有指数到 9 月要多付 三个月的资金利息(减去分红)。理论值 ≈ 指数 × (利率−分红率) × 剩余年限。
假跳空问题:移仓日把两段合约直接首尾相接,会在接缝处凭空出现一根”跳涨”——那不是 行情,是基差。实测我们的数据:M25→U25 接缝处两合约同刻价差 +53.50 点(指数 6100、 年化差 3.5%、剩余 0.25 年 → 理论 ≈53 点,对上了);Z25→H26 是 +58.25 点。不处理的话, 做多策略每次移仓白捡 $267 的假利润,十个月两次移仓就是 $534 的系统性造假。
我们的缝法:利用两个合约在移仓前同时都有成交的重叠时段,取上千根”同一分钟 K 线”的价差的中位数(比”前收减后开”稳健——后者混进了两根 K 线之间的真实行情变动)。 需要连续价格时,把历史段整体平移这个价差(back-adjust)。附赠的质量关卡:Z25 有两个 独立下载的文件,同样的方法测它们的”拼接价差”,结果恰好 0.00——两条独立数据链严丝 合缝,等于整条流水线又自检了一次。
空洞的处理:7–9 月的空洞两侧被标为不同的数据块(block)。规则:任何持仓、任何 指标状态都不许穿越块边界——不假装连续,让下游被迫诚实。
局限与提升:移仓日目前用”到期前约 8 天”的惯例值(应升级为按两合约成交量交叉自动判定); 加法调整在多年跨度上会轻微扭曲收益率(比例式调整更严谨)。
13. backtest.py:诚实的考场
回测引擎 = 让策略在历史上”重考一遍”的考场。考场最大的风险是不知不觉放水。 六条反放水规则,每条堵一个真实存在的坑:
| 规则 | 堵住的坑 | 不堵会怎样 |
|---|---|---|
| 信号在第 i 根收盘决定,第 i+1 根开盘才成交 | 未来函数 | “收盘价站上均线就以这根收盘价买入”——你用了收盘后才知道的信息,回测虚高 |
| 市价/止损成交价加 1 tick 不利滑点 | 理想成交幻觉 | 每回合虚增 $1.25+,高频策略立刻由亏变”赚” |
| 止损与止盈同根 K 线都可能触发 → 按止损算 | K 线内部顺序不可知 | 挑对自己有利的顺序 = 系统性放水(回忆第 4 节:K 线不知道先到高点还是低点) |
| 开盘已跳空越过止损 → 按更差的开盘价成交 | 跳空风险 | 隔夜/数据断档的真实亏损被砍到止损价 |
| 限价单必须被穿价才算成交 | 触价成交假设 | 实盘限价单要排队,”刚好碰到就成交”经常轮不到你 |
| 数据块边界强制平仓、信号不穿越 | 持仓穿越空洞 | 物理上不可能的持仓路径混进统计 |
为什么用”笨”的逐根循环而不是花哨的矩阵运算:因为带止损止盈的交易是路径依赖的 (这根 K 线发生什么取决于之前的持仓状态),矩阵化写法极易出错且错了看不出来。逐根循环 的每一笔成交都能手算复核——我们的 7 个单元测试就是先手算答案再让引擎对答案。 8 万根 K 线跑 2 秒,对研究足够快。
局限与提升:单合约 1 手、固定 tick 止损止盈(还不支持”按当日区间宽度定止损”这类 动态规则)、无移动止损;滑点是常数(应按波动率/成交量校准)。这些都排在路线图上。
14. 统计指标逐个讲
引擎每次回测输出这些数(拿第 17 节的真实例子对照着看):
| 指标 | 定义 | 怎么读 |
|---|---|---|
| 胜率 win_rate | 赚钱笔数占比 | 单看无意义!低胜率+大盈亏比可以很赚(趋势型),高胜率+小盈亏比可以很险(卖尾部风险型) |
| 盈亏比 | 平均盈利 ÷ 平均亏损 | 与胜率配对看:期望 = 胜率×均盈 −(1−胜率)×均亏 |
| 期望值 expectancy | 平均每笔净赚亏 | 最核心的数。为正且显著,策略才存在 |
| 盈利因子 PF | 总盈利 ÷ 总亏损 | 1.0=打平;扣费后 1.2–1.4 已是散户实盘的好成绩;回测里看到 2.5+ 先怀疑过拟合 |
| 最大回撤 max DD | 资金曲线峰到谷最大跌幅 | 决定你”拿不拿得住”;实盘回撤通常比回测更深 |
| 日夏普 Sharpe | 日收益均值÷波动×√252 | 赚得稳不稳;1 以下平庸,2 以上(扣费后、样本外)很少见 |
| 样本量 | 交易笔数 | 一切指标的前提:71 笔的胜率误差是±11 个百分点——等于没测 |
15. 回测为什么常常骗人
三大骗局,按危害排序:
① 过拟合——策略把历史的噪音背了下来。类比:给学生看了 500 道题和答案,他把答案 背了;换一套新题立刻不及格。参数越多、调得越细,越容易背题。解药:参数尽量少; 在参数空间里找平原(一片相邻参数都还行)而不是尖峰(只有 or=17 分钟、止损=13 tick 这一个点特别好——那是背题的标志)。
② 多重检验——试了 1000 个策略,总有几个纯靠运气好看。类比:让 1000 个人抛硬币 10 次,总有人连正 8 次,但他不是”抛硬币大师”。解药:记录你试过多少东西;对”最优结果” 永远打折;最终裁决只靠没碰过的数据。
③ 未来信息泄漏——最隐蔽。除了明显的未来函数,还有微妙版本:用”整段数据算出的 均值”做标准化(那个均值包含未来)、用后来才修正的数据、在移仓拼接里让价差把未来信息 带进历史。解药:引擎强制次根开盘成交只是第一道;每个特征都要问”这个数在当时那一刻 真的可知吗”。
样本外(out-of-sample)为什么神圣:它是你唯一一次”高考”。看过一眼的数据就永远 变成了”样本内”——你的下一个决定已经被它污染。所以我们把 2026 年 4–7 月封存(D1 决策), 开发期绝不下载。
16. 正确的研究流程(我们接下来怎么走)
写下假设(先于看数据)→ 开发窗内做参数面板(找平原)→ walk-forward 滚动检验
→ 通过者用 holdout 窗看一次 → 通过者封存等 2026-04~07 终考 → 模拟盘 → 1 手实盘
数据切分(决策 D7):开发窗 = 2025-03→2025-12(随便折腾); holdout = 2026-01→2026-03(每个策略族只许看一次); 终考 = 2026-04→2026-07(未下载,等重订阅时用,一次定生死)。
walk-forward 是什么:模拟真实使用的滚动考法——用 1–3 月的数据选参数,在 4 月上 “实战”;窗口推进一个月再来一遍。它考的不是”策略在某段行情里行不行”,而是 “用过去选参数、在未来执行”这个完整流程行不行——这才是你实盘每天真正做的事。
17. 案例解剖:演示策略的 −$23,744
我们故意跑了一个”教科书反面教材”:30/120 分钟均线交叉、10 tick 止损、日内强平, 在 10 个月真实数据上 5,610 笔。把亏损拆开:
| 成分 | 金额 | 每笔平均 |
|---|---|---|
| 策略本身(无摩擦毛利) | ≈ −$1,865 | −$0.33 ≈ 随机 |
| 滑点 | −$14,025 | −$2.50 |
| 佣金 | −$7,854 | −$1.40 |
| 净结果 | −$23,744 | −$4.23 |
三个教训:① 均线交叉本身≈抛硬币(毛利几乎为零)——“信号”不等于”优势”; ② 92% 的亏损是摩擦——零期望+高频率=向做市商定期捐款,5,610 笔里 4,755 笔死于 10 tick 的窄止损,每次止损都重新付一遍摩擦;③ 这台机器 2 秒钟给出这个结论,而模拟盘 要挂三个月——回测系统真正卖的商品是”廉价而诚实的坏消息”。
18. 仓位与风险:1 手 MES 的账户数学
1% 规则:单笔风险(止损距离×点值+摩擦)不超过账户的 1%。例:止损 8 点 = $40 + 摩擦 $3 ≈ $43 → 账户应有 $4,300;止损 4 点 → 约 $2,200。这就是”1 手 MES 配 $2,000–4,000 账户”的来历。仓位由风险定,绝不由保证金定(有的券商日内保证金只要 $40——那是让你上 800 倍杠杆的邀请函,不是许可)。
为什么是 1%:连亏是常态不是意外。45% 胜率的系统,几百笔里出现 7–10 连亏很正常—— 这不是系统坏了,是二项分布的日常。每笔 1%,10 连亏 = 回撤约 10%,活着;每笔 10%, 10 连亏 = 账户归零。先保证”任何正常的坏运气都杀不死你”,再谈赚钱。
收益预期:扣费后期望 $2/笔 × 每天 2 笔 × 21 天 ≈ $85/月;期望 $5/笔的优秀系统 ≈ $200+/月。1 手阶段的目标是验证期望为正,不是收入——验证通过后,从 1 手到 5 手 只是改一个数字,而从”没有正期望”到”有”隔着整个第三部分。
19. 案例复盘二:一片”平原”是怎么蒸发的(ORB)
第 15 节讲过”找平原不找尖峰”。ORB 策略族给了我们一个活教材:平原也会骗人。
样本内(27 组参数、157 个交易日):正期望区成片、结构有经济逻辑、最优格 +$5.18/笔—— 按第 15 节的标准这是”值得继续查”的好形态。然后三道预注册检验依次开火:
| 检验 | 结果 | 揭示的问题 |
|---|---|---|
| 按月分解 | 78% 的净利来自单月(其余月份合计为负) | “稳定小优势”其实是两个月的行情红利 |
| walk-forward | 每月训练窗选出的”最优参数”不断漂移,滚动执行 −$7.07/笔 | 样本内的选择在时间上不可复制 |
| 空头侧变体(H2) | 同样死于 WF,利润again集中于单月 | 数据挖掘出的假设先验更弱,死得更快 |
三条带走的教训:① 平原只是门票不是结论——27 格挑最好+趋势月红利足以伪造平原;
② walk-forward 考的是”用过去选参、在未来执行”这个流程,它才是你实盘每天做的事;
③ 预注册的价值:门槛在看到结果前就定死(写在 scripts/orb_stage2.py 顶部),
坏消息出来时没有讨价还价的余地。全过程 holdout 一眼未看,代价≈半小时算力。
每个假设的生死都记录在 reports/research_journal.md(多重检验总账)。
20. 案例复盘三:一个走完全程的假设(H4 日内动量)
H4 是目前唯一走完全程的假设,它的旅程值得逐站记住:
| 关卡 | 结果 |
|---|---|
| 开发窗面板(18 格) | formation=60 的 9 格邻域全部为正,最优 +$14.03/笔 |
| 按月分解 | 5/8 月为正,最大单月占 38%,两个数据块都贡献 |
| walk-forward | 四门槛全过:69 笔、+$7.24/笔、67% 测试月非负 |
| ES 跨品种(同期) | 9 格邻域 8 格为正 |
| holdout(2026-01→03,唯一一看) | 主格 −$18.83/笔,邻域 9 格全负 |
它通过了我们当时能设的每一道纪律关卡,然后在唯一没被任何选择污染的数据上 整体翻转。教训比 ORB 的更深一层:
- 开发期的一切证据都是”同一段历史的不同侧影”——ES 同期复现看似独立, 实为同一个指数、同一段行情,只能证明管线稳健,不能证明规律恒久。
- holdout 在替你付实盘学费:这次”考试不及格”的成本是模拟的 −$678; 没有这道门,它就会变成真钱,而且规模更大。
- 一年的数据无法区分三件事:优势衰减了 / 优势只属于某种市场状态 / 优势从来不存在。要区分它们只有一个办法——更长的历史,跨多个状态。
- 所以四连败的真正产出是一个可执行的结论:当前瓶颈是数据长度,不是想法数量。 花一个月订阅费补齐 2019→今(MES)与 2011→今(ES),整座工厂即可在 6–15 年、多状态样本上重跑——这是性价比最高的下一步。
21. 长历史时代:新数据、新部件、新纪律
四连败的结论(§20)指向数据长度,于是系统升级到 16 年样本。这一章记录升级中学到的东西。
数据分层采购。精细数据贵得不成比例(逐笔 tbbo 全历史 ≈ $1,120,1 分钟只要 $69)—— 所以架构分三层:1 分钟 = 骨干层(回答”效应是否跨状态存在”,永久使用); 逐笔 = 精加工层(只为幸存策略的关键时段定点购买);实时 = 执行层(上模拟盘才付费)。 “是否需要更细的数据”的正确问法是:当前要回答的问题需要什么分辨率。
双源交叉 QC。同一段行情我们有两条独立数据链(Denali 逐笔聚合 vs Databento 官方 1 分钟): 26.5 万个重叠分钟里 99.81% 收盘价完全一致。两条链在采集、传输、落盘上毫无共享环节—— 一致即互证。买第二个数据源最大的价值不是备份,是验证。
Roll spread 的宏观自检。92 次移仓的基差全部实测:2010–2016 为负(股息>零利率, 期货贴水)→ 2018 转正(加息)→ 2020 又转负(疫情零利率)→ 2023–2025 飙到 +47~+65 点。 移仓机制复刻了 16 年利率史——当你的中间产物能对上一段独立的宏观历史,管线大概率是对的。
两位外部顾问抓出的四个致命坑(协议 v2 → v2.1 的由来):
| 坑 | 内容 | 修法 |
|---|---|---|
| 量纲陷阱 | “20 tick 止损”在 2010 年是指数的 0.45%,2026 年只有 0.07%——同参数跨年代根本不是同一个策略 | 所有价格参数改为 ATR 倍数,逐折按 train 窗换算 |
| 复权缺失 | 未复权序列每次移仓有 5~65 点假跳空,且随利率制度变号——恰好与要检验的年代效应混淆 | 差值后复权;合约变更日信号作废 |
| id 回收 | CME 会把 instrument_id 隔十年重发给新合约 | 主键 = id + 时间聚类合成键 |
| 电池未标定 | 旧门槛放过了 H4 这个假阳性,但”电池的联合假阳率”从未被测量 | MCPT:200 个纯随机策略过同一套门槛,看多少能混过去 |
MCPT(蒙特卡洛置换检验)的直觉:你的考试如果连蒙题的都能考及格,考试本身就不合格。 让 200 个”抛硬币决定方向”的假策略走完整套 walk-forward+门槛流程,通过率就是这套考试的 “蒙混率”——它给”通过”二字标定了含金量。
品种切换的教训:原计划”ES 上开发、MES 上出样”被否——ES 与 MES 被套利锁在 1 tick 内, 价格上是同一条序列,切换只会把”品种差异”与”年代差异”搅混。正确做法:时间切分永远在 同一条序列上做,品种迁移误差用重叠期并跑单独量化(桥接检验)。
16 年裁决(本章的结局):三族在新框架下全部否决——ORB 4,986 笔 −0.84 点/笔、
隔夜动量 1,819 笔 −0.99、日内动量 1,690 笔 −0.27(CI 上界仍低于门槛)。最有教学价值的
对照:H4 在 2025 单年曾”9/9 邻域全正 +$14/笔”,16 年视角下 2012–2016 深度为负——
一年的漂亮形态在十六年里连正号都保不住。这就是为什么第 15 节说”样本外只有一次”、
第 20 节说”一年的数据无法区分三件事”。完整报告:reports/longhist_campaign.md。
22. swing 战役与第三种裁决:”数据不足”
日内三族死于”决定性负值”后,战役转向持仓 1–10 天的 swing 尺度(摩擦占比从 ~20% 降到 ~2%)。H5(趋势内回调反弹)与 H6(月末效应)的结局引入了第三种裁决—— 既不是通过也不是否决,而是数据不足(inconclusive):
| 日内三族 | swing 两族 | |
|---|---|---|
| 期望 | −0.27 ~ −0.99 点/笔(负) | +1.12 / +1.48 点/笔(正!) |
| 置信区间 | 整体在门槛之下 → 可判死刑 | 跨零且够不到门槛 → 无法判案 |
| 根因 | 效应不存在 | 每年只有 ~25 笔,9.5 年凑不齐统计功效 |
功效(power)的直觉:想听清一个很小的声音,要么声音大点,要么听得久点。 H5 的”声音”若真是 +1.1 点/笔,以它的波动(σ≈30 点)需要约三千笔才能确认—— 百年量级。所以裁决不是”效应不存在”,是”这台望远镜看不了这么暗的星”。 正确的应对不是反复重看(那是多重检验),而是造更大的望远镜(合并 ES+NQ 样本的功效升级方案已预注册起草)或接受不可判定。
这一战役还留下两个流程教材:①框架缺陷(长回看指标在测试窗内热不了身)被
“H5 首跑 0 笔”暴露——荒谬的结果常常是 bug 的化名,别急着解释成市场现象;
②协议修订(v3.1)发生在任何可解释结果之前并全程披露,包括把缺陷版跑出的
数字登记为”弱窥视”。完整报告:reports/swing_campaign.md。
23. 一夜层扫:功效、贝塔伪装与”测谎仪的量程”
swing 战役之后的同一个深夜,工厂对剩余的公开信息层做了系统扫荡(订单流特征×11、
发表的日内动量+delta、隔夜溢价、月度动量),全部阵亡或不可判定——明细见
reports/tier_sweep.md。这一夜留下三个高阶概念:
功效(power)=测谎仪的量程。reports/power_audit.md 给每台”测谎仪”标了量程:
H1 五千笔样本对 0.3 点/笔的优势有 85% 检出力——它说”没有”就是没有;
而 swing/月频族对任何现实优势只有 5% 检出力——它们说”没查出”只是”看不见”。
同样一句”没通过”,量程不同含义完全不同;不标量程的检验报告都是半成品。
贝塔伪装。H9 月度动量 +19.4 点/月、9/11 年为正,表面像圣杯——拆开多空两腿: 多头 +27.5/月,空头 10 个月每月 −61.6;而同期无脑持有是 +26.5/月。 它的”预测”部分在主动毁值,收益全部来自牛市里恰好做多。任何策略的及格线 不是零,是”你不动脑子也能拿到的那份”——这就是电池里 beta 对照的存在意义。
真实但不可用。隔夜溢价毛收益 +0.89 点/夜(文献异象验证为真!)但摩擦 0.78 吞掉一切,且零利率年代连毛收益都为负。一个发现可以同时”真实”和”对你无用”—— 它被登记为『成本敏感型机会』:若未来成本结构改变(会员费率/更大点值合约),即可复活。
24. 溢价层战役:从”找信号”到”收租金”(H10/H11 与组合的曙光)
层扫之后,战略庭把搜索转向风险补偿层:不再问”价格接下来往哪走”(预测), 改问”承担什么风险能拿到补偿”(收租)。补偿型溢价的幸存机制与形态类完全不同—— 收割它的人自己在扛风险,所以它不会因为被人知道而消失。一夜之间四个租口全部实测:
| 租口 | 实测 | 状态 |
|---|---|---|
| 隔夜持有(H8) | 毛 +0.89 点/夜真实,摩擦吞噬 | 太薄 |
| 高波动状态隔夜(H11) | 单夜溢价翻倍(+0.223),年化 15-25 点 | 真实但小(β 曲线实测检出率 86.5% 的实权否决) |
| 宏观公告日(H10) | 净 +1.345 点/日 = 非公告日的 4 倍(官源日历 388 条) | 全项目最强实证;年化 39 点,距 120 部署线 3× |
| 卖权溢价(VRP,指数级) | 2022+ Sharpe 仍 0.79 | 过门,待期权链数据决策 |
三个新概念:执行工程——同一策略换被动挂单(K=1 分钟甜点)省 0.13-0.27 点/回合, 是”凭空发钱”但有逆向选择上限;β 检出率曲线——v4 电池给每份判决附上”我对这个 量级的优势有多大把握看见”(H11 判决书:86.5%),从此”没通过”三个字有了刻度; 组合天花板——把互不重叠的真溢价拼起来:A∪B 在被动口径下 96 点/年、Sharpe 0.56, 距部署线只差最后一口气。单个租口都太薄,叠起来的租金第一次接近了门槛—— 这就是下一战役(正式组合族 + 跨资产宽度)的出发点,也是第 9 课多重检验纪律 最严峻的考场:拼合本身就是选择,必须预注册后用 walk-forward 重考。
附录
A. 术语速查表
| 术语 | 一句话 |
|---|---|
| tick(跳动) | 价格最小变动单位;MES = 0.25 点 = $1.25 |
| 逐笔数据 | 每笔真实成交的完整记录,市场的原始录像 |
| OHLC / K 线 | 一段时间的开/高/低/收压缩摘要 |
| delta | 主动买量 − 主动卖量(吃单方向的净值) |
| VWAP | 成交量加权平均价,”当日大资金的平均成本线” |
| 订单簿 / bid / ask | 挂单公告板 / 买一价 / 卖一价 |
| 点差 spread | 卖一减买一;市价单每次穿越都在付 |
| 滑点 | 想要的价与实际成交价的差 |
| 回合 RT | 一买一卖;佣金按回合计 |
| 基差 basis | 期货价与现货价(或两个到期月之间)的定价差 |
| 移仓 roll | 到期前把持仓/数据从旧合约换到新合约 |
| back-adjust | 拼接连续合约时平移历史段消除基差跳空 |
| RTH / ETH | 日盘(芝加哥 08:30–15:00)/ 全时段电子盘 |
| 数据块 block | 连续无空洞的数据段;持仓与指标不得跨块 |
| 未来函数 | 用”当时不可知”的信息做决策,回测大忌 |
| 样本内 / 样本外 | 开发时用的数据 / 封存到最后一考的数据 |
| walk-forward | “用过去选参、在未来执行”的滚动检验 |
| 过拟合 | 把噪音背成规律;样本内漂亮、样本外崩 |
| 多重检验 | 试得足够多总有碰巧好看的;对最优结果打折 |
| 预注册 | 看结果之前把判定门槛写死,杜绝”看完再找理由” |
| 研究台账 | 登记每个试过的假设(无论生死),是多重检验的总账本 |
| 复权(back-adjust) | 拼接连续合约时平移历史段,消除移仓造成的假跳空 |
| 贴水/升水 | 期货价低于/高于理论现货对应价;由利率与股息的相对大小决定 |
| ATR 归一化 | 把”多少 tick”换成”多少倍日均波幅”,让参数跨年代可比 |
| MCPT | 用大量随机假策略测量整套检验流程的”蒙混通过率” |
| 功效(power) | 样本量能否分辨出目标大小的效应;样本不足时”没发现”≠”不存在” |
| 桥接检验 | 用两品种重叠期并跑,单独量化品种迁移误差 |
| 期望值 | 平均每笔净赚亏,策略存在与否的判据 |
| PF 盈利因子 | 总盈利÷总亏损;扣费后 1.2–1.4 已属优秀 |
| 最大回撤 | 资金曲线峰谷最大距离 |
| 夏普比率 | 收益÷波动,衡量”赚得稳不稳” |
| memmap | 把文件当数组按需读盘,不整个载入内存 |
| Parquet / 列式 | 按列打包存储的分析格式,读快压缩好 |
| 向量化 | 用底层批量运算替代 Python 逐条循环 |
B. 常用命令
# 跑全部测试
.venv\Scripts\python.exe -m pytest -q
# 重新盘点数据
.venv\Scripts\python.exe -m scfable.inventory "..\schart\Data" --out reports
# 逐笔转 Parquet(幂等,重复跑只处理新文件)
.venv\Scripts\python.exe -m scfable.scid_to_parquet --data-dir "..\schart\Data" --out data\parquet --include "MES*.scid;ES*.scid"
# 构建 MES 连续合约 1 分钟 K 线 + 报告
.venv\Scripts\python.exe -m scfable.continuous --parquet-dir data/parquet --period 60 --out data/bars --report reports
# 查看某个 .scid 文件头和首尾记录
.venv\Scripts\python.exe -m scfable.scid "..\schart\Data\MESZ25-CME.scid" -n 5
C. 文件地图
scfable/
├── docs/初学者手册.md ← 你在这里
├── README.md 项目总览 + 决策记录 D1~D7
├── src/scfable/
│ ├── scid.py §7 解析器
│ ├── validate_tradelog.py §8 实证校验
│ ├── inventory.py §9 盘点
│ ├── scid_to_parquet.py §10 粮仓转换
│ ├── bars.py §11 K 线聚合
│ ├── continuous.py §12 连续合约(v1,分段配置)
│ ├── longhist.py §21 Databento 装载 + 成交量滚动连续合约(v2)
│ ├── wf.py §21 多年期 walk-forward 框架 + 门槛电池 v2 + MCPT
│ └── backtest.py §13 回测引擎
├── tests/ 每个部件的"考卷"
├── scripts/ 研究/分析脚本(orb_stage2、ibkr_analyze 等,可复现)
├── reports/ 盘点/校验/面板报告 + research_journal.md 研究台账(入库)
└── data/ Parquet 与 K 线缓存(不入库)
D. 决策记录索引
| 编号 | 决策 | 详见 |
|---|---|---|
| D1 | 2026-04→07 封存为最终样本外 | README |
| D2 | 内部 UTC;SC 显示时区实证为 UTC+8 | README + §8 |
| D3 | 资金范围 1 手 MES | README + §18 |
| D4 | 成本模型:$1.40/RT + 1 tick 滑点 + 限价须穿价 | README + §13 |
| D5 | 只用官方来源数据 | README |
| D6 | 旧 GPT 策略作废 | README |
| D7 | 开发窗 2025-03→12;holdout 2026-01→03 每族一次 | §16 |