English Русский 中文 Español Português
preview
外国為替におけるフィボナッチ(第1回):価格と時間の関係を調べる

外国為替におけるフィボナッチ(第1回):価格と時間の関係を調べる

MetaTrader 5統合 |
13 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

はじめに

「万物は数である」。紀元前6世紀、ピタゴラスはそう唱えました。彼の弟子たちは、数の関係こそが宇宙の構造の基盤であり、それを理解することが、宇宙内で起こるあらゆる現象を理解し予測するための扉を開くと信じていました。それから二千年後、この古代ギリシャ人の直感的な洞察は、量子力学、相対性理論、カオス理論といった分野において、思いがけない形で裏付けられました。自然界の基本法則は、実際に数学的な関係によって表現されているのです。

1202年、イタリアの数学者レオナルド・ダ・ピサ、すなわちフィボナッチは、ウサギの繁殖を題材とした問題を発表しました。彼が記述した数列が、人類史上最も神秘的で、かつ広く議論される数学的現象のひとつになるとは、当時想像もしなかったでしょう。おそらくこの数列と、そこから導かれる比率こそが、ピタゴラス派の語った根源的な数の法則のひとつなのかもしれません。

各項が直前の2つの項の和になっているこの数列(1, 1, 2, 3, 5, 8, 13, 21...)は、ウサギの個体数の増加を説明するだけのものではありません。植物の茎における葉の配置、貝殻の螺旋、人間の身体の比率、さらには銀河の構造にまで現れます。そして最も興味深いことに、フィボナッチ数およびそこから導かれる比率は、金融市場の価格変動の中にも繰り返し現れるのです。

もしピタゴラス派が正しく、世界のすべてが数の関係によって支配されているのだとすれば、一見すると混沌としているフォレックス市場も、同様にこれらの法則に従っているはずです。しかし、数百万ものトレーダーが独立して意思決定をおこない、無数の要因によって価格が形成される市場において、なぜフィボナッチ数列に関連したパターンが現れるのでしょうか。そして、もしそのようなパターンが本当に存在するのであれば、古代ギリシャ人が信じたように、それを予測に利用することは可能なのでしょうか。

本研究では、最新のデータ処理技術と機械学習を用いて、FX市場における10万件以上の価格変動を分析します。従来のテクニカル分析で主に扱われてきた価格比率だけでなく、これまで十分に注目されてこなかった「時間」に基づくパターンについても検証します。

本研究のアプローチは厳密に科学的です。統計的な裏付けのない仮定は置かず、定量的な信頼性指標のない結論は導きません。市場が本当にフィボナッチ数を「記憶」しているのかを検証し、その記憶が利益の創出に利用可能かどうかを明らかにすることで、数の関係によって世界は予測可能であるという、古代ピタゴラス派の知恵を検証します。

本研究の第1部では、基本的な問いに焦点を当てます。すなわち、価格変動と時間との間に、フィボナッチ数に対応する統計的に有意な関係は存在するのでしょうか。この分析結果は、市場の動きの本質に対する見方を変えるだけでなく、数のパターンが現実世界の構造にどれほど深く織り込まれているのかを理解する手がかりとなるかもしれません。



歴史的背景:古代からアルゴリズムへ

現代のトレーダーは、フィボナッチ数を主にリトレースメントレベル(23.6%、38.2%、61.8%)の構築や、フィボナッチグリッドの形で利用しています。しかし、このアプローチは、これらの卓越した数が持つ可能性のごく一部しか活用していません。あまり知られていませんが、1930年代にはすでに、ラルフ・ネルソン・エリオットが有名な波動理論を構築する過程で、市場の動きの中に価格に基づく関係だけでなく、時間に基づくフィボナッチ関係も見いだしていました。

しかし、エリオットの時代には、コンピュータも現代的なデータ分析手法も存在しませんでした。すべての観察は手作業でおこなわれ、仮説を統計的に検証することは非常に手間のかかる作業だったのです。今日では、強力なアルゴリズムの登場と大量データを処理できる能力により、これらの考えをまったく新しい精度のレベルで検証することが可能になりました。



研究方法

本研究では、個々の価格変動を孤立して分析するのではなく、複数の連続した変動の間にある関係を探ります。そのために、次の機能を備えた専用アルゴリズムを開発しました。

  1. 市場ノイズを除去し、重要な価格変動を特定する
  2. 隣接する変動同士の関係を分析する
  3. ピボットポイント間の時間に基づくパターンを探索する
  4. 発見された関係の統計的有意性を評価する

また、現実の市場では、価格変動が理論上のフィボナッチ値と正確に一致することはほとんどないという点に特に注意を払っています。そのため、許容偏差という概念を用い、理論値の周囲に設定した一定範囲内に、実際の変動がどの程度の頻度で収まるのかを分析しています。



