成为新会员获取本项目完整教程资料

加入会员群

摘要内容缺失

本项目完整教程资料

下载教程资料
封面
摘要:痛点——外汇市场流动性极高、信息连续流动,方向型策略难以持续获得超额收益,简单均值回归在市场结构切换时误信号多、回撤深。方法——本文基于 7 个美元主要货币对的 15 分钟行情构建 Z-score 统计套利框架,Logistic 回归做入场过滤、Ridge 回归做幅度预测,13 维特征,滚动前向 40 天训练、5 天测试、17 折检验。结果——等权组合样本外总收益 3.98%、年化 12.28%、超额夏普 1.29、最大回撤仅 3.12%;模拟盘实盘运行 12 个决策周期,产生真实成交。价值——为低风险偏好资金提供可复制的外汇相对价值策略模板,文末教程教你把整条流水线封装为可交互 Agent。

关键词:统计套利;均值回归;Z-score;Logistic回归;Ridge回归;滚动前向检验;外汇量化

Keywords: statistical arbitrage; mean reversion; z-score; logistic regression; ridge regression; walk-forward backtesting

一、研究背景与痛点:外汇市场为什么需要统计套利

外汇市场高效率让传统方向型策略很难持续获得超额收益,市场中性、相对价值类方法因此受到重视。统计套利依赖协整或高相关资产之间的均值回复行为,在外汇场景里,通常表现为交易两条经济上联动的货币对之间的价差。但简单的距离法或线性均值回归,容易在市场结构切换时产生误信号和明显回撤。

本文的做法是把传统统计指标与 Logistic、Ridge 回归结合:Z 分数仍然决定交易方向,机器学习输出用来校准入场信念与仓位大小,让策略在保持可解释的同时用机器学习优化入场强度。整个项目在 7 个美元主要货币对上,用 15 分钟行情和严格的滚动前向检验验证样本外表现,并完成模拟盘环境的自动化实盘 部署 。本文将我们的统计套利建模经验封装为一个对话式AI Agent和可复用的skill。

本文完整代码、数据与配套AI Agent、skill请阅读原文链接获取。

全文回答的核心问题有三个:候选价差的均值回复是否足够稳定;机器学习输出是否在 Z 分数之外提供了增量信息;扣除交易成本、考虑市场状态变化后,策略表现是否仍有经济意义。



二、技术方案总览:Z-score均值回归与双模型增强架构

方案一句话概括:Z 分数决定方向,两个线性模型调整信念与仓位。Sarmento 和 Horta(2020)证明在配对交易上加一层分类模型能提升信号准确度与风险调整后收益,这是用 Logistic 回归估计回复概率作为入场过滤的理论依据。Gu、Kelly 和 Xiu(2020)验证了惩罚回归处理高维金融数据的有效性——Ridge 回归能在训练时抑制过拟合,支撑用它预测下一根K线的价差变化幅度。Neufeld 等(2024)指出稳健的统计套利必须适应市场状态切换,这与选择滚动前向检验框架的思路一致。

打个比方,Z 分数像温度计,只告诉你”现在偏热还是偏冷”;Logistic 回归像老医生,结合病史判断”这次发烧会不会自己退”;Ridge 回归则估计”大概多久退烧”。三者结合,决策质量自然高于只看温度计。完整流水线为:数据准备 → 价差构造与 Z 分数标准化 → 特征工程(13 维)与标签构造 → Logistic/Ridge 双模型 → 滚动前向检验(17 折)→ 配对筛选(21 选 2)与等权组合 → 模拟盘实盘部署,详见文末附录 A。

三、数据来源与预处理:15分钟K线行情数据

本文使用的外汇行情数据由拓端团队整理核对,全部内容真实有效。

  • 数据名称:美元主要货币对 15 分钟行情数据(FX 15-minute OHLC data)
  • 数据量:7 个货币对 × 约 17,280 根 K 线,合计约 12 万条报价记录
  • 字段:时间戳、开盘价、最高价、最低价、收盘价
  • 数据来源:某外汇交易平台的模拟盘行情接口,由拓端团队整理
  • 时间跨度:180 个自然日(截至 2026 年 4 月 6 日)
  • 区域跨度:全球外汇市场,覆盖欧元、英镑、澳元、纽元、日元、加元、瑞郎兑美元七个主要货币对
  • 数据格式:CSV 宽表(对齐时间戳后)
  • 数据简介:数据为 15 分钟级 OHLC 行情,经时间戳对齐与缺失剔除后形成干净的宽表价格矩阵,既支持价差构造与 Z 分数计算,也支持机器学习特征拼接
  • 本数据可支撑的主题实证研究:一是外汇价差均值回归特性检验;二是机器学习信号过滤对交易质量的提升评估;三是滚动前向框架下的策略稳健性分析;四是交易成本与持仓周期的敏感性研究
  • 数据指标:对数价差、滚动 Z 分数、滚动波动率、双腿收益率差、回复概率(模型输出)、预期价差变化(模型输出)
