// // ペアトレで使用する数学系の関数まとめファイル // //+------------------------------------------------------------------+ //| 線形回帰 学習 //+------------------------------------------------------------------+ vector LinearRegression(const vector &x, const vector &y) { vector results = vector::Zeros(2); //--- サイズが違うときは0を返す 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; //--- 最小二乗法 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; } //+------------------------------------------------------------------+ //| 線形回帰 予測 //+------------------------------------------------------------------+ double LinearRegressionPredict(double x, const vector &results) { return x * results[0] + results[1]; } //+------------------------------------------------------------------+ //| 線形回帰 残差 //+------------------------------------------------------------------+ double LinearRegressionResidual(double x, double y, const vector &results) { return y - (x * results[0] + results[1]); }