openpyxlによる株価チャート作成術!Pythonでローソク足(OHLC)グラフをExcelに出力する方法

openpyxl

Pythonを使ったデータ分析やレポート作成の自動化は、今や多くのビジネスシーンで不可欠なスキルです。特に、株価や為替などの金融データを扱う際、その変動を視覚的に捉えるためのチャート作成は重要な作業の一つです。

この記事では、Pythonのライブラリopenpyxlを使って、Excelに本格的な株価チャート(ローソク足チャート)を自動で描画する方法を、初心者から中級者の方にも分かりやすく徹底解説します。

手作業で毎日グラフを更新している方や、PythonでのExcel操作をもう一歩進めたい方は、ぜひ最後までご覧ください。

はじめに:PythonでExcelの株価チャート作成を自動化しよう

この記事を読めば、Pythonプログラムを実行するだけで、指定したデータに基づいた株価チャートが埋め込まれたExcelファイルを出力できるようになります。

この記事で実現できること

最終的なゴールは、以下のような始値・高値・安値・終値(OHLC)と出来高(Volume)を含む複合チャートを自動で作成することです。

  • ローソク足チャートの自動生成
  • 出来高の棒グラフを組み合わせた複合チャートの作成
  • チャートのタイトルや軸ラベル、サイズのカスタマイズ

想定する読者

  • 金融データなどを扱っており、Excelでのレポート作成を効率化したい方
  • Pythonを使ったデータ可視化に興味がある方
  • openpyxlの基本的な使い方は知っていて、チャート作成機能について学びたい方

必要なライブラリと環境

この記事のコードは、Python 3.8以上を想定しています。また、以下のライブラリを使用しますので、未インストールの方は事前にインストールしておきましょう。pandasはサンプルデータ作成に利用します。

pip install openpyxl pandas

準備:openpyxlとサンプルデータ

まずは、チャートを描画するための準備を整えます。ライブラリのインストールが完了したら、株価チャートとは何か、そして今回使用するサンプルデータについて確認しましょう。

openpyxlライブラリのインストール

上記のコマンドでopenpyxlpandasをインストールしてください。openpyxlはPythonからExcelファイルを読み書きするための定番ライブラリで、セルの操作だけでなく、グラフ作成や書式設定など高度な機能も備えています。

株価チャート(StockChart)とは?

株価チャートは、特定の期間における価格の変動を視覚的に表現したグラフです。openpyxlではStockChartという専用のオブジェクトが用意されています。

特に、ローソク足チャートは代表的な形式の一つで、以下の4つの価格(四本値)を一本の「ローソク」で表現します。

  • 始値 (Open): 期間の開始時の価格
  • 高値 (High): 期間中の最高価格
  • 安値 (Low): 期間中の最安価格
  • 終値 (Close): 期間の終了時の価格

このOHLC(Open-High-Low-Close)データを使うことで、価格の変動幅や方向性を直感的に把握できます。

サンプル用の株価データを作成する

今回は、pandasライブラリを使って架空の株価データを作成します。実際の業務では、CSVファイルやAPIから取得したデータを利用することになるでしょう。

以下のコードで、日付、OHLC、そして出来高(Volume)を含むDataFrameを作成します。

import pandas as pd
from datetime import date

# サンプルデータを作成
data = {
    "Date": pd.to_datetime([
        date(2025, 1, 6), date(2025, 1, 7), date(2025, 1, 8), 
        date(2025, 1, 9), date(2025, 1, 10), date(2025, 1, 13), 
        date(2025, 1, 14), date(2025, 1, 15)
    ]),
    "Open": [1000, 1020, 1010, 1030, 1050, 1040, 1060, 1080],
    "High": [1030, 1025, 1040, 1060, 1055, 1050, 1090, 1100],
    "Low": [990, 1005, 1000, 1025, 1035, 1030, 1055, 1070],
    "Close": [1020, 1015, 1035, 1050, 1040, 1045, 1080, 1095],
    "Volume": [10000, 12000, 11000, 15000, 13000, 12500, 18000, 20000]
}

df = pd.DataFrame(data)
print(df)

このDataFrameをExcelファイルに書き込み、チャート作成の元データとして使用します。


基本編:openpyxlで基本的なローソク足チャートを作成する

準備が整ったので、いよいよチャートを作成していきます。まずはOHLCデータのみを使った、シンプルなローソク足チャートの作成手順を見ていきましょう。

Excelファイルにデータを書き込む

最初に、pandasで作成したデータをExcelワークシートに書き込みます。openpyxl.utils.dataframe.dataframe_to_rows関数を使うと、DataFrameを簡単に行データに変換できます。

import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows

# ↑で作成したdfがある前提

# 1. 新規Excelブックとワークシートを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Stock Data"

# 2. DataFrameをワークシートに書き込む
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)

# 3. 日付の書式設定(任意)
for cell in ws['A'][1:]:
    cell.number_format = 'YYYY-MM-DD'

StockChartオブジェクトを作成する

次に、チャートそのものを作成します。openpyxl.chartモジュールからStockChartをインポートし、インスタンス化します。

from openpyxl.chart import StockChart, Reference, Series

# StockChartオブジェクトを作成
chart = StockChart()
chart.title = "株価チャート (基本)"

チャートのデータ範囲を指定する(ReferenceとSeries)

ここが最も重要なポイントです。作成したチャートオブジェクトに、Excelシート上のどの範囲がデータなのかを教える必要があります。これにはReferenceオブジェクトを使用します。