外汇统计套利项目的15分钟K线数据样例与预处理结果

滚动前向配置如下:

参数数值
标的7 个美元主要货币对
数据周期180 天
数据频率15 分钟 K 线
训练窗口40 天(3840 根)
测试窗口5 天(480 根)
步长5 天
每日K线数约 96 根
样本外折叠数17

每个折叠里,模型用前 40 天训练、后 5 天检验,然后整个窗口前移 5 天重复,最终得到 17 个互不重叠的样本外窗口。

四、核心模型设计:Logistic入场过滤与Ridge幅度预测

策略核心是价差的均值回复:先构造两条价格序列的对数价差,再用滚动 Z 分数标准化。当价差偏离近期均值足够远,就预期它向均衡回复。每个训练折叠拟合两个模型:Logistic 回归估计下一根K线价差发生回复的概率,Ridge 回归预测下一根K线价差变化幅度。模型使用 13 维特征,包括当前 Z 分数、近期价差变化、滚动波动率、双腿收益率差、小时级时间特征等。Z 分数决定方向,机器学习输出调整信念与仓位——策略保持可解释,同时用机器学习细化入场强度。

第一轮对话:基础信号构建

背景:我在做外汇价差均值回归策略,数据是7个美元主要货币对的15分钟K线,共180天。已构造对数价差并用64期滚动均值方差标准化出Z分数。 目标:请帮我用 Python 写出信号生成模块,当价差偏离足够大时产生开仓方向。 约束:滚动窗口统计量避免前视偏差;阈值参数化便于后续调参;不依赖复杂深度学习框架。

交易规则上,只有当 Z 分数绝对值大到指示显著偏离时才开仓,同时刻意回避极端观测——极端偏离往往反映市场不稳定而非正常均值回复:

规则阈值
开仓z
加仓(更大仓位)z
平仓z
止损z
极端Z过滤z
最长持仓16 根K线

机器学习信号用于缩放仓位,最终信号设上限以控制敞口。一个容易忽视的实操细节:仓位在收益计算前整体后移一根K线——t 时刻产生的信号从下一根开始生效,比”当根成交”的假设更贴近现实。交易成本按换手率计,每次仓位变动 0.5 个基点。

第二轮对话:加入机器学习过滤

背景:基础Z分数策略回测能跑通,但假信号偏多,结构性行情切换时回撤明显。特征矩阵已备好13列。 目标:在原有信号上加一层机器学习确认——用Logistic回归估计回复概率做入场过滤,用Ridge回归预测下一根价差变化做幅度确认。 约束:模型只用训练窗口数据拟合;输出概率与幅度用于缩放仓位而非决定方向;保留sklearn默认接口。

五、回测设置:滚动前向检验框架

每个候选价差严格执行同一流程:用历史序列构造特征;只在 40 天训练窗口上拟合 Logistic 与 Ridge;对随后 5 天测试窗口生成预测;在测试窗口上跑回测;分别记录样本内与样本外结果。全部互不重叠的测试折叠拼接成一条连续的样本外净值曲线——报告的业绩数字全部来自未见过的数据。

外汇市场行为随时间变化,单一训练-测试切分容易产生误导,滚动前向让策略在多个短市场状态下接受检验,结论更可靠。

此处根据原文逻辑补充:原文报告给出的是规则与结果,完整的逐折决策循环为便于讲解由我们补写,与文末配套工程的可运行代码一致。

配对筛选环节,7 个工具两两组合出 21 个候选价差,全部走同一套滚动前向框架。排序主要看样本外超额夏普,并对成交次数充足者小幅加分——避免选中”只靠极少量观测撑起漂亮指标”的价差。最终选出两个组合:英镑/纽元(GBP/USD vs NZD/USD)与纽元/加元(NZD/USD vs USD/CAD)。两者在回测窗口内样本外表现最强、最稳,其余价差要么超额夏普偏弱、要么收益曲线不稳定,说明均值回复在全美元主要货币对中并非普遍成立。

六、测试结果与对比:外汇统计套利样本外表现

外汇统计套利GBP/USD vs NZD/USD样本外价格、价差、Z分数与净值四联图
外汇统计套利NZD/USD vs USD/CAD样本外价格、价差、Z分数与净值四联图

把两只入选价差等权合成组合后,样本外总收益 3.98%、年化 12.28%,相对 4.5% 无风险基准的超额收益 7.78%;年化波动 6.04%,原始夏普 2.03、超额夏普 1.29;最大回撤 3.12%。纽元/加元贡献更高收益(总收益 4.74%、年化 14.72%),但波动与回撤也更深;英镑/纽元更稳(年化波动 4.46%、最大回撤 1.68%)。两者组合后分散效应明显,组合级收益曲线更平滑。

