シェア:

ビットコインの売り時・買い時がわかる?「CSI」っていう方法を見てみよう!

この作戦は、「CSI」っていう特別なモノサシを使って、ビットコインの値段の上がり下がりをチェックする方法です。1時間ごとに値段の動きを見て、いつ買っていつ売ればいいかのタイミングを探します。

取引数
140
勝率
19.29%
最終リターン
-40.73%
最大DD
40.73%

導入と前提条件

この作戦は、「CSI」っていう特別なモノサシを使って、ビットコインの値段の上がり下がりをチェックする方法です。1時間ごとに値段の動きを見て、いつ買っていつ売ればいいかのタイミングを探します。

【検証】戦略のバックテスト概要

  • 戦略名: Commodity Selection Index を使用したトレンド追従戦略
  • 対象銘柄: BTC/USDT
  • 時間足: 1h
  • 期間: 2025-04-28〜2025-08-26(119日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

Commodity Selection Index の理論的背景

この作戦は、「流れに乗る」っていう考え方がもとになっています。これは、一度決まった方向に値段が動き出すと、しばらくは同じ方向に動き続けることが多い、という考え方です。CSIは、値段の動きの大きさと、上がるパワーと下がるパワーのどっちが強いかを組み合わせて、今の流れの強さをはかるのに役立ちます。もし上がるパワーが強ければ「買い」、下がるパワーが強ければ「売り」というように、その流れに乗って、うまくもうけようとします。

具体的な売買ルール(今回の検証)

エントリー条件

  • ビットコインの値段が上がるパワーが強くて、しかも値段の動きが大きくなってきたら、買うチャンスです。
  • 値段が上がるパワーが、下がるパワーより強くなったときも、買うチャンスかもしれません。

エグジット条件

  • ビットコインの値段が上がるパワーが弱くなって、値段の動きが小さくなってきたら、持っているものを売るタイミングです。
  • 値段が下がるパワーが、上がるパワーより強くなったときも、売るタイミングかもしれません。

リスク管理

一度にたくさんのお金を使わずに、持っているお金のうちのほんの少しだけを使います。もしソンが出ても、それ以上大きくならないように、「これ以上ソンしたらやめる」と決めた金額になったら、すぐに取引をやめるようにします。

再現手順(HowTo)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでBTC/USDTのOHLCVを取得して前処理
  3. 『Commodity Selection Index』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数140回
勝率19.29%
平均利益1.19%
平均損失-0.74%
期待値-0.37%
プロフィットファクター0.38
最大ドローダウン40.73%
最終リターン-40.73%
シャープレシオ-1.13
HODL(Buy&Hold)16.7%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Commodity Selection Index Trading Signal
CSIを使用したトレンド判定
"""
import pandas as pd
import numpy as np


def calculate_commodity_selection_index_signals(df: pd.DataFrame,
                                              period: int = 14,
                                              multiplier: float = 0.015) -> pd.DataFrame:
    """
    Commodity Selection Index戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    period : int
        計算期間(デフォルト: 14)
    multiplier : float
        マルチプライヤー(デフォルト: 0.015)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    df = df.copy()
    
    # ATR計算
    df['h_l'] = df['high'] - df['low']
    df['h_c'] = np.abs(df['high'] - df['close'].shift(1))
    df['l_c'] = np.abs(df['low'] - df['close'].shift(1))
    df['tr'] = df[['h_l', 'h_c', 'l_c']].max(axis=1)
    df['atr'] = df['tr'].rolling(window=period).mean()
    
    # ADX計算
    df['up_move'] = df['high'] - df['high'].shift(1)
    df['down_move'] = df['low'].shift(1) - df['low']
    df['plus_dm'] = np.where((df['up_move'] > df['down_move']) & (df['up_move'] > 0), df['up_move'], 0)
    df['minus_dm'] = np.where((df['down_move'] > df['up_move']) & (df['down_move'] > 0), df['down_move'], 0)
    
    df['plus_di'] = 100 * (df['plus_dm'].rolling(window=period).sum() / df['atr'])
    df['minus_di'] = 100 * (df['minus_dm'].rolling(window=period).sum() / df['atr'])
    df['dx'] = 100 * np.abs(df['plus_di'] - df['minus_di']) / (df['plus_di'] + df['minus_di'] + 0.0001)
    df['adx'] = df['dx'].rolling(window=period).mean()
    
    # CSI計算
    df['csi'] = df['adx'] * df['atr'] * 100 / (np.sqrt(150) * multiplier)
    
    # シグナル初期化
    df['signal'] = 0
    df['is_buy'] = False
    df['is_sell'] = False
    
    position = 0
    
    for i in range(period * 2, len(df)):
        # 買いシグナル(CSIが高く、上昇トレンド)
        if position <= 0 and df['csi'].iloc[i] > 100 and df['plus_di'].iloc[i] > df['minus_di'].iloc[i]:
            df.loc[df.index[i], 'is_buy'] = True
            df.loc[df.index[i], 'signal'] = 1
            position = 1
            
        # 売りシグナル
        elif position >= 0 and (df['csi'].iloc[i] < 50 or df['minus_di'].iloc[i] > df['plus_di'].iloc[i]):
            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 "Commodity Selection Index"


def get_strategy_description() -> str:
    """戦略の説明を返す"""
    return "CSIを使用したトレンド判定戦略"

なぜこの結果になったのか(3つの理由)

  1. 1この作戦では14日間の値段の動きを見ていましたが、ビットコインはもっと速く値段が変わるので、この期間は長すぎたのかもしれません。
  2. 2100回挑戦したら、もうけが出たのは19回くらいで、ソンすることが多かったみたいです(勝率19.29%)。
  3. 3ぜんぶの結果を合わせると、持っていたお金が40.73%も減ってしまう、残念な結果になりました。

この結果から学べる3つの教訓

  1. 1どんなに「良さそう!」と思った作戦でも、実際にやってみると、うまくいかないことがあるとわかりました。
  2. 2勝つ回数が少なくても、一回で大きく勝てればプラスになることもありますが、この作戦ではそうはなりませんでした。
  3. 3昔のデータでうまくいったからといって、これからもうまくいくとは限らない、ということがよくわかりました。

リスク管理の具体的手法

取引量の決め方

一回の挑戦で使うお金は、持っているお金全部の2%まで、みたいに小さな割合に決めておきます。

損失が大きくなったときの対処法

もしソンが増えて、持っているお金の10%みたいに決めておいた金額まで減ってしまったら、一度ストップして、それ以上ソンが大きくならないようにします。

資金管理の方法

長い目で見てちゃんともうけ続けられるように、お金を大事に、かしこく使うことを心がけます。

改良案の具体的提案

  • 値段の動きを見る期間の長さや、パワーをはかるための数字を変えてみて、もっとうまくいく設定を探してみます。
  • 「こういう時だけ買う」みたいに、ルールをもっと厳しくして、失敗を減らす工夫をしてみます。
  • 一番ソンした時にお金が大きく減ってしまうこと(最大ドローダウン)があったので、これをできるだけ小さくする方法を考えます。

実用性の向上(運用上の注意)

  • この作戦はテストの結果が良くなかったので、このまま使うのは危ないです。もし試すなら、昔のデータで本当にうまくいくか、自分で確かめてみてください。
  • ビットコインは値段の動きがとても大きいので、もしこの作戦を使うなら、「ソンを大きくしないためのルール」を絶対に守ることが大事です。
  • この作戦はあくまでヒントの一つです。他の情報もいろいろ見て、最後に「買う」か「売る」か決めるのは、自分自身で考えてくださいね。

検証の透明性と信頼性

  • データの出所: この結果は、過去のビットコイン(BTC/USDT)の1時間ごとの値段のデータを使って計算しました。
  • 検証のやり方: ここに書いてある成績(勝った割合や、もうけ・ソンなど)は、2025年4月28日から2025年8月26日までの約4ヶ月間のデータで計算したものです。
  • コード: この作戦を計算したコンピューターのプログラムは、誰でも見られるようになっています。
  • 注意事項: この作戦は、昔のデータで計算した結果です。将来も同じようにうまくいくとは限りません。お金を使うときは、自分の責任でお願いします。

よくある質問

Q.ビットコインって何?

A.ビットコインは、インターネット上で使えるお金みたいなものです。円やドルと違って、特定の国が作っているのではなく、世界中の人たちが協力して仕組みを支えています。

Q.CSIってどうやって計算するの?

A.CSIは、値段がどれくらい大きく動くか(動きの幅)と、上がるパワーと下がるパワーのどっちが強いか、を組み合わせて計算します。くわしい計算は少し難しいですが、値段の動きの強さを数字にしたもの、と考えてください。

Q.勝率が低いってどういうこと?

A.「勝率」は、挑戦した回数のうち、もうけが出たのが何回あったかの割合です。この作戦では、もうけが出た回数よりも、ソンしてしまった回数の方がずっと多かったということです。

Q.最大DDって何?

A.「最大DD(ドローダウン)」は、一番うまくいかなかった時に、もとのお金が最大でどれくらい減っちゃったか、という割合のことです。この作戦では、一番ソンの大きかった時で、お金が40.73%も減ってしまった、ということです。

Q.この戦略は使っても大丈夫?

A.今回のテストではうまくいかなかったので、このまま使うのはやめたほうがいいです。もし使ってみたいなら、自分でいろいろ工夫したり、もっとよく調べてから、自分の判断と責任で挑戦してください。

Q.検証に使用した期間と時間足は?

A.1h足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-40.73%、最大DDは40.73%です。

Q.勝率やPFはどの程度?

A.勝率は19.29%、プロフィットファクターは0.38です。

Q.HODLとの比較結果は?

A.HODLは16.70%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報