見出し画像

Pythonで「Point & Figure」チャートを描画する。(5)

【追記】
本記事投稿後、Point&Figureチャートの描画モジュールの作成を進めていましたが、チャートを描画する計算過程の論理的ロジックが完結していなかったので、改めてプラグラムのロジックをしっかり検討するところから出直すことにしました。

まずはロジックを明確にするため、表計算ソフト(Numbers)で Point&Figureチャートを描画することに挑戦しました。

 >>> 記事はこちら

----------------------------------------------------------------------
本記事はチャート描画のロジックが固まったところで改めて修正します。
----------------------------------------------------------------------
これまでの過程で、matplotlib の散布図にて Point&Figureチャートとして遜色ない見栄えのチャートを描画することができるようになりました。

今回は、時系列データから Point&Figure チャートを描画するためのデータを準備する部分のモジュール化を進めていきたいと思います。

時系列の数値データからmatplotlibの散布図描画に必要な以下のデータを作成、抽出していきます。

(1) 時系列データの配列を作成する。

データの加工に数値処理を実行していくことになるので、標準モジュールの numpy をインポートします。numpy は Pythonで多量の数値計算を行うための機能をまとめたモジュールで、特に「多次元配列」に関する機能が充実しています。Pythonは C言語や Java などに比べて数値計算に時間がかかると言われていますが、numpy はC言語で実装されているので高速に数値計算を処理することができます。

import nympy as np

as np の部分は「エイリアス」と呼称されるもので、インポートしたモジュールを別名でインスタンス化して使えるようにするための記述です。numpy の機能を使用するのに、本来ならば numpy.◯◯ とコードを書かなければなりませんが、エイリアスを使用すると np.◯◯ と短縮して書けるようになります。

numpy では array という関数を使用して配列を作成します。

import numpy as np

配列の変数名 = np.array( [リスト] )

arrayによる配列は ndarray(多次元配列)というクラスのインスタンスとして作成されます。( nd は N-dimensional( N 次元)を意味します。Python には標準ライブラリに array モジュールが含まれていますが、1次元配列しか扱うことができません。)

変数に時系列データを格納します。(要素数:10)

import numpy as np
rate = np.array([108.67,108.61,105.67,106.37,105.42,\
106.27,106.91,108.06,107.56,107.93])

【 list , array , numpy.array の比較 】

画像1

(2) 時系列データ配列から「最大値・最小値・中央値」を抽出する。

時系列データの最大値と最小値を目安としてチャートのY軸の描画範囲を指定します。チャートの見栄えを良くするために、配列の中央値からY軸の描画範囲の余白となる部分を算出します。

画像2

「中央値」の算出には median 、「最大値」の算出には max 、「最小値」の算出には min メソッドを使用します。

import numpy as np

# 配列の中央値を算出する。
m = np.median(rate)

# 配列の最大値を算出する。
top = np.max(rate)

# 配列の最小値を算出する。
bottom = np.min(rate)

最大値、最小値それぞれに余白分の数値処理を行います。

import numpy as np

# 配列の中央値を算出し、Y軸余白とする。(1/10, 小数点切り下げ)
alfa = np.floor(np.median(rate) / 10)
print(alfa)	# 10

# 配列の最大値を算出し、余白分を加算してY軸最大描画範囲とする。
ylim_top = np.floor(np.max(rate) + alfa)
print(ylim_top)	# 118

# 配列の最小値を算出し、余白部分を減算してY軸最小描画範囲とする。
ylim_bottom = np.floor(np.min(rate) - alfa)
print(ylim_bottom)	# 95

小数点の切り下げ処理には floor メソッドを使用しました。
ちなみに、小数点を切り上げる場合は ceil メソッドを使用します。

import numpy as np

x = np.array([2.5, 8.3])

# 各要素の小数点切り下げ
a = np.floor(x)
print(a)  # [2. 8.]

# 各要素の小数点切り上げ
b = np.ceil(x)
print(b)  # [3. 9.]

算出した値を Point&FigureチャートY軸の描画範囲として指定します。

# matplotlib Y軸の描画範囲を設定
ax.set_ylim(bottom=ylim_bottom, top=ylim_top)

(3) チャート描画の起点となる散布図マーカーの座標を算出する。

Point&Figureチャートを描画する起点となる散布図マーカーの座標を算出します。Point&Figureチャートの枠にマーカーを表示させるためには、枠の値幅の中央に描画する必要があります。

(例) Point&Figureチャート枠の値幅が20銭で、描画したいレートが 108.67$とすると、108.60 ~ 108.80 の枠にマーカーを描画することとなるので、散布図マーカーはその中央値の108.70に描画することになります。

画像3

起点となるレートは、配列の第1要素に対して以下のとおり計算します。

【レートが108.67、チャート枠設定値幅が20銭の場合】
(1) レートをチャート枠の値幅で除算する。
  108.67 / 0.20 = 543.35
(2) 計算結果の小数点以下を切り下げる。
  543.35 -->> 543.00
(3) チャート枠の中央値となるよう0.5を加算する。
  543.00 -->> 543.50
(4) 計算結果にチャート枠の値幅を乗算してマーカー描画位置とする。
  543.50 * 0.20 = 108.70

チャート描画の起点となる散布図マーカーの座標算出をコード化します。

# チャート枠の値幅を設定する。
shiftRate = 0.2


# 配列の第1要素からマーカー描画の起点を算出する。
# レートをチャート枠の値幅で除算、小数点切り下げ、+0.5
# 計算結果とチャート枠値幅を乗算

startRate = (np.floor(rate[0]/shiftRate) + 0.5) * shiftRate
print(startRate)	# 108.7

(4) 時系列データの差分配列を求める。

前の値とのレート差を算出することにより値動きのみを表した数値配列に変換します。この処理には、要素間の差分を計算することができる diff メソッドを使用します。

import numpy as np

x = np.array([1, 3, 7, 15])

# 隣り合う要素同士の差分を計算
diff = np.diff(x)
print(diff)  # [2 4 8]

引数に時系列データ配列を指定して要素間の差分を算出します。

import numpy as np

rate_diff = np.diff(rate)
print(rate_diff) 

# [-0.06 -2.94  0.7 -0.95  0.85  0.64 1.15 -0.5  0.37]

要素間の差分から「枠」転換数を算出することにより、散布図のマーカを描画する際の繰り返し処理の回数とすることができます。


ここまでで時系列データから Point&Figureのチャート描画に必要な各種データを作成することができました。

次回は、時系列データの要素間差分データから散布図マーカーを繰り返し描画していくことで Point&Figureチャートを描画していきます。



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