外汇统计套利等权组合样本外净值曲线、回撤与滚动夏普三联图
指标英镑/纽元纽元/加元等权组合
总收益3.15%4.74%3.98%
年化收益9.62%14.72%12.28%
超额收益(对4.5%基准)5.12%10.22%7.78%
年化波动4.46%10.09%6.04%
夏普(原始)2.151.462.03
夏普(超额)1.151.011.29
最大回撤\-1.68%\-5.92%\-3.12%
卡玛比率5.722.493.93
有效活跃K线占比45.38%46.05%47.59%
入场/出场事件数1,1781,1422,320

滚动前向框架天然支持折叠级对比:同一折里,样本内表现普遍强于样本外,测试折间波动更大——策略应用到未见数据时存在正常的性能衰减。但两只入选价差的样本外超额夏普仍达 1.15 和 1.01,等权组合 1.29。这说明策略并非纯过拟合驱动:衰减存在,但逻辑在滚动市场状态下依然成立。

GBP/USD vs NZD/USD分折样本内外超额夏普对比柱状图
NZD/USD vs USD/CAD分折样本内外超额夏普对比柱状图

以 4.5% 年化无风险利率为基准,等权组合样本外总收益 3.98%、年化 12.28%,超额收益 7.78%,超额夏普 1.29——策略在跑赢基准的同时把波动控制在温和水平。

七、局限性与失败分析

实盘结果印证了系统架构与均值回复假设的可行性:实时运行、正确成交、会话正收益,统计信号与机器学习确认的结合让交易并非纯噪声驱动。但以下局限必须正视,全部基于原文事实:

  1. 交易频率低:实盘会话仅 3 次入场、2 次出场,保守入场机制约束了收益弹性与资金利用率。
  2. 单笔盈利幅度小:当前阈值与模型预测可能未捕捉到足够强的价差偏离,”重精度、轻频率”的配置限制了资金效率。
  3. 评估窗口短、统计意义有限:实盘会话仅 12 个决策周期(约 2 小时 46 分钟),回测窗口 180 天、17 折,未覆盖更长时间尺度的趋势市与震荡市等不同状态;12 周期的小样本结果不具备统计显著性。
  4. 分散不足:实盘只用了 2 个价差组合,存在单一价差风险;回测的等权组合也仅由 2 只价差构成。
  5. 归因受限:会话开始时账户已带有既有持仓,+2.06 美元的净值变动不能全部归因于策略新增交易,本次实盘定位为运行验证而非盈利证据。
  6. 成本模型简化:回测按每次仓位变动 0.5 个基点计成本,未模拟滑点与流动性冲击。
  7. 会话时长细节:实际会话略低于名义 3 小时——程序只在完整 15 分钟周期上评估,不足一个周期就不启动,最终覆盖 12 个完整决策周期。

八、系统实现与落地:从回测到实盘

实时系统是一台自动化的机器学习辅助配对交易机器人:识别两条相关货币对之间的临时偏离,赚取价差均值回复的钱。账户凭证通过环境变量在运行时注入,不写入任何代码与材料,保证安全。

本次实盘会话交易两只价差:欧元/英镑(EUR\_USD/GBP\_USD)与澳元/纽元(AUD\_USD/NZD\_USD)——部署窗口内偏离最清晰、信号最可操作的两对。决策周期 M15,每 15 分钟用最新 K 线评估一次市场,每 900 秒轮询一次,默认下单 10,000 单位,实际手数随信号强度缩减。

值得注意的是,回测选出的最强组合(英镑/纽元、纽元/加元)并没有被机械搬进实盘。实时系统监控的是部署窗口内当下最突出的机会——历史上最优的价差,未必是短实盘窗口里最活跃的价差。回测负责验证策略框架,实盘负责验证同一套逻辑能在实时机会上运行。

系统假设两条腿的对数价差均值回复。每个周期拉取最新 300 根 M15 K线,计算价差的 64 期滚动均值与标准差,得到 Z 分数;同时构造 13 维特征向量(当前 Z 分数与偏离距离、多周期价差收益、双腿收益率差、滚动波动率、小时周期特征),供两个 预训练 模型推理——Logistic 估计回复概率,Ridge 预测价差变化幅度。统计框架给出交易设定,机器学习作为附加确认层。

提示词:实盘信号与仓位管理

背景:回测验证通过,现在要把策略部署到模拟盘,15分钟决策一次,每天轮询。 目标:写出实盘信号生成与下单手数管理模块,统计条件与ML条件双确认才开仓。 约束:开仓概率阈值0.48、开仓|z|≥0.7;|z|≥1.3用满1万手,0.7-1.3之间缩到6000手;平仓|z|<0.3,止损|z|>3.5;全部用fill-or-kill订单防单腿成交。

