トレンドライン(Trend Line)

概要

相場にはトレンド相場とレンジ相場があります。トレンド相場では相場が方向性をもって大きく動き、レンジ相場では相場に動きがなく一定の範囲で横ばいとなります。つまり、相場は次に紹介する3種類のいずれかの動きをします。次の例は原油の5分足チャートを見たものです。

図1 上昇トレンド(チャート出展元 サクソバンク証券
図2 下落トレンド(チャート出展元 サクソバンク証券
図3 レンジ相場(チャート出展元 サクソバンク証券

相場はこれらの内のいずれかの動きをします。上昇トレンドとは相場が山と谷(押し目)を連続的に描きながら高くなっていく動きで、下落トレンドとは山(戻り目)と谷が連続的に作られて次々に谷が低くなっていく動きとなります。例えるなら3歩上って2歩下がる動きを繰り返すのが上昇トレンド、3歩下って2歩上がる動きを繰り返すのが下落トレンドとなり、結果として相場はNのように上昇と下落を繰り返しながら、ジグザクに上下します。このように一方的に上がったり下がったりはしないことがトレンドを読むことを難しくしています。またトレンドには、超短期から超長期までそれぞれの時間軸にトレンドがあります。

更に重要なことはトレンドはいつまでも続くものではなく、必ず始まりと終わりがあります。1つのトレンドが終わると次のトレンドが始まるかレンジ相場へ移行し、それをトレンド転換と呼びます。そして1つのトレンドは経済や需給に関する材料(例えば原油の供給が減るニュース)で始まり、初めのニュースを否定する材料(最初のニュースを否定する原油の生産量が増えるニュース)が出るまでは継続します。他には金曜日で市場が閉じて週末を挟んで月曜日に開く際にトレンドの転換が起こる場合もあります(図1は週末でのトレンド転換例)。トレンドの切れ目を節目と呼び、この節目がトレンドの転換点なのかどうかをリアルタイムに判断することが必要となってきます。

また、レンジ相場となった場合は、同じ値幅の上下を繰り返します(このためボックス相場とも呼びます)が、必ずどこかで流れが変わって次のトレンドへ移行します。この時、相場の値幅を上抜けあるいは下抜けする現象が必ず起こり、これをブレイクと呼びます。このブレイクポイントを判断するためにも節目の分析が必要です。

相場の節目となる谷と谷(押し目と押し目)の安値同士、山と山(戻り目と戻り目)の高値同士を結んだ線をトレンドラインと呼び、更に前者をサポートライン(下値支持線)、後者をレジスタンスライン(上値抵抗線)と呼びます。トレンドラインは初心者から熟練者まで使用できる最も基本的なチャート分析の方法です。

トレンドライン

まず前提としてトレンドラインは他のテクニカル指標のように過去のデータの蓄積で情報を得るのではなく、リアルタイムに用意する必要があります。刻一刻変わるレートの中で、トレンドラインは線を引いたその瞬間だけ有効で次の瞬間には別なトレンドラインへ移ってしまいます。

トレンドラインを使用してその瞬間瞬間のトレンドを把握することで、相場が上昇トレンドに向かうことを知らずに売り注文を出したり、逆に下落トレンド継続中に買い注文を出すなどの行為を避けることが可能です。また、トレンドが終わる際には決済を行い、次のトレンド発生へ備えたり、トレンドが見えない時はレンジ相場と判断することで勝率を上げていくことが可能です。

トレンドラインを引く

レジスタンスライン(上値抵抗線)とサポートライン(下値支持線)を実際の原油の5分足チャートを使って引いてみましょう。本ページではトレンドラインを引くのに安値か高値(ひげの先端)を使用します。トレンドラインを引く流儀によってはひげを使わない場合もあります。

図4 下落トレンドとレジスタンスライン(チャート出展元 サクソバンク証券

図2のチャートへレジスタンスラインを引いてみることを考えます。現在の時間を5月8日の4時(黒点線)と仮定して、レジスタンスラインを引きます。この時には丸で囲んだ左上の戻り目と少し前に発生した戻り目を結んで、図4のようにレジスタンスラインを引くことが出来ました。

トレンドラインと相場の動きの予想

トレンドラインはリアルタイムにその時その時に引けるラインを使って次に相場がどう動くのかを予想します。まず図4を使って時間とともに予想がどう変化していくのかの例を見ることにしましょう。まず起点となる図4です。

図4(再掲) 下落トレンドとレジスタンスライン(チャート出展元 サクソバンク証券

この時点でレジスタンスラインを引くことができます。この後予想できることは、レジスタンスラインにレートが近付いていくか、そのまま下落を続けていくかのどちらかになります。

図5 レジスタンスラインがレートと交差(チャート出展元 サクソバンク証券

1時間後、図5のようにレートがレジスタンスラインに近づき交差しました。ここの時点で考えられることは、下げトレンドが終了(ブレイク)してトレンドが転換するか、単に戻り目で再度レートが低下するかのどちらかになります。どちらの場合もトレンドラインの引き直しが必要です。このようにトレンドが終了することをトレンドがブレイクすると言います。

図6 下げトレンドの終了(ブレイク)(チャート出展元 サクソバンク証券

その後、レートは図6のようにレジスタンスラインをブレイクしました。下落トレンドのブレイク後はレンジ相場へ移行するか上昇トレンドへ移行します。どちらに移行するかはブレイク後のレートの動き次第です。

図7 レンジ相場へ(チャート出展元 サクソバンク証券

さらに時間が進んで、図7は点線の時点でレンジ相場へ移行すると考えて、直近の戻り目と押し目を使ってトレンドライン(水平ライン)を図のように引き直してみたものです。

図8 レンジ相場(チャート出展元 サクソバンク証券

その後、しばらくは想定通りレンジ内で動いていた相場ですが、図8のように再度レジスタンスラインにレートが接近してきました。ここからはレジスタンスラインを次の戻り目で引き直しレンジ相場が継続するのか、上昇トレンドに入るかの選択肢を考えることが出来ます。

図9 レンジ相場でのブレイク判断(チャート出展元 サクソバンク証券

さらに少し時間がたつと、レートは図9のようにレジスタンスラインと交差しました。続いて図9のようにレジスタンスラインをブレイクして上昇を始めたので、上昇トレンドが発生したとみなして新しくサポートラインを引き直します。この時のサポートラインは図10中のオレンジ線のようになるでしょう。

図10 上昇トレンドへ(チャート出展元 サクソバンク証券

ここまでの動きはあくまで一例ですが、トレンドラインは通常のテクニカル指標と違って現在の状況を使って次の値動きを予想するために使用します。決して過去のデータだけを使い、予想を立てることはしません。

トレンドライン使用時の利点と注意点

トレンドラインを使った予想の利点と欠点を纏めると次のようになります。

pythonによる実装

右肩上がりの場合と右肩下がりの場合にサポートラインと、レジスタンスラインを引くための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

データをcsvファイルから読み込みます

#ファイルの読み込み
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()

トレンドラインを計算します

def get_longTrend(df):#チャートの向きを取得する関数(右肩上がりか、右肩下がりか)
    v_start = df.iloc[0][1]
    v_end = df.iloc[-1][4]
        
    if v_start > v_end:
        return True
    else :
        return False

######関数ここまで

#計算開始ポイントと計算終了ポイント
stdstart = 50
stdend = 100

#最大値や最小値の計算から取り除くデータの数(例:5)
nrange = 5

#描画期間
df_draw = df[stdstart:stdend]
df_draw = df_draw.reset_index()

#計算対象区間
df_calc = df_draw[:-nrange]

#範囲内のトレンドの判断(右肩上がり:1 右肩下がり:-1)
f_trend = get_longTrend(df_calc)

#最小値と最大値
max = df_calc['High'].max()
min = df_calc['Low'].min()
        
#index取得
maxindex = df_calc['High'].idxmax()
minindex = df_calc['Low'].idxmin()
        
#初期化
df_draw['slope_support'] = 0
df_draw['slope_resistance'] = 0

if f_trend:
    #傾きの計算(右肩上がり)
    df_draw['slope_support'] = 999
    df_draw.loc[df_draw['slope_support'].index > minindex, 'slope_support'] = (df_draw['Low']-min)/(df_draw['Low'].index - minindex)
    slope_support = df_draw['slope_support'].min()
    intercept_support = min - (slope_support*minindex)
            
    df_draw['slope_resistance'] = -999
    df_draw.loc[df_draw['slope_resistance'].index > maxindex , 'slope_resistance']= (df_draw['High']-max)/(df_draw['High'].index - maxindex)
    slope_resistance = df_draw['slope_resistance'].max()
    intercept_resistance = max - (slope_resistance*maxindex)
            
else:
    #傾きの計算(右肩下がり)
    df_draw['slope_support'] = 999
    df_draw.loc[df_draw['slope_support'].index > minindex, 'slope_support'] = (df_draw['Low']-min)/(df_draw['Low'].index - minindex)
    slope_support = df_draw['slope_support'].max()
    intercept_support = min - (slope_support*minindex)

    df_draw['slope_resistance'] = -999
    df_draw.loc[df_draw['slope_resistance'].index > maxindex , 'slope_resistance']= (df_draw['High']-max)/(df_draw['High'].index - maxindex)
    slope_resistance = df_draw['slope_resistance'].min()
    intercept_resistance = max - (slope_resistance*maxindex)

チャートへの描画と保存例です

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

data = df[stdstart:stdend]
ohlc = np.vstack((range(len(data)), data.T)).T

fig = plt.figure(figsize=(12, 8))
fig.patch.set_facecolor(canvas_color)
ax = fig.add_subplot(1, 1, 1)
ax.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax.grid()

#時刻からローソク足の本数へ座標変換
x = np.arange(0, len(data))

#レジスタンスラインの計算
yr = slope_resistance*x + intercept_resistance
#サポートラインの計算
ys = slope_support*x + intercept_support

if slope_resistance > -999 :
    plt.plot(x, yr, ls='-', label='resistance line')
            
if slope_support < 999 :
    plt.plot(x, ys, ls='-', label='support line')

#ロゴ読み込み
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, 10400), xybox=(0, 10900), 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., 11000.)
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.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('TrendLine.png')
plt.show()

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

リンクはこちら


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


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