ビットコインでいつ買う?いつ売る?『VHS』っていう方法を調べてみたよ!
このお話は、ビットコインの値段の動きに「勢い」があるかどうかを調べて、買うタイミングや売るタイミングを見つける『VHS』っていう方法についてです。1時間ごとの値段の動きを見て、もしこの方法を使っていたらどうなったかを、過去のデータで試してみました。さあ、どんな結果になったか、一緒に見てみましょう!
導入と前提条件
このお話は、ビットコインの値段の動きに「勢い」があるかどうかを調べて、買うタイミングや売るタイミングを見つける『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)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Vertical Horizontal Filter』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 277回 |
勝率 | 23.47% |
平均利益 | 0.98% |
平均損失 | -0.67% |
期待値 | -0.29% |
プロフィットファクター | 0.47 |
最大ドローダウン | 55.33% |
最終リターン | -55.33% |
シャープレシオ | -0.69 |
HODL(Buy&Hold) | 77.78% |
HODL戦略との比較
実装コード(Python)
"""
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この方法は、値段がどんどん動く「活発モード」は得意ですが、あまり動かない「お休みモード」だと、間違ったサインをたくさん出してしまい、損することが多かったです。だから、勝てる確率(勝率)が低くなってしまいました。
- 2全体として、勝ったときに得た利益の合計よりも、負けたときに失った損失の合計のほうが大きかった、ということを示しています。だから、トータルでマイナスになってしまいました。
- 3結果として、何もしないでずっと持っているだけ(これをHODLと言います)よりも、成績が悪くなってしまいました。これは、この方法が試した期間のビットコインの動き方と、相性が良くなかったからかもしれません。
この結果から学べる3つの教訓
- 1どんな場面でも必ず勝てる「最強の方法」はない、ということが分かりました。その方法が、「活発モード」と「お休みモード」のどちらが得意なのかを知ることが大事なんですね。
- 2勝つ回数が少なくても、一回でとても大きな利益を出せれば、トータルでプラスになることもあります。でも、今回の方法では、それもうまくいきませんでした。
- 3昔のデータでうまくいくか試すことは大切ですが、その結果が未来も同じになるとは限りません。時代や状況によって、うまくいく方法は変わっていくんですね。
リスク管理の具体的手法
取引量の決め方
1回の取引で失っても大丈夫な金額の上限を決めます。例えば、お小遣いが1万円あったら、1回の取引で損してもいいのは200円まで、というように自分でルールを決めます。そうすれば、もし負けても次もチャレンジできます。
損失が大きくなったときの対処法
もし、負けが続いてお金が大きく減ってしまったら、一度取引をお休みします。そして、なぜ負けたのかをしっかり考えて、作戦を立て直してから、またチャレンジを再開します。
資金管理の方法
お小遣い帳みたいに、毎月いくら勝って、いくら負けたかを記録します。そして、もし勝ってお金が増えたら、それをどう使うか(次のチャレンジに使うか、貯金するかなど)を計画的に考えるようにします。
改良案の具体的提案
- 苦手な「お休みモード」のときはお休みして、得意な「活発モード」のときだけ取引するように、ルールをもっと厳しくしてみます。
- 「よし、買おう!」というサインが出たときに、他の道具も使ってダブルチェックすることで、そのサインが本当に正しいかどうか、確かめるようにします。
- この方法で使う計算の数字を色々と変えてみて、どれが一番良い結果になるのか、ベストな組み合わせを探してみます。
実用性の向上(運用上の注意)
- この方法は、ビットコインの値段がグーンと上がったり下がったりしている時に力を発揮しやすいです。でも、値段があまり動いていない時は、うまくいかないことが多いので注意が必要です。
- 「買い」や「売り」のサインが出たからといって、すぐに飛びつかないようにしましょう。他のヒント(例えばグラフの形など)も見て、「本当に今でいいのかな?」と確かめるのが成功のコツです。
- 実際に自分のお金で試す前に、昔のデータで何度も練習したり、すごく少ない金額で試したりして、この方法をちゃんと理解できているか、自分に合っているかを確認することが、とっても大事です。
検証の透明性と信頼性
- データの出所: この分析で使ったビットコインの値段のデータは、ちゃんとした会社が発表している、信頼できるものを使いました。
- 検証のやり方: この方法が昔のデータでうまくいったかどうかは、コンピューターでシミュレーション(これをバックテストと言います)して確かめました。
- コード: このシミュレーションに使ったプログラムの設計図は、誰でも見られるように公開されています。
- 注意事項: これは、あくまで昔のデータでのお話で、未来も同じようにうまくいくことを保証するものではありません。投資をするときは、自分でしっかり考えて決めてくださいね。