【Python】【テクニカル指標】パーフェクトオーダーの検出とローソク足への追加描画

パーフェクトオーダーは、短期・中期・長期移動平均線がすべて上昇しており、「短期移動平均線>中期移動平均線>長期移動平均線」という完璧な上昇トレンドの並びになったり、その逆で短期・中期・長期移動平均線がすべて下降しており、「長期移動平均線>中期移動平均線>短期移動平均線」という完璧な下降トレンドの並びになったことを教えてくれるシグナルです。

ここでは株価データを取得し、mplfinanceを使用してローソク足チャートを描画し、ローソク足チャートにテクニカル指標であるパーフェクトオーダー検知シグナルを追加ていきます。

なお、最低限のポイントのみの説明にするため、Pythonライブラリ、モジュール等のインストール方法については割愛させて頂きます。お使いのPC環境等に合わせてインストールしてもらえればと思います。



1.ライブラリをインポートする

まず、pandas、numpy、mplfinance、pandas_datareaderをインポートします。mplfinanceを使用することで簡単にローソク足チャートを描画できます。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import mplfinance as mpf

import pandas_datareader.data as web
import datetime


2.株価データを取得する

下記を参考にOHLCV(始値 / 高値 / 安値 / 終値 / 出来高)形式の日経平均株価(^NKX)データを取得します。データの取得期間は、2022年7月1日から現在の日付までです。
※stooqでデータ取得した場合、日付の降順にデータが並ぶようです。df.sort_index(inplace=True)で昇順に並び替えています。

start = '2022-7-01'
end = datetime.date.today()

df = web.DataReader('^NKX', 'stooq', start, end)

# 日付を昇順に並び替える
df.sort_index(inplace=True)


3.移動平均を算出する

パーフェクトオーダーは、短期・中期・長期移動平均線の上昇、下降と並びで判定するため、まず移動平均を算出します。ここでは、5日線、20日線、60日線、100日線、200日線を算出して判定に使います。

# 移動平均線の期間として5日、20日、60日、100日、200日を採用しました。
df['SMA5'] = df['Close'].rolling(window=5).mean()
df['SMA20'] = df['Close'].rolling(window=20).mean()
df['SMA60'] = df['Close'].rolling(window=60).mean()
df['SMA100'] = df['Close'].rolling(window=100).mean()
df['SMA200'] = df['Close'].rolling(window=200).mean()

df.head(200)で200行表示をしてみます。

df.head(200)


4.パーフェクトオーダーを判定・検出する

4.1 パーフェクトオーダーの検出


完璧な上昇トレンド発生時のシグナルを得るため、PerfectOrderカラムを追加し、「df['SMA5'] > df['SMA20'] > df['SMA60'] > df['SMA100'] > df['SMA200']」の条件が成立した場合、PerfectOrderカラムを1とします。

df['PerfectOrder'] = 0
df.loc[(df['SMA5'] > df['SMA20']) & (df['SMA20'] > df['SMA60']) & (df['SMA60'] > df['SMA100']) & (df['SMA100'] > df['SMA200']), 'PerfectOrder'] = 1

PerfectOrderカラムが1のデータを先頭から10行表示をしてみます。

df[df['PerfectOrder'] == 1].head(10)

4.2 パーフェクトオーダーの開始点と終了点の検出

PerfectOrderの値について、前日との差分を計算し、パーフェクトオーダー開始マーカーの位置およびパーフェクトオーダー終了マーカーの位置を算出します。

dfにPerfectOrder_diffカラムを追加し、df['PerfectOrder'].diff()の値を格納します。この値によりパーフェクトオーダーの開始と終了位置を捉えることが可能になります。

  • PerfectOrder_diff = 0の場合(PerfectOrderに変化なし):

  • PerfectOrder_diff = 1の場合(PerfectOrderが0→1に変化):パーフェクトオーダーの開始

  • PerfectOrder_diff = -1の場合(PerfectOrderが1→0に変化):パーフェクトオーダーの終了

パーフェクトオーダーの開始点と終了点をローソク足に追加してシグナル表示するため、PerfectOrder_startカラムとPerfectOrder_endカラムを作成し、開始点と終了点の高値*1.03の値を格納しています。あとで、開始・終了時の高値上方にマーカーを表示させるためです。

