+{"cells":[{"cell_type":"markdown","metadata":{"id":"WlEdUu9fEnsO"},"source":["# 株価推移\n","\n","[](https://colab.research.google.com/github/J-Quants/jquants-api-client-python/blob/master/examples/20220825-001-price-movement.ipynb)\n","\n","このノートブックでは指定した日付を基準として複数の銘柄の株価の推移をプロットします。\n","\n","\n","----\n","\n","**このノートブックはGoogle Driveを使用します。**\n","\n","- Google Drive の以下のファイルにリフレッシュトークンが書き込まれていることを想定しています。\n"," - `MyDrive/drive_ws/secret/jquantsapi-key.txt`\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"iND2IbyywrSt"},"outputs":[],"source":["# 表示する銘柄のコードを指定します (e.g. 8697)\n","TARGET_SYMBOLS = [\n"," \"7201\", # 日産\n"," \"7203\", # トヨタ\n"," \"7267\", # ホンダ\n","]\n","\n","# 基準となる営業日付を指定します。(YYYY-MM-DD)\n","# 土日や祝日などの営業日以外を入力すると適切に機能しません\n","BASE_DATE = \"2022-07-01\""]},{"cell_type":"code","execution_count":null,"metadata":{"id":"9REtVkPaGx7Y"},"outputs":[],"source":["# 必要なモジュールをインストールします。\n","! python -m pip install jquants-api-client japanize-matplotlib"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ilrdZjP4KknF"},"outputs":[],"source":["# Google drive をマウントします。\n","from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"A5fW3HxGN__3"},"outputs":[],"source":["import os\n","from datetime import datetime\n","\n","import japanize_matplotlib\n","import jquantsapi\n","import matplotlib.pyplot as plt\n","import numpy as np\n","import pandas as pd\n","import seaborn as sns"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"3CeWabhlOGE4"},"outputs":[],"source":["# pandas の表示制限を調整します\n","pd.set_option(\"display.max_rows\", 1000)\n","pd.set_option(\"display.max_columns\", 1000)\n","pd.set_option(\"display.width\", 2000)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"lLpjTna8OIN-"},"outputs":[],"source":["# TARGET_SYMBOLS が4桁で入力されている場合は末尾に0を付与する\n","for i in range(len(TARGET_SYMBOLS)):\n"," if len(TARGET_SYMBOLS[i]) == 4:\n"," TARGET_SYMBOLS[i] += \"0\""]},{"cell_type":"code","execution_count":null,"metadata":{"id":"fSG_cbO7Qm4x"},"outputs":[],"source":["# 一度取得したデータは Google Drive 上に保存して再利用します。\n","# 保存先ディレクトリを指定します。\n","STORAGE_DIR_PATH = \"/content/drive/MyDrive/drive_ws/marketdata\"\n","os.makedirs(STORAGE_DIR_PATH, exist_ok=True)\n","STORAGE_DIR_PATH"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"rkEQDOUlQqCN"},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"metadata":{"id":"fIRnvS9kOOqI"},"outputs":[],"source":["# J-Quants APIのトークンを保存してあるファイルを指定します\n","REFRESH_TOKEN_FILE_PATH = \"/content/drive/MyDrive/drive_ws/secret/jquantsapi-key.txt\""]},{"cell_type":"code","execution_count":null,"metadata":{"id":"dHm6w6O_QUnS"},"outputs":[],"source":["def get_refresh_token(refresh_token_file_path: str = REFRESH_TOKEN_FILE_PATH):\n"," with open(refresh_token_file_path, \"r\") as f:\n"," refresh_token = f.read()\n"," return refresh_token.rstrip().lstrip()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"9Ts2dfaRQV9C"},"outputs":[],"source":["# ファイルからリフレッシュトークンを読み込みます\n","refresh_token = get_refresh_token()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"CI9C-h6iQXsG"},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"metadata":{"id":"7ZH_LuWUQYk8"},"outputs":[],"source":["# J-Quants APIクライアントを初期化します\n","jqapi = jquantsapi.Client(refresh_token=refresh_token)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ximJhjXpQaXa"},"outputs":[],"source":[]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# 銘柄情報を取得します\n","df_list = jqapi.get_list()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"cKTVKiW2LuoV"},"outputs":[],"source":["# 取得したデータを表示して確認します\n","df_list.head(2)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"qXNlF0iBQe8q"},"outputs":[],"source":["# 株価情報を取得します\n","buff = []\n","for code in TARGET_SYMBOLS:\n"," df = jqapi.get_prices_daily_quotes(code=code)\n"," buff.append(df)\n","df_p = pd.concat(buff).reset_index(drop=True)\n","\n","# 各列のデータ型を調整します\n","df_p.loc[:, \"Date\"] = pd.to_datetime(df_p[\"Date\"], format=\"%Y-%m-%d\")\n","df_p.loc[:, \"Open\"] = df_p[\"Open\"].astype(np.float64)\n","df_p.loc[:, \"High\"] = df_p[\"High\"].astype(np.float64)\n","df_p.loc[:, \"Low\"] = df_p[\"Low\"].astype(np.float64)\n","df_p.loc[:, \"Close\"] = df_p[\"Close\"].astype(np.float64)\n","df_p.loc[:, \"Volume\"] = df_p[\"Volume\"].astype(np.float64)\n","df_p.loc[:, \"TurnoverValue\"] = df_p[\"TurnoverValue\"].astype(np.float64)\n","df_p.loc[:, \"AdjustmentFactor\"] = df_p[\"AdjustmentFactor\"].astype(np.float64)\n","df_p.loc[:, \"AdjustmentOpen\"] = df_p[\"AdjustmentOpen\"].astype(np.float64)\n","df_p.loc[:, \"AdjustmentHigh\"] = df_p[\"AdjustmentHigh\"].astype(np.float64)\n","df_p.loc[:, \"AdjustmentLow\"] = df_p[\"AdjustmentLow\"].astype(np.float64)\n","df_p.loc[:, \"AdjustmentClose\"] = df_p[\"AdjustmentClose\"].astype(np.float64)\n","df_p.loc[:, \"AdjustmentVolume\"] = df_p[\"AdjustmentVolume\"].astype(np.float64)\n","\n","# 日付を絞り込みます\n","df_p = df_p.loc[df_p[\"Date\"] >= BASE_DATE]"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"I-fpvU4EQiZp"},"outputs":[],"source":["# 取得したデータを表示して確認します\n","df_p.head(2)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"K3chIJJNSIva"},"outputs":[],"source":["# 銘柄\n","target_symbols = TARGET_SYMBOLS\n","# 基準日\n","base_date = BASE_DATE\n","\n","# 対象銘柄および基準日以降のデータに絞り込み (計算量を減少させるため)\n","df_work = df_p.loc[(df_p[\"Code\"].isin(target_symbols)) & (df_p[\"Date\"] >= base_date)].copy()\n","\n","# # 株価をフィルするために並べ替えます\n","df_work.sort_values([\"Code\", \"Date\"], inplace=True)\n","# # 株価をフィルするために0をnanに置き換えます\n","df_work[\"AdjustmentClose\"].replace({0.0: np.nan}, inplace=True)\n","# # 終値が0の場合は前営業日の終値を使用します\n","df_work.loc[:, \"AdjustmentClose\"] = df_work.groupby(\"Code\")[\"AdjustmentClose\"].ffill()\n","# # 終値がnanの場合は翌営業日の終値を使用します (データの先頭を処理します)\n","# df_work.loc[:, \"AdjustmentClose\"] = df_work.groupby(\"Code\")[\"AdjustmentClose\"].bfill()\n","\n","# 基準日の終値を基準価格としてコピーします\n","df_work.loc[:, \"base_price\"] = df_work.loc[df_work[\"Date\"] == base_date, \"AdjustmentClose\"]\n","# base_priceをフォーワードフィルします\n","df_work.loc[:, \"base_price\"] = df_work.loc[:, \"base_price\"].ffill()\n","\n","# 基準価格からの変化率を計算\n","df_work.loc[:, \"percentage\"] = df_work[\"AdjustmentClose\"].div(df_work[\"base_price\"]) * 100\n","\n","# 銘柄情報と結合します\n","df_work = pd.merge(df_work, df_list, on=\"Code\")\n","# 銘柄コードと銘柄名を結合します\n","df_work[\"銘柄\"] = df_work[\"CompanyName\"] + \"(\" + df_work[\"Code\"] + \")\"\n","\n","# プロット用に整形します\n","df = df_work.pivot(index='Date', columns='銘柄', values='percentage')\n","\n","# プロットします\n","ax = df.plot(figsize=(20, 8), grid=True)\n","\n","# 縦軸100の位置に基準線を描画します\n","ax.axhline(y=100, color=\"black\")"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"fgQxPl9xKqZp"},"outputs":[],"source":[]}],"metadata":{"colab":{"authorship_tag":"ABX9TyOfd009YyGGYAvhV6/kJPoc","collapsed_sections":[],"name":"20220825-001-price-movement.ipynb","provenance":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0}
0 commit comments