0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonで株価チャートを描画

Last updated at Posted at 2025-10-11
import yfinance as yf
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import mplfinance.original_flavor as mpl
import streamlit as st
import pandas as pd

# ---------------------------------------------------
# ① 銘柄を指定
# ---------------------------------------------------
ticker = "AAPL"  # Apple社

# ---------------------------------------------------
# ② 株価データを取得
# ---------------------------------------------------
stock = yf.download(ticker)
print(stock)

# データ取得の確認
if stock.empty:
    st.error("データが取得できませんでした。ティッカーシンボルを確認してください。")
    st.stop()

# ---------------------------------------------------
# ③ データ整形(必要な列だけ取り出す)
# ---------------------------------------------------
required_cols = ['Open', 'High', 'Low', 'Close']
if not all(col in stock.columns for col in required_cols):
    st.error("株価データに必要な列が含まれていません。")
    st.stop()

ohlc = stock[required_cols].copy()
ohlc.insert(0, 'Index', range(len(ohlc)))  # X軸用のIndex列を追加

# ---------------------------------------------------
# ④ グラフ作成(ローソク足のみ)
# ---------------------------------------------------
fig = plt.figure(figsize=(20, 10))

ax1 = fig.add_subplot(1, 1, 1)
mpl.candlestick_ohlc(
    ax1,
    ohlc[['Index', 'Open', 'High', 'Low', 'Close']].values,
    width=0.5,
    colorup='r',
    colordown='b'
)

# 日付ラベル
ax1.set_xticks(range(len(ohlc)))
ax1.set_xticklabels([d.strftime('%Y-%m-%d') for d in stock.index], rotation=90)
ax1.xaxis.set_major_locator(mdates.AutoDateLocator())

# ラベル・タイトル
ax1.set_xlabel("Date", fontsize=14)
ax1.set_ylabel("Price (USD)", fontsize=14)
ax1.set_title(f"{ticker} - Candlestick Chart", fontsize=18)
ax1.grid(True)

plt.tight_layout()

# ---------------------------------------------------
# ⑤ Streamlitで表示
# ---------------------------------------------------
st.pyplot(fig)

% streamlit run <コード保存先ディレクトリ>/<ファイル名>.py

スクリーンショット 2025-10-17 19.26.48.png

このコードは、Apple社(AAPL)の株価を取得して、ローソク足チャートを表示するWebアプリを作成するものです。Streamlit というPythonライブラリを使って、インタラクティブなWebアプリとして表示します。


📌 全体の流れ(ざっくり)

  1. 株のティッカー(銘柄コード)を指定
  2. Yahoo Finance から株価データを取得
  3. ローソク足チャート用にデータを整形
  4. matplotlibとmplfinanceでローソク足チャートを描画
  5. StreamlitでWeb表示

🧩 各セクションの詳細解説


① 銘柄を指定

ticker = "AAPL"
  • Apple社の株式ティッカー AAPL を指定。
  • ticker を変えれば、他の会社の株価チャートも見られます(例:MSFT, GOOGL, TSLAなど)。

② 株価データを取得

stock = yf.download(ticker)
  • yfinance ライブラリを使って、指定したティッカーの株価データ(過去の時系列データ)を取得。
  • stockDataFrame 形式で、日付ごとの「Open」「High」「Low」「Close」「Volume」などの情報を含みます。

チェック:

if stock.empty:
    st.error("データが取得できませんでした。ティッカーシンボルを確認してください。")
    st.stop()
  • データが空だったらエラーメッセージを出して処理を停止。

③ データ整形

required_cols = ['Open', 'High', 'Low', 'Close']
ohlc = stock[required_cols].copy()
ohlc.insert(0, 'Index', range(len(ohlc)))  # X軸用Index列
  • ローソク足に必要な4つのカラムだけを取り出します。
  • X軸に使うための Index 列を追加(0, 1, 2,...の連番)。

④ グラフ作成(ローソク足チャート)

mpl.candlestick_ohlc(...)
  • mplfinance.original_flavor を使って、ローソク足チャート(candlestick chart)を描画。
  • colorup='r':株価が上がった日は赤
  • colordown='b':株価が下がった日は青
  • X軸に日付を設定し、見やすくフォーマット。

⑤ Streamlitで表示

st.pyplot(fig)
  • 作成した matplotlib のグラフ(fig)を、Streamlit アプリ内に表示。

🔧 実行方法

このコードをローカルで動かすには、以下の準備が必要です:

必要なライブラリのインストール

pip install yfinance streamlit matplotlib mplfinance pandas

実行コマンド

streamlit run ファイル名.py

✅ ポイントまとめ

