お金の流れを読んでみよう!仮想通貨の売買チャレンジ「チャイキン・マネーフロー」
この作戦は、仮想通貨(今回はイーサリアム)の「お金がどっちに流れているか」をヒントに、いつ買っていつ売るかを見つける方法です。5分ごとという短い時間で、たくさん売買を試してみました。でも残念ながら、今回はあまり良い結果が出ませんでした。どうしてうまくいかなかったのか、この失敗から何を学べるのかを一緒に見ていきましょう!
導入と前提条件
この作戦は、仮想通貨(今回はイーサリアム)の「お金がどっちに流れているか」をヒントに、いつ買っていつ売るかを見つける方法です。5分ごとという短い時間で、たくさん売買を試してみました。でも残念ながら、今回はあまり良い結果が出ませんでした。どうしてうまくいかなかったのか、この失敗から何を学べるのかを一緒に見ていきましょう!
【検証】戦略のバックテスト概要
- 戦略名: Chaikin Money Flow を使用したトレンド追従戦略
- 対象銘柄: ETH/USDT
- 時間足: 5m
- 期間: 2024-10-11〜2025-08-25(317日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: bybit
Chaikin Money Flow の理論的背景
この作戦の根っこにある考え方は、「人気のある仮想通貨には、みんなのお金が集まってくる」「人気がなくなると、お金は逃げていく」という、とてもシンプルなものです。CMFは、このお金の流れを「取引された量」という情報を使って、もっと詳しく見ようとします。具体的には、その日の最後の値段が、一日の値動きの中で高かったのか低かったのかを見て「その日のお金の勢い」を考えます。そして、その勢いと、実際に取引された量をかけ合わせます。これを20日分くらい集計して、お金の流れが今どちらに向いているかを数字で表してくれるんです。CMFの数字が大きくプラスなら「お金が集まってきているぞ!」、大きくマイナスなら「お金が逃げているぞ!」と判断するわけです。
具体的な売買ルール(今回の検証)
エントリー条件
- お金の流れ(CMF)がプラスの目安(0.05)を超えて、さらに勢いが強くなったとき
エグジット条件
- お金の流れ(CMF)がマイナスの目安(-0.05)を下回って、さらに勢いが弱くなったとき
リスク管理
この作戦では、一番大きく損した時に、もとでのお金の99.96%を失ってしまうという、とても危険な結果になりました。これは、売ったり買ったりした回数が2128回とすごく多いのに、勝てたのが約22%と少なかったからです。大きな損を防ぐためには、「1回の取引で損しても良いのは、もとでのお金の1%まで」のように、あらかじめルールを決めておくことが大切です。今回の実験では、そういった「損を小さくする工夫」が足りなかったようです。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでETH/USDTのOHLCVを取得して前処理
- 『Chaikin Money Flow』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 2128回 |
勝率 | 21.99% |
平均利益 | 1.02% |
平均損失 | -0.76% |
期待値 | -0.37% |
プロフィットファクター | 0.33 |
最大ドローダウン | 99.96% |
最終リターン | -99.96% |
シャープレシオ | -0.82 |
HODL(Buy&Hold) | 93.83% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
Chaikin Money Flow (CMF)戦略
出来高加重の資金流入・流出を測定
"""
import pandas as pd
import numpy as np
def calculate_cmf_signals(df: pd.DataFrame, cmf_period: int = 20,
threshold: float = 0.05) -> pd.DataFrame:
"""
Chaikin Money Flowシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
cmf_period : int
CMF計算期間(デフォルト: 20)
threshold : float
シグナル閾値(デフォルト: 0.05)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# Money Flow Multiplier計算
df['mf_multiplier'] = ((df['close'] - df['low']) - (df['high'] - df['close'])) / (df['high'] - df['low'])
df['mf_multiplier'] = df['mf_multiplier'].fillna(0)
# Money Flow Volume
df['mf_volume'] = df['mf_multiplier'] * df['volume']
# Chaikin Money Flow
df['cmf'] = (
df['mf_volume'].rolling(window=cmf_period).sum() /
df['volume'].rolling(window=cmf_period).sum()
)
# CMFの変化率
df['cmf_change'] = df['cmf'] - df['cmf'].shift(1)
# シグナル生成
df['is_buy'] = (
(df['cmf'] > threshold) & # CMFが正の閾値を超える
(df['cmf'].shift(1) <= threshold) & # 前期間は閾値以下
(df['cmf_change'] > 0) # CMFが上昇中
)
df['is_sell'] = (
(df['cmf'] < -threshold) & # CMFが負の閾値を下回る
(df['cmf'].shift(1) >= -threshold) & # 前期間は閾値以上
(df['cmf_change'] < 0) # CMFが下降中
)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"Chaikin Money Flow: 期間={cmf_period}, 閾値={threshold}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1勝った割合が約22%ととても低く、ほとんどの取引で負けてしまったため、どんどん損がふくらんでしまいました。
- 2取引の回数が2128回と多すぎたのに、一回ごとの儲けが小さく、取引にかかる手数料を考えると赤字になってしまいました。
- 3お金の流れを見るための「目安の数字」や「計算に使う期間」の設定が、今回のイーサリアムの5分ごとの値動きに合っていなかったのかもしれません。
この結果から学べる3つの教訓
- 1どんなに良さそうに見える作戦でも、実際に試してみると、予想と違う結果になることがあると分かりました。
- 2勝つ回数が少なくても、一回で大きく勝てればプラスになりますが、この作戦ではそれもできませんでした。
- 3「期待値(1回の取引で平均いくら儲かるか)」や「PF(儲けと損のバランス)」といった、取引全体の成績を見る数字も大事だと学びました。今回の作戦では、どちらもマイナスでした。
リスク管理の具体的手法
取引量の決め方
1回の取引で、自分が持っているお金のうち、いくらまでなら損しても大丈夫かを決めておくことです。例えば、10万円持っていたら、「1回の負けは1000円まで」というようにルールを決めます。
損失が大きくなったときの対処法
もし損が続いて大きくなってしまったら、一度取引をお休みするルールを決めておくことです。今回の実験では、もとでのお金をほとんど全部失う結果になったので、こういうルールがとても大切だと分かります。
資金管理の方法
自分が持っているお金全体を、どうやって投資に使っていくか計画を立てることです。例えば、「投資に使うのは持っているお金の半分だけにする」など、生活に困らない範囲で、うまくお金を管理することが大事です。
改良案の具体的提案
- お金の流れを見るための「目安の数字」や「計算に使う期間」を色々な数字に変えて、一番うまくいく設定を探してみる。
- お金の流れ(CMF)だけでなく、値段の勢いを見る道具など、別のものと組み合わせて、もっと確実なタイミングを探すようにする。
- 「1回の取引で失うお金はここまで」という上限を決めるなど、損を小さくするためのルールをもっと厳しくする。
実用性の向上(運用上の注意)
- この作戦は今回はうまくいきませんでしたが、設定を変えたり、他の方法と組み合わせたりすれば、将来うまくいくヒントになるかもしれません。
- もし自分で試すなら、必ず無くなってもいい少額のお金で試したり、過去のデータでうまくいくか何度もチェックしたりすることが大切です。
- 「期待値」がマイナスということは、続ければ続けるほど損をする可能性が高いということです。そういう作戦は、続けるべきか慎重に考えましょう。
検証の透明性と信頼性
- データの出所: この実験で使った値段や取引量のデータは、実際の仮想通貨取引所が公開している情報をもとにしています。
- 検証のやり方: Pythonというプログラミング言語を使って、過去のイーサリアムの5分ごとのデータで、この作戦がどれくらいうまくいくかを計算して確かめました。
- コード: この実験で使ったプログラムは公開されています。なので、自分で同じ実験をしたり、もっと良くするための改造をしたりすることもできます。
- 注意事項: このお話は、あくまで昔のデータで試した結果です。未来も同じように儲かることを保証するものではありません。投資は、自分の判断と責任で行うものです。特に、この作戦は大きな損を出したので、そのまま使うのはとても危険です。