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
このコードは、Apple社(AAPL)の株価を取得して、ローソク足チャートを表示するWebアプリを作成するものです。Streamlit というPythonライブラリを使って、インタラクティブなWebアプリとして表示します。
📌 全体の流れ(ざっくり)
- 株のティッカー(銘柄コード)を指定
- Yahoo Finance から株価データを取得
- ローソク足チャート用にデータを整形
- matplotlibとmplfinanceでローソク足チャートを描画
- StreamlitでWeb表示
🧩 各セクションの詳細解説
① 銘柄を指定
ticker = "AAPL"
- Apple社の株式ティッカー
AAPLを指定。 -
tickerを変えれば、他の会社の株価チャートも見られます(例:MSFT,GOOGL,TSLAなど)。
② 株価データを取得
stock = yf.download(ticker)
-
yfinanceライブラリを使って、指定したティッカーの株価データ(過去の時系列データ)を取得。 -
stockはDataFrame形式で、日付ごとの「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)
出力結果:

名前 年齢 職業
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)
出力結果(一部):

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つのグラフを並べることもできます。
データ整形と描画:
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の株価情報)
もともとこんな構造です:

📌 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, ...] → 各行に入れる値(連番)
✅ なぜこんなことをするの?
mplfinance.original_flavor.candlestick_ohlc() など一部のチャート描画関数では、
X軸に日付ではなく、数値(連番) が必要な場合があります。
そのため、"index"列に数値を入れておいて、それをX軸の位置として使うのです。
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で、たとえばこういうカラムがあります:

ここで、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)
-
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'」みたいに日付ラベルを貼っているわけです。 -
locator = mdates.AutoDateLocator()
AutoDateLocator は Matplotlibの日付軸用の目盛り位置を自動調整するクラスです。
これを使うと、日付が密集しすぎたり、逆に間隔が空きすぎたりしないように、良い間隔で日付ラベルを表示してくれます。 -
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)の文字サイズが大きく表示されます。
💡 補足:
他にも xticks() には以下のようなオプションがあります:
plt.xticks(rotation=45, fontsize=12, ha='right')

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() を使えば、より簡潔に書けます。





