「未来の値段がわかる計算式?」ビットコインの取引を試してみた結果
今回は、ビットコインを5分ごとという、とても短い時間で売り買いする作戦を試してみました。この作戦では「インバース・フィッシャー・トランスフォーム」という、値段の勢いがわかると言われる特別な計算方法を使います。でも、結果は残念ながらあまり良くありませんでした。どうしてうまくいかなかったのか、一緒に見ていきましょう!
導入と前提条件
今回は、ビットコインを5分ごとという、とても短い時間で売り買いする作戦を試してみました。この作戦では「インバース・フィッシャー・トランスフォーム」という、値段の勢いがわかると言われる特別な計算方法を使います。でも、結果は残念ながらあまり良くありませんでした。どうしてうまくいかなかったのか、一緒に見ていきましょう!
【検証】戦略のバックテスト概要
- 戦略名: Inverse Fisher Transform を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-07-21〜2025-08-25(399日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Inverse Fisher Transform の理論的背景
この作戦の裏側にある考え方は、「値段の動きって、実はだいたい決まった範囲に収まることが多いよね」というものです。そこでまず「RSI」という道具で、今の値段にどれくらい勢いがあるかを調べます。次に、その結果を「インバース・フィッシャー・トランスフォーム」で計算し直して、すごく分かりやすい数字に変身させます。この数字が、ある決まった線を超えたり、向きを変えたりしたときを「買う合図」や「売る合図」にしよう、というわけです。こうすれば、ちょっとした値段のふらつきにだまされずに、本当の大きな流れの変化をつかまえられるんじゃないか、と考えたんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 計算して出てきた数字が、すごく低い場所から上を向き始めたら、「これから上がるかも!」と考えて買う、というルールです。
エグジット条件
- 逆に、計算した数字がすごく高い場所から下を向き始めたら、「そろそろ下がるかも!」と考えて売る、というルールです。
リスク管理
どんな取引でも、大きな損をしないための「安全ルール」はとても大切です。例えば、「一度に全部のお金を使わない」とか、「予想が外れたら、傷が浅いうちにやめる」といったルールですね。ただ、今回の作戦では、この安全ルールがうまく働かず、残念ながら大きな損が出てしまいました。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Inverse Fisher Transform』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 810回 |
勝率 | 30.12% |
平均利益 | 0.54% |
平均損失 | -0.8% |
期待値 | -0.39% |
プロフィットファクター | 0.28 |
最大ドローダウン | 96.16% |
最終リターン | -96.09% |
シャープレシオ | -0.4 |
HODL(Buy&Hold) | 67.84% |
HODL戦略との比較
実装コード(Python)
"""
Inverse Fisher Transform Trading Signal Generator
価格を正規分布に変換してシグナルを明確化
"""
import pandas as pd
import numpy as np
def calculate_inverse_fisher_signals(df: pd.DataFrame,
period: int = 9) -> pd.DataFrame:
"""
Inverse Fisher Transform戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
計算期間(デフォルト: 9)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# RSI計算
df['price_change'] = df['close'].diff()
df['gain'] = df['price_change'].where(df['price_change'] > 0, 0)
df['loss'] = -df['price_change'].where(df['price_change'] < 0, 0)
df['avg_gain'] = df['gain'].rolling(window=period).mean()
df['avg_loss'] = df['loss'].rolling(window=period).mean()
df['rs'] = df['avg_gain'] / (df['avg_loss'] + 0.0001)
df['rsi'] = 100 - (100 / (1 + df['rs']))
# RSIを-1から1にスケーリング
df['normalized'] = (df['rsi'] - 50) / 50
# スムージング
df['smooth'] = df['normalized'].ewm(span=5, adjust=False).mean()
# Fisher Transform
df['fisher'] = 0.5 * np.log((1 + df['smooth'].clip(-0.999, 0.999)) / (1 - df['smooth'].clip(-0.999, 0.999)))
# Inverse Fisher Transform
df['ift'] = (np.exp(2 * df['fisher']) - 1) / (np.exp(2 * df['fisher']) + 1)
# シグナルライン
df['ift_signal'] = df['ift'].shift(1)
# シグナル生成
df['is_buy'] = (df['ift'] > df['ift_signal']) & (df['ift'] > -0.5) & (df['ift_signal'] <= -0.5) & df['ift'].notna()
df['is_sell'] = (df['ift'] < df['ift_signal']) & (df['ift'] < 0.5) & (df['ift_signal'] >= 0.5) & df['ift'].notna()
# 不要カラム削除
df.drop(['price_change', 'gain', 'loss', 'avg_gain', 'avg_loss', 'rs', 'rsi',
'normalized', 'smooth', 'fisher', 'ift_signal'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝った回数がとても少なかったからです。10回挑戦して、勝てたのは3回だけ。ほとんどの取引で負けてしまったので、お金が減ってしまいました。
- 21回の取引で、平均して少しずつお金が減ってしまう計算だったからです。これを繰り返すと、どんどんお金がなくなってしまいます。
- 3一番運が悪かったときには、持っていたお金のほとんど(96%)を失ってしまうほど、大きな損が出てしまったからです。これはとても危険な状態でした。
この結果から学べる3つの教訓
- 1たくさん負けても、たった1回の勝ちで全部取り返せるくらい、大きな勝ちをねらえる作戦じゃないとダメだ、ということです。
- 2「今がチャンス!」という合図だけで飛びつくのではなく、世の中全体の景気や、大きな値段の流れ(トレンド)もしっかり見ることが大切だ、ということです。
- 3どんなにすごい計算式を使っても、突然のニュースや予想外の出来事が起きると、うまくいかなくなってしまうことがある、ということです。
リスク管理の具体的手法
取引量の決め方
一度の挑戦で使うお金は、持っているお金全部じゃなくて、ほんの少しだけ(例えば100分の1とか)にしましょう。そうすれば、もし負けてもダメージは小さくて済みます。
損失が大きくなったときの対処法
もし、負けが続いて持っているお金が1割減ってしまったら、一度お休みして作戦を考え直す、というような「ストップルール」を決めておきましょう。
資金管理の方法
もし取引でうまく利益が出たら、その一部は貯金するなど、安全な場所に移しておきましょう。いつも心とお金に余裕を持つことが、落ち着いて取引するコツです。
改良案の具体的提案
- 「買いだ!」「売りだ!」と判断するルールを、もっと厳しくします。本当に「これは絶対いける!」という時だけ挑戦するようにして、むだな取引を減らすんです。
- ただビットコインを買って、じっと持っている作戦(これを「HODL(ホドル)」と言います)よりも、良い成績が出るように、作戦の根本から考え直してみます。
- 5分ごとではなく、1時間ごとや1日ごとなど、もっと長い時間で値段の動きを見たり、他の計算方法と組み合わせたりして、作戦をパワーアップさせます。
実用性の向上(運用上の注意)
- 今回の作戦は、テストの結果がとても悪かったので、このまま真似するのは絶対にやめましょう。もし使うなら、自分でたくさん工夫や改良をすることが必要です。
- 5分ごとの取引は、値段の動きがとても激しくてプロでも難しいです。慣れないうちは、もっとゆったりしたペースの取引から始めるのがおすすめです。
- 取引を始める前には、経済ニュースなどをチェックして、「今日は何か大きなイベントがあるかな?」と確認するクセをつけましょう。
検証の透明性と信頼性
- データの出所: この結果は、専門家が書いたプログラム(Pythonコード)と、そのプログラムで計算した成績のデータを元にしています。
- 検証のやり方: 提供されたプログラムを使って、過去のビットコインの値段のデータで、「もしこの作戦を使っていたらどうなっていたか」というシミュレーションをして、成績を確かめました。
- コード: この作戦を試したプログラムの設計図(コード)は、公開されています。
- 注意事項: 注意してほしいのですが、この結果はあくまで過去のデータで試したものです。未来でも同じようにうまくいくとは限りません。お金を実際に使うときは、必ず自分でよく考えて、自分の責任で行ってくださいね。