フィボナッチパターン統計分析戦略

斐波那契 模式识别 统计分析 技术指标 趋势跟踪 ATR 风险管理 IQR
作成日: 2025-03-03 10:24:54 最終変更日: 2025-03-03 10:24:54
コピー: 3 クリック数: 478
2
フォロー
319
フォロワー

フィボナッチパターン統計分析戦略 フィボナッチパターン統計分析戦略

概要

フィボナッチパターンの統計分析策略は,フィボナッチ反射レベル,パターン認識アルゴリズム,統計分析の3つの核心技術を巧みに組み合わせた高度な量化取引方法である.この策略は,主に19%と82.56%のフィボナッチ反射レベルを取引信号の基礎として使用し,モデルマッチングアルゴリズムによって高確率の取引設定を識別し,統計分析で補足的に確認する.この多次元信号確認機構は,戦略の信頼性と正確性を大幅に向上させる.この策略は,緑の矢印が強い多動信号を表す,赤い矢印の下の矢印が強い空き信号を表す,緑の背景が多動条件を表す,赤の背景が空き条件を表す,強力な空き信号を表す,明確な入場と出口のルールを提供する.

戦略原則

フィボナッチモデルの統計分析戦略の核心原則は,以下の3つの主要な構成要素の協同作業に基づいています.

  1. フィボナッチ回線レベル: 戦略は93周期間の最高点と最低点を用いて,特殊な19%と82.56%のフィボナッチ回調レベルを計算する.これらの異常なフィボナッチレベルは,戦略の特異性であり,市場の特定の行動に関する統計的分析に基づいて得られた可能性がある.価格がこれらのレベルに触れたり破れたりすると,初回取引信号が生成される.

  2. パターン認識戦略は,過去の価格パターンを分析し,現在のパターンとの類似性を計算することによって,複雑なパターンマッチングアルゴリズムを実現します. それは,指定された長さのグラフパターン (デフォルト 5) を使用し,歴史的データ (デフォルト 93 サイクル) で最適なマッチを探します. 発見されたパターンの類似性が設定された値 (デフォルト 0.7) を超える場合,戦略は,この歴史的パターンの後の価格動きに基づいて,現在のパターンの後の可能な動きを予測します.

  3. 統計分析策略は,統計確認機構を導入し,中位数,四分位数,四分位距離 (IQR) を計算して,価格の統計分布を決定する.価格が中位数,上下四分位数,または上下境界 (Q3 + 1.5 * IQRとQ1 - 1.5 * IQRと定義) を越えると,統計信号が生成される.これらの信号の強さは,突破レベルとユーザ設定の統計権に基づいて再計算される.

取引信号の生成は,以下の3つの要素の組み合わせによるものです.

  • 多条件は,フィボナッチタッチまたは突破シグナルを満たす必要がある (ユーザの設定に応じて),また,モデルの方向は多方向または中立である.
  • 空気条件は,フィボナッチ触点または突破信号を満たす必要があり,パターン方向は空方または中性であり,統計空方権は0よりも重要である.

戦略は,以下のような複雑なリスク管理の仕組みを導入しています.

  • パーセンテージまたはATRによるストップを選択できます.
  • 選択可能な追跡停止
  • 利回りメカニズムの7段階,各段階の14.28%のポジション

