シェア:

ビットコインでいつ買う?いつ売る?『VHS』っていう方法を調べてみたよ!

このお話は、ビットコインの値段の動きに「勢い」があるかどうかを調べて、買うタイミングや売るタイミングを見つける『VHS』っていう方法についてです。1時間ごとの値段の動きを見て、もしこの方法を使っていたらどうなったかを、過去のデータで試してみました。さあ、どんな結果になったか、一緒に見てみましょう!

取引数
277
勝率
23.47%
最終リターン
-55.33%
最大DD
55.33%

導入と前提条件

このお話は、ビットコインの値段の動きに「勢い」があるかどうかを調べて、買うタイミングや売るタイミングを見つける『VHS』っていう方法についてです。1時間ごとの値段の動きを見て、もしこの方法を使っていたらどうなったかを、過去のデータで試してみました。さあ、どんな結果になったか、一緒に見てみましょう!

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

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

Vertical Horizontal Filter の理論的背景

値段の動きには、勢いよく一方向に進む「活発モード(トレンド)」と、狭い範囲を行ったり来たりする「お休みモード(レンジ)」の2種類がある、という考えが元になっています。この『VHS』は、ある期間での一番高い値段と一番安い値段の差と、その間のジグザグした動きの道のりを比べて、どっちのモードなのかを数字で表します。この数字が大きければ「活発モード」、小さければ「お休みモード」と判断しやすくなるんです。

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

エントリー条件

  • 値段の動きが「お休みモード」から「活発モード」に変わり始めたとき、特に値段が少し高めの位置にあるときに「買い」のチャンスを探します。
  • 「活発モード」の勢いが弱まってきて、値段がすごく高い場所まで来たときに「売り」のチャンスを探します。

エグジット条件

  • 「活発モード」が終わり、「お休みモード」に戻りそうになったら、取引を終わりにします(これを「手じまい」と言います)。
  • 「活発モード」の勢いがだんだん弱くなってきたときも、取引を終わりにするサインです。

リスク管理

