💹

株価チャート分析アプリを作りました

2024/09/10に公開

株価チャート表示アプリの紹介

日本株の株価をチャートとして表示するアプリを作成しました。Gradioでシンプルなインターフェースを実現し、銘柄コードを入力するだけで、指定した銘柄の過去90日分の終値チャートとトレンドラインを表示します。

概要

このアプリは、ユーザーが4桁の銘柄コードを入力することで、過去90日間の終値の株価チャートとトレンドラインをプロットします。データはStooqから取得しています。

主な機能

  • 4桁の銘柄コードを入力して、過去1年分の株価データを取得。
  • グラフは、過去90日の終値をプロットして、トレンドラインを表示。
  • Gradioインターフェースを使用してシンプルな操作性を構築。

開発環境

  • プログラミング言語: Python
  • 開発: Google Colaboratory
  • ライブラリ:
    • Gradio
    • Pandas DataReader
    • Matplotlib
    • PIL (Python Imaging Library)
    • Numpy
  • データソース: Stooq

使い方

  1. 4桁の銘柄コード(例: 7203 for トヨタ自動車)を入力します。
  2. 「submit」ボタンをクリックすると、過去90日の株価終値チャートとトレンドラインが表示されます。
  3. データが取得できない場合は、エラーメッセージが表示されます。

デプロイ

HuggingFaceにデプロイしました。アカウントを作成して、スペースを作り、ファイルをアップロードしました。
https://huggingface.co/

参考リンク

アプリリンク

アプリのデモはこちらからアクセスできます: 株価チャートナビ

コードの解説

以下にコードの詳細を説明します:

  1. データ取得: pandas_datareaderを使って、Stooqから指定した銘柄の株価データを取得します。
  2. プロット: matplotlibを使用して、株価の終値をプロットし、トレンドラインを表示します。
  3. エラーハンドリング: データが取得できない場合や例外が発生した場合は、適切なエラーメッセージを表示します。
  4. 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