未来の価格を予測!?特別な道具「フィッシャー変換」でリップル(XRP)の取引を試してみた結果
このレポートでは、仮想通貨リップル(XRP)を1時間ごとの値動きで取引する、「フィッシャー変換」という方法を試してみました。157日間で597回も取引した結果、どうなったのかをわかりやすく説明します。未来の価格を予測するヒントが見つかるかもしれませんよ。
導入と前提条件
このレポートでは、仮想通貨リップル(XRP)を1時間ごとの値動きで取引する、「フィッシャー変換」という方法を試してみました。157日間で597回も取引した結果、どうなったのかをわかりやすく説明します。未来の価格を予測するヒントが見つかるかもしれませんよ。
【検証】戦略のバックテスト概要
- 戦略名: Fisher Transform を使用したトレンド追従戦略
- 対象銘柄: XRP/USDT
- 時間足: 1h
- 期間: 2025-03-20〜2025-08-25(157日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: kucoin
Fisher Transform の理論的背景
「フィッシャー変換」は、価格の動きの速さや大きさを、わかりやすい「いきおい」の数字に変える考え方です。たとえば、価格が急に上がったり下がったりすると、この「いきおい」の数字も大きく動きます。この作戦では、「いきおい」がある基準を超えたら、売ったり買ったりするサインだと考えます。これは、価格が「いきおいよく動き始めた!」という合図なんです。むずかしい計算式は使わず、価格の「いきおいの変化」に注目しています。
具体的な売買ルール(今回の検証)
エントリー条件
- 「いきおい」の数字が、1つ前の数字より大きくなって、でも2つ前の数字よりは小さいか同じだったとき(買うタイミング)
- 「いきおい」の数字が、1つ前の数字より小さくなって、でも2つ前の数字よりは大きいか同じだったとき(売るタイミング)
エグジット条件
- 「買う」のサインが出たあと、反対に「売る」のサインが出たとき(取引をやめるタイミング)
- 「売る」のサインが出たあと、反対に「買う」のサインが出たとき(取引をやめるタイミング)
リスク管理
1回の取引で損してもいい金額を、持っているお金のほんの少しだけに決めます。たとえば、「1回の取引で損していいのは、全部のお金の2%まで」というようなルールです。こうすることで、もし取引がうまくいかなくても、すぐにお金が全部なくなってしまうのを防ぎます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでXRP/USDTのOHLCVを取得して前処理
- 『Fisher Transform』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 597回 |
勝率 | 24.12% |
平均利益 | 1.33% |
平均損失 | -0.9% |
期待値 | -0.36% |
プロフィットファクター | 0.42 |
最大ドローダウン | 89.82% |
最終リターン | -89.24% |
シャープレシオ | -1.59 |
HODL(Buy&Hold) | 21.26% |
HODL戦略との比較
実装コード(Python)
"""
Fisher Transform Breakout
価格を正規化したFisher変換のシグナルで判定するのだ。
"""
import pandas as pd
import numpy as np
def calculate_fisher_signals(df: pd.DataFrame, period: int = 10) -> pd.DataFrame:
out = df.copy()
hl2 = (out['high'] + out['low']) / 2
min_l = hl2.rolling(period).min()
max_h = hl2.rolling(period).max()
# 範囲が0の場合を防ぐ
x = 2 * ((hl2 - min_l) / (max_h - min_l + 0.0001) - 0.5)
x = x.clip(-0.999, 0.999)
# Fisher変換の計算
fish = pd.Series(index=x.index, dtype=float)
fish.iloc[0] = 0
for i in range(1, len(x)):
if not pd.isna(x.iloc[i]):
fish.iloc[i] = 0.5 * np.log((1 + x.iloc[i]) / (1 - x.iloc[i] + 0.0001)) + 0.5 * (fish.iloc[i-1] if not pd.isna(fish.iloc[i-1]) else 0)
else:
fish.iloc[i] = fish.iloc[i-1] if i > 0 else 0
trigger = fish.shift(1)
out['fisher'] = fish
out['trigger'] = trigger
# クロスオーバーシグナル
out['is_buy'] = (fish > trigger) & (fish.shift(1) <= trigger.shift(1)) & fish.notna() & trigger.notna()
out['is_sell'] = (fish < trigger) & (fish.shift(1) >= trigger.shift(1)) & fish.notna() & trigger.notna()
return out
なぜこの結果になったのか(3つの理由)
- 1取引を続けても、だんだん損をしてしまう可能性が高かったのは、この作戦がリップル(XRP)の1時間ごとの値動きとは、相性が良くなかったからかもしれません。
- 2勝ったのが24%くらいと低かったのは、「いきおい」の変化を見つけようとしたけど、それが「ウソの動き」で、だまされてしまうことが多かったからだと考えられます。
- 3一時的に一番大きくお金が減ってしまった割合が、約90%とすごく大きかったのは、損が大きくなるのをうまく止められず、大きな損をかかえてしまったからだと言えます。
この結果から学べる3つの教訓
- 1どんなに良さそうな作戦でも、すべての仮想通貨や時間の区切り方でうまくいくわけではない、ということを学びました。
- 2勝つ確率の低さだけでなく、1回でどれくらい大きく損をする可能性があるか(最大DD)も、作戦が良いか悪いかを判断するのに、とても大事だとわかりました。
- 3597回も取引をしたということは、チャンスがたくさんあったはずなのに、良い結果につながりませんでした。つまり、チャンスの活かし方に問題があったと考えられます。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金の量は、いつも持っているお金の全体のうち、決まった割合(たとえば1%)にします。こうすることで、もし損が大きくなっても、全体のお金への影響を小さくできます。
損失が大きくなったときの対処法
もし損が一定の金額(たとえば持っているお金の10%)を超えたら、その日は取引をやめる、とか、作戦自体を見直す、というルールを作ります。これで、負けが続いて大きく損するのを防ぎます。
資金管理の方法
取引に使うお金は、なくなっても生活に困らないお金だけにします。また、利益が出たら、その一部を貯金するなど、お金の使い道をちゃんと計画することが大切です。
改良案の具体的提案
- 取引の回数をへらして、もっと「これは確実だ!」と思えるサインのときだけ取引するようにルールをきびしくすれば、勝つ確率が上がるかもしれません。
- 損が少し出たらすぐに取引をやめる(損切り)ルールを決めたり、利益が出ているときに自動で利益を確保する(利確)機能を入れたりすることも考えられます。
- ほかの分析道具(たとえば、みんなが見ている平均の値段の線など)と組み合わせることで、もっと正確な「買い」や「売り」のサインが見つけられるようになるかもしれません。
実用性の向上(運用上の注意)
- この作戦を試すときは、まず少ない金額から始めて、実際の値動きでどうなるかを確認してみましょう。
- 市場の様子はいつも変わるので、ときどき作戦の成績をチェックして、必要なら設定(見る期間など)を調整することが大事です。
- 「フィッシャー変換」の数字だけを見るのではなく、グラフ全体の形やほかの道具も参考にしながら、総合的に判断することが、もっと良い取引につながります。
検証の透明性と信頼性
- データの出所: もとになったデータは、提供された過去のテストデータです。
- 検証のやり方: 過去のリップル(XRP)の1時間ごとの値動きのデータ(2025-03-20から2025-08-25まで)を使って、パソコンのプログラムで試しました。
- コード: このテストで使ったプログラムのコードは、見ることができます。
- 注意事項: このレポートは、情報を伝えるためのもので、投資をおすすめするものではありません。実際に取引するときは、ご自身の判断と責任で行ってください。過去の良い成績が、未来も同じように良いとは限りません。