Streamlitを使って株価データをグラフ表示した


Streamlitを使って株価データをグラフ表示した

StreamlitとはPandasのDataFrameやmatplotlibで作成したグラフを簡単にウェブアプリにすることが出来るサービス

株価データ取得の方法はこちら → Seleniumを使い株価データを自動取得
株価データをBigQueryに保存する方法はこちら → 自動取得した株価データをBigQueryに保存
Streamlit公式サイト

はじめに

パッケージをインストール pip install streamlit
デモを起動 streamlit hello

$ pip install streamlit
$ streamlit hello

サイドメニューのChoose a demo で複数タイプのデモがある

株価を表示

銘柄を取得

stock_list.csv に銘柄データを追加

stock_list.csv

stock_no,name
7203,トヨタ自動車(株)
9984,ソフトバンクグループ(株)
6861,(株)キーエンス
6758,ソニー(株)
9432,日本電信電話(株)
9983,(株)ファーストリテイリング

Pandas DataFrameにして取得

def _get_stock_list():
    stock_list = pd.read_csv(
        os.getcwd() + "/stock_list.csv",
        thousands=",",
        engine="python",
        encoding="UTF-8",
    )
    return stock_list

サイドメニューに検索を追加

selectboxで銘柄検索、date_inputで期間検索
期間検索の結果はselected_date[0]で開始期間、selected_date[1]で終了期間

...
def main():

    # サイドメニュー
    stock_list = _get_stock_list()
    stock_name = st.sidebar.selectbox(
        "銘柄検索",
        stock_list["name"].values,
    )
    stock_no = stock_list.query(f"name == '{stock_name}'").iloc[0]["stock_no"]

    min_date = datetime.now() - timedelta(days=90)
    max_date = datetime.now()
    selected_date = st.sidebar.date_input(
        "期間検索", [min_date, max_date], max_value=max_date
    )

    start_date = selected_date[0].strftime("%Y-%m-%d")
    end_date = (
        selected_date[1].strftime("%Y-%m-%d")
        if len(selected_date) == 2
        else max_date.strftime("%Y-%m-%d")
    )

BigQueryに保存したデータ取得

stock_no、start_date、end_date は検索の値を使う

def _get_stock(stock_no: str, start_date: str, end_date: str):

    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter("start_date", "STRING", start_date),
            bigquery.ScalarQueryParameter("end_date", "STRING", end_date),
        ]
    )
    df = client.query(
        f"""SELECT * FROM `weekend-hackathon.yahoo_finance_download.{stock_no}` 
WHERE trade_at >= @start_date AND trade_at <= @end_date ORDER BY trade_at LIMIT 1000""",
        job_config,
    ).to_dataframe()

    df = df.rename(
        columns={
            "trade_at": "日付",
            "open": "始値",
            "high": "高値",
            "low": "安値",
            "close": "終値",
            "volume": "出来高",
            "adj_close": "調整後終値",
        }
    )

    return df

Streamlitに描画

タイトルとDataframe、グラフを表示する
コメントはMarkDownとして画面出力できる
Dataframeは st.write(stock_df) とするだけでリスト表示
グラフ描画はMATLABを使うサンプルは終値を繋げた

def main():
...
    # メイン
    f"""
    # {stock_no} {stock_name}
    """

    stock_df = _get_stock(stock_no, start_date, end_date)
    st.write(stock_df)

    x = stock_df["日付"].values
    y_count = stock_df["終値"].values

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(x, y_count)

    xfmt = mdates.DateFormatter("%m/%d")
    xloc = mdates.DayLocator(interval=math.floor(len(stock_df) / 5))

    ax.xaxis.set_major_locator(xloc)
    ax.xaxis.set_major_formatter(xfmt)
    st.write(fig)

Streamlit起動

起動し対象URLにアクセスすると表示される
検索すると銘柄、期間が変更したものに更新される

$ streamlit run app.py
2021-01-30 02:46:47.751
  For better performance, install the Watchdog module:

  $ xcode-select --install
  $ pip install watchdog



  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://192.168.10.7:8501

やってみた感じPythonだけでいい感じに作れた
次回はStreamlitをデプロイします
いいね!と思ったら LGTM お願いします

【PR】週末ハッカソンというイベントやってます! → https://weekend-hackathon.toyscreation.jp/about/

続き投稿しました
Streamlitで作成した株価アプリをWEB公開した(キャッシュ説明あり)