ビットコインの取引、『ガン・ハイロー』ってどんな作戦?
ねえ、ビットコインの値段の動きを予想して、「いつ買ったり売ったりすればいいか」を教えてくれる特別な方法があるのを知ってるかな? それが「ガン・ハイロー」という、昔からある考え方を使った取引の作戦なんだ。この記事では、この作戦がどんな仕組みなのか、分かりやすく説明していくね。
導入と前提条件
ねえ、ビットコインの値段の動きを予想して、「いつ買ったり売ったりすればいいか」を教えてくれる特別な方法があるのを知ってるかな? それが「ガン・ハイロー」という、昔からある考え方を使った取引の作戦なんだ。この記事では、この作戦がどんな仕組みなのか、分かりやすく説明していくね。
【検証】戦略のバックテスト概要
- 戦略名: Gann HiLo を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-04-28〜2025-08-26(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Gann HiLo の理論的背景
この作戦は、昔いたW.D.ガンさんという取引のプロが考えたアイデアが元になっています。ガンさんは、値段の動きには決まったパターンがあると考えました。特に、値段の「平均の線」よりも実際の値段が上にあれば「値上がり中」、下にあれば「値下がり中」と判断します。そして、この流れが変わる瞬間に取引をすることで、もうけを狙うという考え方です。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段が「値下がり中」から「値上がり中」に変わったとき(買いの合図)
- 値段が「値上がり中」に変わって、買うための目印の線をこえたとき(買いの合図)
エグジット条件
- 値段が「値上がり中」から「値下がり中」に変わったとき(取引を終えるタイミング)
- 値段が「値下がり中」に変わって、売るための目印の線を下回ったとき(取引を終えるタイミング)
リスク管理
この作戦でも、損をしてしまうことはあります。もし予想と反対に値段が動いてしまったら、損がそれ以上大きくならないように、前もって決めた値段で取引を終える「損切り」というルールを守ることがとても大切です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Gann HiLo』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 110回 |
勝率 | 22.73% |
平均利益 | 1.49% |
平均損失 | -0.87% |
期待値 | -0.34% |
プロフィットファクター | 0.5 |
最大ドローダウン | 33.2% |
最終リターン | -31.51% |
シャープレシオ | -0.78 |
HODL(Buy&Hold) | 16.56% |
HODL戦略との比較
実装コード(Python)
"""
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取引を110回もしたけど、勝てたのは22.73%だけでした。つまり、ほとんどの取引で負けてしまったということです。
- 21回の取引あたりのもうけを計算すると、平均して少しずつ損をしていました。
- 3最終的に、もとのお金が31.51%も減ってしまいました。一番ひどい時には、もとのお金の33.2%も減ってしまったことがあり、これはとても危険な状態です。
この結果から学べる3つの教訓
- 1勝つ割合が低くても、1回で大きく勝てば全体でプラスになることもあります。でも、今回のテストではそうなりませんでした。
- 2値段の大きな流れに乗る作戦は、ビットコインみたいに急に値段が変わるものだと、流れがすぐに変わってしまって、損につながりやすいのかもしれません。
- 3どんなに良さそうな作戦でも、設定や取引する時期によって、成績は全然ちがうものになるんだと分かりました。
リスク管理の具体的手法
取引量の決め方
1回の取引で、もし負けても大丈夫な金額を決めておきます。例えば、「持っているお金の1%まで」というように。そして、その金額に合わせて、買うビットコインの量を決めます。
損失が大きくなったときの対処法
もし計画よりもお金が大きく減ってしまったら、一度取引をお休みしたり、1回に使うお金の量を減らしたりします。一番お金が減った時の割合(最大DD)を超えないように気をつけます。
資金管理の方法
持っているお金のうち、いくら取引に使って、いくらは普段の生活のためにとっておくか、きちんと分けておくことが大事です。もしもうけが出たら、その一部は貯金するなど、お金全体の管理を考えましょう。
改良案の具体的提案
- 作戦の設定(期間など)を色々と変えてみて、もっともうけが出やすい組み合わせを探してみましょう。
- 勝つ割合が低いので、「損切り」のルールをもう少し厳しくして、小さな損で早く逃げるように工夫してみましょう。
- この作戦だけじゃなくて、他の作戦と組み合わせて、危なさを減らしてみるのも良いかもしれません。
実用性の向上(運用上の注意)
- この作戦は、値段がはっきりと上がっていたり、下がっていたりする「大きな流れ」があるときに、力を発揮しやすいです。
- ビットコインは値段の動きがとても激しいです。だから、損が大きくならないうちに取引をやめる「損切り」のルールは、絶対に守ってください。
- 取引の成績は、その時々で変わります。いつも今の状況をチェックして、必要なら設定を見直すようにしましょう。
検証の透明性と信頼性
- データの出所: BTC/USDTというビットコインの、1時間ごとの値段のデータを使いました。
- 検証のやり方: ここに書いてある成績(取引の回数や勝った割合など)は、過去の値段のデータを使って計算したものです。
- コード: この取引の判断に使ったコンピューターのプログラムは、誰でも見られるように公開されています。
- 注意事項: この作戦は、過去のデータではこうだった、という話です。将来も同じようにもうかることを保証するものではありません。投資は、ご自身の判断と責任で行ってください。