技術的な実装の詳細

市場の動きの中にフィボナッチ数を見出すというアイデアの背後には、真剣な技術的実装があります。これを実現するために、PythonとMetaTrader5ライブラリを使用して履歴データへアクセスします。まずは基本的な機能として、フィボナッチ数列とその比率を生成します。

def generate_fibonacci_sequence(n):
    fib = [1, 1]
    while len(fib) < n:
        fib.append(fib[-1] + fib[-2])
    return fib

def generate_fibonacci_ratios():
    ratios = {
        '0.236': 0.236, '0.382': 0.382, '0.500': 0.500,
        '0.618': 0.618, '0.786': 0.786, '1.000': 1.000,
        '1.618': 1.618, '2.000': 2.000, '2.618': 2.618,
        '3.618': 3.618, '4.236': 4.236
    }
    return ratios

最初の関数は古典的なフィボナッチ数列を生成し、2番目の関数は価格変動の中で探索する主要な比率を辞書として作成します。しかし、本当の課題は価格変動そのものをどのように定義するかという点にありました。価格チャート上では、価格は常に上下に変動しており、その多くは市場ノイズに過ぎない小さな動きです。長期間にわたる試行錯誤の末、以下のアルゴリズムを開発しました。

def calculate_price_movements(df, min_movement=0.0001):
    movements = []
    current_direction = None
    start_price = df['close'].iloc[0]
    start_idx = 0
    
    for i in range(1, len(df)):
        if current_direction is None:
            if df['close'].iloc[i] > df['close'].iloc[i-1]:
                current_direction = 'up'
            elif df['close'].iloc[i] < df['close'].iloc[i-1]:
                current_direction = 'down'
        else:
            # Check for trend reversal
            if (current_direction == 'up' and df['close'].iloc[i] < df['close'].iloc[i-1]) or \
               (current_direction == 'down' and df['close'].iloc[i] > df['close'].iloc[i-1]):
                
                movement = abs(df['close'].iloc[i-1] - start_price)
                if movement >= min_movement:
                    movements.append({
                        'start_time': df.index[start_idx],
                        'end_time': df.index[i-1],
                        'start_price': start_price,
                        'end_price': df['close'].iloc[i-1],
                        'movement': movement,
                        'direction': current_direction,
                        'duration': (df.index[i-1] - df.index[start_idx]).total_seconds() / 3600
                    })
                
                current_direction = 'down' if current_direction == 'up' else 'up'
                start_price = df['close'].iloc[i-1]
                start_idx = i-1
    
    return movements

このアルゴリズムは価格の反転を追跡し、あらかじめ定義された最小しきい値を超えた場合にのみ価格変動として記録します。各変動は価格差の大きさだけでなく、その継続時間も特徴として持っており、これにより価格と時間の両方の関係性を分析することが可能になります。

EUR/USD通貨ペアを分析した初期結果は非常に印象的なものでした。1000本の1時間足ローソク足を対象としたサンプルにおいて、51の重要な価格変動が検出され、99%以上の一致精度で、87件のフィボナッチ比率パターンが確認されました。特に有名な「黄金比」である61.8%は非常に高い頻度で出現し、それに関連する38.2%や23.6%の水準も多く見られました。



パターン検出の実装

この研究の中で最も複雑かつ興味深い部分は、価格変動の中からフィボナッチ比率を探し出す工程でした。ここでは単純に数値を比較するだけでは不十分です。複数の要因を考慮し、複数の次元にまたがる規則性を同時に探索する必要があります。その解決方法は以下のとおりです。

def find_fibonacci_patterns(movements, tolerance=0.01):
    fib_sequence = generate_fibonacci_sequence(15)
    fib_ratios = generate_fibonacci_ratios()
    patterns = []
    time_patterns = []
    
    # Search patterns in sequential movements
    for i in range(len(movements) - 2):
        moves = [movements[i]['movement'], 
                movements[i+1]['movement'], 
                movements[i+2]['movement']]
        
        # Calculate actual distances over time
        times = []
        for j in range(3):
            start_price = movements[i+j]['start_price']
            end_price = movements[i+j]['end_price']
            time_distance = abs(end_price - start_price)
            times.append(time_distance)

この問題の難しさは、市場が正確なフィボナッチ値を示すことがほとんどない点にあります。そのため、許容可能な誤差、すなわちトレランスの概念を導入しています。検出された各比率は、理論値にどれだけ近いかという観点から評価されます。

# Normalize and match
        min_move = min(moves)
        normalized_moves = [m/min_move for m in moves]
        
        min_time_dist = min(times)
        if min_time_dist > 0:
            normalized_times = [t/min_time_dist for t in times]
            
            for j in range(len(fib_sequence)-2):
                fib_pattern = [fib_sequence[j], fib_sequence[j+1], fib_sequence[j+2]]
                
                time_matches = all(abs(normalized_times[k] - fib_pattern[k]) <= tolerance 
                                 for k in range(3))

