pairs_trading/test.mq5
super.admin 7aec422ada convert
2025-05-30 16:15:29 +02:00

65 lines
3.9 KiB
MQL5

//
// 動作確認などで使用するスクリプトファイル
//
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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]);
}
//+------------------------------------------------------------------+