ビットコインで挑戦!「買い手 vs 売り手」作戦の成績を見てみよう!
この作戦は、ビットコインの1時間ごとの値動きを見て、「買いたい人」と「売りたい人」のどちらが強いかをチェックする方法です。そして、売ったり買ったりするベストなタイミングを探します。実際に1年以上試してみたんですが、残念ながら結果はマイナスでした。でも、この失敗から学べることがたくさんありますよ!
導入と前提条件
この作戦は、ビットコインの1時間ごとの値動きを見て、「買いたい人」と「売りたい人」のどちらが強いかをチェックする方法です。そして、売ったり買ったりするベストなタイミングを探します。実際に1年以上試してみたんですが、残念ながら結果はマイナスでした。でも、この失敗から学べることがたくさんありますよ!
【検証】戦略のバックテスト概要
- 戦略名: Balance of Power を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2024-07-01〜2025-08-25(419日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Balance of Power の理論的背景
この作戦は、市場は「買いたい人」と「売りたい人」の綱引きで動く、という考え方が元になっています。例えば、1時間で値段が始まった時より終わった時の方が高ければ、「買いたい人」が綱引きで勝った、ということです。逆に安くなっていたら、「売りたい人」が勝ったことになります。この綱引きの勝敗を数字にして、その数字の平均を見ることで、全体の流れや急な変化をつかまえようとします。「買いたい人」の力がぐっと強くなったり、どちらかがすごく強くなりすぎた状態から普通に戻ったりするタイミングを、チャンスと考えるんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 「買いたい人」が「売りたい人」より強くなった、というサインが出たとき。
- 「売りたい人」の勢いがすごく強かった状態が終わり、今度は「買いたい人」の勢いが出てきたとき。
エグジット条件
- 「売りたい人」が「買いたい人」より強くなった、というサインが出たとき。
- 「買いたい人」の勢いがすごく強かった状態が終わり、今度は「売りたい人」の勢いが出てきたとき。
リスク管理
この作戦では、大きな損をしないためのルールを決めています。まず、損がふくらむ前に「手じまい(取引を終えること)」するタイミングを決めます。それに、もしもの時に損が大きくなりすぎないように、自分の持っているお金に合わせて、取引する量を調整します。もし負けが続いても、一度お休みしたり、取引する量を減らしたりして、さらに大きな損を防ぐようにします。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Balance of Power』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 684回 |
勝率 | 20.03% |
平均利益 | 1.65% |
平均損失 | -0.85% |
期待値 | -0.35% |
プロフィットファクター | 0.5 |
最大ドローダウン | 91.37% |
最終リターン | -91.36% |
シャープレシオ | -0.98 |
HODL(Buy&Hold) | 77.68% |
HODL戦略との比較
実装コード(Python)
"""
Balance of Power Trading Signal Generator
買い手と売り手の力関係を測定
"""
import pandas as pd
import numpy as np
def calculate_bop_signals(df: pd.DataFrame,
smooth_period: int = 14) -> pd.DataFrame:
"""
Balance of Power戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
smooth_period : int
平滑化期間(デフォルト: 14)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# Balance of Power計算
# BOP = (Close - Open) / (High - Low)
df['bop_raw'] = (df['close'] - df['open']) / (df['high'] - df['low'] + 0.0001)
# スムージング(SMA)
df['bop'] = df['bop_raw'].rolling(window=smooth_period).mean()
# BOPの移動平均(トレンド)
df['bop_ma'] = df['bop'].rolling(window=smooth_period).mean()
# BOPの標準偏差(ボラティリティ)
df['bop_std'] = df['bop'].rolling(window=smooth_period * 2).std()
# ダイナミックレベル
df['bop_upper'] = df['bop_ma'] + df['bop_std']
df['bop_lower'] = df['bop_ma'] - df['bop_std']
# ゼロラインクロス
df['bop_prev'] = df['bop'].shift(1)
df['zero_cross_up'] = (df['bop'] > 0) & (df['bop_prev'] <= 0)
df['zero_cross_down'] = (df['bop'] < 0) & (df['bop_prev'] >= 0)
# エクストリーム反転
df['extreme_low'] = df['bop'] < -0.5
df['extreme_high'] = df['bop'] > 0.5
df['extreme_low_prev'] = df['extreme_low'].shift(1)
df['extreme_high_prev'] = df['extreme_high'].shift(1)
# シグナル生成
df['is_buy'] = (
df['zero_cross_up'] |
(df['extreme_low_prev'] & ~df['extreme_low'])
) & df['bop'].notna()
df['is_sell'] = (
df['zero_cross_down'] |
(df['extreme_high_prev'] & ~df['extreme_high'])
) & df['bop'].notna()
# 不要カラム削除
df.drop(['bop_raw', 'bop_ma', 'bop_std', 'bop_upper', 'bop_lower', 'bop_prev',
'zero_cross_up', 'zero_cross_down', 'extreme_low', 'extreme_high',
'extreme_low_prev', 'extreme_high_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝った回数が少なくて、トータルで損をしてしまったのは、ビットコインの値段が、予想できないほど大きく動くことが多かったからだと考えられます。
- 2「買いたい人が強くなった」という単純なサインだけでは、「ダマシ」というニセモノのサインが多くて、それが損につながってしまったのかもしれません。
- 3「すごく売られた後に買う」という逆を狙うサインも、ビットコインの値段が一方的に上がり続けたり、下がり続けたりする場面では、うまく働かなかったのかもしれません。
この結果から学べる3つの教訓
- 1どんなに良さそうに見える作戦でも、その時の状況によっては、うまくいかないことがあると学びました。
- 2ひとつのサインだけを信じるんじゃなくて、市場全体の大きな流れや、他の情報も合わせて考えることが大事だと感じました。
- 3成績が悪くても、なぜダメだったのかを考えて、次に活かすことが大切だとわかりました。
リスク管理の具体的手法
取引量の決め方
1回の取引で、持っているお金の1%から2%より大きな損をしないように、買う量を決めます。例えば、10万円持っていたら、1回の失敗で損するお金が1000円から2000円に収まるようにします。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が10%など、決めた割合以上に減ってしまったら、いったん全部の取引をやめます。そして、市場が落ち着くのを待つか、作戦をもう一度考え直します。
資金管理の方法
取引に使うお金は、もしなくなっても生活に困らないお金だけにします。利益が出ても、全部使ってしまうのではなく、一部は次の取引のためにとっておくなど、計画的にお金を管理します。
改良案の具体的提案
- 力の平均を計算する期間を、短くしたり長くしたりして、もっと確実なサインを見つけられるように工夫する。
- 値段の平均線など、他の作戦と組み合わせて、サインが本物かどうかを見分ける力をアップさせる。
- 市場の動きが激しい時と、おだやかな時で、自動的にルールが変わるような仕組みを入れる。
実用性の向上(運用上の注意)
- この作戦を試すなら、まずはすごく少ないお金でやるか、本物のお金を使わない「練習モード」でやってみましょう。
- ビットコインの値段がジェットコースターみたいに激しく動いているときは、この作戦がうまくいかないかもしれないので、注意してください。
- 「いつ買うか」も大事ですが、「いつやめるか」という損切りのルールをしっかり決めておくことが、大きな損を防ぐために一番重要です。
検証の透明性と信頼性
- データの出所: この成績は、過去のビットコインの値段のデータ(いつ始まって、いくらで終わって、一番高かったのはいくらで、一番安かったのはいくらか、という情報)を使って計算しました。
- 検証のやり方: もしこの作戦を過去の特定の期間でやっていたらどうなっていたか、をコンピューターで試してみました(これをバックテストと言います)。
- コード: この作戦を計算するためのコンピューターのプログラムは、誰でも見られるように公開されています。
- 注意事項: この結果は、あくまで過去のデータで試したものです。未来でも同じようにうまくいくとは限りません。投資は、自分の判断と責任で行ってくださいね。