信号生成与执行上,只有统计与机器学习条件同时满足才生成信号:价差偏离足够大(|z| ≥ 0.7),且 Logistic 给出至少中等的回复概率(> 0.48)。方向由价差的 Z 分数符号决定——Z 为正做空价差(空第一条腿、买第二条腿),Z 为负做多价差。|z| ≥ 1.3 用满 10,000 单位基础手数,0.7 到 1.3 之间缩到 6,000 单位。平仓两条件:回复到位(|z| < 0.3)止盈,或继续发散(|z| > 3.5)止损。若持仓期间出现反向有效信号,先平当前仓、稍候再开新仓。

风险管理上,除统计止损外,系统强制最长持仓 16 根K线(M15 下即 4 小时),到期无论盈亏一律平出,防止资金困在迟迟不回复的仓位里。所有市价单用 fill-or-kill 提交——配对交易里单腿成交会留下不想要的方向敞口,必须杜绝。每次生成新信号前,系统直接向经纪商核验实际持仓,避免内部状态与真实仓位不一致。每个 15 分钟周期结束后,账户余额与累计收益追加写入 CSV 权益日志;终端同步显示当前 Z 分数、模型回复概率、预期价差变化、未实现盈亏与估算净值。

提示词:实盘验证与绩效日志

背景:系统已在模拟盘部署完成,接下来跑一次完整的实盘会话验证。 目标:设计绩效记录模块——每周期追加权益日志,会话结束输出净值变化、成交统计与结论。 约束:日志落CSV;区分”策略新增交易”与”账户既有持仓”的盈亏归属;输出要求包含未平仓位说明。

记录在案的会话覆盖约 2 小时 46 分钟(2026 年 4 月 10 日 11:08 至 13:54 UTC),共 12 个连续的 15 分钟决策周期。期间系统产生真实入场与出场交易——这正验证了实盘要求的核心目标:策略能在实时环境产生可执行信号、通过经纪商接口自动交易,而不只是回测原型。

外汇统计套利实盘12周期净值、盈亏与无风险基准对比图

12 个周期内,净值从 100,045.74 美元增至 100,047.79 美元,变动 +2.06 美元(+0.0021%)。由于会话开始时账户已带有既有持仓,这段变动不能全部归因于策略新增交易,因此本次会话定位为运行验证而非盈利证据。成交日志显示 3 次入场、2 次出场,会话结束时留有 1 个未平价差仓位。

净值走势呈现典型的均值回复交易形态:多数信号检查周期因入场条件未全部满足而保持观望,交易频率有限;触发交易时对短期价差波动敏感。会话盈亏 +2.06 美元——实盘交易略有盈利但幅度有限,利润主要来自小幅均值回复而非趋势性行情。当前阈值配置明显偏向”重精度、轻频率”,信号质量上去了,资金效率却受限。

九、配套工具与资源:把流水线做成可交互Agent(附教程)

看完回测与实盘验证,你可能会想亲手试一试:调一调阈值、换一只价差组合、重跑一遍滚动前向检验。以下教程教你如何把本文的分析流程封装成可交互的Agent——无需修改任何源码,拖动滑块即可完成全部验证,工程与样例数据随文末资源一同提供。

本教程教你把这篇外汇统计套利文章里的「Z-score 均值回归 + Logistic/Ridge 机器学习过滤 + 滚动前向检验」流水线,改造成一个读者自己就能跑起来、点点鼠标就能换参数重跑回测的 Streamlit 可交互 Agent。

9.1 为什么要做成 Agent

一篇量化研究报告,哪怕写得再细,本质上是一张”静态照片”:参数写死在代码里,读者想验证”开仓阈值从 0.9 调到 1.1 会怎样”,就得读懂全部源码、自己改代码、自己重跑。大多数人卡在第一步就放弃了。

做成可交互 Agent 之后,同一套流水线变成了”活的游戏机”:拖滑块改阈值、点单选换货币对、结果实时刷新。一句话对比:

原来的静态报告做成 Agent 后
改参数读懂源码、手动改代码再重跑侧栏拖滑块,秒级重跑
换标的替换数据文件路径单选按钮一键切换
理解策略通读全文界面五区块按序自解释
验证鲁棒性自己写验证脚本调参即验证
Streamlit 页面整页全景——左侧参数面板(6 个滑块/开关),右侧从上到下依次是标题”外汇统计套利·机器学习增强演示 Agent”、①数据(单选按钮 GBP/USD vs NZD/USD 选中、10061 根 15 分钟 K 线说明、价差走势蓝色曲线图)、②Z 分数信号(振幅 ±4 的蓝色曲线图)、③机器学习过滤器(Logistic 平均回撤概率 0.533 与 Ridge 下一根价差变化均值两个指标卡)

