出来高について考察します。そして、出来高を「上昇に寄与した出来高」と「下降に寄与した出来高」に分割するインジケーターを作成します。
2021年3月21日
出来高を考える
ローソク足はOHLCの情報により作成されます。つまり、始値、高値、安値、終値の4つのデータです。 これらは欠かすことのできない重要な情報ですが、これにもう1つ付け加えるなら「V」となるでしょう。Volume、出来高です。
出来高は、一定期間に行なわれた取引の数量を表します。 1時間足なら、1時間の内に行なわれた取引量を合計したものが、ローソク足の下に棒グラフで描写されることになります。
一般的には、「一定時間ごとの取引量を見る」のが出来高です。
取引量は、時間ではなく回数で見ることも可能です。 1回の約定のデータをティックデータと呼び、時間ではなく一定の約定数ごとにローソク足を描写するチャートのことをティックチャートと言います。
ティックチャートの出来高は、「一定回数ごとの取引量を見る」ことになります。
この場合の出来高増加が示すのは、大口が動き出した可能性です。 出来高の増加は平均売買サイズの増加と同義なので、このように考えられるわけです。
個人トレーダーの重要なテーマは「大口に逆らわない=大口の動きに着いていく」であり、この視点は大口の動きを察知する1つの指標になります。
出来高は2つに分けられる
出来高の考察を続けます。
売買が成立するのは、買い方と売り方の双方の合意が成ったときです。 言葉にすればこうなのですが、実際に起こっているのは、「オファーとそれに応じる者が現れるか」です。
一般的な注文方法に「成り行き」と「指値」があります。 買いを考えたとき、成り行きはオファーに応じるもので、直ぐにでも買いたいということですから「積極的」なものです。
一方、指値はオファーそのもので、この価格なら買ってもいいよという「消極的」なものだと言えます。
買い板に売りがぶつけられているときは、売り方が攻め込んでいる。 逆に、売り板に買いがぶつけられているときは、買い方が攻め込んでいる とも考えられるでしょう。
これらは同じ出来高になりますが、細かいことを考えると、出来高はその性質によって2つに別けられるということです。
Level2データ
かなりマニアックな話になりますが、ティックデータを購読すると、上記のような視点で出来高を分割することができます。
ティックデータには、
- 約定した時間
- 約定した金額
- 約定した数量
が含まれます。 約定した時間のBidとAskのどちらと約定した金額が等しいかを調べることで、 売りと買いのどちらの板が食われているかが判別可能です。
そして、この情報を時間や約定数で集計してやれば、買い方と売り方のどちらが攻め込んでいるかを知ることができます。
TradingViewは、ティックデータに対応して…
いません!
これだけ前置きをしておいて、TradingViewはティックデータに対応していないのです。申し訳ございません。
それでも、かなり貴重な情報を公開したつもりなので、新たな知見を得られた人も多いのではないかと思います。
しかし、これで話は終わりでは面白くありませんので、ティックデータ無しでも出来ることがないか考えてみます。
出来高を分割する
ティックデータにアクセスできない以上、厳密なところは分かりません。しかし、推測するぐらいならできそうです。
出来高インジケーター
買い出来高と売り出来高をそれぞれ「推測」して、それをプロットするインジケーターを作成します。
見た目はこんな感じです。上がTradingViewの標準機能の出来高の表示、下が今回作成するインジケーターの表示になります。
ゼロを起点に上側が買い出来高、下が売り出来高です。違和感なく使えるように、色目はデフォルトのものに合わせました。
コード
//@version=4
study("Estimated Up Down Volume", shorttitle="eVol", format=format.volume)
range = high - low
uVol = 0.0
if close > open
uVol := (range / (2 * range + open - close)) * volume
else if close < open
uVol := ((range + close - open) / (2 * range + close - open)) * volume
else
uVol := volume / 2
dVol = -(volume - uVol)
plot(uVol, title="Up Volume", style=plot.style_columns, histbase=0, color=#1C5E5E)
plot(dVol, title="Down Volume", style=plot.style_columns, histbase=0, color=#813439)
解説
コードに難しいところは無いと思います。 問題となるのは、価格の上昇に寄与したであろう出来高の推定をどう行うかだけです。 上昇分の推定さえできれば、全体の出来高から上昇分をマイナスすることで、下降分の出来高は推測できます。
何も前提を置かない状況では、買い出来高と売り出来高は1:1と考えます。つまり、出来高の1/2が買い出来高です。 後は上昇幅と下降幅比率により買い出来高の割合を調整します。
上昇幅:下降幅 = 上昇分 : (全体 - 上昇分)
ということなのですが、これだけだと分かりずらいと思うので、具体例をあげてみます。
close > open
終値が始値より高い場合、
range / (2 * range + open - close)
を上昇分の割合と考えます。
始値100から一文の安値もなく上昇し、高値200が終値となったケースでは、
全体の値幅 | 100 |
上昇分の値幅 | 100 |
下降分の値幅 | 0 |
100 ÷ (200 + 100 - 200) = 100%
となるので、出来高の100%を上昇分と推測します。
始値100から高値200を付けて150が終値となった場合、
全体の値幅 | 100 |
上昇分の値幅 | 100 |
下降分の値幅 | 50 |
100 ÷ (200 + 100 - 150) = 66%
2:1の割合になりますので66%が上昇分となります。
始値100から安値80を付けた後に上昇し高値180、そして終値が150となった場合、
全体の値幅 | 100 |
上昇分の値幅 | 100 |
下降分の値幅 | 20 + 30 |
100 ÷ (200 + 100 - 150) = 66%
これも2:1となって66%が上昇分となります。
close < open
終値が始値より安い場合、
(range + close - open) / (2 * range + close - open)
を上昇分の割合と考えます。
始値200から一文の高値もなく下降し、安値100が終値となったケースでは、
全体の値幅 | 100 |
上昇分の値幅 | 0 |
下降分の値幅 | 100 |
(100 + 100 - 200) ÷ (200 + 100 - 200) = 0%
となるので、出来高の0%を上昇分と推測します。つまり、出来高すべてが下降分です。
始値200から安値100を付けて150が終値となった場合、
全体の値幅 | 100 |
上昇分の値幅 | 50 |
下降分の値幅 | 100 |
(100 + 150 - 200) ÷ (200 + 150 - 200) = 33%
1:2の割合になりますので33%が上昇分となります。
始値200から高値220を付けた後に下降し安値120、そして終値が150となった場合、
全体の値幅 | 100 |
上昇分の値幅 | 20 + 30 |
下降分の値幅 | 100 |
(100 + 150 - 200) ÷ (200 + 150 - 200) = 33%
これも1:2となって33%が上昇分となります。
参考
TradingViewでも公開しています。
少しでも参考になった部分があれば、上記ページの画像右下に「いいね」ボタンがあるのでクリックをお願いします。結構モチベが上がるのです!