用判别分析开发交易系统:让指标数据自动判别涨跌方向
技术分析的核心任务之一,是判断市场近期走向。统计上,这等价于“选指标、定数值,把未来市场状态分成上涨/下跌两类”。判别分析(Discriminant Analysis, DA)正是干这个的:它找出哪些变量最能区分两组,并给出判别方程。神经网络其实是 DA 的一个特例,所以 DA 也是理解 NN 的好跳板。
一、判别分析是什么
DA 是模式识别方法,基于它的防御系统大多很成功。它回答两个问题:哪些变量能把流入数据判别成不同组?判别机制长什么样?举个简化例子:用 RSI、MACD、RVI 三个指标预测价格走向,DA 可能告诉你“RVI 没用,剔除”,并生成两个方程——G1(上涨)和 G2(下跌),每个柱子开始时算一遍,G1>G2 看涨,G1<G2 看跌。
二、DA 在交易里的典型流程
整个分析分四个阶段:数据准备(采指标值)、从准备数据里选最佳变量、用测试数据分析和测试模型、最后根据判别方程构建可交易模型。DA 是现代统计软件(Statistica、SPSS)的标配,本文用 Statistica 8.0 演示。
- 数据准备:用 EA 把指标值和价格变化存成 CSV
- 变量选择:让 DA 筛掉无判别力的指标(如示例里的 RVI)
- 模型测试:用测试集验证判别方程准确率
- 落地:把判别方程转成交易信号逻辑
三、用 MQL5 EA 采集训练数据
文章给出数据采集 EA:OnInit 里创建一堆指标句柄(加速动量、牛/熊力量、AO、CCI、DeMarker、FrAMA、MACD、RSI、RVI、随机、WPR 等共 37 个),并在 OnInit 写好 CSV 表头。这样就能把“指标值→下一根 K 线涨跌”的样本自动积累下来,供 Statistica 使用。
// OnInit 中创建指标句柄(节选)
int OnInit() {
h_AC = iAC(Symbol(),Period());
h_BearsPower= iBearsPower(Symbol(),Period(),BearsPower_PeriodBears);
h_BullsPower = iBullsPower(Symbol(),Period(),BullsPower_PeriodBulls);
h_AO = iAO(Symbol(),Period());
h_CCI = iCCI(Symbol(),Period(),CCI_PeriodCCI,CCI_Applied);
h_DeMarker = iDeMarker(Symbol(),Period(),DeM_PeriodDeM);
h_FrAMA = iFrAMA(Symbol(),Period(),FraMA_PeriodMA,FraMA_Shift,FraMA_Applied);
h_MACD = iMACD(Symbol(),Period(),MACD_PeriodFast,MACD_PeriodSlow,MACD_PeriodSignal,MACD_Applied);
h_RSI = iRSI(Symbol(),Period(),RSI_PeriodRSI,RSI_Applied);
h_RVI = iRVI(Symbol(),Period(),RVI_PeriodRVI);
h_Stoch = iStochastic(Symbol(),Period(),Stoch_PeriodK,Stoch_PeriodD,Stoch_PeriodSlow,MODE_SMA,Stoch_Applied);
h_WPR = iWPR(Symbol(),Period(),WPR_PeriodWPR);
// ... 校验句柄、建 CSV 表头
}
四、数据准备:指标值与分组变量
CSV 里每列是一个指标,每行是一个柱的测量值。除了指标绝对值,还要存“当前值减前一值”的差(看变化方向),信号线指标要存主线与信号线之差。最后、也最关键的是“分组变量”:根据下一根 K 线的价格变化把样本分组——文章用四个组:跌超 200 点、跌 200 点内、涨 200 点内、涨超 200 点。
// OnTick 中每个新柱保存指标值(节选)
void OnTick() {
static datetime Prev_time;
MqlRates mrate[]; ArraySetAsSeries(mrate,true);
if(!SymbolInfoTick(_Symbol,tickdata)) return;
if(CopyRates(_Symbol,_Period,0,4,mrate)<0) return;
if(Prev_time==mrate[0].time) return; // 没新柱
Prev_time=mrate[0].time;
// 把各指标值、差值、时间/小时写入 CSV
FileWrite(FileHandle, TimeToString(TimeCurrent()), tm.hour,
(mrate[1].close-mrate[2].close)/_Point, ... );
}
五、在 Statistica 里建判别方程
把 CSV 导入 Statistica(File>Open,选 Delimited,注意把小数点分隔符设对)。然后基于价格变量创建分组变量 Group,用公式把价格变动转成组号:=iif(v3<=-200;1;0)+iif(v3<0 and v3>-200;2;0)+iif(v3>0 and v3<200;3;0)+iif(v3>=200;4;0)。运行判别分析后,软件会输出每个指标的判别权重和判别方程系数。
六、从判别方程到交易信号
拿到 DA 生成的两个判别方程后,把它转成 MQL5 里的计算:每个新柱代入指标值算 G1、G2,G1>G2 做多、G1<G2 做空。你也可以用 DA 的判别权重反过来精简指标集——剔除权重近零的指标,减小过拟合面。这样,一个“统计上能区分涨跌”的模型就落地成了可执行信号。
七、小结
判别分析把“哪些指标最能区分涨跌”这件事变得可量化、可解释。用 MQL5 EA 自动采 37 个指标、存 CSV、进 Statistica 出判别方程,再写回 MQL5 做信号,是一条完整的“统计→交易”流水线。它比盲目堆神经网络更透明,也更适合作为理解机器学习的入门台阶。记住:DA 给的是方向边界,落地时一定配仓位管理和过滤。