Python 株価の価格帯別出来高をグラフ化する

 本記事では、下図のようなグラフを作成する雛形コードを載せました。下図左にはチャート図、右には価格帯別出来高図を表記します。

f:id:HK29:20220305222652p:plain

 下図は、例として読み込んだ時系列データです。次のリンク先のような手順で入手できます。Python 楽天証券のマーケットスピードⅡとエクセルRSSから、チャート時系列データをcsvで保存する「win32com」 - PythonとVBAで世の中を便利にする

f:id:HK29:20220305222329p:plain

そして、下図は本プログラムの処理によって得た最終的なデータです。

f:id:HK29:20220305222427p:plain

 

■本プログラム

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
import numpy as np
from dateutil import relativedelta
import datetime
now = datetime.datetime.now()

# csvファイルの読み込み
fiel_path = '8267_イオン.csv'
df = pd.read_csv(fiel_path)
df


# In[2]:


# 日付型へ変換
df['日付'] = pd.to_datetime(df['日付'])

# 不要な列を削除する
df.drop(['時刻'], axis=1, inplace=True)

# 列名を一括で変更する
target_column_list = ['日付', '始値', '高値', '安値', '終値', '出来高']
rename_column_list = ['Time', 'Open', 'High', 'Low', 'Close', 'Volume']
df.rename(columns=dict(zip(target_column_list, rename_column_list)), inplace=True)
df


# In[3]:


df2 = df.copy()

df2['Ave'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4
df2


# In[4]:


# 現在から3年前のデータまでを対象にするため、時間の演算
# 秒, 時間, 日の場合
#my_time = now + datetime.timedelta(days = 3, hours = 5)
# 月, 年の場合は、dateutilのrelativedeltaを使う
my_time = now + relativedelta.relativedelta(years = -10)
print(my_time.year, my_time.month, my_time.day)

DF = df2.copy()
# #DF = DF[DF['Time'] > datetime.datetime(2019, 1, 1)]
DF = DF[DF['Time'] >  datetime.datetime(my_time.year, my_time.month, my_time.day)]
DF.reset_index(drop = True, inplace = True)
DF


# In[5]:


# インデックスを列名で指定
DF.set_index('Time', inplace=True)
DF


# In[6]:


# 価格帯の最小と最大を算出
min = int(DF['Ave'].min())
max = int(DF['Ave'].max())
print(min, max)


# In[7]:


# 階級の境界を算出
my_classes = 21

my_bins = np.arange(min, max, int((max-min)/my_classes))
my_bins


# In[8]:


# 階級に分けて、カテゴリ列を作成する
DF['Category'] = pd.cut(DF['Ave'], my_bins)
DF


# In[9]:


#価格別出来高の計算
my_sum = DF.groupby('Category').sum()
#label_list = [str(i[0]) + 'a' + str(i[1]) for i in my_sum.index]
label_list = [str(i) for i in my_sum.index]
label_list


# In[10]:


# 単純移動平均の計算
my_days1 = 25
my_days2 = 75
my_days3 = 200

simple_moving_average1 = pd.Series.rolling(DF['Close'], window=my_days1).mean()
simple_moving_average2 = pd.Series.rolling(DF['Close'], window=my_days2).mean()
simple_moving_average3 = pd.Series.rolling(DF['Close'], window=my_days3).mean()


# In[11]:


# グラフ化
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import japanize_matplotlib
plt.rcParams['font.size'] = 22 # グラフの基本フォントサイズの設定

fig = plt.figure(figsize=(34,9))

ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(DF['Close'], color="k", lw=3)
ax1.set_ylabel('株価[¥]')
ax1.plot(simple_moving_average1, color="r", lw=3, label="移動平均 {} 日".format(my_days1))
ax1.plot(simple_moving_average2, color="y", lw=3, label="移動平均 {} 日".format(my_days2))
ax1.plot(simple_moving_average3, color="b", lw=3, label="移動平均 {} 日".format(my_days3))
ax1.legend()

# X軸目盛表記を調整する
x_ticklabels = ax1.get_xticklabels() # デフォルトの目盛り表記をゲットする
plt.setp(x_ticklabels, rotation=75) # 目盛り表記を90度回転。#フォントサイズの指定する場合 ,fontsize=16)
tick_spacing = 180 # 目盛り表示する間隔(3か月=90日)
ax1.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing)) # X軸目盛の表示間隔を間引く
ax1.grid()
ax1.set_title(fiel_path)

ax2 = fig.add_subplot(1, 2, 2)
ax2.barh(label_list, my_sum['Volume'], color="g")
ax2.set_xlabel('出来高')
ax2.set_ylabel('価格帯')
plt.show()


# In[ ]:

以上

<広告>