ビットコインの値段の動きをチェック!「ボラティリティ・レシオ」で売り買いのチャンスを見つけよう
これは、ビットコインの5分ごとの値段のグラフを見て、値段の動きの激しさ(ボラティリティ)を分析する方法です。この方法で、いつ買うか、いつ売るかのチャンスを探します。昔のデータと比べて、今の値段がどれくらい激しく動いているかを調べるんですよ。
導入と前提条件
これは、ビットコインの5分ごとの値段のグラフを見て、値段の動きの激しさ(ボラティリティ)を分析する方法です。この方法で、いつ買うか、いつ売るかのチャンスを探します。昔のデータと比べて、今の値段がどれくらい激しく動いているかを調べるんですよ。
【検証】戦略のバックテスト概要
- 戦略名: Volatility Ratio を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-09-03〜2025-08-25(355日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Volatility Ratio の理論的背景
この方法の元になる考え方は、「値段の動きの激しさが、急に強まったり弱まったりする時」は、全体の流れが変わりやすい、というものです。最近の値段の動きの大きさが、過去の一番大きかった動きと比べてどれくらいなのかを数字で表します。この数字が、決めておいた基準より大きくなったり小さくなったりした時に、売り買いのサインを探します。さらに、値段が平均の線より上にあるか下にあるか、といった情報も見て、もっと良いタイミングを見つけようとします。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段の動きが急に激しくなって、値段も平均の線より上にあるとき。「よし、買おう!」と考えるチャンスです。
- 値段の動きの激しさを表す数字が、前の数字より大きくなったときも、買うチャンスと考えます。
エグジット条件
- 値段の動きが急に激しくなったけれど、値段は平均の線より下にあるとき。「そろそろ売ろうかな」と考えるタイミングです。
- 値段の動きの激しさを表す数字が、前の数字より小さくなったときも、売るタイミングと考えます。
リスク管理
もし予想と反対に値段が動いてしまったら、損が大きくならないように、前もって決めておいた値段で必ず取引を終えるルールです。これで、大きな損を防ぎます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Volatility Ratio』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 5802回 |
勝率 | 9.31% |
平均利益 | 0.58% |
平均損失 | -0.5% |
期待値 | -0.4% |
プロフィットファクター | 0.14 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -2.81 |
HODL(Buy&Hold) | 90.51% |
HODL戦略との比較
実装コード(Python)
"""
Volatility Ratio Trading Signal Generator
現在のボラティリティと過去のボラティリティを比較
"""
import pandas as pd
import numpy as np
def calculate_volatility_ratio_signals(df: pd.DataFrame,
period: int = 14,
threshold: float = 0.5) -> pd.DataFrame:
"""
Volatility Ratio戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
計算期間(デフォルト: 14)
threshold : float
シグナル閾値(デフォルト: 0.5)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# True Range計算
df['h_l'] = df['high'] - df['low']
df['h_c'] = np.abs(df['high'] - df['close'].shift(1))
df['l_c'] = np.abs(df['low'] - df['close'].shift(1))
df['true_range'] = df[['h_l', 'h_c', 'l_c']].max(axis=1)
# 現在のTrue Range
df['current_tr'] = df['true_range']
# 過去のTrue Rangeの最大値
df['max_tr'] = df['true_range'].rolling(window=period).max()
# Volatility Ratio
df['vr'] = df['current_tr'] / (df['max_tr'] + 0.0001)
# VRの移動平均
df['vr_ma'] = df['vr'].rolling(window=period).mean()
# ボラティリティブレイクアウト検出
df['vr_high'] = df['vr'] > (1 + threshold)
df['vr_low'] = df['vr'] < threshold
# 価格のトレンド
df['price_ma'] = df['close'].rolling(window=period).mean()
df['price_trend'] = np.where(df['close'] > df['price_ma'], 1, -1)
# エクスパンション・コントラクション
df['vr_expanding'] = df['vr'] > df['vr_ma']
df['vr_contracting'] = df['vr'] < df['vr_ma']
# シグナル生成
df['vr_prev'] = df['vr'].shift(1)
df['vr_expanding_prev'] = df['vr_expanding'].shift(1)
df['is_buy'] = (
(df['vr_expanding'] & (df['vr_expanding_prev'] == False) & (df['price_trend'] > 0)) |
(df['vr_low'] & (df['vr'] > df['vr_prev']))
) & df['vr'].notna()
df['is_sell'] = (
(df['vr_expanding'] & (df['vr_expanding_prev'] == False) & (df['price_trend'] < 0)) |
(df['vr_high'] & (df['vr'] < df['vr_prev']))
) & df['vr'].notna()
# 不要カラム削除
df.drop(['h_l', 'h_c', 'l_c', 'current_tr', 'max_tr', 'vr_ma', 'vr_high', 'vr_low',
'price_ma', 'price_trend', 'vr_expanding', 'vr_contracting',
'vr_prev', 'vr_expanding_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1この方法では、全部で5802回も取引をしましたが、勝てたのは100回のうち9回くらい(勝率9.31%)と、とても少なかったです。だから、もうけを出すのが難しかったみたいです。
- 21回の取引で平均して0.4%ずつ損をする計算(期待値がマイナス)になっていました。取引すればするほど、少しずつお金が減っていく状態だったことが、最後には全部損してしまった(最終損益-100%)原因の一つです。
- 3もうけた金額(利益)と損した金額(損失)を比べると、もうけがすごく小さかったようです。これは、取引で勝って得たお金よりも、手数料などで払ったお金の方がずっと多かったかもしれない、ということです。
この結果から学べる3つの教訓
- 1たくさん取引するやり方でも、勝つ回数が少なかったり、1回あたりの平均がマイナスだったりすると、全部合わせてもうけるのは難しい、ということが分かりました。
- 2「値段の動きの激しさ」をはかる方法だけでなく、他のいろんな方法と組み合わせることが大事なんだな、と感じました。
- 3なんでうまくいかなかったのか原因を調べて、どうすれば良くなるかを考えることが、もっと良い方法を作るために大切だと分かりました。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金は、自分が持っているお金のすごく小さい一部(たとえば100分の1とか)だけにします。こうすれば、もし予想がはずれても、失うお金が少なくてすみます。
損失が大きくなったときの対処法
もし取引で負けが続いても、持っているお金全体が、決めた割合以上(たとえば10分の1)減らないようにします。もしそれ以上減ってしまったら、一度取引をお休みする、などのルールを決めておきます。
資金管理の方法
取引に使うお金は、万が一なくなっても生活に困らないお金だけにしましょう。また、もうけが出たら、その一部は使わずに取っておくなど、上手にお金を管理することが大切です。
改良案の具体的提案
- 勝てる回数を増やすために、「こんな時には絶対に取引しない」みたいにルールを厳しくしたり、他のグラフ分析ツールと組み合わせたりする方法を考えてみます。
- 1回あたりの取引の平均をプラスにするために、「ここまで損したらやめる(損切り)」や「ここまでもうかったらやめる(利益確定)」のルールをもっと上手なものに見直します。
- もし取引の回数が多すぎるなら、取引する時間を決めたり、5分ごとじゃなくて1時間ごとなど、もっと長い時間のグラフを使ったりして、回数を減らすことも考えられます。
実用性の向上(運用上の注意)
- この方法は5分ごとのグラフを使うので、値段の動きがとても速くて激しいです。だから、初めての人は、まず練習用のニセのお金で取引(デモ取引)をしてみて、慣れるのがおすすめです。
- 「基準にする数字」や「比べる期間の長さ」などの設定を変えると、この方法の動きも変わります。いろんな数字で試してみて、自分に合う設定を見つけるのも面白いですよ。
- この実験の結果は、あくまでも昔のデータを使ったものです。未来も同じようにうまくいくとは限りません。いつもマーケット(市場)の様子に気を配ることが大切です。
検証の透明性と信頼性
- データの出所: この実験は、ビットコインの5分ごとの昔の値段のデータ(いつ始まって、一番高くていくらで、一番安くていくらで、最後にいくらになったか)を使って行われました。
- 検証のやり方: 昔の値段のデータにこの方法のルールを当てはめて、「もしこのルールで取引していたら、どうなっていただろう?」というのをコンピューターで計算して、結果を確かめています。
- コード: この方法をコンピューターで動かすためのプログラム(コード)は、誰でも見られるようになっています。
- 注意事項: この説明は、投資をすすめるものではありません。取引には損をする危険があります。お金を使うかどうかは、最後は必ず自分で考えて決めてくださいね。