ケルトナーズ・チャネル(Keltner’s Channel)

 

概要
図1 ケルトナーチャネルの描画例

1960年に穀物トレーダーであったチェスター・W・ケルトナーによって考案されたトレンド系のテクニカル指標です。図1のように中央の1本の移動平均線とそれを上下に挟んだ2本のラインによるバンドを使って、バンドをレートが飛び出すかどうかでトレンドを予想します。

高値、安値、終値を使ったTP(ティピカルプライス)のSMAを中央に引きます。区間nは任意です。次にバンド幅を高値と安値の差分の平均値を使って計算し定義します。

ケルトナーズ・チャネルの計算は当初、バンド幅に平均価格、中央値にSMAを使っていましたが、1980年代ごろにリンダ・ラシュキによって改良される際にATR(アベレージ・トゥルーレンジ)とEMAを使う新バージョンとなりました。ただし、どちらの場合でも使い方自体に差はありません。

計算方法(n=5の場合)

中央ラインのSMAを計算します。区間nは任意ですが日足での標準的な値は10です。次にバンド幅を定義します。バンド幅(Band Width)はn区間の平均価格(高値-安値)を足し合わせて平均したものです。最後にバンドを引きます。幅は1.5倍のバンド幅を使用します。証券会社の提供するツールによってはバンド幅を設定できる場合もあります。その場合は取引銘柄に合わせて調整する使い方も可能です。

$$ \rm{} TP = (高値+安値+終値)/3 \\ Center Line = SMA(TP, 5) \\ Band Width = \sum_{i=1}^{5} (高値-安値)/5 \\ Upper Band = Center Line + 1.5 \times Band Width \\ Lower Band = Center Line – 1.5 \times Band Width \\ $$

具体的に計算してみましょう。日足でのnの標準的な値は10ですがここでは5を使用します。

日数価格 高値-安値 SMA(5) Band Width Upper Band Lower Band 
1日目100060
2日目105034
3日目107016
4日目106026
5日目1080231041441107975
6日目11006010723211201024
7日目11504610923411431041バンド上抜け
8日目11201911024711731033
9日目11304011163811731078
10日目(最新)1100  7211004711711029

改良型のケルトナーズ・チャネルにも触れておきます。TPを使用するところやバンド幅の係数は変わっていませんが、中央の移動平均線により相場の値動きに敏感なEMAを使用し、バンド幅にATRを使用しています。

$$ \rm{} TP = (高値+安値+終値)/3 \\ Center Line = EMA(TP, 5) \\ ATR = Max(当日高値-当日安値,当日高値-前日終値,前日終値-当日安値)/n \\ Band Width = \sum_{i=1}^{5} ATR/5 \\ Upper Band = Center Line + 1.5 \times Band Width \\ Lower Band = Center Line – 1.5 \times Band Width \\ $$
Pythonによる実装

必要なライブラリを読み込みます

!pip install mpl_finance #Collaboratoryに入っていないライブラリを読み込みます
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import mpl_finance
import sys
import numpy as np
from datetime import datetime
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import requests
import io

疑似データを読み込みます

#ファイルの読み込み
URL = "https://neulab.co.jp/wp-content/uploads/pseudo_data.csv" #csvファイルのURL

datafile = requests.get(URL)#ファイルの読み込み

#データフレームの作成
df_temp = pd.read_csv(io.BytesIO(datafile.content), header=0, index_col=0, parse_dates=True, encoding="UTF-8")

df = df_temp.loc[:,['Open','High','Low','Close']]
df.head()

ケルトナーチャネルを計算します

df_close = df['Close']
df_low = df['Low']
df_high = df['High']
df_tp = (df_high + df_low + df_close)/3
df_tp_ema = df_tp.ewm(span=10).mean()

a = (df['High'] - df['Low']).abs()
b = (df['High'] - df['Close'].shift(1)).abs()
c = (df['Low'] - df['Close'].shift(1)).abs()

df_tr = pd.concat([a, b, c], axis=1).max(axis=1)
df_tr_sma = df_tr.rolling(14).mean()

df_high_band = df_tp_ema + 1.5*df_tr_sma
df_low_band = df_tp_ema - 1.5*df_tr_sma

matplotを使ったチャートの描画例です

canvas_color = '#fffafa'
line_color = '#c8ced1'
font_color = '#171510'
colorup = '#bf0000'
colordown = '#006fbf'

n_data = -100
data = df[n_data:]
ohlc = np.vstack((range(len(data)), data.T)).T

fig = plt.figure(figsize=(12, 16))
fig.patch.set_facecolor(canvas_color)

ax = fig.add_subplot(2, 1, 1)
ax.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax.plot(range(len(data)), df_high_band.values[n_data:], color='darkred', ls='-', label='High Band')
ax.plot(range(len(data)), df_low_band.values[n_data:], color='darkblue', ls='-', label='Low Band')
ax.grid()

#ロゴ読み込み
logoURL = "https://neulab.co.jp/wp-content/uploads/logo.png" #logoファイルのURL
img_c = plt.imread(logoURL)
imagebox = OffsetImage(img_c, zoom=0.020) #画像をimageboxにいれる。
imagebox.image.axes = ax
im_sabo = AnnotationBbox(imagebox, (0, 9850), xybox=(0, 9900), xycoords="data", boxcoords="data", pad=0.3, frameon=False)

l1,l2 = ax.get_legend_handles_labels()
ax.legend(l1,l2, loc='upper right', fontsize=14, edgecolor='none', facecolor=canvas_color)

ax.add_artist(im_sabo)
ax.set_ylabel("Price of Something", fontsize=22)
ax.set_ylim(9000., 10000.)
ax.yaxis.tick_right()
ax.yaxis.set_label_coords(0, 0.5)
ax.tick_params(labelsize=24, labelcolor=font_color, color=line_color)

ax.spines['left'].set_linewidth(0)
ax.spines['right'].set_linewidth(0)
ax.spines['top'].set_linewidth(0)
ax.spines['bottom'].set_linewidth(0)

xtick0 = 2
plt.xticks(range(xtick0,len(data),12), [x.strftime('%m/%d') for x in df_tp.index][xtick0::12])

plt.subplots_adjust(left=0.03, right=0.92, bottom=0.1, top=0.99)
plt.grid(which='major',color=line_color,linestyle='-')
plt.grid(which='minor',color=line_color,linestyle='-')

ax.set_axisbelow(True)

plt.savefig('Keltner.png')

以上のコードをGoogle社の提供しているColaboratory上で公開しており、実際に動作させることができます。

リンク先はこちら

ケルトナーズ・チャネルを使った予想

ケルトナーズ・チャネルはトレンドのある場合は順張りの指標として使用します。図2が分かりやすいエントリーポイント2か所の例となります。バンドが横に寝ているレンジ相場の時は、逆張りの指標として使用します。

図2 ケルトナーチャネルを使った予想例
注意点

もみ合い相場では、騙しが多くなるため、RSIなどのオシレーター計指標を併用するのが良いとされています。


※このHPページで紹介しているテクニカル指標を使った取引ルールや売買シグナルの見方は一般的な考え方に基づくものであり、利益の増加や損失の減少を保証するものではありません。ご自身の判断にてお取引いただきますようお願いいたします。


現在、ニューラボでは人工知能による取引アルゴリズムを開発中です。11月にリリース予定。乞うご期待!
自動取引にご興味を持たれましたら お問い合わせページよりお気軽にお問合せください。