9.2 拆解原文流水线

原文的流水线一共五环,每一环的输入输出都很清晰,这正是能封装成 Agent 的前提:

  1. 数据层:7 个美元主要货币对、180 天、15 分钟 K 线(每天 96 根),合成对数价差 spread = log(腿A) - log(腿B),再用 40 根滚动窗口算 Z 分数。
  2. 特征层:用 Z 分数及其衍生统计量做特征——当前 z、z 的一阶差分、5/20 期滚动均值、20 期滚动波动率、价差 5 期动量,共 6 列。
  3. 标签层:回归目标 = 下一根 K 线价差变化;分类目标 = “Z 分数方向与下一根变化方向相反”(即发生均值回复)。
  4. 模型层:Logistic 回归估计”会回复”的概率,作入场过滤器;Ridge 回归预测下一根价差变化幅度,作幅度确认。
  5. 回测层:滚动前向检验——40 天训练、5 天测试、步长 5 天,全样本期共 17 个样本外折叠。

原文给出的关键数据事实(教程、代码默认值、样例数据三处都与它对齐):

项目数值
标的7 个美元主要货币对
数据周期180 天,15 分钟 K 线
每日 K 线数约 96 根
训练窗口40 天 = 3840 根
测试窗口5 天 = 480 根
步长5 天
样本外折叠数17
开仓阈值z
加仓阈值z
平仓阈值z
止损阈值z
极端 Z 过滤z
最长持仓16 根 K 线
无风险基准年化 4.5%

样本外真实结果(等权组合):总收益 3.98%、年化 12.28%、超额收益 7.78%、年化波动 6.04%、原始夏普 2.03、超额夏普 1.29、最大回撤 \-3.12%、卡玛 3.93、入场/出场事件 2320 次。

9.3 目标形态

Agent 用 Streamlit 单页实现,五个区块从上到下,对应流水线五环:

  1. ① 数据:单选按钮切换两只价差组合(GBP/USD vs NZD/USD、NZD/USD vs USD/CAD),主区显示价差走势图。
  2. ② Z 分数信号:整段 Z 分数曲线 + 阈值说明行。
  3. ③ 机器学习过滤器:Logistic 平均回撤概率、Ridge 预测均值两个指标卡,开关可一键启停过滤器。
  4. ④ 滚动前向回测:净值曲线 + 绩效汇总表(总收益/年化/波动/夏普/回撤/卡玛)。
  5. ⑤ 交易事件与结论:折叠数、成交笔数、最大回撤三个指标卡 + 分折 PnL 柱状图 + 成交明细表 + 口径说明。

左侧栏是参数面板:开仓/加仓/平仓/止损四个阈值滑块、最长持仓滑块、机器学习过滤器开关。交互顺序:左侧调参 → 右侧自动整页重算。

左侧参数面板特写——”⚙️ 参数面板”标题下依次是开仓阈值滑块(0.90)、加仓阈值滑块(1.30)、平仓阈值滑块(0.50)、止损阈值滑块(3.20)、最长持仓滑块(16)、”启用机器学习过滤器(Logistic + Ridge)”开关(开启状态),底部灰色小字”默认参数与项目报告 Table 1 一致”

9.4 环境与安装

Python 3.13 实测可用(Streamlit 1.64 + scikit-learn 1.9.1)。建议独立虚拟环境(以代码包实际接口为准):

终端窗口渲染图——标题栏”安装与启动 streamlit”,黑底白字依次显示 venv 创建、pip install 成功安装 streamlit-1.64.0 scikit-learn-1.9.1 pandas-3.0.6 numpy-2.5.3 等包、streamlit run app.py 后出现 “You can now view your Streamlit app in your browser” 与 Local URL: http://localhost:8642

启动:

浏览器打开 http://localhost:8642 即可。

9.5 数据准备

CSV 两列核心字段:pair_leg_a、pair_leg_b(价差组合两条腿的中间价),外加一列 time。Agent 读取后自动补算对数价差与 Z 分数,不需要手工预处理。

没有真实行情数据也能完整体验:工程自带 gen_sample_data.py,用 OU 均值回复过程合成 105 个交易日 × 96 根/日的 15 分钟行情(前 40 天留作首个训练窗,余下可切 13 个测试窗),并在中段人为放大一次偏离,让 Z 分数信号有事可做。生成后放 data/ 目录即可。

注意:演示数值与原报告(3.98% 总收益等)来自不同数据与成本模型,不可直接对比;app 界面底部有同样的口径说明,避免误读。

9.6 骨架搭建

