'23/11/14更新:チャートと価格帯別出来高のグラフサイズの割合を変更したコードに変えました。
本記事では、下図のようなグラフを作成する雛形コードを載せました。下図左にはチャート図、右には価格帯別出来高図を表記します。

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

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

■本プログラム
import pandas as pd
import numpy as np
from dateutil import relativedelta
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import japanize_matplotlib
plt.rcParams['font.size'] = 22
import datetime
now = datetime.datetime.now()
fiel_path = '8267_イオン.csv'
df = pd.read_csv(fiel_path)
df
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
df2 = df.copy()
df2['Ave'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4
df2
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(my_time.year, my_time.month, my_time.day)]
DF.reset_index(drop = True, inplace = True)
DF
DF.set_index('Time', inplace=True)
DF
min = int(DF['Ave'].min())
max = int(DF['Ave'].max())
my_classes = 21
my_bins = np.arange(min, max, int((max-min)/my_classes))
DF['Category'] = pd.cut(DF['Ave'], my_bins)
my_sum = DF.groupby('Category').sum()
label_list = [str(i) for i in my_sum.index]
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()
fig = plt.figure(figsize=(21,9))
ax1 = fig.add_axes([0.1, 0.1, 0.5, 0.8])
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_ticklabels = ax1.get_xticklabels()
plt.setp(x_ticklabels, rotation=75)
tick_spacing = 180
ax1.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
ax1.grid()
ax1.set_title(fiel_path)
ax2 = fig.add_axes([0.72, 0.1, 0.15, 0.8])
ax2.barh(label_list, my_sum['Volume'], color="g")
ax2.set_xlabel('出来高')
ax2.set_ylabel('価格帯')
plt.savefig(f'{fiel_path[:-4]}.jpg', bbox_inches='tight')
以上
<広告>
リンク
リンク