機能 説明
yfinance Yahoo Financeから株価データ取得
mplfinance ローソク足チャートの描画に使用
matplotlib グラフ全体の調整と描画
streamlit Webアプリとしてグラフを表示

もし、別のティッカーで表示したいチャートの期間を変更したい移動平均線を追加したいなどのカスタマイズをしたければ、気軽に教えてください!

🔍 全体の目的:
Apple(AAPL)の株価データを取得し、ローソク足チャートとしてWebアプリ(Streamlit)上に描画・表示する。

🧩 各行の解説:
import yfinance as yf
Yahoo Finance から株価データを取得するためのライブラリ。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
matplotlib はグラフ描画ライブラリ。日付や目盛りの調整にも使用。
import mplfinance.original_flavor as mpl
mplfinance はローソク足チャートを描くためのライブラリ。
original_flavor は古いAPIの機能を使うためのモジュール。
import streamlit as st
streamlit は簡単にWebアプリを作成できるライブラリ。
このコードはWebブラウザ上にチャートを表示するWebアプリを作ることを想定しています。
import pandas as pd
import numpy as np
import datetime
データ処理や日付操作に必要な一般的なライブラリ群。

銘柄の指定と株価データの取得:
apl = "AAPL"
stock = yf.download(apl)
AAPL(Appleのティッカー)を指定して、Yahoo Finance から株価データを取得。ティッカーとは、株式やETFなどの銘柄を識別するための「銘柄コード」です。
データは DataFrame 形式で、日足のOpen, High, Low, Close, Volume などの列が含まれる。
DataFrame(データフレーム)形式は、主にPandasライブラリで使用されるデータの表形式(2次元)です。非常に使いやすく、データの操作や分析に便利な構造を提供します。

✅ DataFrameの基本概念
行(Row):データの1つのレコード、つまり観測値を表します。
列(Column):データの各特徴や属性を表します。例えば、株価データの場合、列は「日付」「始値」「終値」「高値」「安値」などです。

🧩 DataFrameの特徴
行と列で構成されており、データを表形式で表示する。
各列に異なるデータ型を設定可能(例えば、ある列は数値、別の列は文字列など)。
インデックス(行のラベル)を設定でき、データに名前を付けることができる。

🔷 例:簡単なDataFrame
import pandas as pd

データの辞書形式

data = {
'名前': ['Alice', 'Bob', 'Charlie'],
'年齢': [25, 30, 35],
'職業': ['Engineer', 'Doctor', 'Artist']
}

DataFrame作成

df = pd.DataFrame(data)

表示

print(df)
出力結果:
image.png
名前 年齢 職業
0 Alice 25 Engineer
1 Bob 30 Doctor
2 Charlie 35 Artist

列(Column): 名前, 年齢, 職業
行(Row): 各個人(Alice, Bob, Charlie)

🔷 株価データのDataFrame例
例えば、yfinance で取得した株価データ(AAPL)の場合、DataFrame は次のようになります:
import yfinance as yf

Apple(AAPL)の株価データ取得

stock = yf.download("AAPL")

表示

print(stock)
出力結果(一部):
image.png
Date Open High Low Close Adj Close Volume
2023-10-13 171.03 172.60 170.79 171.21 171.21 54390000
2023-10-12 170.52 172.01 169.75 171.63 171.63 54440000
行(Index): 日付(2023-10-13, 2023-10-12)
列(Column): Open, High, Low, Close, Adj Close, Volume
yfinanceから取得したデータは、日付がインデックス、各列が株価に関連する情報(始値、高値、終値、取引量など)です。

🧑‍💻 DataFrameの操作例
特定の列を抽出:

'Close'列(終値)のみ表示

print(df['Close'])
行のフィルタリング(例えば、2023年10月13日のデータだけ抽出):

特定の日付のデータ(インデックスに日付が設定されている場合)

oct13_data = stock.loc['2023-10-13']
print(oct13_data)
列の追加:

'Daily Change'列を追加(終値と前日終値の差)

stock['Daily Change'] = stock['Close'].diff()
print(stock)

✅ まとめ
DataFrame は、Pandasの中心的なデータ構造であり、行と列で構成された表形式のデータを操作するために非常に便利です。
株価データやCSVファイルなど、多くのデータソースをDataFrameに読み込むことができます。
列名を指定して、行操作や列操作(追加、削除、更新、フィルタリング)が簡単にできます。

