K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

ジグザグ

05.2.4

ジグザグ

最終更新 2020-03-11 読了時間 2 分
まとめ
ZigZag は、株価の細かな上下を無視して「直前の高値・安値から一定割合以上動いたときだけ転換点とみなす」インジケーターで、転換点どうしを直線で結ぶとトレンドの骨格だけが残ります。このページでは zigzag ライブラリの peak_valley_pivots(trmd["Close"], 0.03, -0.03) を使い、TORM plc(TRMD)の 2023 年以降の終値から 3% 以上の反転点を検出します。返り値は各日に +1(ピーク)・−1(バレー)・0(転換点ではない)を付けた配列で、0 でない日だけを ax.plot で結ぶと mplfinance のローソク足の上に緑のジグザグ線が重なります。閾値の 0.03 を 0.05 に広げれば小さなスイングが消え、0.01 に狭めればほぼ毎日が転換点になるという感度の調整が、この 1 つの引数で行えます。

直感 #

山道を歩いた記録を地図に描くとき、1 歩ごとの蛇行まで描くと線がつぶれて読めませんが、「ここで登りから下りに変わった」という峠と谷だけを結べば道の形が分かります。ZigZag はこれを株価で行います。終値が直前の安値から 3% 以上上がったらそこを「谷」として確定し、直前の高値から 3% 以上下がったらそこを「山」として確定します。3% 未満の値動きは転換と見なさないため、ローソク足のノイズが消えて、上昇スイングと下降スイングの長さだけが見えてきます。

ZigZagをプロットする #

ZigZagライブラリを使用してジグザグをプロットします。株価のデータとしてTORM plc (TRMD)のデータを使用しています。Yahoo Finance の「Historical Data」からダウンロードした CSV は Date・Open・High・Low・Close・Adj Close・Volume の 7 列で、mplfinance はこの列名をそのまま認識します。

次のコードは、CSV を読み込んで日付をインデックスにし、先頭 5 行を表示してデータの形を確認します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import mplfinance as mpf
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib.dates import DateFormatter
from zigzag import peak_valley_pivots

# TORM plc (TRMD)
trmd = pd.read_csv("TRMD.csv", index_col="Date")
trmd.index = pd.to_datetime(trmd.index)
trmd.head(5)

OpenHighLowCloseAdj CloseVolume
Date
2023-02-1732.08000232.66999831.76000032.06000125.389601206600
2023-02-2132.49000233.25000031.84000032.11999925.437117240900
2023-02-2232.70999932.75999831.11000131.45000124.906519340400
2023-02-2333.38000134.63999933.33000234.29999927.163548496600
2023-02-2434.88999934.96500034.29000134.68999927.472404338000

ローソク足に ZigZag を重ねる #

次のコードは、ローソク足を描いた軸を returnfig=True で受け取り、終値から ±3% の転換点を検出して、転換点どうしを緑の直線で結びます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def plot_zigzag(ax, X, p):
    """zigzagをプロット
    args:
        ax: axis
        X: pandas.Series
        p: pivots index
    """
    ax.plot(np.arange(len(X))[p != 0], X[p != 0], "g-", linewidth=1)
    return ax

fig, axes = mpf.plot(
    trmd, type="candle", style="starsandstripes", figsize=(12, 4), returnfig=True
)

pivots = peak_valley_pivots(trmd["Close"], 0.03, -0.03)
axes[0] = plot_zigzag(axes[0], trmd["Close"], pivots)

ZigZagをプロットするの図

図の読み方 #

緑の線が折れ曲がる点が、終値が直前の極値から 3% 以上反転した日です。線の 1 区間が 1 つのスイングで、上向きの区間が長く下向きの区間が短ければ、上昇トレンドの中の押し目が 3% 以内で収まっていたことを意味します。ローソク足の細かな上下は線に反映されないので、線の傾きと区間の長さだけを見ればトレンドの強さと転換の頻度を比べられます。