ビットコインが大きく動く時を見つけよう!AIが教える「デサイクラー」作戦
この作戦は、ビットコインの値段が大きく動きそうな合図を見つけて、うまく利益を出すための方法です。1時間ごとの値段のデータを使って、過去の約1年2ヶ月分の動きで、この作戦がうまくいくか試してみました。AIが値段の勢いを調べて、いつ買ったり売ったりすればいいか教えてくれます。
導入と前提条件
この作戦は、ビットコインの値段が大きく動きそうな合図を見つけて、うまく利益を出すための方法です。1時間ごとの値段のデータを使って、過去の約1年2ヶ月分の動きで、この作戦がうまくいくか試してみました。AIが値段の勢いを調べて、いつ買ったり売ったりすればいいか教えてくれます。
【検証】戦略のバックテスト概要
- 戦略名: Decycler Oscillator を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2024-07-01〜2025-08-25(419日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Decycler Oscillator の理論的背景
この作戦は、「値段は、ある範囲の中で動いていて、上がりすぎたり下がりすぎたりすると、元に戻ろうとする」という考え方が元になっています。まず「デサイクラー」という方法で、値段のなめらかな動きを予想します。そして、実際の値段と予想した値段がどれくらい離れているかを調べます。この差が、決めておいた基準の線を越えたときに、買ったり売ったりする合図が出ます。値段の勢いも一緒に見ることで、もっと成功しそうなタイミングを探します。
具体的な売買ルール(今回の検証)
エントリー条件
- デサイクラーで計算した線が、下の基準線を下から上に突き抜けたとき。これは「売られすぎだから、これから上がるかも?」という合図です。
- デサイクラーの線が真ん中の0の線を下から上に越えて、さらに値段が上がる勢いが強まっているとき。
エグジット条件
- デサイクラーで計算した線が、上の基準線を上から下に突き抜けたとき。これは「買われすぎだから、これから下がるかも?」という合図です。
- デサイクラーの線が真ん中の0の線を上から下に越えて、さらに値段が上がる勢いが弱まっているとき。
リスク管理
もし予想と反対に値段が動いてしまったら、損が大きくならないように、すぐに取引をやめるルールを決めておきます。この作戦のテストでは、最大で持っているお金の約44%も損してしまったことがありました。だから、損を小さくすることはとても大切です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Decycler Oscillator』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 152回 |
勝率 | 29.61% |
平均利益 | 2.2% |
平均損失 | -1.41% |
期待値 | -0.34% |
プロフィットファクター | 0.66 |
最大ドローダウン | 43.67% |
最終リターン | -43.01% |
シャープレシオ | -0.22 |
HODL(Buy&Hold) | 77.66% |
HODL戦略との比較
実装コード(Python)
"""
Decycler Oscillator Trading Signal Generator
高周波ノイズを除去してトレンドを抽出
"""
import pandas as pd
import numpy as np
def calculate_decycler_signals(df: pd.DataFrame,
hp_period: int = 125,
smooth_period: int = 5) -> pd.DataFrame:
"""
Decycler Oscillator戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
hp_period : int
ハイパスフィルター期間(デフォルト: 125)
smooth_period : int
スムージング期間(デフォルト: 5)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# Decycler (High-pass filter)
alpha = (np.cos(2 * np.pi / hp_period) + np.sin(2 * np.pi / hp_period) - 1) / np.cos(2 * np.pi / hp_period)
df['decycler'] = df['close'].copy()
for i in range(2, len(df)):
df.loc[df.index[i], 'decycler'] = alpha * (df.iloc[i]['close'] + df.iloc[i-1]['close']) / 2 + (1 - alpha) * df.iloc[i-1]['decycler']
# Decycler Oscillator (価格 - Decycler)
df['osc'] = ((df['close'] / df['decycler']) - 1) * 100
# スムージング
df['osc_smooth'] = df['osc'].rolling(window=smooth_period).mean()
# 標準偏差バンド
df['osc_std'] = df['osc_smooth'].rolling(window=hp_period).std()
df['upper_band'] = df['osc_std'] * 2
df['lower_band'] = -df['osc_std'] * 2
# モメンタム
df['osc_momentum'] = df['osc_smooth'] - df['osc_smooth'].shift(smooth_period)
# シグナル生成
df['osc_prev'] = df['osc_smooth'].shift(1)
df['is_buy'] = (
((df['osc_smooth'] > df['lower_band']) & (df['osc_prev'] <= df['lower_band'])) | # 売られ過ぎからの反発
((df['osc_smooth'] > 0) & (df['osc_prev'] <= 0) & (df['osc_momentum'] > 0)) # ゼロクロス+モメンタム
) & df['osc_smooth'].notna()
df['is_sell'] = (
((df['osc_smooth'] < df['upper_band']) & (df['osc_prev'] >= df['upper_band'])) | # 買われ過ぎからの反落
((df['osc_smooth'] < 0) & (df['osc_prev'] >= 0) & (df['osc_momentum'] < 0)) # ゼロクロス+モメンタム
) & df['osc_smooth'].notna()
# 不要カラム削除
df.drop(['decycler', 'osc', 'osc_smooth', 'osc_std', 'upper_band', 'lower_band',
'osc_momentum', 'osc_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦が成功する確率(勝率)は、約30%とあまり高くありませんでした。取引を1回しても、平均すると少し損をしてしまう計算になりました。これは、取引の合図が出ても、思ったように利益が出ないことが多かったということです。
- 2テスト期間全体で見ると、残念ながらお金はマイナス43%になってしまいました。これは、勝ったときにもらえる利益よりも、負けたときに失うお金の方が大きかった、ということです。
- 3テストの途中で、持っているお金が一番多いときから最大で約44%も減ってしまう時期がありました。これは、続けて負けてしまうと、お金が大きく減る危険があるということです。
この結果から学べる3つの教訓
- 1この作戦をそのまま使っても、安定して利益を出し続けるのは難しいかもしれません。勝つ確率が低くて、最終的にお金が減ってしまったので、今のままでは損をしてしまう可能性が高いと言えます。
- 2「デサイクラー」という考え方自体は、値段の勢いを見るのに役立つかもしれません。でも、いつ取引するかの合図の出し方を変えたり、他の方法と組み合わせたりする工夫が必要みたいです。
- 3過去のデータでうまくいかなかったからといって、未来でも絶対にダメとは限りません。でも、世の中の状況はいつも変わるので、この作戦もそのまま使うのではなく、もっと良くしていく必要があるということがわかりました。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金は、自分が持っているお金のほんの一部だけにします。例えば、1%だけと決めておけば、もし失敗しても、全体のお金が大きく減るのを防げます。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が決めた割合(例えば10%)より減ってしまったら、一度すべての取引をお休みします。そして、落ち着いてやり方を見直す時間を作ります。
資金管理の方法
取引で増えたお金は、全部を次の取引に使わずに、一部は貯金したり、もっと安全な方法でお金を増やすことを考えます。そして、取引に使うお金は、なくなっても生活に困らないお金だけにすることがとても大切です。
改良案の具体的提案
- どんなときに取引を始めるか、というルールをもう少し厳しくしてみます。例えば、他の分析方法も一緒に使って、「今がチャンス!」という確信がもっと持てる時だけ取引するようにします。
- 取引をやめるタイミングのルールを見直します。うまくいっている時は利益をもっと伸ばせるように、ダメだった時は損が小さいうちにやめられるように工夫します。
- 計算に使う数字(パラメータ)を、その時の状況に合わせて変えてみます。色々な数字で試してみて、一番うまくいく組み合わせを見つけるのも良い方法です。
実用性の向上(運用上の注意)
- この作戦の成績は、あくまで過去のデータで試した結果です。未来も同じようにうまくいくとは限りません。実際に試すときは、なくなっても大丈夫な少ない金額から始めるのがおすすめです。
- 「デサイクラー」の合図だけを信じるのではなく、他の分析方法やニュースなども見ながら、色々な情報を合わせて判断することが大切です。
- 計算に使う数字や、テストする期間を変えてみると、この作戦がどんな時に強くて、どんな時に弱いのかがわかるかもしれません。色々と試してみるのも良い勉強になります。
検証の透明性と信頼性
- データの出所: このテストで使ったのは、ビットコインの1時間ごとの値段のデータです。
- 検証のやり方: 用意されたプログラムを使って、決まった期間の過去のデータで、この作戦がどれくらいの成績だったかを計算しました。
- コード: この作戦をコンピューターで動かすためのプログラム(Pythonコード)は、見ることができます。
- 注意事項: このお話は、お金を増やす方法を教えるものではありません。投資には損をする危険もあります。取引をするかどうかは、最後は自分でよく考えて決めてくださいね。