💹
株価チャート分析アプリを作りました
株価チャート表示アプリの紹介
日本株の株価をチャートとして表示するアプリを作成しました。Gradioでシンプルなインターフェースを実現し、銘柄コードを入力するだけで、指定した銘柄の過去90日分の終値チャートとトレンドラインを表示します。
概要
このアプリは、ユーザーが4桁の銘柄コードを入力することで、過去90日間の終値の株価チャートとトレンドラインをプロットします。データはStooqから取得しています。
主な機能
- 4桁の銘柄コードを入力して、過去1年分の株価データを取得。
- グラフは、過去90日の終値をプロットして、トレンドラインを表示。
- Gradioインターフェースを使用してシンプルな操作性を構築。
開発環境
- プログラミング言語: Python
- 開発: Google Colaboratory
-
ライブラリ:
- Gradio
- Pandas DataReader
- Matplotlib
- PIL (Python Imaging Library)
- Numpy
- データソース: Stooq
使い方
- 4桁の銘柄コード(例: 7203 for トヨタ自動車)を入力します。
- 「submit」ボタンをクリックすると、過去90日の株価終値チャートとトレンドラインが表示されます。
- データが取得できない場合は、エラーメッセージが表示されます。
デプロイ
HuggingFaceにデプロイしました。アカウントを作成して、スペースを作り、ファイルをアップロードしました。
参考リンク
- Gradio公式ドキュメント
- Pandas DataReader
- Matplotlib公式ドキュメント
- Stooq
- 【初心者でもできる】HuggingFaceにGradioで作成したアプリをデプロイする方法
アプリリンク
アプリのデモはこちらからアクセスできます: 株価チャートナビ
コードの解説
以下にコードの詳細を説明します:
-
データ取得:
pandas_datareader
を使って、Stooqから指定した銘柄の株価データを取得します。 -
プロット:
matplotlib
を使用して、株価の終値をプロットし、トレンドラインを表示します。 - エラーハンドリング: データが取得できない場合や例外が発生した場合は、適切なエラーメッセージを表示します。
- Gradioインターフェース: 簡単なGUIを作成して、ユーザーが銘柄コードを入力しやすいようにします。
import gradio as gr
import pandas_datareader.data as pdr
import matplotlib.pyplot as plt
from io import BytesIO
import datetime
from PIL import Image
import numpy as np
def get(銘柄コード):
try:
# 銘柄コードの設定(日本の株式市場用に“.JP”を追加)
ticker = f"{銘柄コード}.JP"
# 現在の日付を取得
end_date = datetime.datetime.now()
# 1年前の日付を取得
start_date = end_date - datetime.timedelta(days=365)
# データを取得
data = pdr.DataReader(ticker, "stooq", start=start_date, end=end_date)
# データが取得できない場合の処理
if data.empty:
return "データが取得できませんでした。銘柄コードを確認してください。"
# 使用するデータの件数
data = data.head(90)
# データのプロット
plt.figure(figsize=(12, 10)) # 図のサイズを設定
plt.plot(data.index, data['Close'], label='終値') # 終値のプロット
# トレンドラインの計算とプロット
# 日付を順序数に変換(線形回帰のため)
x = np.arange(len(data.index))
y = data['Close'].values
coefficients = np.polyfit(x, y, 1) # 線形回帰の係数を計算(次数1)
trendline = np.poly1d(coefficients) # トレンドラインの関数を生成
plt.plot(data.index, trendline(x), color='red', linestyle='--', label='トレンドライン') # トレンドラインのプロット
# グラフのタイトル、ラベル、グリッド、凡例の設定
plt.title(f"{ticker}の株価") # タイトル
plt.ylabel('Close Price') # y軸ラベル
plt.grid(True) # グリッドを表示
plt.legend() # 凡例を表示
# プロットをBytesIOオブジェクトに保存
img_data = BytesIO()
plt.savefig(img_data, format='jpeg') # 画像として保存
img_data.seek(0) # ポインタを先頭に戻す
plt.close() # プロットを閉じる
# BytesIOをPILイメージに変換
img = Image.open(img_data)
return img
except Exception as e:
return f"エラーが発生しました: {str(e)}" # エラーメッセージを返す
# Gradio インターフェースの作成
iface = gr.Interface(
fn=get, # 入力を処理する関数
inputs=gr.Textbox(label="銘柄コード(4桁)"), # ユーザー入力のテキストボックス
outputs=gr.Image(type="pil"), # 出力を画像として設定
title="株価チャート", # インターフェースのタイトル
description="4桁の銘柄コードを入力すると株価チャートを表示します。", # インターフェースの説明
allow_flagging='never', # フラグ付け機能を無効化
)
# インターフェースの起動
iface.launch()
Discussion