Pythonで日経平均株価のグラフを作成してみた(後編)
前編では、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/