戦略的優位性

  1. 多次元信号確認戦略は技術分析 (フィボナッチ),パターン認識,統計分析の3次元を組み合わせ,強力な複数の確認機構を作り,偽信号の可能性を大幅に低減している.

  2. 適応性が高い: 戦略は,時間周期選択,パターン長さ,類似度値,歴史回顧ウィンドウ,統計周期など,さまざまな市場環境と取引品種に適応できるように,豊富なパラメータ設定を提供します.

  3. スマートパターン認識: 戦略のパターンマッチングアルゴリズムは,パターンの形だけでなく,類似度値も考慮し,高度に類似したパターンのみが予測に使用されることを保証し,予測の正確性を向上させる.

  4. 統計的検証戦略は,四分位数とIQRの統計的方法の導入により,価格が統計的分布のどこに位置するかを認識し,取引決定のための追加の客観的な根拠を提供します.

  5. リスクの管理戦略は,複数のストップ・オプション (固定パーセント,ATR倍数,ストップ・トラッキング) と7段階の分期利益メカニズムを提供し,柔軟で体系的なリスク管理を実現します.

  6. 視覚化して直感的に: 戦略は背景の色,矢印,マーク,タグを含む豊富な視覚要素を提供し,トレーダーが現在の市場状況と信号の強さを直感的に理解するのを助けます.

  7. リアルタイムステータスパネル: 戦略は,フィボナッチ,パターン,統計の3つのコンポーネントの現在の状態と,それらの総合的な結果を明確に示すために,グラフにリアルタイムで更新された状態パネルを表示します.

戦略リスク

  1. パラメータ感度策略は,パターン長さ,類似度値,統計周期などの複数のパラメータを使用しており,これらのパラメータの設定は,策略の性能に著しく影響する.不適切なパラメータの設定は,過適合または信号欠損を引き起こす可能性があります.反射最適化によって,特定の市場に適したパラメータの組み合わせを見つけるのがお勧めです.

  2. 市場環境への依存: 特定の市場環境下では,フィボナッチレベルが有効に機能しない可能性があります,特に強烈なトレンドまたは非常に変動する市場では. 戦略の有効性は,市場条件によって変化する可能性があります. 解決策は,異なる市場環境下では異なるパラメータ設定を使用する市場環境検出機構を導入することです.

  3. 計算の複雑さ: 戦略のパターンマッチングアルゴリズムは,各周期内に歴史データを巡って類似性を計算する必要があり,これはより短い時間枠で計算負荷を生じることがあります.この問題を軽減するために,アルゴリズムを最適化するか,計算頻度を減らすことを考慮することができます.

  4. 過剰取引のリスク:複数のシグナルメカニズムは,特に短い時間枠で,頻繁に取引するシグナルを引き起こす可能性があります.取引頻度制限または信号強度フィルターを追加し,最高品質の信号のみを実行することをお勧めします.

  5. 障害を解決する: 策略は多種多様なストップオプションを提供しているが,最適なストップレベルを決定することは依然として課題である.ストップがあまりに緊密である場合,頻繁なストップが起こりうるし,あまりにも広い場合,過剰な損失が起こりうる.市場の変動的な動向に応じてストップレベルを調整することが推奨されている.

  6. 根本的な考慮の欠如戦略は,基本的要素を考慮せずに,技術的および統計的分析に完全に基づいています. 重要なニュースまたはイベントが発生したときに,純粋に技術的な戦略は挑戦されることがあります. 解決策は,ニュースフィルターを追加するか,重大イベントの前後に取引を一時停止することです.

