シェア:

ビットコインの取引、『ガン・ハイロー』ってどんな作戦?

ねえ、ビットコインの値段の動きを予想して、「いつ買ったり売ったりすればいいか」を教えてくれる特別な方法があるのを知ってるかな? それが「ガン・ハイロー」という、昔からある考え方を使った取引の作戦なんだ。この記事では、この作戦がどんな仕組みなのか、分かりやすく説明していくね。

取引数
110
勝率
22.73%
最終リターン
-31.51%
最大DD
33.20%

導入と前提条件

ねえ、ビットコインの値段の動きを予想して、「いつ買ったり売ったりすればいいか」を教えてくれる特別な方法があるのを知ってるかな? それが「ガン・ハイロー」という、昔からある考え方を使った取引の作戦なんだ。この記事では、この作戦がどんな仕組みなのか、分かりやすく説明していくね。

【検証】戦略のバックテスト概要

  • 戦略名: Gann HiLo を使用したトレンド追従戦略
  • 対象銘柄: BTC/USDT
  • 時間足: 1h
  • 期間: 2025-04-28〜2025-08-26(119日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

Gann HiLo の理論的背景

この作戦は、昔いたW.D.ガンさんという取引のプロが考えたアイデアが元になっています。ガンさんは、値段の動きには決まったパターンがあると考えました。特に、値段の「平均の線」よりも実際の値段が上にあれば「値上がり中」、下にあれば「値下がり中」と判断します。そして、この流れが変わる瞬間に取引をすることで、もうけを狙うという考え方です。

具体的な売買ルール(今回の検証)

エントリー条件

  • 値段が「値下がり中」から「値上がり中」に変わったとき(買いの合図)
  • 値段が「値上がり中」に変わって、買うための目印の線をこえたとき(買いの合図)

エグジット条件

  • 値段が「値上がり中」から「値下がり中」に変わったとき(取引を終えるタイミング)
  • 値段が「値下がり中」に変わって、売るための目印の線を下回ったとき(取引を終えるタイミング)

リスク管理

この作戦でも、損をしてしまうことはあります。もし予想と反対に値段が動いてしまったら、損がそれ以上大きくならないように、前もって決めた値段で取引を終える「損切り」というルールを守ることがとても大切です。

再現手順(HowTo)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでBTC/USDTのOHLCVを取得して前処理
  3. 『Gann HiLo』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数110回
勝率22.73%
平均利益1.49%
平均損失-0.87%
期待値-0.34%
プロフィットファクター0.5
最大ドローダウン33.2%
最終リターン-31.51%
シャープレシオ-0.78
HODL(Buy&Hold)16.56%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Gann HiLo Trading Signal
W.D. Gannの理論に基づくトレンド追従戦略
"""
import pandas as pd
import numpy as np


def calculate_gann_hilo_signals(df: pd.DataFrame,
                               period: int = 13,
                               multiplier: float = 1.0) -> pd.DataFrame:
    """
    Gann HiLo戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    period : int
        基本期間(デフォルト: 13)
    multiplier : float
        調整係数(デフォルト: 1.0)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    df = df.copy()
    
    # SMA of High and Low
    df['sma_high'] = df['high'].rolling(window=period).mean()
    df['sma_low'] = df['low'].rolling(window=period).mean()
    
    # Gann HiLo Activator
    df['hilo'] = pd.Series(index=df.index, dtype=float)
    df['trend'] = pd.Series(index=df.index, dtype=int)
    
    # 初期値設定
    if len(df) > 0:
        df.loc[df.index[0], 'hilo'] = df['close'].iloc[0]
        df.loc[df.index[0], 'trend'] = 1
    
    # Gann HiLo計算
    for i in range(1, len(df)):
        prev_trend = df.loc[df.index[i-1], 'trend']
        
        if prev_trend == 1:  # 上昇トレンド
            if df['close'].iloc[i] <= df['sma_low'].iloc[i] * multiplier:
                df.loc[df.index[i], 'trend'] = -1
                df.loc[df.index[i], 'hilo'] = df['sma_high'].iloc[i]
            else:
                df.loc[df.index[i], 'trend'] = 1
                df.loc[df.index[i], 'hilo'] = max(df['sma_low'].iloc[i], 
                                                  df.loc[df.index[i-1], 'hilo'])
        else:  # 下降トレンド
            if df['close'].iloc[i] >= df['sma_high'].iloc[i] * (2 - multiplier):
                df.loc[df.index[i], 'trend'] = 1
                df.loc[df.index[i], 'hilo'] = df['sma_low'].iloc[i]
            else:
                df.loc[df.index[i], 'trend'] = -1
                df.loc[df.index[i], 'hilo'] = min(df['sma_high'].iloc[i], 
                                                  df.loc[df.index[i-1], 'hilo'])
    
    # シグナル初期化
    df['signal'] = 0
    df['is_buy'] = False
    df['is_sell'] = False
    
    # 現在のポジション状態を追跡
    position = 0
    
    for i in range(period, len(df)):
        # 買いシグナル(トレンドが上昇に転換)
        if position <= 0 and df['trend'].iloc[i] == 1 and df['trend'].iloc[i-1] == -1:
            df.loc[df.index[i], 'is_buy'] = True
            df.loc[df.index[i], 'signal'] = 1
            position = 1
            
        # 売りシグナル(トレンドが下降に転換)  
        elif position >= 0 and df['trend'].iloc[i] == -1 and df['trend'].iloc[i-1] == 1:
            df.loc[df.index[i], 'is_sell'] = True
            df.loc[df.index[i], 'signal'] = -1
            position = -1
        else:
            # ポジション維持
            df.loc[df.index[i], 'signal'] = position
    
    # NaN値を0で埋める
    df['signal'] = df['signal'].fillna(0)
    
    return df


def get_strategy_name() -> str:
    """戦略名を返す"""
    return "Gann HiLo"


def get_strategy_description() -> str:
    """戦略の説明を返す"""
    return "Gann理論に基づく高値・安値の移動平均を使用したトレンド追従戦略"

なぜこの結果になったのか(3つの理由)

  1. 1取引を110回もしたけど、勝てたのは22.73%だけでした。つまり、ほとんどの取引で負けてしまったということです。
  2. 21回の取引あたりのもうけを計算すると、平均して少しずつ損をしていました。
  3. 3最終的に、もとのお金が31.51%も減ってしまいました。一番ひどい時には、もとのお金の33.2%も減ってしまったことがあり、これはとても危険な状態です。

この結果から学べる3つの教訓

  1. 1勝つ割合が低くても、1回で大きく勝てば全体でプラスになることもあります。でも、今回のテストではそうなりませんでした。
  2. 2値段の大きな流れに乗る作戦は、ビットコインみたいに急に値段が変わるものだと、流れがすぐに変わってしまって、損につながりやすいのかもしれません。
  3. 3どんなに良さそうな作戦でも、設定や取引する時期によって、成績は全然ちがうものになるんだと分かりました。

リスク管理の具体的手法

取引量の決め方

1回の取引で、もし負けても大丈夫な金額を決めておきます。例えば、「持っているお金の1%まで」というように。そして、その金額に合わせて、買うビットコインの量を決めます。

損失が大きくなったときの対処法

もし計画よりもお金が大きく減ってしまったら、一度取引をお休みしたり、1回に使うお金の量を減らしたりします。一番お金が減った時の割合(最大DD)を超えないように気をつけます。

資金管理の方法

持っているお金のうち、いくら取引に使って、いくらは普段の生活のためにとっておくか、きちんと分けておくことが大事です。もしもうけが出たら、その一部は貯金するなど、お金全体の管理を考えましょう。

改良案の具体的提案

  • 作戦の設定(期間など)を色々と変えてみて、もっともうけが出やすい組み合わせを探してみましょう。
  • 勝つ割合が低いので、「損切り」のルールをもう少し厳しくして、小さな損で早く逃げるように工夫してみましょう。
  • この作戦だけじゃなくて、他の作戦と組み合わせて、危なさを減らしてみるのも良いかもしれません。

実用性の向上(運用上の注意)

  • この作戦は、値段がはっきりと上がっていたり、下がっていたりする「大きな流れ」があるときに、力を発揮しやすいです。
  • ビットコインは値段の動きがとても激しいです。だから、損が大きくならないうちに取引をやめる「損切り」のルールは、絶対に守ってください。
  • 取引の成績は、その時々で変わります。いつも今の状況をチェックして、必要なら設定を見直すようにしましょう。

検証の透明性と信頼性

  • データの出所: BTC/USDTというビットコインの、1時間ごとの値段のデータを使いました。
  • 検証のやり方: ここに書いてある成績(取引の回数や勝った割合など)は、過去の値段のデータを使って計算したものです。
  • コード: この取引の判断に使ったコンピューターのプログラムは、誰でも見られるように公開されています。
  • 注意事項: この作戦は、過去のデータではこうだった、という話です。将来も同じようにもうかることを保証するものではありません。投資は、ご自身の判断と責任で行ってください。

よくある質問

Q.ビットコインって何?

A.インターネット上で使える「デジタルなお金」のことだよ。銀行や国ではなく、世界中のコンピューターのネットワークで管理されている特別な仕組みなんだ。

Q.「流れに乗る作戦(トレンドフォロー戦略)」ってどういう意味?

A.値段の「大きな流れ」に乗って取引する作戦のことだよ。値段が上がり続けている流れのときは「買い」、下がり続けている流れのときは「売り」で、その流れについていくんだ。

Q.「勝率」って何?勝てない作戦はダメなの?

A.取引をした回数のうち、もうけが出た取引の割合のことだよ。勝率が低くても、負けたときの損が小さくて、勝ったときのもうけがすごく大きければ、全体ではプラスになることもあるんだ。

Q.「最大DD(最大ドローダウン)」って、一番損した金額のこと?

A.それに近いね。正確には、取引を始めてから、お金が一番大きく減ってしまったときの「割合」のことだよ。この数字が大きいと、お金をたくさん失ってしまう危険がある、ということなんだ。

Q.この作戦で本当に利益を出せるの?

A.今回のテストではもうけは出なかったけど、設定を変えたり、市場の状況が良いときに使ったりすれば、うまくいく可能性はあるよ。でも、投資には必ず「損をするかもしれない」というリスクがあることは忘れないでね。

Q.検証に使用した期間と時間足は?

A.1h足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-31.51%、最大DDは33.20%です。

Q.勝率やPFはどの程度?

A.勝率は22.73%、プロフィットファクターは0.50です。

Q.HODLとの比較結果は?

A.HODLは16.56%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報