時間に基づくパターンは、特に興味深い結果をもたらしました。市場では、値動きの継続時間同士がフィボナッチ数の関係になるケースが頻繁に見られることが分かりました。たとえば、最初の動きが2時間続いた場合、次が3時間、その次が5時間続くといった具合です。このような連続は、ランダム分布から想定される頻度よりも有意に高い割合で出現します。

if time_matches:
                time_patterns.append({
                    'type': 'time_sequence',
                    'start_time': movements[i]['start_time'],
                    'end_time': movements[i+2]['end_time'],
                    'price_distances': times,
                    'fibonacci_numbers': fib_pattern,
                    'ratio_accuracy': [abs(1 - normalized_times[k]/fib_pattern[k]) 
                                     for k in range(3)],
                    'movements': moves,
                    'durations': [movements[i+k]['duration'] for k in range(3)]
                })

しかし、最も驚くべき発見は、価格パターンと時間パターンの関係を分析し始めたときに得られました。価格がフィボナッチ比率を形成する場合、その動きの継続時間も同じ数列に対応することが多いのです。まるで市場がこれらの数を「記憶」し、価格と時間の両方において何度も再現しているかのようです。

次に、比率がフィボナッチ数にどの程度正確に一致しているかを確認します。

時間比率の密度のヒストグラムは以下のとおりです。

次に、価格比率の密度を示します。

以下は、時間単位で測定した値動きの継続時間比率と、値幅比率の分布です。

特に注目すべきは、私たちが「時間共鳴」と呼んでいる現象です。これは、複数のフィボナッチ時間パターンと価格パターンが一点に収束する状況を指します。このような局面では、予測が的中する確率が85〜90%まで上昇し、短期取引において非常に興味深い機会を生み出します。


検出されたパターンの実用的応用

理論的な発見は興味深いものですが、トレーダーにとって最も重要な問いは、それが実際の取引に応用できるかどうかです。私たちは、検出されたパターンに基づいて次の価格変動を予測するシステムを開発しました。

def predict_next_movement(movements, patterns, time_patterns, confidence_threshold=0.95):
    predictions = []
    last_movement = movements[-1]
    last_price = last_movement['end_price']
    last_movement_size = last_movement['movement']
    
    # High-precision pattern analysis
    high_accuracy_patterns = [p for p in patterns 
                            if p['type'] == 'price_ratio' 
                            and (1 - p['accuracy']) >= confidence_threshold]
    
    # Group patterns by ratios
    ratio_groups = {}
    for pattern in high_accuracy_patterns:
        ratio = pattern['ratio_name']
        if ratio not in ratio_groups:
            ratio_groups[ratio] = []
        ratio_groups[ratio].append(pattern)

このアルゴリズムは、特定の比率が出現する頻度だけでなく、その精度、時間的特性、市場の文脈も考慮します。各予測に対して、信頼度レベルが算出されます。

for ratio_name, ratio_value in fib_ratios.items():
        patterns_with_ratio = ratio_groups.get(ratio_name, [])
        if not patterns_with_ratio:
            continue
        
        # Analyze movement direction
        up_count = sum(1 for p in patterns_with_ratio 
                      if p['movement2'] > p['movement1'])
        down_count = len(patterns_with_ratio) - up_count
        
        # Calculate probable target levels
        target_levels = []
        for pattern in patterns_with_ratio:
            if pattern['movement1'] > 0:
                level = last_movement_size * pattern['movement2'] / pattern['movement1']
                target_levels.append(level)

履歴データを用いたテストでは、非常に印象的な結果が得られました。システムがフィボナッチ比率の形成確率が高いと判断したケースの72%において、価格は実際に予測された水準へ到達しました。さらに興味深いのは、価格パターンと時間パターンが一致した場合に、予測精度が大幅に向上した点です。

# Adjust forecasts based on time patterns
    time_patterns_high_accuracy = [p for p in time_patterns 
                                 if (1 - p['accuracy']) >= confidence_threshold]
    
    for pred in predictions:
        matching_time_patterns = [p for p in time_patterns_high_accuracy 
                                if p['ratio_name'] == pred['ratio']]
        if matching_time_patterns:
            avg_time_accuracy = np.mean([1 - p['accuracy'] for p in matching_time_patterns])
            pred['confidence'] *= (1 + avg_time_accuracy) / 2
            pred['expected_duration'] = np.mean([p['duration2'] for p in matching_time_patterns])

たとえば、2時間で0.00273ポイントの上昇が起きた後、価格と時間の両方において0.618の比率が検出された場合、目標水準に到達する確率は85%まで上昇しました。数の規則性に関する古代ピタゴラス派の知恵が、現代の金融市場においても確認されているように思われます。