戦略最適化の方向性

  1. 動態参数調整: 市場変動やトレンド強度に応じて,パターン長さ,類似度値,統計周期などのパラメータを動的に調整する自己適応メカニズムを導入することができる.これは,異なる市場環境における戦略の適応性を向上させるだろう.

  2. 強化モードマッチングアルゴリズム:現在のパターンのマッチングは,主に閉盘価格と開盘価格の関係 ((上,下,または平盤) に基づいています.パターンの認識の正確性を向上させるために,高低点関係,交割量パターンまたは波動率パターンなどのより複雑なパターンの特性を導入することを考えることができます.

  3. 市場環境の分類: トレンド/区間/混沌の分類のような市場環境の分類機構を導入し,異なる市場環境で異なる取引ルールまたはパラメータ設定を使用します. これは,異なる市場条件に戦略をより良く適応するのに役立ちます.

  4. 統計分析の最適化について: 統計信号の質を向上させるために,Z-スコアや百分位順位などのより複雑な統計方法を使用するか,または動的統計周期を導入することを検討することができます.

  5. 機械学習を統合する: パターン認識と統計的重み配分を最適化するために機械学習アルゴリズムを使用するか,または特定のパターンの後の価格動きの確率分布を予測することを検討することができます.

  6. リスク管理の改善: ダイナミックなポジション管理戦略を実現し,シグナル強さ,市場の変動,アカウントリスクに応じてポジションサイズを調整できます. さらに,分批の収益化メカニズムを最適化し,市場条件に応じて収益化目標を動的に調整できます.

  7. フィルターを追加する: トレンドフィルター,波動率フィルター,交差量フィルターなどの様々なフィルターを導入し,信号の質をさらに向上させ,偽信号を減らす.

要約する

フィボナッチパターンの統計分析戦略は,フィボナッチ回帰レベル,パターン認識,統計分析を革新的に組み合わせて,強力な多次元信号システムを構築する,構造的で機能豊かな量化取引戦略である. 戦略の核心的な強みは,その多層の確認機構,適応性設計,そして優れたリスク管理機能であり,異なる市場環境で高確率の取引機会を見つけることができる.

しかし,戦略はパラメータの感受性,市場環境の依存性,計算の複雑性などの課題に直面している.動的パラメータ調整,強化されたパターンマッチングアルゴリズム,市場環境の分類,機械学習などの最適化方向を導入することによって,戦略には大きな改善の余地がある.

この戦略を使用したいトレーダーには,まず,異なる市場とパラメータの設定下での戦略のパフォーマンスを評価し,その後,実際の取引で小さなポジションから始め,特定の取引スタイルと市場環境に合わせてパラメータを徐々に調整し,最適化することをお勧めします. 最も重要なことは,この戦略を取引ツールキットの中のツールとして見ることであり,孤立したシステムではなく,他の分析方法とリスク管理原理と組み合わせて使用することで,その潜在能力を最大化できます.

ストラテジーソースコード
/*backtest
start: 2024-03-03 00:00:00
end: 2024-05-01 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Fibonacci-Only Strategi V2", overlay=true)

timeframe = input.timeframe("15", "Select Timeframe", options=["1", "5", "15", "30", "60", "240", "D"])
use_break_strategy = input(true, "Use Break Strategy")
stop_loss_percent = input.float(1.0, "Stop Loss %", minval=0.1, maxval=2.0, step=0.1)
use_atr_for_sl = input(true, "Use ATR for Stop Loss")
atr_multiplier = input.float(2.0, "ATR Multiplier for SL", minval=0.5, maxval=5.0, step=0.1)
use_trailing_stop = input(true, "Use Trailing Stop")
trailing_stop_percent = input.float(1.5, "Trailing Stop %", minval=0.1, maxval=5.0, step=0.1)

pattern_length = input.int(5, "Candle Pattern Length", minval=3, maxval=10)
similarity_threshold = input.float(0.7, "Pattern Similarity Threshold", minval=0.6, maxval=0.95)
lookback_window = input.int(93, "Historical Lookback Window", minval=10, maxval=93)

stat_period = input.int(50, "Statistical Period", minval=20, maxval=200)
stat_weight = input.float(0.5, "Statistical Confirmation Weight", minval=0.1, maxval=1.0, step=0.1)

fib_high = ta.highest(high, 93)
fib_low = ta.lowest(low, 93)
fib_diff = fib_high - fib_low
fib_19 = fib_high - fib_diff * 0.19
fib_8256 = fib_high - fib_diff * 0.8256
fib_19_reverse = fib_low + fib_diff * 0.19

plot(fib_8256, color=color.purple, style=plot.style_line, title="82.56% Fib")
plot(fib_19_reverse, color=color.orange, style=plot.style_line, title="19% Fib (Low to High)")

fib_19_touch = low[1] > fib_19 and low <= fib_19
fib_8256_touch = high[1] < fib_8256 and high >= fib_8256
fib_19_break = close < fib_19 and open > fib_19
fib_8256_break = close > fib_8256 and open < fib_8256
fib_19_reverse_touch = high[1] < fib_19_reverse and high >= fib_19_reverse
fib_19_reverse_break = close > fib_19_reverse and open < fib_19_reverse

bull_confirmation = close > open
bear_confirmation = close < open

getMedianAndQuartiles(src, len) =>
    values = array.new_float(0)
    for i = 0 to len - 1
        array.push(values, src[i])
    array.sort(values)
    size = array.size(values)
    median = size % 2 == 1 ? array.get(values, math.floor(size / 2)) : (array.get(values, size / 2 - 1) + array.get(values, size / 2)) / 2
    q1_idx = math.floor(size / 4)
    q3_idx = math.floor(3 * size / 4)
    q1 = array.get(values, q1_idx)
    q3 = array.get(values, q3_idx)
    [median, q1, q3]

[price_median, price_q1, price_q3] = getMedianAndQuartiles(close, stat_period)
iqr = price_q3 - price_q1
upper_bound = price_q3 + 1.5 * iqr
lower_bound = price_q1 - 1.5 * iqr

stat_bull_signal = close > price_median and close[1] <= price_median
stat_bear_signal = close < price_median and close[1] >= price_median
stat_strong_bull = close > price_q3 and close[1] <= price_q3
stat_strong_bear = close < price_q1 and close[1] >= price_q1
stat_extreme_bull = close > upper_bound
stat_extreme_bear = close < lower_bound

long_condition_fib_touch = (fib_19_touch or fib_19_reverse_touch) and bull_confirmation
long_condition_fib_break = use_break_strategy and (fib_19_break or fib_19_reverse_break) and bull_confirmation

short_condition_fib_touch = fib_19_touch and bear_confirmation
short_condition_fib_break = use_break_strategy and fib_19_break and bear_confirmation

getPatternSignature(start_idx, len) =>
    pattern = array.new_float(len)
    
    for i = 0 to len - 1
        if close[start_idx + i] > open[start_idx + i]
            array.set(pattern, i, 1.0)
        else if close[start_idx + i] < open[start_idx + i]
            array.set(pattern, i, -1.0)
        else
            array.set(pattern, i, 0.0)
    
    pattern

calcSimilarity(current_pattern, hist_pattern) =>
    matches = 0.0
    
    for i = 0 to array.size(current_pattern) - 1
        if array.get(current_pattern, i) == array.get(hist_pattern, i)
            matches := matches + 1.0
    
    matches / array.size(current_pattern)

findBestMatch() =>
    curr_pattern = getPatternSignature(1, pattern_length)
    
    best_idx = -1
    best_sim = 0.0
    direction = 0
    
    for i = pattern_length + 2 to lookback_window + 1
        if i < pattern_length * 2
            continue
            
        hist_pattern = getPatternSignature(i, pattern_length)
        sim = calcSimilarity(curr_pattern, hist_pattern)
        
        if sim > best_sim and sim >= similarity_threshold
            best_sim := sim
            best_idx := i
            
            next_close = close[i - pattern_length - 1]
            curr_close = close[i - pattern_length]
            
            if next_close > curr_close
                direction := 1
            else if next_close < curr_close
                direction := -1
    
    [best_idx, best_sim, direction]

var latest_pattern_sim = 0.0
var pattern_direction = 0

if barstate.isconfirmed
    [idx, sim, dir] = findBestMatch()
    
    if sim >= similarity_threshold
        latest_pattern_sim := sim
        pattern_direction := dir

calculateStatWeight(stat_signal, stat_strong, stat_extreme) =>
    weight = 0.0
    if stat_signal
        weight := stat_weight * 0.5
    if stat_strong
        weight := weight + stat_weight * 0.3
    if stat_extreme
        weight := weight + stat_weight * 0.2
    weight

stat_bull_weight = calculateStatWeight(stat_bull_signal, stat_strong_bull, stat_extreme_bull)
stat_bear_weight = calculateStatWeight(stat_bear_signal, stat_strong_bear, stat_extreme_bear)

long_condition = (long_condition_fib_touch or long_condition_fib_break) and 
                 (pattern_direction == 1 or pattern_direction == 0)

short_condition = (short_condition_fib_touch or short_condition_fib_break) and 
                  (pattern_direction == -1 or pattern_direction == 0) and
                  stat_bear_weight > 0

atr = ta.atr(14)

if long_condition
    strategy.entry("Long", strategy.long)

if short_condition
    strategy.entry("Short", strategy.short)

var float long_stop_loss = na
var float short_stop_loss = na

if strategy.position_size > 0
    long_stop_loss := use_atr_for_sl ? strategy.position_avg_price - atr * atr_multiplier : strategy.position_avg_price * (1 - stop_loss_percent / 100)

if strategy.position_size < 0
    short_stop_loss := use_atr_for_sl ? strategy.position_avg_price + atr * atr_multiplier : strategy.position_avg_price * (1 + stop_loss_percent / 100)

take_profit_levels = array.new_float(7)
for i = 0 to 6
    tp_percent = 1 + (i + 1) * 0.5 / 100
    array.set(take_profit_levels, i, tp_percent * strategy.position_avg_price)

if strategy.position_size > 0
    if use_trailing_stop
        trail_price = high - (high - strategy.position_avg_price) * trailing_stop_percent / 100
        strategy.exit("Long TS", "Long", stop=math.max(trail_price, long_stop_loss))
    else
        strategy.exit("Long SL", "Long", stop=long_stop_loss)
    
    for i = 0 to 6
        long_tp_price = array.get(take_profit_levels, i)
        strategy.exit("Long TP" + str.tostring(i+1), "Long", limit=long_tp_price, qty_percent=14.28)

if strategy.position_size < 0
    if use_trailing_stop
        trail_price = low + (strategy.position_avg_price - low) * trailing_stop_percent / 100
        strategy.exit("Short TS", "Short", stop=math.min(trail_price, short_stop_loss))
    else
        strategy.exit("Short SL", "Short", stop=short_stop_loss)
    
    for i = 0 to 6
        short_tp_price = array.get(take_profit_levels, i)
        strategy.exit("Short TP" + str.tostring(i+1), "Short", limit=short_tp_price, qty_percent=14.28)

bgcolor(long_condition ? color.new(color.green, 80) : short_condition ? color.new(color.red, 80) : na)

plotarrow(long_condition ? 1 : short_condition ? -1 : 0, title="Signal Direction", colorup=color.green, colordown=color.red, minheight=10, maxheight=20)

long_touch_marker = long_condition and long_condition_fib_touch ? low - atr : na
long_break_marker = long_condition and long_condition_fib_break ? low - atr * 1.5 : na
short_touch_marker = short_condition and short_condition_fib_touch ? high + atr : na
short_break_marker = short_condition and short_condition_fib_break ? high + atr * 1.5 : na

plotshape(long_touch_marker, style=shape.circle, color=color.green, size=size.normal, title="Long Touch Marker", location=location.absolute)
plotshape(long_break_marker, style=shape.xcross, color=color.green, size=size.normal, title="Long Break Marker", location=location.absolute)
plotshape(short_touch_marker, style=shape.circle, color=color.red, size=size.normal, title="Short Touch Marker", location=location.absolute)
plotshape(short_break_marker, style=shape.xcross, color=color.red, size=size.normal, title="Short Break Marker", location=location.absolute)

plotshape(stat_bear_signal, style=shape.triangledown, color=color.red, size=size.tiny, title="Statistical Bear Signal", location=location.abovebar)

if barstate.islast
    var table info = table.new(position.top_right, 4, 5, color.black, color.white, 2, color.gray, 2)
    
    table.clear(info, 0, 0, 3, 4)
    
    table.cell(info, 0, 0, "Fibonacci-Pattern with Stats", bgcolor=color.blue, text_color=color.white)
    table.cell(info, 0, 1, "Fib Status", bgcolor=color.blue, text_color=color.white)
    
    fib_status = "NEUTRAL"
    fib_color = color.gray
    
    if long_condition_fib_touch or long_condition_fib_break
        fib_status := "LONG"
        fib_color := color.green
    else if short_condition_fib_touch or short_condition_fib_break
        fib_status := "SHORT"
        fib_color := color.red
        
    table.cell(info, 1, 1, fib_status, bgcolor=fib_color, text_color=color.white)
    
    table.cell(info, 0, 2, "Pattern", bgcolor=color.blue, text_color=color.white)
    
    pattern_status = "NEUTRAL"
    pattern_color = color.gray
    
    if pattern_direction == 1
        pattern_status := "LONG"
        pattern_color := color.green
    else if pattern_direction == -1
        pattern_status := "SHORT"
        pattern_color := color.red
        
    table.cell(info, 1, 2, pattern_status, bgcolor=pattern_color, text_color=color.white)
    table.cell(info, 2, 2, pattern_direction != 0 ? str.tostring(math.round(latest_pattern_sim * 100)) + "%" : "N/A", bgcolor=color.gray, text_color=color.white)
    
    table.cell(info, 0, 3, "Statistics", bgcolor=color.blue, text_color=color.white)
    
    stat_status = "NEUTRAL"
    stat_color = color.gray
    
    if stat_bull_weight > 0
        stat_status := "BULL"
        stat_color := color.green
    else if stat_bear_weight > 0
        stat_status := "BEAR"
        stat_color := color.red
        
    table.cell(info, 1, 3, stat_status, bgcolor=stat_color, text_color=color.white)
    table.cell(info, 2, 3, stat_bull_weight > 0 ? str.tostring(math.round(stat_bull_weight * 100)) + "%" : 
                          stat_bear_weight > 0 ? str.tostring(math.round(stat_bear_weight * 100)) + "%" : "0%", 
                          bgcolor=color.gray, text_color=color.white)
    
    table.cell(info, 0, 4, "Combined", bgcolor=color.blue, text_color=color.white)
    
    combined_status = "NEUTRAL"
    combined_color = color.gray
    
    if long_condition
        combined_status := "LONG"
        combined_color := color.green
    else if short_condition
        combined_status := "SHORT"
        combined_color := color.red
        
    table.cell(info, 1, 4, combined_status, bgcolor=combined_color, text_color=color.white)

var label_id = label.new(na, na, "", color=color.gray, style=label.style_label_down, textcolor=color.white)

if long_condition and barstate.isconfirmed
    label.set_xy(label_id, bar_index, high)
    label.set_text(label_id, "LONG\n" + 
                           (long_condition_fib_touch ? "Touch" : "Break") + 
                           (pattern_direction == 1 ? " + Pattern " + str.tostring(math.round(latest_pattern_sim * 100)) + "%" : "") +
                           "\nStat: " + str.tostring(math.round(stat_bull_weight * 100)) + "%")
    label.set_color(label_id, color.green)
    label.set_style(label_id, label.style_label_down)

if short_condition and barstate.isconfirmed
    label.set_xy(label_id, bar_index, low)
    label.set_text(label_id, "SHORT\n" + 
                           (short_condition_fib_touch ? "Touch" : "Break") + 
                           (pattern_direction == -1 ? " + Pattern " + str.tostring(math.round(latest_pattern_sim * 100)) + "%" : "") +
                           "\nStat: " + str.tostring(math.round(stat_bear_weight * 100)) + "%")
    label.set_color(label_id, color.red)
    label.set_style(label_id, label.style_label_up)

alertcondition(long_condition, title="Long Entry", message="Long entry signal detected")
alertcondition(short_condition, title="Short Entry", message="Short entry signal detected")