Streamlit 的正确姿势是”侧栏控件 → 主区渲染”两段式:所有 st.slider/st.toggle 放侧栏,主区代码直接引用控件值——任何参数变化都会触发整页自动重跑,不需要手写回调。

骨架三行就位:

再加数据缓存,避免每次交互都重新读 CSV:

9.7 核心模块逐个实现

数据层:对数价差 + 滚动 Z 分数

40 根滚动窗口对齐原报告”40 天训练窗口”的口径(演示数据频率下窗口取 40 根,实盘 15 分钟频率即 3840 根):

为什么用滚动窗口而不是全样本均值:全样本 Z 分数会把”未来”泄露进”过去”,滚动窗口才是可实盘的信号。

特征层与标签层

模型层:Logistic 过滤 + Ridge 幅度

为什么两个线性模型就够:原报告的结论正是”可解释模型 + 好特征”在 15 分钟级外汇上稳定有效;上线快、不易过拟合,也方便在 Agent 里实时重训。

回测层:滚动前向检验

深色代码编辑器风格渲染图——标题栏”app.py · 滚动前向检验核心 walk\_forward()”,Monokai 配色展示 walk\_forward 函数源码,可见 while start + fold\_len <= n 主循环、LogisticRegression/Ridge 训练、测试窗口内逐根决策、entry/exit/stop 阈值判断与 equity 累计
此处根据原文逻辑补充:完整的逐根状态机(仓位/持仓计数/窗口末强平)与成本模型为演示实现,原文报告只给出规则与结果。上面这段是讲解用骨架,完整可跑版本随配套工程提供。

绩效层

年化天数用 365(外汇全年交易)、波动按日聚合再 ×√252,与原报告口径一致。

9.8 参数怎么调

参数默认调大调小
开仓阈值 entry\_z0.9信号更少更保守,成交笔数下降信号更多,但假信号增加
加仓阈值 add\_z1.3加仓更罕见,单笔风险集中更早加仓,摊薄成本但放大敞口
平仓阈值 exit\_z0.5持仓更久,吃足回复但回吐风险大快进快出,成本占比上升
止损阈值 stop\_z3.2止损更松,单笔亏损可能很深止损更紧,频繁止损打断回复
最长持仓 max\_hold16 根给慢回复更多时间强制快平,避免资金占用

两条红线:

  1. 开仓阈值必须小于加仓阈值,否则加仓逻辑永远不触发。
  2. 极端 Z 过滤(|z|>4.5 跳开仓)不能关——极端偏离往往不是”更好的机会”而是结构性行情切换,回复概率失真。

机器学习过滤器的开关是对照组设计:关掉它重跑,就是”纯 Z 分数基线”;开着跑,是”ML 增强版”。两组对比恰好回答原文的核心问题——ML 层有没有提升决策质量。

页面 ④滚动前向回测区块——左侧”净值曲线 NAV”蓝色曲线从 1.0 平稳走势,右侧”绩效汇总”表格 8 行(总收益率 0.70%、年化收益率 2.48%、年化波动率 1.24%、夏普比率(原始) 1.99、超额收益(对 4.5% 无风险) -2.02%、超额夏普 -1.63、最大回撤 -0.13%、卡玛比率 19.44)
页面 ⑤交易事件与结论区块——顶部三个指标卡”回测折叠数 OOS folds 12 / 成交笔数 Trades 160 / 最大回撤 Max Drawdown -0.13%”,下方分折 PnL 蓝色柱状图(12 根柱、有正有负),再下方成交明细表(fold/pnl/hold/z\_entry 四列,可见 0.0022/4/0.9 等行),底部蓝色提示框写明口径说明(合成数据教学演示,报告数字来自 180 天真实行情 17 折检验)

9.9 可测试页面版本

完整工程就四个文件:

一条命令跑起来:

app.py 完整源码(约 250 行,含六模块五区块,默认值与 9.2 节数据事实逐条对齐)随工程文件提供,此处不再整页贴出;核心函数 walk_forward() 已在 9.7 节展示。

第二只价差组合的完整验证(NZD/USD vs USD/CAD,165 笔成交、总收益 1.11%、原始夏普 4.24):

切换到 NZD/USD vs USD/CAD 后的整页——①数据区单选按钮第二项选中、价差曲线围绕 -0.2 波动,③机器学习过滤器 Ridge 均值为 -0.000001,④绩效汇总表显示总收益率 1.11%、年化收益率 3.92%、夏普比率(原始) 4.24、最大回撤 -0.31%,⑤指标卡显示 12 折/165 笔/-0.31%

9.10 教程小结与扩展

