Compare関数の働き・役割
Compare関数は、2つのベクトルや行列を比較し、それらの要素が指定された精度で一致しているかどうかを調べるために使用されます。この精度は「イプシロン」と呼ばれる小さな数値で指定され、Compare関数はこの値を基準にして一致を判定します。
例えば、計算結果に小さな誤差が含まれる場合でも、指定した精度の範囲内であれば「一致している」とみなすことができます。このように、Compare関数は実数の扱いにおいて重要な役割を果たします。特に、科学計算やインジケータの作成、バックテストの結果を検証する際に役立ちます。
イプシロンとは
イプシロンとは、数値を比較する際に許容される誤差の範囲を示す小さな数値のことです。実数(小数を含む連続的な数値)同士の正確な比較は難しいため、この範囲内であれば「ほぼ同じ」とみなす基準として使用されます。
例えば、0.99999999と1.0のような値があった場合、イプシロンが十分小さい値(例:1e-6)であれば、これらは一致していると判断されます。この仕組みにより、微小な計算誤差が結果に影響を与えるのを防ぐことができます。
Compare関数の引数について
Compare関数には、ベクトル型と行列型の2つの書式があります。どちらも、比較対象のデータ(ベクトルまたは行列)と、精度を表す数値を引数として受け取ります。
ベクトル型の引数
ulong vector::Compare(
const vector& vec, // 比較するベクトル
const double epsilon // 精度
最初の書式では、ベクトル同士の比較を行います。この場合、引数は以下のようになります。
1つ目の引数には、比較する対象となるもう一方のベクトルを指定します。
2つ目の引数には、精度を示すイプシロン値を指定します。このイプシロン値が小さいほど厳密な比較が行われ、大きいほど許容される誤差の範囲が広がります。
例えば、ベクトルv1とv2を比較する際には、v1に対してv2を比較対象として指定します。
行列型の引数
ulong matrix::Compare(
const matrix& mat, // 比較する行列
const double epsilon // 精度
);
2つ目の書式では、行列同士の比較を行います。この場合も引数は同じ構成です。
1つ目の引数には、比較する対象となるもう一方の行列を指定します。
2つ目の引数には、精度を示すイプシロン値を指定します。この値によって、行列内の要素がどの程度一致しているかを判定します。
行列型では、複数の要素が存在するため、イプシロン値を慎重に設定することが推奨されます。
Compare関数では、いずれの場合も正確な比較を求める際にイプシロンを小さく設定し、許容する誤差を大きくする場合は値を大きく設定することで、柔軟な比較が可能です。
Compare関数の戻り値について
Compare関数の戻り値は、2つのベクトルや行列を比較したときに一致しなかった要素の数を表します。戻り値が0であれば、すべての要素が指定した精度内で一致しています。0より大きい場合は、一致しなかった要素がその数だけあることを意味します。
Compare関数を使う際の注意点
Compare関数を使用する際には、いくつかの点に注意が必要です。
精度(イプシロン)の設定
Compare関数では、精度を表すイプシロン値が重要な役割を果たします。この値が小さすぎると、計算誤差によって一致するはずの要素が不一致と判断される場合があります。逆に、大きすぎると、本来一致していない要素が一致しているとみなされる可能性があります。
例えば、実数の値が非常に小さい範囲(1e-20)から非常に大きな範囲(1e+20)を持つ場合、適切な精度を選ばないと正確な比較ができなくなります。使用するデータや計算の目的に応じてイプシロン値を慎重に選ぶことが重要です。
浮動小数点数の性質
Compare関数は浮動小数点数の比較に基づいて動作します。浮動小数点数は計算精度に限界があるため、計算結果に微小な誤差が含まれることがあります。このため、正確な比較を行うためには、イプシロン値を適切に設定する必要があります。
科学記法について
Compare関数を使用する際、イプシロン値や計算結果が科学記法(指数表記)で表されることがあります。科学記法を正しく読み解くことは重要です。
科学記法の読み方
科学記法とは、非常に小さい値や非常に大きい値を簡潔に表す方法です。次のように読み解きます。
- 表記例1: 1e-15
この値は「1 × 10のマイナス15乗」を意味します。つまり、0.000000000000001のように非常に小さい値を表します。 - 表記例2: 4.4e-16
この値は「4.4 × 10のマイナス16乗」を意味します。小数点以下に多くのゼロが続く値です。 - 表記例3: 1e+20
この値は「1 × 10の20乗」を意味します。つまり、非常に大きな値(100000000000000000000)を指します。
初心者向けポイント
科学記法は、指数部分にe
が使われている場合、e
の後ろの数字が「小数点をどれだけ移動するか」を示していると考えるとわかりやすいです。-
は左に動かす、+
は右に動かすというイメージです。
Compare関数を使ったサンプルコード
void OnStart(void)
{
// double型の変数xを作成し、負の数の平方根を計算
// この場合、平方根の計算結果はNaN(Not a Number)になる
double x = sqrt(-1);
// xがx自身と等しいかどうかをチェック
// 通常の浮動小数点比較ではNaNは自身と等しくないため、結果はfalseになる
Print("single: ", x == x);
// ベクトルv1とv2を作成し、どちらもNaNの値を要素として含む
vector<double> v1 = {x};
vector<double> v2 = {x};
// ベクトルv1とv2を比較し、その結果を表示
// Compare関数では、NaN同士を等しいものとして扱うため、結果はtrueになる(0が返る)
Print("vector: ", v1.Compare(v2, 0) == 0);
}
/* 実行結果:
single: false // 単一のNaN値では自身と等しくないためfalse
vector: true // ベクトル内のNaN同士はCompare関数で等しいとみなされるためtrue
*/
サンプルコードの解説
このコードは、NaN(Not a Number)値の特性と、ベクトルを比較する際の動作について説明するものです。
1. NaN値の生成
最初に、平方根を計算するsqrt関数を使って、負の数の平方根を計算しています。この処理は、数学的に定義されていない計算を行うため、結果として特殊な値であるNaNが生成されます。変数xにその値が代入されます。
NaNとは「Not a Number」の略で、計算が定義できない場合に浮動小数点演算で生成される特別な値です。
2. NaN値の比較
次に、xがxと等しいかどうかを調べています。この比較は、変数xが自分自身と等しいかどうかを調べる処理です。
ここで重要なポイントは、NaNという特殊な値はどの値とも等しくない、という浮動小数点のルールです。そのため、変数xが自分自身と比較されても結果は偽(false)となり、エキスパートログにsingle: falseと出力されます。
3. ベクトルへのNaN値の格納
次に、ベクトルv1とv2を作成しています。この処理では、波括弧を使った初期化リストを用いて、それぞれのベクトルにNaN値を1つの要素として格納しています。
波括弧は、複数の値をまとめてベクトルに初期値として設定するために使用されます。この記述において、波括弧の中に指定された値のみがベクトルの要素になります。したがって、このコードではベクトルv1とv2はそれぞれ1つの要素を持ち、その唯一の要素がNaN値となっています。
4. ベクトルの比較
次に、v1とv2の内容を比較しています。この処理では、ベクトルのCompare関数を使用しています。Compare関数は、2つのベクトルの要素を順番に比較し、全ての要素が等しい場合に0を返します。
通常、NaNはどの値とも等しくないため比較結果は偽となりますが、Compare関数には特別な仕様があります。Compare関数は、NaN同士を等しいと判定するため、結果として0が返り、比較結果は真(true)となります。
5. 実行結果の解釈
このコードを実行すると、次の結果が得られます。
- single: falseは、変数xが自分自身と等しくないと判定されたためです。これは、NaN値が特殊な規則によってどの値とも等しくないとされるためです。
- vector: trueは、ベクトルのCompare関数がNaN同士を等しいと判定したためです。
Compare関数を使ってEAを作る際のアイディア
Compare関数は、2つの行列やベクトルを比較して不一致の要素を特定するため、EA(エキスパートアドバイザー)にさまざまな形で応用できます。以下に具体的なアイディアを紹介します。
1. バックテストでの計算結果検証
Compare関数を利用して、バックテスト中に得られる計算結果が正しいかを検証できます。例えば、移動平均線やインジケータの値を計算し、過去の正しいデータセットと比較することで、不整合を特定できます。
- バックテスト時に、計算誤差が一定の範囲内に収まっているかをチェック。
- 計算が正確でない場合にエラーをログに出力し、さらなる分析を行う。
2. リアルタイム市場データの異常検出
リアルタイムの価格データを用い、Compare関数を活用して異常値やエラーを検出できます。サーバーから取得した価格データが正しいかを検証することで、異常なデータに基づくトレードを防ぐことができます。
- 現在の価格データと過去のデータを比較し、急激な変動や異常値を検知。
- 異常が検出された場合、トレードを停止するか、データ再取得を試みる。
3. トレード戦略の一致率確認
Compare関数を利用して、複数のトレード戦略の一致率を検証できます。異なるインジケータやアルゴリズムの結果を比較し、一致しているかどうかを確認することで、信頼性の高い戦略を選択する材料にできます。
- 複数のトレードアルゴリズムの結果をベクトルに格納し、比較する。
- 一致率が一定の基準を満たした場合にのみポジションをオープンする。
4. データ同期のチェック
Compare関数を用いて、複数のサーバーから取得したデータが一致しているかを確認することで、データの同期を監視する仕組みを構築できます。
- メインサーバーとバックアップサーバーからのデータを比較。
- 不一致が一定の範囲を超えた場合、警告を発し、適切な対応を行う。
5. カスタムインジケータの検証
カスタムインジケータの計算結果を、既存の指標や理論値と比較して精度を検証する用途にCompare関数を活用できます。これにより、新しいインジケータが実際に有用かどうかを確認することができます。
- カスタムインジケータの計算結果をベクトルに格納。
- 期待値を持つベクトルや行列と比較し、不一致の要素を分析。
実装のポイント
- Compare関数の戻り値が0であれば一致しているため、それを基準として条件分岐を作成します。
- 精度(イプシロン)を適切に設定することで、誤差を許容するか厳密に比較するかを調整します。
- 不一致要素の数をログに出力することで、異常の発生頻度や範囲を把握できます。
Compare関数を使用することで、データの品質管理や戦略の信頼性向上、リアルタイムのエラー検出といった多岐にわたる用途に対応できます。これにより、EAの堅牢性が向上し、安定した運用が可能となります。
コメント