统计套利:用掉期赚稳健收益
基于多货币对相关的低频EA策略详解
什么是统计套利交易策略
统计套利交易策略是一种多货币对交易方法,核心并非传统意义上的无风险套利,而是借助不同货币对之间的正相关性以及正掉期率,来构建相互对冲价格变动风险的仓位组合。该策略假设货币对价格长期会向正掉期率方向变动,且以同为基础货币报价的货币对存在统计正相关,从而可用反向仓位抵消不希望出现的价格波动。它属于低频策略,不需要高频盯盘,也不依赖VPS常驻,只需偶尔关注统计与新闻。
与纯粹的方向性交易不同,统计套利不赌单一货币对涨跌,而是通过数学建模将多个工具组合,使得无论价格短期向哪个方向走,组合的平均日盈利都能被公式锁定。当然,这种锁定是基于历史数据统计,并非未来保证,因此策略同时要求所有涉及货币对的掉期率为正,以在价格假设失效时仍能靠利息差获利。
套利交易与掉期率基础
套利交易(Carry Trade)本质是基于正掉期率获利的策略。外汇交易中,一国央行贴现率决定该货币吸引力,两种货币贴现率之差转换为掉期率。买入高息货币、卖出低息货币,持仓过夜可获正掉期。给定杠杆下,正掉期收益诱人,但杠杆双刃:若价格反向运动,亏损可能超过未来掉期盈利并触发追加保证金。
央行常用官方贴现率(ODR)、回购利率、资金利率、伦巴德利率等工具调控经济。高贴现率不一定吸引资本,若通胀远超贴现率(如津巴布韦曾达950%),反而吓跑投资者。低贴现率常伴随泡沫。交易者需明白,我们生活在调控经济时代,政府间接干预供需,因此货币对利息差背后有宏观政策逻辑。
- 正掉期:买入高息/卖出低息货币过夜赚利息
- 负掉期:反向持仓过夜扣费,策略必须规避
- 杠杆放大掉期收益同时也放大价格风险
- 低频特性:无需实时信号,偶尔检查即可
数学算法与最小二乘模型
策略统计模型简化为线性等式:v1*d1 + v2*d2 + … + vn*dn = profit。其中n为工具数,v为仓位量(负为卖),d为单日平均价变,profit为日均盈利。以两工具为例:v1*d1 + v2*d2 = profit,变形得 d1 = (-v2*d2 + profit)/v1,令 v1=1, y=d1, a=-v2, b=profit,即得经典线性方程 y = a*x + b。
未知数a和b用历史日开盘价通过最小二乘法估计。EA读取p根D1柱开盘价,计算两货币对每日价差序列,求平均差与协方差,得斜率a与截距b。之后用掉期率修正:b' = b – swap1 + a*swap2。因策略假设两仓方向使平均盈利且掉期皆正,故若EA算得b>0且双掉期正,才给建议。
double averagex = s4 / pp;
double averagey = s5 / pp;
for(i=0; i<p; i++) {
double x0 = open1[i] - open1[i + 1];
double y0 = open0[i] - open0[i + 1];
double x1 = x0 - averagex;
double y1 = y0 - averagey;
s1 = s1 + x1 * x1;
s2 = s2 + y1 * y1;
s3 = s3 + x1 * y1;
}
double r=s3/MathSqrt(s1*s2);
double a = signum(r) * SymbolInfoDouble(_Symbol, SYMBOL_TRADE_CONTRACT_SIZE) * MathSqrt(s2) / (MathSqrt(s1) * SymbolInfoDouble(secondpair, SYMBOL_TRADE_CONTRACT_SIZE));
double b = averagey - averagex * a;
实例解析:公式如何锁定盈利
假设两货币对每日价变满足 y = 2*x + 1,即 y–2*x = 1。这意味着在工具一买1单位,工具二卖2单位(a=2)。若工具二价涨1至9,工具一理论涨3至13:二卖亏2,一买赚3,净+1。若次日二价跌回8,一跌1至12:二买赚2,一亏1,净仍+1。可见不论方向,日均盈利b=1点。此即统计套利核心:用历史拟合的线性关系中和方向风险。
EA实施与参数配置
手动计算繁琐,原文提供StatisticCarryTrading.mq5 EA自动执行。它有两个输入:secondpair(第二货币对,需与图表货币对报价币一致,如EURUSD配AUDUSD)、p(统计柱数,不宜超两国最后一次降息间隔)。EA附于第一货币对D1图,计算后显示建议或“Not recommended”。
EA初始化时复制两对D1开盘价,算相关系数r与a、b,检查两边掉期符号,若皆正则弹出买卖方向与量。交易者手动开仓后,可留EA不删,它每次加载重算,若经纪商掉期变负或统计反转,提示无建议,便于撤单。低频特性令客户端无需常连。
input string secondpair="AUDUSD";
input int p=100;
double open0[]; double open1[];
int OnInit() {
CopyOpen(_Symbol,PERIOD_D1,0,p+1,open0);
ArraySetAsSeries(open0,true);
CopyOpen(secondpair,PERIOD_D1,0,p+1,open1);
ArraySetAsSeries(open1,true);
// ... 计算与建议逻辑
return(0);
}
常见错误与社区反馈
原文评论区指出代码瑕疵:如averagex = open1[0]-open1[100]/100漏括号,应为(open1[0]-open1[100])/100;部分MessageBox标题黑底难见;有用户称计算全错,主张用百笔开仓均价。作者假设未被证伪,但实践需注意:合约大小不同需用SYMBOL_TRADE_CONTRACT_SIZE修正手数比例,否则仓位失衡。
- 运算符优先级错误导致均值偏差
- 未处理掉期为负时硬开仓风险
- 相关系数弱(如-0.21)仍给建议需谨慎
- 回测周期须覆盖利率稳定段
与其他方案的对比
对比高频套利(如tick价差捕捉),统计套利不需低延迟VPS,成本低;对比单货币对趋势跟踪,它靠组合对冲削弱回撤;对比网格马丁,无加仓爆仓逻辑,风险源于宏观利率突变。劣势是盈利薄、依赖经纪商掉期政策、历史相关未必延续。适合有闲置资金、愿赚利息的稳健型账户。