把一条量化研究流水线封装成可交互 Agent,方法论就四步:

  1. 拆模块:把”数据→特征→标签→模型→回测”拆成输入输出清晰的函数,每个函数单独可测。
  2. 定控件:把研究里的每个”手改数字”映射成侧栏控件(阈值→滑块、标的→单选、开关→toggle)。
  3. 串流程:主区按流水线顺序渲染五区块,参数变化自动整页重算。
  4. 留红线:口径说明写进界面(演示数据 vs 真实回测不可比)、极端过滤不许关、阈值约束在文档里写明。

原文局限 ↔ Agent 扩展对照:

原文局限Agent 里的扩展方向
参数固定,只有一组结论滑块即时重跑,参数敏感性自己就能扫
只验证两只最佳价差单选切换组合,扩展数据文件即可覆盖 7 对
成本模型简化把成本滑块化,敏感度一目了然
17 折样本外仅一份报表折叠数/窗口长度参数化,做滚动稳健性检查

一句话收束:Agent 化的价值不在界面,而在”把别人的结论变成自己的验证”——每个读者调完参数看到的数字,都是一次独立的样本外检验。

十、结论与展望

10.1 核心问题与解决方案

  1. 问题一:机器学习层能否提升外汇均值回归策略的决策质量? 解决方案:Z 分数决定方向、Logistic 回归估计回复概率做入场过滤、Ridge 回归预测变化幅度确认信念。滚动前向 17 折检验下,等权组合样本外超额夏普 1.29、最大回撤 3.12%,显著优于单一线性均值回归在结构切换期的表现。
  1. 问题二:如何保证回测结论可信、不靠前视偏差粉饰? 解决方案:严格滚动前向框架——40 天训练、5 天测试、步长 5 天,测试折叠互不重叠并拼接为连续样本外曲线;信号后移一根K线生效,成本按 0.5 基点换手计入。
  1. 问题三:回测策略如何走向真实交易? 解决方案:模拟盘全自动化部署——15 分钟决策周期、双模型确认开仓、fill-or-kill 防单腿成交、最长持仓 16 根K线强制退出、每周期权益日志落盘。实盘 12 个周期产生真实成交,完成运行验证。

10.2 技术创新与业务价值

  1. 技术创新:可解释统计信号(Z 分数)与两个线性机器学习模型(Logistic、Ridge)的组合架构——机器学习只调信念与仓位、不抢方向决定权,兼顾可解释性与数据驱动的精度。
  2. 业务价值:组合样本外年化 12.28%、超额夏普 1.29、回撤 3.12%,为低风险偏好的资金提供了可复制的外汇相对价值策略模板;实盘验证部分证明了同一套逻辑可直接部署于自动化交易。
  3. 可复用价值:从数据处理、特征工程、模型训练、滚动前向回测到实盘执行、绩效监控的完整链路均已封装,读者可按第九节教程复现为自己的可交互系统。

展望层面,更长评估窗口、更多价差组合分散、成本敏感性与滑点建模,是这一框架自然的下一步——第九节的参数化 Agent 已经把这些扩展入口预留好了。

附录A:全文脉络与项目结构

        数据准备(7个货币对,15分钟K线)              |              v        价差构造与Z分数标准化              |              v     特征工程(13维特征) + 标签构造              |+------+------+       |             |       v             v  Logistic回归    Ridge回归  (回复概率过滤)   (幅度预测)       |             |+------+------+              |              v     滚动前向检验(40天训练,5天测试,17折)              |              v      配对筛选(21选2)与等权组合              |              v    模拟盘实盘部署(12个决策周期)

以代码包实际接口为准):

常见问题FAQ

Q1:什么是外汇统计套利?为什么用均值回归? A:外汇统计套利是交易两条经济上联动的货币对之间价差的市场中性策略。价差围绕均衡波动,偏离后倾向回复,均值回归正是捕捉这一行为;本文用滚动 Z 分数度量偏离程度,|z| ≥ 0.9 开仓、|z| < 0.5 平仓。

Q2:为什么在 Z-score 之外还要加 Logistic 和 Ridge 两个机器学习模型? A:Z 分数只反映偏离程度,无法区分”即将回复的正常偏离”与”结构切换的开端”。Logistic 回归用 13 维特征估计回复概率做入场过滤(>0.48 才开仓),Ridge 回归预测下一根价差变化做幅度确认;机器学习只调信念与仓位、不抢方向决定权,保持可解释。

Q3:滚动前向检验(walk-forward)为什么比单次训练-测试划分更可信? A:外汇市场行为随时间变化,单一划分容易偶然命中某个市场状态。滚动前向用 40 天训练、5 天测试、步长 5 天,17 个测试折互不重叠并拼接为连续样本外曲线,每折评估都只用当时可得的信息,从设计上压缩前视偏差。

Q4:这套策略的样本外成绩到底如何? A:等权组合 17 折样本外总收益 3.98%、年化 12.28%、对 4.5% 无风险基准超额收益 7.78%、原始夏普 2.03、超额夏普 1.29、最大回撤 -3.12%、卡玛 3.93;两只入选价差样本外超额夏普分别 1.15 和 1.01。