# 前日との差分を計算する --> -1, 0, 1のいずれかになる
df['PerfectOrder_diff'] = df['PerfectOrder'].diff()

# ローソク足にシグナル表示するため、パーフェクトオーダー開始・終了位置を計算
df['PerfectOrder_start'] = np.nan
df['PerfectOrder_end'] = np.nan

df.loc[(df['PerfectOrder_diff'] == 1), 'PerfectOrder_start'] = (df['High'] * 1.03)  # 開始点高値上方に表示
df.loc[(df['PerfectOrder_diff'] == -1), 'PerfectOrder_end'] = (df['High'] * 1.03)  # 終了点高値上方に表示

mplfinanceによるローソク足チャート内にパーフェクトオーダーの開始と終了位置を一点鎖線表示するため、開始と終了の日時をリストで取得します。

vlines_sign = df[df['PerfectOrder_diff'].isin([1, -1])].index.tolist()
print(vlines_sign)


5.ローソク足チャートにパーフェクトオーダーを追加して描画する

5日移動平均 df['SMA5']、20日移動平均 df['SMA20']、60日移動平均 df['SMA60']、100日移動平均 df['SMA100']、200日移動平均 df['SMA200']をaddplotで追加します。さらに、パーフェクトオーダー df['PerfectOrder']パーフェクトオーダー開始マーカーの位置 df['PerfectOrder_start'](赤▼)パーフェクトオーダー終了マーカーの位置 df['PerfectOrder_end'](青▼)addplotで追加します。

addplotの中には、リスト形式で表示したいデータを指定します。

  • panelオプションでパネル番号を指定

  • colorオプションでプロットの色を指定

  • widthオプションで描画の線の太さを設定


  • 移動平均線は0番目のパネルに、出来高は1番目のパネルに、パーフェクトオーダーは2番目のパネルに表示されます。

# スタイルを定義
my_style = mpf.make_mpf_style(
    base_mpf_style='binance',
    rc={
        'xtick.labelsize': 8,
        'ytick.labelsize': 8,
        'grid.alpha': 0.7,
    }
)

apd = [
    # 5日移動平均線
    mpf.make_addplot(df['SMA5'], color='red', panel=0, width=2),
    
    # 20日移動平均線
    mpf.make_addplot(df['SMA20'], color='orange', panel=0, width=2),
    
    # 60日移動平均線
    mpf.make_addplot(df['SMA60'], color='purple', panel=0, width=1.5),

    # 100日移動平均線
    mpf.make_addplot(df['SMA100'], color='blue', panel=0, width=1.5),

    # 200日移動平均線
    mpf.make_addplot(df['SMA200'], color='green', panel=0, width=1.5),
    
    # PerfectOrderシグナル
    mpf.make_addplot(df['PerfectOrder'], color='red', panel=2, width=1.5),

    # PerfectOrder開始マーカーの位置
    mpf.make_addplot(df['PerfectOrder_start'], type='scatter', markersize=100, marker='v', color='red', panel=0),

    # PerfectOrder終了マーカーの位置
    mpf.make_addplot(df['PerfectOrder_end'], type='scatter', markersize=100, marker='v', color='blue', panel=0),
]


# ラベルをつけてチャートを表示
fig, axes = mpf.plot(
    df,
    type='candle',
    volume=True,
    style=my_style,
    addplot=apd,
    
    returnfig=True,
    figsize=(10, 8),
    datetime_format='%Y/%m/%d',

    tight_layout=True,
    
    # パーフェクトオーダーの開始と終了位置を一点鎖線表示
    vlines=dict(vlines=vlines_sign, colors='grey', linewidths=1.0, linestyle='-.'),
)

# ラベルを追加
axes[0].legend(['MA5', 'MA20', 'MA60', 'MA100', 'MA200'])
axes[1].legend(['Volume'])
# axes[2].legend(['PerfectOrder'])

# チャートを表示
fig.show()


ローソク足チャートの描画の参考

mplfinanceを使用してローソク足チャートにパーフェクトオーダーとなるタイミングを可視化できました。この方法を使えばパーフェクトオーダーが発現したタイミングを自動検出することができるようになり、エントリーポイントの判定にも活用できます。


この記事が気に入ったらサポートをしてみませんか?