print(stock)
データ確認用(開発・デバッグ中に便利)。
stock = yf.download(ticker)
[100%**] 1 of 1 completed
Price Close High Low Open Volume
Ticker AAPL AAPL AAPL AAPL AAPL
Date
2025-09-17 238.990005 240.100006 237.729996 238.970001 46508000
2025-09-18 237.880005 241.199997 236.649994 239.970001 44249600
2025-09-19 245.500000 246.300003 240.210007 241.229996 163741300
2025-09-22 256.079987 256.640015 248.119995 248.300003 105517400
2025-09-23 254.429993 257.339996 253.580002 255.880005 60275200
2025-09-24 252.309998 255.740005 251.039993 255.220001 42303700
2025-09-25 256.869995 257.170013 251.710007 253.210007 55202100
2025-09-26 255.460007 257.600006 253.779999 254.100006 46076300
2025-09-29 254.429993 255.000000 253.009995 254.559998 40127700
2025-09-30 254.630005 255.919998 253.110001 254.860001 37704300
2025-10-01 255.449997 258.790009 254.929993 255.039993 48713900
2025-10-02 257.130005 258.179993 254.149994 256.579987 42630200
2025-10-03 258.019989 259.239990 253.949997 254.669998 49155600
2025-10-06 256.690002 259.070007 255.050003 257.989990 44664100
2025-10-07 256.480011 257.399994 255.429993 256.809998 31955800
2025-10-08 258.059998 258.519989 256.109985 256.519989 36496900
2025-10-09 254.039993 258.000000 253.139999 257.809998 38322000
2025-10-10 245.270004 256.380005 244.000000 254.940002 61999100
2025-10-13 247.660004 249.690002 245.559998 249.380005 38142900
2025-10-14 247.770004 248.850006 244.699997 246.600006 35478000
2025-10-15 249.339996 251.820007 247.470001 249.490005 33893600
2025-10-16 247.449997 249.039993 245.130005 248.250000 39698000

チャートの設定:
fig = plt.figure(figsize=(40, 30))
fig.autofmt_xdate(rotation=90, ha="center")
チャートのサイズを大きく設定。
**「幅40インチ × 高さ30インチの空の図(Figure)を作る」**というコード

横軸(X軸)のラベル(日付)が重ならないように90度回転。
X軸の日付ラベルを90度回転し、中央揃えで見やすく整えるための処理です。

ax = fig.add_subplot(1,1,1)
1つのサブプロット(1行1列)を作成。
✅ 一言で説明すると:
ax = fig.add_subplot(1, 1, 1)
は、
図(fig)の中に、1つのグラフ領域(Axes)を作成し、それを変数 ax に代入する
という意味です。

🔍 もう少し詳しく分解すると:
💡 用語の整理
Figure (fig):キャンバス全体(画面や画像全体)
Axes (ax):グラフを実際に描く領域(X軸・Y軸があるところ)

📌 書式:
fig.add_subplot(nrows, ncols, index)
nrows:行数(縦方向に何個並べるか)
ncols:列数(横方向に何個並べるか)
index:何番目のグラフか(左上を1番としてカウント)

🧩 具体的に fig.add_subplot(1, 1, 1) の意味:
1行 × 1列 のグリッド(つまり1個だけのグラフ)
その中の1番目の場所(= 唯一の場所)
つまり:
「キャンバス全体に1つだけグラフを描く場所を作る」という意味になります。

🔧 イメージ図:
+---------------------------+
| Axes (ax) |
| ← グラフを描く場所 |
+---------------------------+

← これは fig の中に作られた1つのグラフ枠

🧪 補足:複数のグラフを作る場合

2行1列の2番目のグラフ領域

ax2 = fig.add_subplot(2, 1, 2)
こんなふうに、縦に2つのグラフを並べることもできます。

✅ まとめ
image.png

データ整形と描画:
stock.insert(0, "index", [i for i in range (len(stock))])
mpl.candlestick_ohlc は数値ベースのX軸を使うため、日付の代わりに連番の「index」列を挿入。

✅ 一言で説明すると:
stock.insert(0, "index", [i for i in range(len(stock))])
は、
stock というDataFrameの先頭(0番目の列)に、「index」という名前の列を追加し、0からの連番を入れる
という意味です。

🔍 詳しく分解して解説:
📌 stock とは?
これは yfinance.download() で取得した 株価データのDataFrame です。
(例:AAPLの株価情報)
もともとこんな構造です:
image.png

📌 range(len(stock)) の意味
len(stock):行数を返す(=データの日数)
range(...):0から(行数 - 1)までの整数を順番に出す
[i for i in range(...)]:その整数列をリストにする
例:もしデータが5行なら → [0, 1, 2, 3, 4]

📌 stock.insert(0, "index", [...]) の意味
.insert(列番号, 列名, 値) で、指定した位置に列を追加します。
この場合は:
0 → 一番左(先頭の列)
"index" → 新しい列の名前
[0, 1, 2, 3, ...] → 各行に入れる値(連番)

