// // 動作確認などで使用するスクリプトファイル // //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnStart() { const string sym_name[] = {"EURUSD", "GBPUSD"}; const int arr_size = ArraySize(sym_name); vector x, y; vector resuls; x.CopyRates(sym_name[0], PERIOD_D1, COPY_RATES_CLOSE, 1, 5); y.CopyRates(sym_name[1], PERIOD_D1, COPY_RATES_CLOSE, 1, 5); resuls = LinearRegression(x, y); Print("線形回帰モデル: y = ", resuls[0], "x + ", resuls[1]); } //+------------------------------------------------------------------+ //| 線形回帰 学習 //+------------------------------------------------------------------+ 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]); } //+------------------------------------------------------------------+