チャイキン・マネーフロー:資金の流入・流出を測る
- CMFは「高値引けか安値引けか」を出来高で重みづけして20日分を合計した値。ETF1321では62.2%の日がプラスだった
- CMF(20)がプラスの間だけ保有すると、取引264回・年率−0.01%・PF1.04。利益と損失がほぼ釣り合い、買い持ちに大きく見劣りした
- 出来高の重みには差が出た(出来高なしは年率−1.6%)。ただしCMFがマイナス圏の日の方が、その後20日はよく上がった
CMFは「引け位置」の出来高加重平均
CMF(チャイキン・マネーフロー)は、まず毎日のCLV(クローズ・ロケーション・バリュー)を求めます。CLVは、終値がその日の高値と安値の間のどこにあるかを表す数字です。高値で引ければ+1、安値で引ければ−1、ちょうど真ん中なら0になります。
次に、CLVにその日の出来高を掛けます。これを「マネーフロー出来高」と呼びます。大商いの日に高値で引ければ大きなプラス、大商いの日に安値で引ければ大きなマイナスです。最後に20日分を合計し、同じ20日の出来高の合計で割ります。結果は必ず−1〜+1に収まります。
CMF(20) = 20日間の(CLV × 出来高)の合計 ÷ 20日間の出来高の合計
CLVは「前日比」を見ていない
CLVはその日の値幅の中だけで決まります。前日の終値から大きく窓を開けて始まっても、その分は数えません。日経平均は海外市場の影響で朝に窓を開けやすく、ETF1321では寄り付きの窓(前日終値→始値)の大きさが平均0.78%、日中の動き(始値→終値)の平均0.65%より大きいほどです。
その結果、CLVの符号と前日比の符号は27.2%の日で食い違いました(1,295日)。窓を開けて下に始まった日のうち、前日比はマイナスなのにCLVはプラスだった日が28.1%あります。大きく下げて始まり、少し戻して引ければ「買い圧力」と数えられるわけです。CLVは前日比との相関が0.491、日中の動きとの相関が0.719で、CMFは主に「日中の買い戻し・売り込み」を測る指標だと考えた方が実態に近いでしょう。
「CMFがプラス=お金が流れ込んで価格が上がっている」とは限りません。CMFが見ているのは引け位置で、価格の上げ下げそのものではありません。窓を開けて急落した日でも、安値から戻して引ければCLVはプラスになります。実際、2025年4月7日の急落時もCMF(20)は+0.044とプラスのままでした。
実際の日経平均で見てみる
2024年8月5日の急落では、CMF(20)は−0.284まで沈んでいました。前の営業日の8月2日もCLVは−0.82と安値引けで、CMF(20)は−0.259でした。ところが9月2日には+0.155まで戻りました。CMFは20日分の合計なので、急落の数日が窓から外れると数値が一気に入れ替わります。
2025年4月は対照的です。CMF(20)は4月1日にマイナスへ、4月3日にはもうプラスへ戻り、4月7日(ETF終値32,650円)も+0.044でした。窓を開けて下げた日でも引けにかけて戻す日があり、急落の底ではプラス圏にいたことになります。4月30日には+0.215まで上がりました。
2026年は、CMF(20)がプラスだった日が82%に達しました。最も低かったのは3月5日の−0.125で、直近500日の最大値+0.300は8月31日です。10月1日はCLV+0.99とほぼ高値引け、10月2日はCLV−0.56でしたが、CMF(20)は+0.183と高い水準を保っています。
一方で、ゼロラインの行き来は多いのが気になります。直近500日でゼロライン越えは52回、終値と20日線の上下入れ替わり(55回)とほとんど変わりません。2024年12月13日〜30日には、わずか2週間あまりで10回も入れ替わりました。19年全体でも529回、年27.2回です。
検証:CMF(20)がプラスの間だけ保有
ルール:CMF(20)がゼロより上で引けた日の終値で買い、ゼロ以下で引けた日の終値で売る。比較として、同じCLV×出来高を積み上げたA/Dラインがその20日線より上の間だけ持つ方法(A/Dラインのルールを同じETFで計算)と、終値が20日線より上の間だけ持つ方法を並べました。出来高を使わずCLVだけを20日平均した版も試しています。条件は共通の検証ルールのとおりです。
| 戦略(ETF1321) | 最終資産 | 年率 | 最大下落率 | 取引 | 勝率 | PF | 保有率 |
|---|---|---|---|---|---|---|---|
| 買い持ち(ETF) | 4.03倍 | 7.4% | −61.0% | — | — | — | 100% |
| CMF(20)>0 | 1.00倍 | −0.0% | −53.6% | 264 | 44% | 1.04 | 62% |
| CMF(16)>0 | 1.26倍 | 1.2% | −59.5% | 284 | 41% | 1.12 | 61% |
| CMF(24)>0 | 1.03倍 | 0.1% | −59.8% | 233 | 42% | 1.07 | 63% |
| CLV20日平均>0(出来高なし) | 0.72倍 | −1.6% | −69.5% | 281 | 41% | 0.97 | 65% |
| A/D>A/Dの20日線 | 0.74倍 | −1.5% | −66.9% | 304 | 36% | 0.98 | 60% |
| 終値>20日線 | 1.13倍 | 0.6% | −52.5% | 281 | 27% | 1.09 | 58% |
| CMF(20) ±0.05の幅つき | 1.16倍 | 0.8% | −63.6% | 101 | 50% | 1.14 | 63% |
| CMF(20)>0かつ終値>200日線 | 1.39倍 | 1.7% | −31.3% | 215 | 39% | 1.17 | 42% |
| (参考)CMF(50)>0 | 2.35倍 | 4.5% | −44.9% | 140 | 41% | 1.53 | 68% |
CMF(20)のルールは19年で264回売買し、最終資産は1.00倍、年率は−0.01%でした。最大下落率−53.6%は買い持ちの−61.0%より小さいものの、2007年8月から2016年8月まで、9年かけて資産が半分近くまで減っています。前半(〜2016年9月)の年率は−6.7%、後半は+6.7%です。後半だけ見ても、買い持ちの後半15.4%の半分以下にとどまりました。
比較の中では、CMFはA/Dラインより明らかにましですが、20日線とは大差ありません。同じ材料を「積み上げて20日線と比べる」A/Dは年率−1.5%、「20日の割合にする」CMFはほぼ0%。CMFと20日線ルールの判断が一致した日は65.6%で、A/Dとは82.3%でした。
出来高の重みは有効だったが、向きが逆だった
出来高を使わずCLVを平均しただけの版は年率−1.6%、最大下落率−69.5%で、CMF(20)よりはっきり悪化しました。両者の相関は0.852と高いのに成績に差が出たので、出来高で重みをつける意味はあったと言えます。ただ、問題はCMFそのものの向きです。CMF(20)の水準ごとに、その後20営業日のリターンを集計しました。
CMFがプラス圏(とくに+0.1〜+0.2)の日は、その後20日の平均が全日平均を下回りました。保有中の日の平均リターンは+0.03%、現金で待っていた日は+0.06%です。CMF(20)は過去20日のリターンとの相関が0.511あり、「すでに上がった」ことを後から確認している面が強いと考えられます。日経平均の数週間単位の戻りやすさに対して、CMFに従うと上がった後に乗り、下がった後に降りる形になります。
期間を50日に延ばすと年率4.5%・PF1.53まで改善しますが、これは結果を見てから選んだ設定なので参考扱いです。それでも買い持ちの7.4%には届きません。
読み解き
- CMF(20)のゼロライン越えは、19年でほぼ損益ゼロ。取引264回、PF1.04。コストをゼロにしても年率2.75%(PF1.21)で、往復0.2%のコストを差し引く前から優位性は小さい。
- 出来高の重みは役に立ったが、20日線を超える力はない。出来高なしのCLV平均(−1.6%)やA/D+20日線(−1.5%)より良く、20日線(0.6%)と同程度。値動きにない情報を、出来高が新たに加えたとは言いにくい。
- CMFが測るのは「日中の引け位置」で、方向は短期的に逆を向く。CLVは27.2%の日で前日比と符号が食い違い、CMFがやや弱い日の方がその後20日はよく上がった。
成績のまとめ(CMF(20)>0で保有)
成績は厳しい。年率−0.01%は買い持ち7.4%に遠く及ばず、PF1.04は利益と損失がほぼ同じ大きさ。後半が前半を上回ったのは「前半がマイナスだったから」で、後半の年率6.7%も買い持ちの後半15.4%の半分以下。最大下落率も、−53.6%と買い持ちの−61.0%の差にとどまる。売買ルールとして単独で使える水準ではない。
自分で試す(TradingView)
//@version=6
indicator("チャイキン・マネーフロー(CMF)", overlay = false)
len = input.int(20, "期間")
rng = high - low
// CLV:終値が値幅のどこにあるか(−1〜+1)。値幅ゼロの日は0
clv = rng > 0 ? ((close - low) - (high - close)) / rng : 0.0
cmf = math.sum(clv * volume, len) / math.sum(volume, len)
plot(cmf, "CMF", color = cmf > 0 ? color.green : color.red, style = plot.style_columns)
hline(0, "0", color = color.gray)
bgcolor(cmf > 0 ? color.new(color.blue, 92) : na, title = "CMF>0(保有)")

