80%ルールに基づく先物価値エリア反転戦略

ETH VOL POC VAH VAL TPO
作成日: 2025-07-17 15:50:07 最終変更日: 2025-07-17 15:50:07
コピー: 0 クリック数: 226
2
フォロー
319
フォロワー

80%ルールに基づく先物価値エリア反転戦略 80%ルールに基づく先物価値エリア反転戦略

概要

80%の法則に基づく期貨価値領域の逆転戦略は,古典的な80%の法則の設定を検証するために特別に設計された量化取引システムである.この戦略の核心は,価格が前の取引日の価値領域に戻った後の逆転の機会を捕捉することである.戦略は,価格が前の日の価値領域に戻ったときに,十分な時間後に,この領域に留まった後に,システムは取引信号を誘発し,主な目標は価格制御ポイントである.

戦略原則

この戦略は,市場トレンド平均値回帰の原理に基づいており,特に価格と価値領域の関係に焦点を当てている.戦略の核心的な論理には,以下のものが含まれる.

  1. 取引の時間帯を定義する策略は,実際の22時間ETH期貨ウィンドウ ((太平洋時間午後5時から翌日の午後3時まで) に固定され,グローバルタイムゾーン設定をサポートしています. これは,策略が正しい市場環境で動作することを保証しています.

  2. 価値領域計算: システムは自動的に価値領域高点 ((VAH),価値領域低点 ((VAL) と価格制御ポイント ((POC) を計算する:

    • 値域の範囲は,1日の高低差の68% (標準差の範囲) と定義される.
    • VAHとVALは高低点と値域の範囲で計算される
    • POCは ((最高価格+最低価格+閉店価格) / 3として計算されます.
  3. 信号確認メカニズム: 価格が値域に戻り,少なくとも45分間その領域に留まらなければならない (“5分チャート上の3つのK線) 入り信号を確認するために. この要求は,価格の逆転意図の真偽を保証するものである.

  4. 有効日 フィルタリング:

    • 複数日有効:日終盤価格がVALより低い
    • 効力のある空白日:日終盤価格がVAHより高い
  5. トリガー条件:

    • 多頭シグナル:有効数日の間,価格は下から値域に戻り,3つのK線を領域内に保持し,VALを回測する
    • 空頭シグナル:有効空白日,価格が上から価値領域に戻り,領域内の3K線を保持し,VAHを回測した
  6. 退出戦略価格がPOCに達したときに退出するのが主な目標であり,これは平均値帰帰帰の核心思想に合致する.

戦略的優位性

  1. 基本統計この戦略は,価値領域と80%の法則に基づいており,両者は堅実な統計的基礎を有している. 価値領域は,正規分布の標準差に類似して,価格活動が68%発生する領域を表している.

  2. 取引窓口の正確な定義: 戦略は,単純な日間の区間ではなく,実際の22時間のETH期貨の窓を使用し,市場構造をより正確に反映します.

  3. フレキシブルなタイムゾーンサポート: グローバルトレーダーは,地理的な位置に合わせて戦略を調整して,どのタイムゾーンでもシステムが正常に動作できるようにします.

  4. 厳格な信号確認: 値域内で少なくとも3つのK線を保持することを要求し,偽信号の可能性を大幅に減らす.

  5. 目標の明確化: POCを主要目標として使用することで,明瞭な利がもたらされ,期貨市場の一般的な平均値回帰特性に適合する.

  6. 双重検証の仕組み: 値域への戻りを要求するだけでなく,境界を反測することを要求する ((VALまたはVAH),これは信号の信頼性を高めます。

  7. マニュアルカバーモード: 自動ロジックは特殊な市場条件に対応するのに不十分であるとき,戦略はトレーダーに手動で設定された価値領域レベルを使用することを許可する.

  8. デビュー機能: 詳細な診断ラベルを提供して,戦略の開発と前向きなテストを助けます.

戦略リスク

  1. 平均値の回帰は失敗するリスク: 80%の法則は多くの場合有効ですが,市場では強烈なトレンドが発生し,価格がPOCに戻ることができません. このリスクを軽減するために,トレンドフィルターを追加したり,ストップ・ロスを設定することを検討できます.

  2. パラメータ感度: 3K線 ((45分) の確認要求は,重要なパラメータである。短すぎると早期入場が起こり,長すぎると機会が逃れることがある。異なる市場条件で異なる確認時間設定をテストすることが推奨されている。

  3. 市場環境への依存: この戦略は,区間振動市場では最適ですが,強いトレンドまたは高い波動環境では不適切である可能性があります. 市場環境のフィルターを追加することを検討してください.

  4. リスクの選択: 戦略のパフォーマンスは,選択された取引時間 (ニューヨーク,ロンドン,東京または全天候) に影響される可能性があります. 異なる取引時間の歴史的なパフォーマンスを分析し,最適な時間を選択することをお勧めします.

  5. 値域計算方法の限界: 固定68%の範囲と簡略化されたPOC計算を使用すると,一部の市場の実際の価値分布を正確に反映することができません.取引量に基づく価値領域計算方法を使用することを考慮すると,より正確かもしれません.

  6. リスクの抑制の欠如: 現行の戦略には明確な止損メカニズムがないため,極端な市場の動きで深刻な損失を引き起こす可能性があります.ATRまたは固定パーセントに基づく止損設定を実施することを推奨しています.

戦略最適化の方向性

  1. 動態確認条件:現在の戦略は,固定3K線を確定条件として使用し,市場の変動性に応じてこのパラメータを調整することを考えることができます.高い変動期にはより長い確認時間が必要であり,低変動期には短縮される可能性があります.

  2. 取引量に基づく価値領域:現在の価値領域計算は価格に基づく簡略化方法である.取引量に基づくTPO ((Time Price Opportunity) 分析または取引量分布 ((Volume Profile) にアップグレードすることができ,これは市場参加者の合意価値領域をより正確に反映する.

  3. 複数時間枠確認: より大きな時間枠のトレンド方向と組み合わせて,逆転信号をフィルタリングし,取引順調の80%のルール信号のみで,戦略の成功率を向上させる可能性があります.

  4. 適応目標設定: 現行の戦略は,POCを目標として固定している.市場の波動性に応じてダイナミックな目標を設定することを考えることができる.例えば,波動性高い市場では,より遠い目標を設定する (VAHやVALなど).

  5. 波動率フィルター:ATRまたは他の波動性指標をフィルター条件として追加し,非常に低い波動性または非常に高い波動性のある市場環境での取引を避ける.

  6. 設定を最適化する: 異なる時間帯と取引時間の戦略のパフォーマンスを深く分析し,最適な取引時間の組み合わせを特定する.

  7. スマート・ストップ・メカニズム: リスクの管理を向上させるため,サポート/レジスタンスベースのストップや価格変動に基づくトラッキングストップなどのインテリジェントストップロジックを実装する.

  8. 信号の強度評価: 価格再入力の強さ,K線の特徴の確認,および他の市場要因を組み合わせた信号質量評価システムを開発し,ポジションの大きさを決定するために,各信号に強度評価を割り当てます.

要約する

80%の法則に基づく期貨価値領域逆転戦略は,価格が価値領域に戻る逆転の機会を捉えるために精密に設計された量的な取引システムである.それは,厳格な信号確認機構,正確な時間帯の定義,明確な目標設定によって,トレーダーにクラシック80%の取引法を適用する体系的な方法を提供します.

戦略の主要な優点は,その統計学的基礎,厳格な信号確認要求,および柔軟な配置オプションにある.しかしながら,平均回帰の失敗,パラメータの感受性,および市場環境依存などのリスクも存在する.ダイナミック確認条件,取引量に基づく価値領域計算,複数の時間枠確認,および自主的に適応する目標設定などの最適化措置を適用することによって,戦略の安定性と適応性が著しく向上することができる.

80%の法則に基づくシステムは,期貨市場での平均還元策を模索するトレーダーにとって,個人リスクの好みや市場の見解に基づいてさらにカスタマイズ・最適化できる堅固なスタート地点を提供します.

ストラテジーソースコード
/*backtest
start: 2025-07-09 00:00:00
end: 2025-07-16 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_OKX","currency":"SOL_USDT","balance":200000}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dscottmuller

// === Update July 15, 2025 ===
// • Converted to strategy for backtesting
// • POC-based exits for precision targeting
// • Full move markers for research tracking
// • Global time zone input (default: America/Los_Angeles)

//@version=5
strategy("80% Rule Backtest", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === General Inputs ===
useAllMarkets    = input.bool(false, "Use 24-Hour Session (All Markets)")
sessionChoice    = input.string("New York", "Market Session", options=["New York", "London", "Tokyo"])
showSessionBox   = input.bool(false, "Highlight Selected Session")
enableSounds     = input.bool(false, "Enable Audible Alerts")
extendLines      = input.bool(true,  "Extend Lines Right")

// === Advanced Session Settings ===
group = "Advanced Session Settings"
showAutoLevels   = input.bool(true, "Show Auto-Calculated VAH/POC/VAL", group=group)
useManualLevels  = input.bool(false, "Use Manual VAH/POC/VAL", group=group)
manualVAH        = input.float(0.0, "Manual VAH", group=group)
manualVAL        = input.float(0.0, "Manual VAL", group=group)
manualPOC        = input.float(0.0, "Manual POC", group=group)
debugMode        = input.bool(false, "Enable Debug Mode", group=group)

// === Time Zone Selection ===
sessionTZ = input.string("America/Los_Angeles", "ETH Session Timezone",
 options=[
     "America/Los_Angeles",  // Default: Pacific Time
     "America/New_York", 
     "America/Chicago", 
     "America/Denver", 
     "Europe/London", 
     "Europe/Paris", 
     "Asia/Tokyo", 
     "Australia/Sydney"
 ], group=group)

// === Market Session Filter ===
nySession     = time(timeframe.period, "0930-1600", "America/New_York")
londonSession = time(timeframe.period, "0800-1630", "Europe/London")
tokyoSession  = time(timeframe.period, "0900-1500", "Asia/Tokyo")
allSession    = time(timeframe.period, "0000-0000")
inSession = useAllMarkets ? not na(allSession) : sessionChoice == "New York" ? not na(nySession) : sessionChoice == "London"   ? not na(londonSession) : sessionChoice == "Tokyo"    ? not na(tokyoSession) : false
bgcolor(showSessionBox and inSession ? color.new(color.blue, 90) : na)

// === ETH Session Window (22-Hour Futures) ===
ethStart = timestamp(sessionTZ, year, month, dayofmonth - 1, 17, 00)
ethEnd   = timestamp(sessionTZ, year, month, dayofmonth,     15, 00)
inEthWindow = time("30") >= ethStart and time("30") <= ethEnd

ethHigh  = inEthWindow ? high : na
ethLow   = inEthWindow ? low  : na
ethClose = inEthWindow ? close : na

extHigh  = ta.highest(ethHigh, 100)
extLow   = ta.lowest(ethLow, 100)
extClose = ta.valuewhen(not na(ethClose), ethClose, 0)

// === Value Area Calculations ===
vaRange = (extHigh - extLow) * 0.68
vah = extHigh - ((extHigh - extLow - vaRange) / 2)
val = extLow  + ((extHigh - extLow - vaRange) / 2)
poc = (extHigh + extLow + extClose) / 3

finalVAH = useManualLevels ? manualVAH : vah
finalVAL = useManualLevels ? manualVAL : val
finalPOC = useManualLevels ? manualPOC : poc

// === Signal Logic ===
validLongDay  = extClose < finalVAL
validShortDay = extClose > finalVAH

insideVA = close > finalVAL and close < finalVAH
reenteredFromBelow = validLongDay and close > finalVAL
reenteredFromAbove = validShortDay and close < finalVAH

var int barsInside = 0
barsInside := ta.change(time("D")) ? 0 : insideVA ? barsInside + 1 : 0
insideConfirmed = barsInside >= 3

retestVAL = validLongDay and low <= finalVAL
retestVAH = validShortDay and high >= finalVAH

longSignal  = inSession and validLongDay and reenteredFromBelow and insideConfirmed and retestVAL
shortSignal = inSession and validShortDay and reenteredFromAbove and insideConfirmed and retestVAH

longBar  = longSignal and not longSignal[1]
shortBar = shortSignal and not shortSignal[1]

// === Strategy Entries ===
if longBar
    strategy.entry("Long", strategy.long, comment="80% Long Signal")

if shortBar
    strategy.entry("Short", strategy.short, comment="80% Short Signal")

// === Strategy Exits at POC ===
strategy.exit("Long to POC",  from_entry="Long",  limit=finalPOC)
strategy.exit("Short to POC", from_entry="Short", limit=finalPOC)

// === Track Full Move (Visual Only) ===
longFullHit  = longBar and high >= finalVAH
shortFullHit = shortBar and low  <= finalVAL

plotshape(longFullHit,  title="Full Move Long",  location=location.abovebar, color=color.green, style=shape.triangleup, text="FULL")
plotshape(shortFullHit, title="Full Move Short", location=location.belowbar, color=color.red,   style=shape.triangledown, text="FULL")

// === Debug Diagnostics ===
if debugMode and (longBar or shortBar)
    debugText = (useManualLevels ? "Manual Mode" : "Auto Mode") +  " | TZ: " + sessionTZ +  " | 80% Triggered | barsInside: " + str.tostring(barsInside)

    label.new(bar_index, close, debugText, xloc.bar_index, longBar ? yloc.belowbar : yloc.abovebar, style=label.style_label_left, textcolor=color.white, size=size.small, color=color.new(color.gray, 70))