Q5:GBP/USD vs NZD/USD 和 NZD/USD vs USD/CAD 是怎么从 21 个候选里选出来的? A:7 个货币对两两组合共 21 个候选价差,全部走同一套滚动前向框架,按样本外超额夏普排序并对成交次数充足者小幅加分(避免极少量观测撑起的虚高指标),最终这两只表现最强、最稳。

Q6:回测选出的最优价差,为什么实盘却交易 EUR\_USD/GBP\_USD 和 AUD\_USD/NZD\_USD? A:实盘监控的是部署窗口内当下最突出的机会——历史最优价差未必是短实盘窗口里最活跃的价差。回测负责验证策略框架,实盘负责验证同一套逻辑能在实时机会上运行。

Q7:实盘盈利 +2.06 美元是不是太少了? A:本次实盘定位是运行验证而非盈利证据:12 个决策周期、3 入 2 出、约 2 小时 46 分钟,且账户初始自带既有持仓,盈亏不能全部归因于策略。低频率、小盈亏反映”重精度、轻频率”的保守阈值配置。

Q8:机器学习过滤器可以关掉吗? A:可以,且这正是对照组设计:关掉重跑即”纯 Z 分数基线”,开着跑是”ML 增强版”,两组对比回答 ML 层有无增量价值。但极端 Z 过滤(|z|>4.5 跳开仓)不能关——极端偏离常是结构切换而非机会。

Q9:调参有哪些红线? A:两条:开仓阈值必须小于加仓阈值(否则加仓永不触发);极端 Z 过滤不能关闭。其余参数(平仓、止损、最长持仓)可在配套 Agent 里滑块化扫描敏感性。

Q10:怎么自己跑一遍这套系统? A:按第九节教程:Python 3.13 + Streamlit 1.64 + scikit-learn 1.9.1,pip install streamlit scikit-learn pandas numpy 后 streamlit run app.py --server.port 8642 即可;工程含合成样例数据生成器,无真实行情也能完整体验。完整代码、数据与配套 AI Agent 、skill 通过文末入口获取。

Q11:演示 Agent 里的 0.70% 总收益和报告的 3.98% 为什么对不上? A:演示用 OU 过程合成数据(105 个交易日)与简化成本模型,仅用于教学验证流程可跑通;报告数字来自 180 天真实行情、17 折滚动前向检验。两者口径不同,不可直接对比,Agent 界面底部也有同样的口径说明。

Q12:这套方法对其他市场(如加密货币、股票配对)适用吗? A:方法论可迁移(价差构造→Z 分数→ML 过滤→滚动前向),但原文仅在美元主要货币对的 15 分钟行情上验证,其他市场的有效性原文未提供实测数据,需读者自行检验。

作者声明与资源获取

作者系外汇量化与机器学习方向分析师,拥有多年数据挖掘与策略回测经验。本文所有业绩数字均来自原文报告的滚动前向回测与模拟盘实盘记录,未做任何外推或夸大。

如果不想自己搭建环境,也可以直接体验我们封装好的演示版Agent:打开演示链接即可在线调参运行,或通过公众号原文底部入口订阅获取完整工程、数据与skill。

本文完整代码、数据与配套AI Agent、skill请阅读原文链接获取。
相关技术文章图片

ChatGPT 大模型荐股与夏普比率投资组合优化系统实现|附agent、数据、教程文档

Python 中国证券成分股波动率量化:ARIMA-随机森林预测、MPT投资组合优化、四维评价体系与动态仓位策略。

探索观点

参考文献

  1. Sarmento, R. M., & Horta, N. C. (2020). Enhancing a pairs trading strategy with the application of machine learning. PhD thesis, Universidade de Lisboa.
  2. Gu, S., Kelly, B., & Xiu, D. (2020). Empirical asset pricing via machine learning. The Review of Financial Studies, 33(5), 2223–2273.
  3. Neufeld, A., Sester, J., & Šiška, D. (2024). Adversarial training of reinforcement learning agents for pairs trading. Mathematical Finance.

(正文10)当然,航天产业的快速发展也面临挑战。太空垃圾问题日益严峻——地球轨道上目前有约3.4万块直径超10厘米的太空碎片,碰撞风险每五年增加一倍;太空资源开发的法律框架仍不明确,各国在月球采矿权等问题上存在分歧;而技术标准的不统一则导致不同卫星系统间的兼容性问题。解决这些挑战需要全球协作:2024年生效的《阿尔忒弥斯协定》已得到33个国家签署,为月球资源利用确立了基本原则;欧洲太空局的”太空清扫者”任务计划在2026年捕获并移除一块大型太空碎片,开创主动清理轨道的先河。