もし予想が外れても大損しないように、「ここまで値段が下がったら諦める」というラインをあらかじめ決めておくことが大切です。また、一度にたくさんのお金を使わず、少しずつ取引することで、失敗したときのダメージを小さくします。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数277回
勝率23.47%
平均利益0.98%
平均損失-0.67%
期待値-0.29%
プロフィットファクター0.47
最大ドローダウン55.33%
最終リターン-55.33%
シャープレシオ-0.69
HODL(Buy&Hold)77.78%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Vertical Horizontal Filter Trading Signal Generator
トレンドとレンジ相場を識別する指標
"""
import pandas as pd
import numpy as np


def calculate_vhf_signals(df: pd.DataFrame,
                         period: int = 28) -> pd.DataFrame:
    """
    Vertical Horizontal Filter戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    period : int
        計算期間(デフォルト: 28)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    df = df.copy()
    
    # 最高値と最安値
    df['highest'] = df['close'].rolling(window=period).max()
    df['lowest'] = df['close'].rolling(window=period).min()
    
    # 垂直距離(トレンドの強さ)
    df['vertical_distance'] = np.abs(df['highest'] - df['lowest'])
    
    # 水平距離(日々の変化の合計)
    df['daily_change'] = np.abs(df['close'] - df['close'].shift(1))
    df['horizontal_distance'] = df['daily_change'].rolling(window=period).sum()
    
    # VHF計算
    df['vhf'] = df['vertical_distance'] / (df['horizontal_distance'] + 0.0001)
    
    # VHFの移動平均
    df['vhf_ma'] = df['vhf'].rolling(window=period // 2).mean()
    
    # VHFの変化率
    df['vhf_change'] = df['vhf'] - df['vhf'].shift(1)
    
    # トレンド/レンジ判定
    df['trending'] = df['vhf'] > df['vhf_ma']
    df['ranging'] = ~df['trending']
    
    # 価格の位置
    df['price_position'] = (df['close'] - df['lowest']) / (df['vertical_distance'] + 0.0001)
    
    # シグナル生成
    df['vhf_prev'] = df['vhf'].shift(1)
    df['trending_prev'] = df['trending'].shift(1)
    df['is_buy'] = (
        (df['trending'] & (df['trending_prev'] == False)) &  # レンジからトレンドへ
        (df['price_position'] > 0.5)  # 価格が上半分
    ) & df['vhf'].notna()
    df['is_sell'] = (
        (~df['trending'] & df['trending_prev']) |  # トレンドからレンジへ
        (df['trending'] & (df['vhf_change'] < 0) & (df['price_position'] > 0.8))  # トレンド弱まり
    ) & df['vhf'].notna()
    
    # 不要カラム削除
    df.drop(['highest', 'lowest', 'vertical_distance', 'daily_change', 'horizontal_distance',
             'vhf_ma', 'vhf_change', 'trending', 'ranging', 'price_position',
             'vhf_prev', 'trending_prev'], axis=1, inplace=True, errors='ignore')
    
    return df

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

  1. 1この方法は、値段がどんどん動く「活発モード」は得意ですが、あまり動かない「お休みモード」だと、間違ったサインをたくさん出してしまい、損することが多かったです。だから、勝てる確率(勝率)が低くなってしまいました。
  2. 2全体として、勝ったときに得た利益の合計よりも、負けたときに失った損失の合計のほうが大きかった、ということを示しています。だから、トータルでマイナスになってしまいました。
  3. 3結果として、何もしないでずっと持っているだけ(これをHODLと言います)よりも、成績が悪くなってしまいました。これは、この方法が試した期間のビットコインの動き方と、相性が良くなかったからかもしれません。

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

  1. 1どんな場面でも必ず勝てる「最強の方法」はない、ということが分かりました。その方法が、「活発モード」と「お休みモード」のどちらが得意なのかを知ることが大事なんですね。
  2. 2勝つ回数が少なくても、一回でとても大きな利益を出せれば、トータルでプラスになることもあります。でも、今回の方法では、それもうまくいきませんでした。
  3. 3昔のデータでうまくいくか試すことは大切ですが、その結果が未来も同じになるとは限りません。時代や状況によって、うまくいく方法は変わっていくんですね。

リスク管理の具体的手法

取引量の決め方

1回の取引で失っても大丈夫な金額の上限を決めます。例えば、お小遣いが1万円あったら、1回の取引で損してもいいのは200円まで、というように自分でルールを決めます。そうすれば、もし負けても次もチャレンジできます。

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

もし、負けが続いてお金が大きく減ってしまったら、一度取引をお休みします。そして、なぜ負けたのかをしっかり考えて、作戦を立て直してから、またチャレンジを再開します。

資金管理の方法

お小遣い帳みたいに、毎月いくら勝って、いくら負けたかを記録します。そして、もし勝ってお金が増えたら、それをどう使うか(次のチャレンジに使うか、貯金するかなど)を計画的に考えるようにします。

改良案の具体的提案

  • 苦手な「お休みモード」のときはお休みして、得意な「活発モード」のときだけ取引するように、ルールをもっと厳しくしてみます。
  • 「よし、買おう!」というサインが出たときに、他の道具も使ってダブルチェックすることで、そのサインが本当に正しいかどうか、確かめるようにします。
  • この方法で使う計算の数字を色々と変えてみて、どれが一番良い結果になるのか、ベストな組み合わせを探してみます。

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

  • この方法は、ビットコインの値段がグーンと上がったり下がったりしている時に力を発揮しやすいです。でも、値段があまり動いていない時は、うまくいかないことが多いので注意が必要です。
  • 「買い」や「売り」のサインが出たからといって、すぐに飛びつかないようにしましょう。他のヒント(例えばグラフの形など)も見て、「本当に今でいいのかな?」と確かめるのが成功のコツです。
  • 実際に自分のお金で試す前に、昔のデータで何度も練習したり、すごく少ない金額で試したりして、この方法をちゃんと理解できているか、自分に合っているかを確認することが、とっても大事です。

検証の透明性と信頼性

  • データの出所: この分析で使ったビットコインの値段のデータは、ちゃんとした会社が発表している、信頼できるものを使いました。
  • 検証のやり方: この方法が昔のデータでうまくいったかどうかは、コンピューターでシミュレーション(これをバックテストと言います)して確かめました。
  • コード: このシミュレーションに使ったプログラムの設計図は、誰でも見られるように公開されています。
  • 注意事項: これは、あくまで昔のデータでのお話で、未来も同じようにうまくいくことを保証するものではありません。投資をするときは、自分でしっかり考えて決めてくださいね。

よくある質問

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

A.インターネット上でやりとりできる「デジタルなお金」のことだよ。銀行や国を通さずに、世界中の人と直接お金のやりとりができるのが特徴なんだ。

Q.1時間足ってどういう意味?

A.値段の動きを表す「ローソク足」っていうグラフがあるんだけど、そのローソク1本が「1時間ぶん」の値段の動きを表しているチャートのことだよ。

Q.勝率が低いのに、どうして投資するの?

A.良い質問だね!例えば、10回勝負して9回負けても、1回の負けで100円の損。でも、たった1回勝ったときに2000円の利益が出たら、トータルではプラスになるよね。こんなふうに「小さく負けて大きく勝つ」を目指す方法もあるんだ。

Q.PFって何? 1より小さいとダメなの?

A.PFは「プロフィットファクター」の略で、儲けが損失の何倍あるかを見るための数字だよ。勝って得た利益の合計を、負けて失った損失の合計で割って計算するんだ。だから1より大きければトータルでプラス、1より小さいとトータルでマイナスってことなんだ。

Q.HODLってどういう意味?

A.英語の「HOLD(持つ)」から来た言葉で、値段が上がっても下がっても気にせず、ずーっと持ち続ける投資スタイルのことだよ。日本語では「ガチホ(ガチでホールド)」なんて言ったりもするね。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

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

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報