ビットコインの「値動きの勢い」を見て売り買い!トレンド強度インデックス(TII)作戦
この作戦は、ビットコインの値段の「勢い」をヒントにして、いつ買うか、いつ売るかを決めるやり方です。5分ごとという短い時間で、何度も売り買いをして、もうけを出すことを目指します。でも、残念ながら、結果はあまり良くなかったみたいです。なぜうまくいかなかったのか、一緒に見ていきましょう。
導入と前提条件
この作戦は、ビットコインの値段の「勢い」をヒントにして、いつ買うか、いつ売るかを決めるやり方です。5分ごとという短い時間で、何度も売り買いをして、もうけを出すことを目指します。でも、残念ながら、結果はあまり良くなかったみたいです。なぜうまくいかなかったのか、一緒に見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: Trend Intensity Index を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-11-28〜2025-08-25(269日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Trend Intensity Index の理論的背景
この作戦は、「流れに乗る」という考え方が基本になっています。「一度上がったり下がったりし始めたら、しばらくその方向は続くことが多い」という考え方です。TIIは、ある時間の中で、最後の値段が平均の値段よりも高かった時間の割合を数字にしたものです。この数字が大きいほど、「上がる勢いが強いぞ!」と判断します。短い時間のTIIと、長い時間のTIIを比べることで、勢いがこれから強くなるか、弱くなるかを見つけます。具体的には、短い時間のTIIが、長い時間のTIIを追い越したとき(これをゴールデンクロスと呼びます)は、「これから値段が上がる勢いがつきそうだ!」と考えて「買い」ます。逆に、追い越されたとき(デッドクロス)は、「これから下がる勢いがつきそうだ…」と考えて「売り」ます。ただし、もともとの勢いが弱いときは、売り買いの合図が出ても何もしません。
具体的な売買ルール(今回の検証)
エントリー条件
- 短い時間のTIIが、長い時間のTIIを追い越したとき(ゴールデンクロス)に買います。
- ただし、追い越す前は、短い時間のTIIが長い時間のTIIより下にいたことが条件です。
- さらに、値動きの勢いが、ある基準(この作戦では20)より強いときだけ、というルールもあります。
- (※この作戦では「買う」ルールだけが決められています。ふつうは、値段が上がっているときに買うのが基本です。)
エグジット条件
- 持っているビットコインは、短い時間のTIIが、長い時間のTIIに追い越されたとき(デッドクロス)に売ります。
- これも、追い越される前は、短い時間のTIIが長い時間のTIIより上にいたことが条件です。
- そして、値動きの勢いが、ある基準(この作戦では20)より強いときだけ、というルールです。
- (※この作戦では「売る」というのは、持っているものを手放すという意味です。先に売ってから後で買う「空売り」をしたい場合は、また別のルールが必要です。)
リスク管理
この作戦では、最大で持っているお金の80%以上も損をしてしまうことがありました。これは、損が大きくなったときにすぐに売る、という「損切り」のルールがうまく働かなかったのかもしれません。大きな損をしないためには、あらかじめ「これ以上損したら、あきらめて売る」というラインを決めておくことがとても大事です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Trend Intensity Index』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 396回 |
勝率 | 30.05% |
平均利益 | 0.74% |
平均損失 | -0.93% |
期待値 | -0.43% |
プロフィットファクター | 0.36 |
最大ドローダウン | 82.98% |
最終リターン | -82.53% |
シャープレシオ | -0.34 |
HODL(Buy&Hold) | 17.92% |
HODL戦略との比較
実装コード(Python)
"""
Trend Intensity Index Trading Signal Generator
トレンドの強度と方向を測定
"""
import pandas as pd
import numpy as np
def calculate_tii_signals(df: pd.DataFrame,
major_period: int = 60,
minor_period: int = 30) -> pd.DataFrame:
"""
Trend Intensity Index戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
major_period : int
主要期間(デフォルト: 60)
minor_period : int
短期期間(デフォルト: 30)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 移動平均計算
df['ma_major'] = df['close'].rolling(window=major_period).mean()
df['ma_minor'] = df['close'].rolling(window=minor_period).mean()
# 価格と移動平均の偏差
df['dev_major'] = df['close'] - df['ma_major']
df['dev_minor'] = df['close'] - df['ma_minor']
# ポジティブ・ネガティブ偏差のカウント
df['pos_major'] = (df['dev_major'] > 0).astype(int)
df['neg_major'] = (df['dev_major'] < 0).astype(int)
df['pos_minor'] = (df['dev_minor'] > 0).astype(int)
df['neg_minor'] = (df['dev_minor'] < 0).astype(int)
# TII計算(期間内のポジティブ偏差の割合)
df['tii_major'] = df['pos_major'].rolling(window=major_period).sum() / major_period * 100
df['tii_minor'] = df['pos_minor'].rolling(window=minor_period).sum() / minor_period * 100
# TII差分(短期と長期の差)
df['tii_diff'] = df['tii_minor'] - df['tii_major']
# TII変化率
df['tii_change'] = df['tii_diff'] - df['tii_diff'].shift(1)
# トレンド強度
df['trend_strength'] = np.abs(df['tii_major'] - 50)
# シグナル生成
df['tii_diff_prev'] = df['tii_diff'].shift(1)
df['is_buy'] = (
((df['tii_diff'] > 0) & (df['tii_diff_prev'] <= 0)) & # ゴールデンクロス
(df['trend_strength'] > 20) # トレンドが十分強い
) & df['tii_diff'].notna()
df['is_sell'] = (
((df['tii_diff'] < 0) & (df['tii_diff_prev'] >= 0)) & # デッドクロス
(df['trend_strength'] > 20) # トレンドが十分強い
) & df['tii_diff'].notna()
# 不要カラム削除
df.drop(['ma_major', 'ma_minor', 'dev_major', 'dev_minor',
'pos_major', 'neg_major', 'pos_minor', 'neg_minor',
'tii_change', 'trend_strength', 'tii_diff_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝てたのは10回中3回くらいで、1回の売り買いで平均して少しずつ損をしていました。それが積み重なって、結果的にとても大きなマイナス(-82.53%)になってしまいました。
- 2もし、売り買いせずに、ただずっとビットコインを持っていただけなら、お金は増えていました(+17.92%)。この作戦を使ったせいで、逆に大きな損をしてしまったんです。
- 3一番調子が悪かったときには、持っていたお金の80%以上がなくなってしまうほど、大きな損をしました。これは、あっという間にお金をほとんど失ってしまう危険があった、ということです。
この結果から学べる3つの教訓
- 1勝つ回数が少なくても、1回勝ったときに大きくもうかれば、トータルではプラスになります。でも、この作戦では、勝ったときにもうかる金額が、負けたときに損する金額より小さかったようです。
- 2「流れに乗る」という考え方自体は良いアイデアです。でも、この作戦で使った「流れの強さをはかる方法」や「売り買いのタイミング」が、今のビットコインの動きには合っていなかったのかもしれません。
- 35分ごとという短い時間で、約400回も売り買いをしたのに、結果はマイナスでした。これは、一つ一つの売り買いの精度が低かったか、そもそも売り買いの回数が多すぎて、手数料などで損が増えたのかもしれません。
リスク管理の具体的手法
取引量の決め方
1回の売り買いで、持っているお金の全部を使うのは危険です。「もし失敗しても、失うのは持っているお金の1%か2%まで」と決めて、買う量を調整しましょう。例えば、100万円持っていたら、1回の失敗で失うのは1万円から2万円まで、といった具合です。
損失が大きくなったときの対処法
もし、持っているお金が全体で10%など、決めた割合以上減ってしまったら、一度すべての売り買いをストップします。そして、「なぜうまくいかないんだろう?」と原因を考えて、作戦を立て直す時間を作りましょう。
資金管理の方法
投資に使うお金は、なくなっても生活に困らない「余っているお金」だけにしましょう。もしもうかったら、その一部は使わずに取っておくなど、全体のお金の管理をしっかりすることが大切です。
改良案の具体的提案
- 勝つ確率を上げるために、売り買いの合図が出てもすぐには動かず、他のヒントも使って「これは本当にチャンスかな?」と確かめるルールを追加すると良さそうです。
- 大きな損をしないように、「これくらい損をしたら、すぐに売る」という「損切り」のルールをもっと厳しくします。そうすれば、1回で失うお金を少なくできます。
- 作戦で使っている数字(長い時間や短い時間の設定)をいろいろ変えてみて、今のビットコインの動きに一番合う組み合わせを探すのも良い方法です。実験して、一番成績が良くなる設定を見つけましょう。
実用性の向上(運用上の注意)
- この作戦は5分ごとの値段を見るので、動きがとても速くて激しくなります。焦らず、落ち着いて判断することがとても大事です。
- 過去のデータで試して「うまくいきそうだ!」と思っても、実際の未来で同じようにうまくいくとは限りません。まずは少ないお金で試してみて、本当にうまくいくか様子を見るのがおすすめです。
- この作戦は、あくまで「値段の勢い」を見ているだけです。だから、突然大きなニュースが出たりして値段が急に動いたときは、作戦通りの合図が出ても損をしてしまうことがあります。世の中のニュースにも気をつけておきましょう。
検証の透明性と信頼性
- データの出所: この説明は、元になったプログラムのコードと、その計算結果のデータを元に作られています。
- 検証のやり方: 過去のビットコインの5分ごとの値段のデータを使って、ある期間で「もしこの作戦を使っていたらどうなっていたか?」をシミュレーションした結果です。
- コード: この作戦をコンピューターで動かすためのプログラム(Pythonという言葉で書かれています)も公開されています。
- 注意事項: この作戦の成績は、あくまで過去のものです。未来でも同じようにもうかることを保証するものではありません。投資をするときは、自分の判断と責任で行ってくださいね。また、この説明は投資のプロからのアドバイスではなく、あくまで分かりやすく解説したものです。