読者です 読者をやめる 読者になる 読者になる

株も歩けば犬に当たる

25万から株を始めた大学生。バイトのほうが稼げると気づいた今日この頃。pythonや株について書いてます。

一目均衡表をPythonでプロット

Python

目次

はじめに

doz13189.hatenablog.com

先日、一目均衡表Pythonでプロットしようとして盛大に失敗しました。

もうグラフとしての形を保ててなかったです。

あきらめるか悩んだのですが、普通に考えてそんなに難しくないので頑張ることにしました。

そして、何とか形を保った一目均衡表が完成しました。

f:id:doz13189:20161004230255p:plain

ということで今回は一目均衡表Pythonでプロットした手順を解説します。

一目均衡表とは

すごく昔からプロのトレーダーから愛用されているテクニカル指標の一つです。

どのくらい昔かと言うと・・・

細田悟一によって、1936年(昭和11年)に考案された。 by wikipedia

これって二・二六事件勃発した年ですね。

教科書上の出来事になっていてもおかしくないくらいの時代に発明されているんですね。

ちなみに、この年には他にも上野動物園からクロヒョウが脱出したり、柴犬が天然記念物に指定されてます。(どうでもええ)

まだ、PCのない時代ですから、これを昔の人達は手書きしていたみたいです。


歴史を振り返ったところで、一目均衡表について説明したいところなのですが。

私が説明しても一目均衡表のいの字もわからないと思うのでググりましょう。

ちなみに私はこのサイトが分かりやすかったと思います。

www.sevendata.co.jp

奥が深いテクニカル指標なので、このサイトだけでなく他のサイトも見て回ったほうが良いと思います。

コード解説

転換線=(過去9日間における最高値+同最安値)÷2
基準線=(過去26日間における最高値+同最安値)÷2
先行スパン1={(転換値+基準値)÷2}を(当日を含めた26日先すなわち)25日先にプロットしたもの
先行スパン2={(過去52日間における最高値+同最安値)÷2}を(当日を含めた26日先すなわち)25日先にプロットしたもの
遅行スパン=(本日の終値)を(当日を含めた26日前すなわち)25日前にプロットしたもの

これが一目均衡表で使用される指標の計算方法です。

なので、必要なのはこの5つの指標です。

  1. 転換線
  2. 基準線
  3. 先行スパン1
  4. 先行スパン2
  5. 遅行スパン


では、まず転換線について見てみます。

計算式はこれです。

転換線=(過去9日間における最高値+同最安値)÷2

import pandas as pd

PandasのSeriesを使います。

high9 = pd.Series.rolling(self.data["High"], window=9,center=False).max()
low9 =  pd.Series.rolling(self.data["Low"], window=9,center=False).min()
change_line = ( high9 + low9 ) / 2

rollingで9日間のデータを取得します。

取得した9日間の中から最高値を取得するために、.max()を使います。

最小値の取得も同じような手順で、.min()を使います。

この最高値と最小値の中値が欲しいので、これらを足して2で割ります。

これで転換線が完成です。


次に基準線です。

計算式はこれなんですが、転換線とほぼ同じです。

基準線=(過去26日間における最高値+同最安値)÷2

9日間から26日間に増えただけです。

high26 = pandas.Series.rolling(self.data["High"], window=26,center=False).max()
low26 =  pandas.Series.rolling(self.data["Low"], window=26,center=False).min()
standart_line = ( high26 + low26 ) / 2

これで基準線もできました。


次に先行スパン1です。

計算式はこれです。

先行スパン1={(転換値+基準値)÷2}を(当日を含めた26日先すなわち)25日先にプロットしたもの

25日先のプロットは後でするとして、まず計算だけ行います。

span1_line = (change_line + standart_line) / 2

先ほど作ったこの2つの指標を足して2で割ることでできます。


次に先行スパン2です。

計算式はこれです。

先行スパン2={(過去52日間における最高値+同最安値)÷2}を(当日を含めた26日先すなわち)25日先にプロットしたもの

転換線、基準線と計算式はほぼ同じです。

52日に伸びただけですね。

high52 = pandas.Series.rolling(self.data["High"], window=52,center=False).max()
low52 =  pandas.Series.rolling(self.data["Low"], window=52,center=False).min()
span2_line = ( high52 + low52 ) / 2

これで先行スパン2も完成です。


遅行スパンはそのまんま終値をプロットします。


指標が出揃ったのでプロットしていきます。

plt.plot(Date, change_line, label = "change")

基本的にはmatplotlibでプロットしてやればOKです。


ただ、一目均衡表は雲と呼ばれるものがあり、これが特徴でもあります。

先行スパン1と先行スパン2の間を灰色で塗ることで、雲っぽくなるので、これをmatplotlibで実現する必要があります。

plt.fill_between(x, y1, y2)

fill.betweenを使えば上手くいきました。

xに日付を入れ、y1に先行スパン1、y2に先行スパン2を入れれば、雲が出来上がります。

plt.fill_between(Date + 26, span1, span2], label="span", facecolor="#dcdcdc", alpha=0.5, edgecolor="#1effff", linewidth="0.5")

Dateに+26をすることで、26日先にプロットしてやります。

ただ、やってもらうとわかると思うのですが、26じゃ上手くいきません。

この26は土日も含めての26になってしまうのですが、実際は土日を含めずに26日先にプロットです。

この数値の決め方にかなり頭をひねったのですが、結局いい方法は見つかりませんでした...

SBIのアプリで見た一目均衡表と比べながらこの数値を調整すると、38でピッタリきました。

また、何かいい方法を探します...


あとは好みで色や線の太さを変えればいいと思います。

ただ、雲は少し透明のほうが見やすいので、alphaは0.5くらいに設定すると良い雲になります。


最後にローソク足と組み合わせると一目均衡表になります。

f:id:doz13189:20161004230255p:plain

以上で解説終わります。

単純移動平均線やボリンジャーバンドと合わせて使っていきたいですね。