Referenceは、ワークシート、最小/最大の列・行番号を指定して、セル範囲を定義します。

# データの範囲を定義
# X軸(カテゴリ):日付 (A2からA9)
cats = Reference(ws, min_col=1, min_row=2, max_row=9)

# Y軸(データ):OHLC (B2からE9)
# from_rows=Trueは、データ系列を行ごとに取得することを意味します
data = Reference(ws, min_col=2, max_col=5, min_row=1, max_row=9)

# チャートにデータを追加
chart.add_data(data, from_rows=True, titles_from_data=True)
chart.set_categories(cats)
  • min_col, max_col: 列番号(A列=1, B列=2, …)
  • min_row, max_row: 行番号
  • add_data(): チャートの主となるデータ(今回はOHLC)を設定します。titles_from_data=Trueとすることで、1行目のヘッダーを凡例として使用します。
  • set_categories(): チャートのX軸ラベル(今回は日付)を設定します。

ワークシートにチャートを追加して保存する

最後に、作成したチャートをws.add_chart()メソッドでワークシート上の好きな位置に追加し、Excelファイルを保存します。

# チャートをG2セルを左上として配置
ws.add_chart(chart, "G2")

# ファイルを保存
wb.save("stock_chart_basic.xlsx")

これでstock_chart_basic.xlsxというファイルが生成され、開くとローソク足チャートが描画されているはずです!


応用編:出来高(Volume)チャートを組み合わせる

株価チャートは、出来高と合わせて見ることで、市場の動向をより深く分析できます。ここでは、先ほどのローソク足チャートに出来高の棒グラフを追加する方法を解説します。

なぜ出来高チャートが必要なのか?

出来高は、特定の期間に成立した売買の数量を示します。出来高が多い状態での価格上昇は「強い買い意欲」を示すなど、価格変動の信頼性を測るための重要な指標となります。

出来高用の棒グラフ(BarChart)を作成する

出来高は通常、棒グラフで表現します。openpyxlではBarChartオブジェクトを使います。

from openpyxl.chart import BarChart

# 出来高用の棒グラフを作成(縦棒グラフ)
bar = BarChart()
# 出来高のデータ範囲 (F1からF9)
vol_data = Reference(ws, min_col=6, min_row=1, max_row=9)
bar.add_data(vol_data, from_rows=True, titles_from_data=True)

株価チャートと出来高チャートを組み合わせる方法

StockChartBarChartを組み合わせるには、plot_area.append()を使います。また、株価と出来高では数値のスケール(単位)が全く異なるため、出来高を第2軸に設定する必要があります。

# 出来高チャートを第2Y軸に設定
bar.y_axis.axId = 200
bar.y_axis.majorGridlines = None # 第2軸の目盛線を消す

# メインのY軸(価格)を第2Y軸と交差させる
# これにより、出来高チャートが株価チャートの下に表示されるようになります
chart.y_axis.crosses = "max" 
chart.y_axis.crossAx = 200

# 出来高チャートを株価チャートに追加
chart.plot_area.append(bar)

# -- この後、ws.add_chart()とwb.save()を実行 --

少し複雑に見えますが、axIdで新しい軸IDを割り当て、crossAxで既存の軸と関連付けるのがポイントです。これにより、美しく整形された複合チャートが完成します。


実践編:チャートをカスタマイズして見栄えを良くする

最後に、チャートのタイトルやサイズを調整して、よりレポートに適した見栄えに整えましょう。

チャートタイトルと軸ラベルを設定する

チャートの各要素は、オブジェクトのプロパティとしてアクセスできます。これにより、タイトルや軸ラベルを簡単に追加・変更できます。

# チャート全体のタイトル
chart.title = "株価と出来高"

# X軸(日付)のラベル
chart.x_axis.title = "日付"

# Y軸(価格)のラベル
chart.y_axis.title = "価格 (円)"

# 第2Y軸(出来高)のラベル
bar.y_axis.title = "出来高 (株)"

チャートのサイズや位置を調整する

チャートの大きさもwidth(幅)とheight(高さ)プロパティで調整できます。単位はcmです。

# チャートのサイズを設定
chart.width = 30  # 約30cm
chart.height = 15 # 約15cm

その他のカスタマイズ要素

StockChartではOHLCの凡例は不要な場合が多いので、非表示にするとスッキリします。

# 凡例を非表示にする
chart.legend = None

これらのカスタマイズを加えた最終的なコードでExcelファイルを出力すれば、そのままビジネスレポートに使える品質のチャートが完成します。


まとめ

今回は、Pythonのopenpyxlライブラリを使って、Excel上に本格的な株価チャート(ローソク足+出来高)を自動作成する方法を解説しました。

最後に、この記事の重要なポイントを振り返ります。

  • pandasでデータを準備し、dataframe_to_rowsでExcelに書き込むと効率的。
  • StockChartオブジェクトを使い、ローソク足チャートを作成する。
  • Referenceオブジェクトで、シート上のデータ範囲を正確に指定することが最も重要。
  • 出来高などは**BarChartで作成**し、plot_area.append()で複合チャートにできる。
  • スケールの違うグラフは、第2軸 (axId, crossAx) を設定して見やすく調整する。
  • titlewidthなどのプロパティで、見た目を柔軟にカスタマイズできる。

この技術を使えば、これまで手作業で行っていた面倒なグラフ作成作業を完全に自動化し、より本質的なデータ分析に集中することができます。ぜひ、ご自身の業務やプロジェクトに応用してみてください。

コメント

タイトルとURLをコピーしました