シェア:

みんなの「買いたい!」気持ちがわかる?「需要指数」で仮想通貨に挑戦!

仮想通貨の取引で「いつ買えばいいの?」「いつ売ればいいの?」と迷ったことはありませんか?「需要指数」という方法を使うと、市場のみんなの「買いたい!」という気持ちと「売りたい…」という気持ちのバランスを見ることができます。これによって、買うタイミングや売るタイミングを見つけやすくなるんです。今回は、ETHとUSDTという仮想通貨の組み合わせで、1時間ごとの値動きを分析してみました。

取引数
436
勝率
25.92%
最終リターン
-68.95%
最大DD
70.29%

導入と前提条件

仮想通貨の取引で「いつ買えばいいの?」「いつ売ればいいの?」と迷ったことはありませんか?「需要指数」という方法を使うと、市場のみんなの「買いたい!」という気持ちと「売りたい…」という気持ちのバランスを見ることができます。これによって、買うタイミングや売るタイミングを見つけやすくなるんです。今回は、ETHとUSDTという仮想通貨の組み合わせで、1時間ごとの値動きを分析してみました。

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

  • 戦略名: Demand Index を使用したトレンド追従戦略
  • 対象銘柄: ETH/USDT
  • 時間足: 1h
  • 期間: 2025-02-19〜2025-08-25(186日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: okx

Demand Index の理論的背景

この作戦の基本的な考え方は、市場の「買いの力」と「売りの力」のどちらが強いかに注目することです。例えば、値段が始まったときより終わったときの方が高ければ「買いの力が強い」、安ければ「売りの力が強い」と考えます。この2つの力のバランスを計算して、「需要指数」という数字を出します。この数字がプラスなら買いたい人が多く、マイナスなら売りたい人が多い、というしるしです。さらに、この指数のデコボコした動きをなめらかにした線も使って、値段の動きと指数の動きのズレがないかも見ます。これによって、より確かな売買のタイミングを探るんです。難しい計算というより、市場の「今の勢い」や「ムード」を数字で見えるようにしたもの、と考えると分かりやすいですよ。

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

エントリー条件

  • 「需要指数」がマイナスからプラスに変わったとき。これは、買いたい気持ちが強くなってきたサインです。
  • 値段は下がっているのに「需要指数」は上がっているなど、値段の動きと指数の動きが逆になったとき。これは、これから値段が上がるかもしれない、という強い買いのサインです。

エグジット条件

  • 「需要指数」がプラスからマイナスに変わったとき。これは、売りたい気持ちが強くなってきたサインです。
  • 値段は上がっているのに「需要指数」は下がっているなど、値段の動きと指数の動きが逆になったとき。これは、これから値段が下がるかもしれない、という強い売りのサインです。

リスク管理

取引をするときは、もし失っても生活に困らないお金だけを使うことが大切です。そして、「損切り」というルールを決めておきましょう。これは、もし予想と反対に値段が大きく動いてしまったら、そこで取引をやめるというルールです。こうすることで、大きな損をしてしまうのを防ぐことができます。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数436回
勝率25.92%
平均利益2.07%
平均損失-1.06%
期待値-0.25%
プロフィットファクター0.65
最大ドローダウン70.29%
最終リターン-68.95%
シャープレシオ-0.7
HODL(Buy&Hold)73.3%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Demand Index Trading Signal Generator
価格と出来高の関係から需要を測定
"""
import pandas as pd
import numpy as np


def calculate_demand_index_signals(df: pd.DataFrame,
                                  period: int = 5) -> pd.DataFrame:
    """
    Demand Index戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    period : int
        移動平均期間(デフォルト: 5)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    df = df.copy()
    
    # 価格変化率
    df['price_change'] = df['close'] / df['close'].shift(1) - 1
    
    # ボリューム変化率
    df['volume_change'] = df['volume'] / df['volume'].shift(1) - 1
    
    # Buying Pressure(買い圧力)
    df['bp'] = df['volume'] * np.where(df['close'] > df['open'], 
                                       (df['close'] - df['low']) / (df['high'] - df['low'] + 0.0001), 
                                       0)
    
    # Selling Pressure(売り圧力)
    df['sp'] = df['volume'] * np.where(df['close'] < df['open'],
                                       (df['high'] - df['close']) / (df['high'] - df['low'] + 0.0001),
                                       0)
    
    # Demand Index
    df['di_raw'] = (df['bp'] - df['sp']) / (df['bp'] + df['sp'] + 0.0001)
    
    # スムージング
    df['di'] = df['di_raw'].rolling(window=period).mean()
    
    # DI変化率
    df['di_change'] = df['di'] - df['di'].shift(1)
    
    # 移動平均
    df['di_ma'] = df['di'].rolling(window=period * 2).mean()
    
    # ダイバージェンス検出
    price_ma = df['close'].rolling(window=period).mean()
    df['price_trend'] = (price_ma - price_ma.shift(period)) / price_ma.shift(period)
    df['di_trend'] = (df['di'] - df['di'].shift(period)) / (np.abs(df['di'].shift(period)) + 0.0001)
    df['divergence'] = df['price_trend'] * df['di_trend']
    
    # シグナル生成
    df['di_prev'] = df['di'].shift(1)
    df['is_buy'] = (
        ((df['di'] > 0) & (df['di_prev'] <= 0)) |  # ゼロラインクロス
        ((df['di'] > df['di_ma']) & (df['divergence'] < -0.1))  # 強気ダイバージェンス
    ) & df['di'].notna()
    df['is_sell'] = (
        ((df['di'] < 0) & (df['di_prev'] >= 0)) |  # ゼロラインクロス
        ((df['di'] < df['di_ma']) & (df['divergence'] < -0.1))  # 弱気ダイバージェンス
    ) & df['di'].notna()
    
    # 不要カラム削除
    df.drop(['price_change', 'volume_change', 'bp', 'sp', 'di_raw', 'di_change',
             'di_ma', 'price_trend', 'di_trend', 'divergence', 'di_prev'], axis=1, inplace=True, errors='ignore')
    
    return df

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

  1. 1今回の取引では、勝てたのは4回に1回くらい(勝率 約26%)でした。つまり、多くの取引で負けてしまった、ということです。
  2. 2儲かった取引の合計金額よりも、損した取引の合計金額の方が大きくなってしまいました。全体として利益を出すのが難しい結果だったことがわかります。
  3. 3最終的に、最初のお金が約69%も減ってしまいました。また、一番うまくいかなかった時期には、お金が最大で70%も減ってしまったことがありました。これも、この作戦の難しいところです。

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

  1. 1たとえ負ける回数が多くても、1回勝ったときに大きく儲けることができれば、全体ではプラスになることもある、ということを学びました。でも、今回はそれがうまくいきませんでした。
  2. 2「需要指数」が、必ずしも値段の未来を当てられるわけではないこと、そして、市場の状況によっては、この方法がうまくいかない時もある、ということが分かりました。
  3. 3たった一つのルールに頼るのではなく、市場の状況に合わせてやり方を変えたり、他の分析方法と組み合わせたりすることが大切だと感じました。

リスク管理の具体的手法

取引量の決め方

1回の取引で使うお金は、持っているお金全体の1%から2%くらい(100分の1か2)にしましょう。こうすれば、もし何回か負けても、すぐにお金が全部なくなってしまうことはありません。

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

もし持っているお金が思ったより減ってしまったら、一度取引をお休みしたり、取引に使う金額を減らしたりしましょう。焦って変な判断をしないために、冷静になることがとても大事です。

資金管理の方法

投資に使うお金と、普段の生活で使うお金は、きちんと分けて管理しましょう。また、「いくら儲かったらやめる」「いくら損したらやめる」という目標を最初に決めておくと、計画的に取引を進められます。

改良案の具体的提案

  • 売買のタイミングを決めるときに、他の分析ツールも一緒に見て、条件を増やすこと。
  • 「需要指数」を計算するときに使う数字(期間など)を変えてみて、もっと良い結果が出ないか試してみること。
  • 利益が出ているときはなるべくそれを伸ばし、損が出始めたらすぐに取引をやめる(損切りする)など、取引ごとのルールをもう少し細かく決めること。

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

  • この作戦は、あくまで考え方の一つです。必ず自分の目で実際の市場の動きを確かめながら取引してくださいね。
  • いきなり大きなお金で取引するのはやめましょう。まずは少額や、練習用の取引(デモ取引)で試してみて、慣れてきたら少しずつ金額を増やしていくのがおすすめです。
  • 世の中のニュースや、他の仮想通貨がどうなっているかなども気にすると、もっと良い判断ができるようになるかもしれません。

検証の透明性と信頼性

  • データの出所: この分析には、過去のETH/USDTの1時間ごとの値段のデータ(始まりの値段、一番高かった値段、一番安かった値段、終わりの値段)と、取引された量を使いました。
  • 検証のやり方: ここに書いてある成績は、「もしこのルールで昔から取引していたらどうなっていたか」をコンピューターで計算(シミュレーション)した結果です。
  • コード: この作戦を計算して、売買のタイミングを見つけるためのプログラムも公開されています。これを使えば、自分で同じ計算を試すこともできます。
  • 注意事項: このお話は、投資の勉強や研究のためのもので、将来必ず儲かることを保証するものではありません。仮想通貨の取引には危険がともない、投資したお金がなくなってしまう可能性もあります。投資をするかどうかは、最後は必ずご自身の責任で判断してください。

よくある質問

Q.「需要指数」って、どうやって計算しているの?

A.すごく簡単に言うと、その時間に「買いたい!」という力がどれくらい強くて、取引された量がどれくらい多いかを組み合わせて、数字にしています。人気と勢いをはかるものさし、というイメージです。

Q.「ダイバージェンス」って、どういう意味?

A.値段の動きと、「需要指数」の動きが、ちぐはぐになっている状態のことです。例えば、値段はどんどん上がっているのに、指数はなぜか下がっている、というような時です。これが起きると、「そろそろ今の流れが終わりそうだよ」というサインになることがあります。

Q.勝つ回数が少ないのに、どうしてこの作戦を使う意味があるの?

A.良い質問ですね。たとえ勝つ回数が少なくても、1回勝ったときにすごく大きな利益を出せれば、負けた分を全部取り返して、さらにプラスにすることも可能です。そういう勝ち方を狙う作戦なんです。また、この作戦がとてもうまくいく市場の状況もあるので、色々な場面で試してみる価値があります。

Q.ETH/USDTって何?他の仮想通貨でも使えるの?

A.ETH/USDTは、「イーサリアム(ETH)」という仮想通貨を「テザー(USDT)」という仮想通貨で買う(または売る)ときの、通貨の組み合わせのことです。この作戦の考え方は、他の仮想通貨や、会社の株などでも応用できる可能性がありますよ。

Q.この作戦を使えば、必ず儲かるの?

A.残念ながら、投資の世界に「絶対に儲かる」という魔法はありません。市場の状況はいつも変わるので、この作戦がうまくいくときもあれば、うまくいかないときもあります。危険があることをちゃんと理解した上で、自分のお金のことは自分で責任を持つ、という気持ちが大切です。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

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

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報