pairs_trading/math_for_pairs_trading.mqh

45 lines
2.6 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:15:29 +02:00
<EFBFBD><EFBFBD>//
// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0g0O(uY0<EFBFBD>0pef[<EFBFBD>|n0<EFBFBD><EFBFBD>pe~0h0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
//
//+------------------------------------------------------------------+
//| <EFBFBD>}b_<EFBFBD>V0^ f[<EFBFBD>
//+------------------------------------------------------------------+
vector LinearRegression(const vector &x, const vector &y)
{
vector results = vector::Zeros(2);
//--- <EFBFBD>0<EFBFBD>0<EFBFBD>0L0U<EFBFBD>F0h0M0o00<EFBFBD>0ԏY0
int size = (int)x.Size();
if(size != y.Size()) {
return results;
}
double x_mean = x.Mean();
double y_mean = y.Mean();
double numerator = 0.0, denominator = 0.0;
//--- g\<EFBFBD>NWN<EFBFBD>l
for (int i = 0; i < size; i++) {
numerator += (x[i] - x_mean) * (y[i] - y_mean);
denominator += (x[i] - x_mean) * (x[i] - x_mean);
}
results[0] = numerator / denominator;
results[1] = y_mean - results[0] * x_mean;
return results;
}
//+------------------------------------------------------------------+
//| <EFBFBD>}b_<EFBFBD>V0^ <EFBFBD>N,n
//+------------------------------------------------------------------+
double LinearRegressionPredict(double x, const vector &results)
{
return x * results[0] + results[1];
}
//+------------------------------------------------------------------+
//| <EFBFBD>}b_<EFBFBD>V0^ <EFBFBD>k<EFBFBD>]
//+------------------------------------------------------------------+
double LinearRegressionResidual(double x, double y, const vector &results)
{
return y - (x * results[0] + results[1]);
}