🧩 追加後の例:
元のDataFrame:
image.png

追加後:
image.png

✅ なぜこんなことをするの?
mplfinance.original_flavor.candlestick_ohlc() など一部のチャート描画関数では、
X軸に日付ではなく、数値(連番) が必要な場合があります。
そのため、"index"列に数値を入れておいて、それをX軸の位置として使うのです。

✅ まとめ
image.png

mpl.candlestick_ohlc(ax, stock.values, width=0.5, colorup="r", colordown="b")
ローソク足チャートを描画。
colorup="r":価格が上がった日のローソクを赤に。
colordown=“b":価格が下がった日のローソクを青に。

mpl.candlestick_ohlc(ax, stock.values, width=0.5, colorup="r", colordown="b") の意味について説明しますね。

これは何をしているか?
Matplotlibのmplfinanceモジュールのcandlestick_ohlc関数を使って、ローソク足チャート(OHLCチャート)を描画しています。
ax:描画先のAxesオブジェクト(グラフの枠みたいなもの)。
stock.values:チャートの元になる数値データの配列。
width=0.5:ローソク足の横幅(太さ)。
colorup="r":終値が始値より上がった場合(陽線)のローソク足の色を赤に。
colordown="b":終値が始値より下がった場合(陰線)のローソク足の色を青に。

もう少し詳しく
ローソク足チャートは、株価の**始値(Open)、高値(High)、安値(Low)、終値(Close)**を視覚的に表現します。
candlestick_ohlc 関数は、これらの4つの値を含むデータセットを受け取り、ローソク足を描きます。

入力データの形
この関数に渡すデータは、各ローソク足が以下の形式のリストや配列である必要があります:
[時間(数値で)、Open, High, Low, Close, ...(他の列があってもよい)]

なぜ stock.values を使うのか?
stock はDataFrameで、たとえばこういうカラムがあります:
image.png

ここで、stock.insert(0, "index", [i for i in range(len(stock))]) によって、0列目に連番(インデックスの代わり)が追加されているため、
stock.values は
[
[0, Open0, High0, Low0, Close0, AdjClose0, Volume0],
[1, Open1, High1, Low1, Close1, AdjClose1, Volume1],
...
]
となり、
candlestick_ohlc は最初の5つの値(index, Open, High, Low, Close)だけを見てローソク足を描画します。

まとめ

mpl.candlestick_ohlc はローソク足を描く関数
ax に描画先を指定
stock.values のデータのうち、[index, Open, High, Low, Close] が必要
width はローソク足の太さ
colorup と colordown は上昇・下降時の色指定

軸の設定:
plt.xticks([x for x in range(len(stock))], [x.strftime('%Y-%m-%d') for x in stock.index])
locator = mdates.AutoDateLocator()
ax.xaxis.set_major_locator(locator)
X軸の目盛りを日付形式で表示。
自動で適切な日付間隔で目盛りを表示。
はい!この部分のコードの意味を順番に説明しますね。

コード全文
plt.xticks([x for x in range(len(stock))], [x.strftime('%Y-%m-%d') for x in stock.index])
locator = mdates.AutoDateLocator()
ax.xaxis.set_major_locator(locator)

  1. plt.xticks([x for x in range(len(stock))], [x.strftime('%Y-%m-%d') for x in stock.index])
    目的: グラフの横軸(x軸)に表示するラベル(目盛り)を設定しています。
    [x for x in range(len(stock))]
→ x軸の位置を表す数字のリスト。
例)0, 1, 2, ..., データ数分の連番。
    [x.strftime('%Y-%m-%d') for x in stock.index]
→ それぞれの位置に対応する日付文字列のリスト。
stock.index は日付のインデックスで、strftime('%Y-%m-%d') で「YYYY-MM-DD」の形にフォーマットしています。
    つまり、x軸の「0の位置には '2023-01-01'」みたいに日付ラベルを貼っているわけです。

  2. locator = mdates.AutoDateLocator()
    AutoDateLocator は Matplotlibの日付軸用の目盛り位置を自動調整するクラスです。
    これを使うと、日付が密集しすぎたり、逆に間隔が空きすぎたりしないように、良い間隔で日付ラベルを表示してくれます。

  3. ax.xaxis.set_major_locator(locator)
    ax.xaxis はグラフのx軸の設定部分。
    set_major_locator(locator) で、「x軸の主要な目盛りの位置を locator によって決める」と指示しています。

