ぷそさんのプログラミング研究所

【Python】株価のローソク足チャートを美しく作成する|銘柄コードを入れるだけで誰でもできる!

目次

Pythonで作る株価のローソク足チャートについて

Pythonで株価のローソク足チャートを作るには,mplfinanceというモジュールを使う方法があります。

このモジュールでは,以下のようなチャートを作ることができます。

しかし,このモジュールではデザインをカスタマイズするのが難しいという問題点があります。

そこで,下の画像のような美しいチャートを自分で作成する方法をご紹介します。

美しいローソク足チャートの作り方

今回のローソク足チャートでは,以下の情報を載せることを想定しています。

  • ローソク足(陽線と陰線の色分け)
  • 移動平均曲線(短期・中期・長期)
  • 直近の終値

必要なもの

必要なモジュールは以下のようになっています。

  • pandas:株価データの処理
  • numpy:株価データの処理
  • pandas_datareader:株価の取得
  • matplotlib:チャートの描画

必要なモジュールがインストールできたので,コードの解説をしたいと思います。

モジュールのインポート

まずは,先ほどインストールしたモジュールをimportします。

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from pandas_datareader.stooq import StooqDailyReader
import matplotlib.pyplot as plt

チャート化したい企業を指定

次に,株価チャートを作りたい企業の株価を取得します。

pandas_datareaderを使うことで株価を取得できます。

CODE=の部分に銘柄コードを入力します。

start = datetime(2022, 1, 1)の部分には,いつまで遡ってデータを取得するかを指定します。

end = datetime.now().date()は今日の日付を指定しています。

# 取得したい銘柄コードを指定
CODE = 9104
CODE_str = str(CODE) + ".JP"

# 取得したい日付を指定
start = datetime(2022, 1, 1)
end = datetime.now().date()

指定した企業の株価を取得

先ほど指定した企業の株価を取得します。

# 株価を取得する
df_target = StooqDailyReader(CODE_str, start=start, end=end).read()
# 日付でソートする
df_target = df_target.sort_values('Date')

チャート化したいデータを追加

移動曲線と陽線・陰線の区別はデータに無いので,自分で追加します。

ここで,短期は25日,中期は50日,長期は75日としています。

df_target = moving_average(df_target, 25)を変えることで期間を変更することができます。

# 移動平均をつける
def moving_average(df, window_size):
    df["mav_" + str(window_size)] = df['Low'].rolling(window=window_size).mean()
    return df

df_target = moving_average(df_target, 25) #短期
df_target = moving_average(df_target, 50) #中期
df_target = moving_average(df_target, 75) #長期

# 陽線と陰線のフラグをつける
df_target["flg"] = np.where(df_target["Close"] > df_target["Open"], 1, 0)

表示する期間を指定

チャートに表示する期間を指定します。

今回は半年前からのデータを表示するようにしています。

# 半年分を抽出
# 半年前の日付を計算
half_year_ago = datetime.now() - timedelta(days=365 / 2)
# 変換
formatted_date = half_year_ago.strftime("%Y-%m-%d")
# 抽出
df_chart = df_target[formatted_date:]

自分で日付を指定する場合には,以下のようにします。

# 自分で日付を指定する場合
start_day = "2023-05-01"
df_chart = df_target[start_day:]

チャート化する

最後にグラフ化します。

見た目を変更しない場合にはコピペするだけで大丈夫です。

変更したい場合には適宜設定してみてください。

# グラフの定義
fig, ax = plt.subplots(figsize=(15, 5),dpi=300)
# ax = fig.add_subplot(1,1,1)

# 背景とかを設定
fig.patch.set_facecolor('#181818')
ax.set_facecolor('#181818')

# その他のカスタマイズ(例: 軸の色)
ax.spines['bottom'].set_color('white')
ax.spines['top'].set_color('white')
ax.spines['right'].set_color('white')
ax.spines['left'].set_color('white')
ax.xaxis.label.set_color('white')
ax.yaxis.label.set_color('white')
ax.tick_params(axis='x', colors='white')
ax.tick_params(axis='y', colors='white')
ax.grid(color='white')

# グラフ関係の関数を作成
# 実体グラフ
def body(ax, df, color):
        ax.bar(x = df.index
        ,height=df["Close"] - df["Open"]
        ,bottom=df["Open"].values
        ,color=color
        ,alpha=1
        ,width=0.9)
        
        ax.bar(x = df.index
        ,height=df["High"] - df["Low"]
        ,bottom=df["Low"].values
        ,color=color
        ,alpha=1
        ,width=0.2)
        

# ローソクの実体を描画
# 陽線のとき
body(ax, df_chart[df_chart["flg"] == 0], "green")
# 陰線のとき
body(ax, df_chart[df_chart["flg"] == 1], "red")

# 移動平均をプロット
ax.plot(df_chart["mav_25"], color = "yellow", linewidth=0.8)
ax.plot(df_chart["mav_50"], color = "tomato", linewidth=0.8)
ax.plot(df_chart["mav_75"], color = "lime", linewidth=0.8)

# 直近の終値を点線で追加
ax.axhline(y=df_chart.iloc[-1,3], color='gold', linestyle='--', linewidth=1.0)


# 見た目の変更
ax.legend(["Short team(25days)","Midium team(50days)","Long team(75days)","Recent Closing price"],loc = "upper left", ncol=4, labelcolor='white', facecolor='#181818', edgecolor='#181818')
ax.set_xlim([df_chart.index[0], df_chart.index[-1]])
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

このブログでは,PythonやLaTeXの使い方などを紹介しています!
仕事でも趣味でもプログラミングをしています。
ブログは2022年8月にスタートしました。
【経歴】東京大学大学院修了→大手IT企業勤務

コメント

コメントする

目次