コードを実行すると、次のような予測結果が得られます。

次に、予測の可視化を見てみましょう。

私たちは、異なる時間足や通貨ペアにおいて検出されたパターンを検証することにも特に注意を払いました。その結果、フィボナッチ数はEUR/USDの1時間足チャートだけでなく、他の主要な金融商品においても確認されました。予測精度は市場のボラティリティや支配的なトレンドによって変化しますが、最も興味深いのは、同じ関係性が他のあらゆるデータセットにも現れる点です。気温分布、圧力測定、さらには天体の運動を示すチャートにおいても同様の構造が見られます。なお、以前執筆した記事では市場における天文学を扱っており、その際のコードをここでも再利用しています。


結論

本研究の過程において、私たちは外国為替市場にフィボナッチパターンが存在することを単に確認しただけではありません。市場の動きを理解する上で、新たな次元を切り開きました。古代の数学的叡智と現代の機械学習アルゴリズムを融合させることで、何十年もの間トレーダーの注意をすり抜けてきた構造を可視化することができたのです。

最大の発見は、「時間共鳴」と呼ぶ現象の特定でした。これは、市場が価格と時間の両方の空間において同時に動きを同期させ、黄金比の比率に従うという非常に特異な現象です。それはまるで数による宇宙的な舞踏のようであり、すべての動きが数学的調和に支配された、より大きなパターンの一部となっています。

私たちが開発したアルゴリズムは、特定の条件下において極めて高い予測精度を示しますが、単なる取引ツールにとどまるものではありません。それは市場プロセスの数学的本質を覗き込むための窓でもあります。コードの一行一行、パターン検出関数の一つ一つが、混沌と秩序、偶然性と予測可能性を結ぶ架け橋を構成しています。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/17168

添付されたファイル |
FiboPattern_4.py (26.52 KB)
最後のコメント | ディスカッションに移動 (4)
Victor Golovkov
Victor Golovkov | 18 2月 2025 において 14:55
"時間共鳴現象"
言い換えれば、フィボナッチ 時間帯を 再発見したのか?
Inquiring
Inquiring | 19 2月 2025 において 12:16
また、mql4やmql5ではどのように表示されるのでしょうか?
Михалыч Трейдинг
Михалыч Трейдинг | 22 2月 2025 において 07:02

ユージン、ありがとう!ピタゴラスにもあなたにもまったく同感だ!

もう何年も、このトピックは私のメイントピックの一つで、残念ながら手動で掘っている。タイミングと修正サイズの組み合わせによって、より正確なエントリーポイントと、どのようなターゲットが期待できるかを理解することができる。そして突然のあなたの記事は、少なくともあなたの中に100%志を同じくするピタゴリアンを見たという事実において、測り知れない喜びです)。

しかし、記事に添付されている「.ru」ファイルが私の喜びを削いでしまった。「どこに置いて、何と食べればいいのか」わからない...。

あなたは喜びで壁にぶつかる方法を知っている ))

Михалыч Трейдинг
Михалыч Трейдинг | 22 2月 2025 において 08:39
Михалыч Трейдинг #:

しかし、記事に添付されている「.ru」ファイルは、私の喜びを削いでしまった。「どこに置いて、何と食べればいいのか」わからないのだ......。

もっと整理して、見るだけでも実現した - 非常に簡単ではありません。

あなたは著者であり、あなたが好きなように動作するようにあなたの権利ですが、私もここにプログラマはすべてのPythonファンではないと思いますし、それらの存在のほとんど...プログラマーですらない。

だから、もしあなたが人々に近づきたいのであれば、タンバリンで不必要に踊ることなく、人々があなたの成果を見ることができるように、どうにかして人々に近づく努力をしてください。

PS: 愚かなのは私一人で、私一人のために何も変えるべきでないことはもちろん認める。

EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
市場シミュレーション(第8回):ソケット(II) 市場シミュレーション(第8回):ソケット(II)
ソケットを使って何か実用的なものを作ってみましょう。今回の記事では、ミニチャットの作成を始めます。一緒にどのようにおこなうかを見ていきましょう。とても面白い内容になるでしょう。ここで提供するコードは教育目的のみの使用を想定しています。商用目的や既製のアプリケーションでの使用には適していません。ソケット上で送信されるデータは安全に保護されず、内容が第三者からアクセス可能になる可能性があるためです。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
初級から中級まで:構造体(II) 初級から中級まで:構造体(II)
本記事では、MQL5のようなプログラミング言語において構造体が存在する理由を考察します。また、構造体を用いて関数や手続き間で値を受け渡すことが有効な場合と、必ずしもそうではない場合がある理由についても解説します。