まとめ
最初の行で、x軸の位置とラベルを人間に読みやすい日付に設定。
そのあと、AutoDateLocator を使ってラベルが多すぎて重ならないように自動調整している。

このコードは、x軸に日付を綺麗に表示したいときの典型的な方法です。
もし「日付が重なって見にくい」などの問題があれば、この調整が重要になります。

plt.xlabel("date", fontsize=40)
plt.ylabel("price", fontsize=40)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.grid()
plt.legend(fontsize=32)
ラベルや目盛り、凡例などのスタイルを調整。

plt.xlabel("date", fontsize=40) の意味は以下の通りです。

plt.xlabel("date", fontsize=40) とは?
plt.xlabel() は、グラフのx軸(横軸)のラベル(説明)を設定する関数です。
引数 "date" は、x軸に表示するテキストラベルの内容。
→ ここでは「date(日時)」と表示します。
キーワード引数 fontsize=40 は、ラベルのフォントサイズを40ポイントに指定しています。
→ とても大きめの文字で表示されます。

まとめると
このコードは、グラフの横軸に「date」というタイトルを大きな文字で付けて、軸が何を表しているかを分かりやすくしている、という意味です。

✅ 一言で説明すると:
plt.xticks(fontsize=16)
は、
X軸(横軸)の目盛りラベルの文字サイズを 16 にする という意味です。

🔍 詳しく解説:
📌 plt.xticks() とは?
plt.xticks() は、Matplotlibで X軸(横軸)の目盛りの設定を行う関数です。
ラベルの値を変更したり、
ラベルの見た目(フォントサイズ、角度、位置など)を変えたりできます。

🧩 fontsize=16 の意味:
fontsize は 文字の大きさ(ポイント数) を指定する引数。
16 はわりと大きめの文字。グラフを見やすくしたいときによく使われます。

📊 使用例:
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [10, 20, 15])
plt.xticks(fontsize=16)
plt.show()
このコードでは、X軸の目盛り(1, 2, 3)の文字サイズが大きく表示されます。

✅ まとめ
image.png

💡 補足:
他にも xticks() には以下のようなオプションがあります:
plt.xticks(rotation=45, fontsize=12, ha='right')
image.png

plt.grid() はとてもシンプルでよく使う関数です!

plt.grid() の意味
グラフに グリッド(網目線、格子線)を表示します。
グリッド線は、データの位置や傾向を読み取りやすくするための補助線です。

デフォルトの動作
何も引数を渡さないと、主要な目盛り(major ticks)に沿った水平・垂直の線が表示されます。


plt.grid() # グリッド線をオンにする

オプション例
plt.grid(True) # グリッドを表示(Trueは省略可能)
plt.grid(False) # グリッドを非表示にする

plt.grid(axis='x') # x軸方向のみグリッド表示
plt.grid(axis='y') # y軸方向のみグリッド表示

まとめ
plt.grid() は、グラフを見やすくするために背景に補助線を引く関数です。

plt.legend(fontsize=32) は、グラフに凡例(レジェンド)を表示するための関数です。

凡例(Legend)とは?
グラフ内の線やマーカーなどが何を表しているかを説明するラベルのこと。
複数のデータ系列があるグラフで、どの線がどのデータか分かるように表示します。

plt.legend(fontsize=32) の意味
plt.legend() は凡例を表示する関数。
fontsize=32 は、その凡例の文字サイズを32ポイントに指定しています。

注意点
凡例は、グラフの各描画要素(線や点など)にラベルを設定して初めて表示されます。
例えば、plt.plot(x, y, label='データ1') のように label 引数をつけておく必要があります。
あなたのコードでは凡例の元になる label が指定されていないため、凡例は表示されない可能性があります。

まとめ
plt.legend(fontsize=32) は「凡例を表示して、その文字を大きくする」
でも、凡例に表示するデータ系列の名前が設定されていないと何も出ません。
Streamlit で表示:
st.pyplot(fig)
作成したチャート(fig)を Streamlit のWebアプリ上で表示。
✅ 実行結果イメージ:
このコードを streamlit で実行すると、ブラウザ上にローソク足チャートが大きく表示されるWebページになります。
⚠ 注意点:
mplfinance.original_flavor は古いAPI
 → 新しい mplfinance.plot() を使う方法もあります(将来的には推奨されるかも)。
legend(凡例)を表示しようとしても、デフォルトではローソク足にはラベルがないため空表示になります。
表示が重い
 → figsize=(40, 30) はかなり大きく、表示や保存に時間がかかる場合があります。
🔄 改良案(Optional):
stock データに日付列(datetime)をそのままX軸に使うようにすれば、より自然な表示になります。
mplfinance.plot() を使えば、より簡潔に書けます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?