ビットコインの未来予測に挑戦!ある作戦を試した結果は…?
このお話は、「ある作戦」を使って、ビットコインがこれから上がるか下がるかを予測し、いつ売り買いすればいいかを探る挑戦の記録です。1時間ごとの値動きのデータ(2025年4月28日〜8月26日のもの)で、この作戦がうまくいくか試してみました。さて、結果はどうだったでしょう?
導入と前提条件
このお話は、「ある作戦」を使って、ビットコインがこれから上がるか下がるかを予測し、いつ売り買いすればいいかを探る挑戦の記録です。1時間ごとの値動きのデータ(2025年4月28日〜8月26日のもの)で、この作戦がうまくいくか試してみました。さて、結果はどうだったでしょう?
【検証】戦略のバックテスト概要
- 戦略名: Ehlers Fisher Transform を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-04-28〜2025-08-26(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Ehlers Fisher Transform の理論的背景
この作戦の根っこにあるのは、「今の価格の勢いを見れば、未来の動きが少しわかるかも?」という考え方です。「Ehlers Fisher Transform」は、その勢いを敏感にキャッチするための特別な方法です。具体的には、最近の価格の一番高いところと一番安いところの間で、今の価格がどのへんにあるかを数字にします。その数字をさらに計算して、「Fisher変換」というグラフを作ります。このグラフが、「トリガー」という目印の線を下から上に突き抜けたら「買い」、上から下に突き抜けたら「売り」のサイン、という仕組みです。
具体的な売買ルール(今回の検証)
エントリー条件
- 勢いを表すグラフ(Fisher変換)が、目印の線(トリガー)を追い越した瞬間に「買います」。
- ただし、まだ何も買ったり売ったりしていない時に限ります。
エグジット条件
- 勢いを表すグラフ(Fisher変換)が、目印の線(トリガー)より下に行ってしまった瞬間に「売ります」。
- これは、すでに買っているものを手放すということです。
リスク管理
大損しないための工夫も大切です。一度にたくさんのお金を使わず、少しずつ取引します。もし予想が外れても、大きなダメージを受けないようにするためです。また、「ここまで損したら、いったんストップする」というルールを決めておくことも重要です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Ehlers Fisher Transform』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 577回 |
勝率 | 12.65% |
平均利益 | 0.65% |
平均損失 | -0.54% |
期待値 | -0.39% |
プロフィットファクター | 0.18 |
最大ドローダウン | 89.59% |
最終リターン | -89.59% |
シャープレシオ | -4.43 |
HODL(Buy&Hold) | 16.67% |
HODL戦略との比較
実装コード(Python)
"""
Ehlers Fisher Transform Trading Signal
Fisher変換を使用したシグナル生成
"""
import pandas as pd
import numpy as np
def calculate_ehlers_fisher_transform_signals(df: pd.DataFrame,
period: int = 10) -> pd.DataFrame:
"""
Ehlers Fisher Transform戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
計算期間(デフォルト: 10)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 中間価格
df['hl2'] = (df['high'] + df['low']) / 2
# 最高値と最低値
df['max_high'] = df['hl2'].rolling(window=period).max()
df['min_low'] = df['hl2'].rolling(window=period).min()
# 正規化
df['value'] = 2 * ((df['hl2'] - df['min_low']) / (df['max_high'] - df['min_low'] + 0.0001) - 0.5)
df['value'] = np.clip(df['value'], -0.999, 0.999)
# Fisher変換
df['fisher'] = 0.5 * np.log((1 + df['value']) / (1 - df['value'] + 0.0001))
df['trigger'] = df['fisher'].shift(1)
# シグナル初期化
df['signal'] = 0
df['is_buy'] = False
df['is_sell'] = False
position = 0
for i in range(period + 1, len(df)):
# 買いシグナル(FisherがTriggerを上抜け)
if position <= 0 and df['fisher'].iloc[i] > df['trigger'].iloc[i] and df['fisher'].iloc[i-1] <= df['trigger'].iloc[i-1]:
df.loc[df.index[i], 'is_buy'] = True
df.loc[df.index[i], 'signal'] = 1
position = 1
# 売りシグナル(FisherがTriggerを下抜け)
elif position >= 0 and df['fisher'].iloc[i] < df['trigger'].iloc[i] and df['fisher'].iloc[i-1] >= df['trigger'].iloc[i-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
df['signal'] = df['signal'].fillna(0)
return df
def get_strategy_name() -> str:
"""戦略名を返す"""
return "Ehlers Fisher Transform"
def get_strategy_description() -> str:
"""戦略の説明を返す"""
return "Fisher変換を使用したシグナル生成戦略"
なぜこの結果になったのか(3つの理由)
- 1この作戦は、過去のデータで試したところ、勝った回数の割合(勝率)が約12.65%と、かなり低かったです。つまり、ほとんどの取引で負けてしまいました。
- 21回の取引で平均してどれくらい損するか(期待値)を計算すると、マイナス0.39%でした。これは、取引をすればするほど、少しずつお金が減っていく可能性が高いということです。
- 3最終的に、もとのお金が89.59%も減ってしまうという、とても残念な結果になりました。これは、一番大きく損した時の割合(最大DD)と同じ数字で、非常に大きな失敗だったことがわかります。
この結果から学べる3つの教訓
- 1「すごい計算方法」と聞いても、実際の取引で必ずうまくいくわけではない、ということを学びました。
- 2勝つ確率が低くても、一回で大きな利益が出ればプラスになることもありますが、この作戦ではそうはなりませんでした。
- 3取引の回数は577回と多かったですが、回数が多ければ成功する、というわけではないこともわかりました。
リスク管理の具体的手法
取引量の決め方
一度に持っているお金を全部使ってしまうのではなく、ほんの少し、例えば全体の1%や2%だけを使って取引をする、というルールを決めることです。
損失が大きくなったときの対処法
もしお金がどんどん減ってきてしまったら、「決めた金額以上に減ったら、しばらく取引をお休みする」というルールを作っておくことです。
資金管理の方法
取引に使うお金の上限を決めて、それを超えないようにします。また、もし利益が出たら、その一部は使わずに別の場所によけておくなど、大切なお金を守る計画を立てることです。
改良案の具体的提案
- 「買い」や「売りのサインが出てもすぐには動かず、他の情報(例えば、値動きが激しいかどうかを示す道具など)も見て、もっと確実なタイミングで取引するようにしてみる。
- 計算に使う「期間」の設定(今回は10)を、色々な数字に変えてみて、どれが一番良い成績になるかを探してみる。
- 大きな損をしないように、「1回の取引で失ってもいい金額の上限(損切りライン)」を、もっと厳しく決めるルールを追加する。
実用性の向上(運用上の注意)
- 今回のテストでは残念な結果だったので、この作戦をそのまま使うのはおすすめできません。他の作戦と組み合わせたり、改善を加えてから試すのが良いでしょう。
- 計算に使う設定の数字を少し変えるだけで、結果がガラッと変わることがあります。色々な設定で試してみることが大切です。
- 実際にお金を使って取引する前に、必ずお試し(シミュレーション)で練習して、どんな結果になりそうかを確認しましょう。
検証の透明性と信頼性
- データの出所: このテストで使ったのは、ビットコインの過去の1時間ごとの価格データです。
- 検証のやり方: 過去のデータを使って、「もしこの作戦通りに自動で売り買いを繰り返したら、お金はどうなったか?」をコンピューターで計算しました。
- コード: このテストで使ったプログラム(Pythonコード)は、誰でも見られるように公開されています。
- 注意事項: このお話は、あくまで過去のデータで試した結果です。未来も同じように利益が出ることを保証するものではありません。投資は、ご自身の判断と責任で行ってくださいね。