Engineering Note

プログラミングなどの技術的なメモ

一目均衡表 (Pythonによるファイナンス)

moving average

本記事は、PythonのPandasを用いてファイナンスの基本的な理論などについて学んでいきます。

今回は、日本人によって発明されたテクニカル指標の一つである一目均衡表(Ichimoku Kinkō Hyō)について学んでいきます。

 

 

Pandasとは

Pandasとは、データ分析や操作をまとめたPythonのライブラリです。

特にPanel、DataFrameおよびSeriesと呼ばれるデータ構造は使いやすく、また統計量を求めるための様々なメソッドが組み込まれています。

なお、Pandasの由来はPanel Dataから来ているそうです。

以下が公式のドキュメントになります。

 

 

一目均衡表とは

一目均衡表(Ichimoku Kinkō Hyō)とは、1936年に都新聞の商況部長であった細田悟一氏が考案し、彼のペンネームであった一目山人に因んでこの名が付けられました。

 

一目均衡表では、以下の5つの線を作成します。

 

  • 基準線

        (過去26日間での高値+過去26日間での安値) \div 2

  • 転換線

        過去9日間での高値+過去9日間での安値) \div

  • 先行スパン1

        (基準線+転換線) \div 2 を26日先にずらす

  • 先行スパン2

        (過去26日間での高値+過去26日間での安値) \div 2 を26日先にずらす

  • 遅行スパン

        終値を26日前にずらす

 

Python一目均衡表を描いてみる

それでは、Python一目均衡表をチャートに描いてみます。

 

import pickle
import pandas as pd
import matplotlib.pyplot as plt

def show_ichimoku(df, start=False, end=False, volume=False):
    h = df.high
    l = df.low

    max_9 = h.rolling(window=9, min_periods=1).max()
    min_9 = l.rolling(window=9, min_periods=1).min()
    tenkan = (max_9+min_9)/2
    base = (h.rolling(window=26, min_periods=1).max()+l.rolling(window=26, min_periods=1).min())/2
    senkou1 = ((tenkan+base)/2).iloc[:-26]
    senkou2 = ((h.rolling(window=52).max()+l.rolling(window=52).min())/2).iloc[:-26]

    plt.style.use('ggplot')
    fig = plt.figure(figsize=(15,5))
    ax = fig.add_subplot(111)
    xdate = [x for x in df.index]
    c = df.close

    if start:
        xmin = start
    else:
        xmin = df.index[0]
    if end:
        xmax = end
    else:
        xmax = df.index[-1]
    ymin = c.loc[xmin:xmax].min() - 50
    ymax = c.loc[xmin:xmax].max() + 50

    ax.plot(xdate, c, color="b", lw=1, linestyle="dotted", label="close")
    ax.plot(xdate[:-26], c.iloc[26:], color="red", lw=1, linestyle="dotted", label="chikou")
    ax.plot(xdate, tenkan,label="conversion line")
    ax.plot(xdate, base, label="base line")
    ax.fill_between(xdate[26:], senkou1, senkou2, color="blue", alpha=0.2, label="cloud")
    ax.set_ylim(ymin, ymax)
    ax.set_xlim(xmin, xmax)
    ax.legend(loc=1)
    plt.show()

with open('n225.pkl', 'rb') as f:
    n225 = pickle.load(f)

show_ichimoku(n225)

 

動作確認

それでは、上記で作成したスクリプトを実行してみます。

事前に2017年1月~2019年2月までの日経平均株価のDataFrameをpickleとして保存しておき、それをロードして使用しています。

 

fig1. 一目均衡表のチャート

fig1. 一目均衡表のチャート

 

チャートの見方としては、終値が先行スパン1,2の間にできた雲を下から上に突き抜けた場合は上昇トレンドに転じたと判断します。

また遅行スパンが終値を上抜いた時や転換線が基準線を上抜いた時と合わせてみていくと、より強い買いシグナルとなっていきます。

 

参考書籍

Python3ではじめるシステムトレード ──環境構築と売買戦略 (Modern alchemists series)

完全独習 統計学入門

マーケットのテクニカル分析 ――トレード手法と売買指標の完全総合ガイド

PythonユーザのためのJupyter[実践]入門