Sitemap
VELTRA Engineering

Posts from the VELTRA Engineering team. www.veltra.com

Pythonで日経平均株価のグラフを作成してみた(後編)

7 min readMar 18, 2020

--

Press enter or click to view image in full size

前編では、APIで日経平均株価のデータの取得と前処理、移動平均線の表示まで行います。
後編では、前編のデータを使い、ポイントアンドフィギュア(以下: P&F)の表示を行います。

PythonはJupyter Notebookで実行しています。

はじめに:

Pythonを使ってAPIでデータ取得、前処理、グラフ表示をするのが目的です。要件をみたすデータとして、日経平均株価を使って移動平均線とP&Fを表示しています。

こちらのデータを使って投資を薦めているわけではありません。

データ整形:

ここからは、ソース内にコメントを記載していきます。

まずは関数を作成します。

Get shimo’s stories in your inbox

Join Medium for free to get updates from this writer.

作成する関数

  • 日経平均値から閾値の計算: getFrameValue
  • P&Fの枠数のリスト作成: getFrameList
  • P&Fのマーク用に1 or -1 を戻す
# 値が枠の閾値になるように計算
# 計算方法: 値 / 枠の幅 -> 整数に変換 -> 枠の幅を乗算
# ex) 値: 23820, 枠の幅 200, 閾値, int(23820 / 200) -> 119 * 200 -> 23800
def getFrameValue(val, box):
return int(val / box) * box
# チャートに記載する枠数を求めリストにセット
# ex) 値: [2000, 2250, 20610, 22210, 21430, 23000], 枠の幅 200, リスト: [1, -3, 8, -4, 8]
def getFrameList(data_list, base_value, box, change_frame):
p_list = [0] # returnの初期値

# 対象データ分ループ
for val in data_list:
val = getFrameValue(val, box)
last_diff = int((val — base_value)/box) # 前日との差分
past_diff = p_list[-1] # 前日の枠数 # 前日がプラス
if past_diff >= 0:
# 前日より高い
if last_diff > 0:
p_list[-1] = past_diff + last_diff # 高値更新のため上書き
base_value = val
# 前日より低い かつ 枠変換以下
elif last_diff < 0 and last_diff <= change_frame*-1:
p_list.append(last_diff) # 次の列になるため、追加
base_value = val
# 前日がマイナス
elif past_diff < 0:
# 前日より安い
if last_diff < 0:
p_list[-1] = past_diff + last_diff # 低値更新のため上書き
base_value = val
# 前日より高い かつ 枠変換以上
elif last_diff > 0 and last_diff > change_frame:
p_list.append(last_diff) # 次の列になるため、追加
base_value = val
# 1件目のデータ終値 からスタートしているので、プラスマイナス1
# ここがないと、データが1マス分ずれていたので、調整
if p_list[0] < 0:
p_list[0] -= 1
elif p_list[0] > 0:
p_list[0] += 1
elif p_list[1] < 0: # 1つ目が0だと2つ目のデータで判断
p_list[0] += 1
elif p_list[1] > 0: # 1つ目が0だと2つ目のデータで判断
p_list[0] -= 1
return p_list# 印の表示用に絶対値で割る, return は 1 or -1
# 0なら1
def sign(val):
result = 1
try:
result = val / abs(val)
# 0なら1を戻す
 except ZeroDivisionError:
result = 1
except:
pass
return result

つづいて、枠の幅と変換点を指定して、P&F作成用の配列を取得します。

# 1枠の幅と変換点、基準値を設定
box = 200
change_frame = 3
base_value = getFrameValue(df_target.values[0], box)
# 表示用のリストを取得
p_list_100 = getFrameList(df_target, base_value, box, change_frame)
# P&Fの印と色を指定
symbol = {-1:'o',1:'x'} # チャートの印
s_color = {-1:'red',1:'blue'} # チャートの色

P&Fの表示:

作成したデータからP&Fを表示していきます。

# P&Fの表示サイズを指定し、表示枠を作成
fig = plt.figure(figsize=(10, 10))
ax = fig.add_axes([.15, .15, .7, .7])
# P&Fの1点目をスタートの価格に設定
chgStart = base_value
# 表示データ分ループ
for ichg, chg in enumerate(p_list_100):
# X, Y軸の表示箇所を指定
x = [ichg+1] * abs(chg)
y = [chgStart + i * box * sign(chg) for i in range(abs(chg))]
# 次のX軸の始点を指定
chgStart += box * sign(chg) * (abs(chg)-2)
# P&Fの各点を表示
ax.scatter(x, y,
marker=symbol[sign(chg)],
c=s_color[sign(chg)],
s=175)
# グリッドの中心にP&Fの各印を表示するように調整
# X軸のグリッドを実際の列分表示
plt.xticks(np.arange(0, len(p_list_100)+1,1))
# Y軸のグレードを 最小、最大値 +-1 枠分、枠の幅ごとに表示
plt.yticks(np.arange(getFrameValue(df_target.min()-box*2, box), getFrameValue(df_target.max()+box*2,box),box))
# grid の表示
plt.grid(True)
# グラフ表示
plt.show()

実行すると意図した取りP&Fが表示できます。

日経平均株価のデータ取得からP&Fの表示まで1日かからずに作成することが出来ました。棒グラフや円グラフなどは色々情報があったのですが、P&Fは全然なく、表示するためのデータの作成に一番苦労をしました。

今回は線グラフとP&Fのグラフのみ表示しましたが、月毎に集計して棒グラフにしたり、散布図などを表示するのもいいかもしれませんね。

参考にしたURL:

Jupyter Notebook: https://ai-inter1.com/jupyter-notebook/

pandas: https://pandas.pydata.org/pandas-docs/stable/reference/index.html

matplotlib: https://matplotlib.org/users/index.html

移動平均線: https://fx-quicknavi.com/chart/moving-average/

P&F: https://fx-quicknavi.com/chart/point-and-figure/

Quandl API: https://www.quandl.com/

--

--