こんにちは。TATです。
今日のテーマは「株価ヒートマップ」です。
久しぶりのおふざけ企画です。
株価の騰落率をヒートマップで可視化してみます。
finvzにあるようなヒートマップを作るのが目標です。
最終的にこういうものが出来上がります。
PythonのPlotlyで作りました。
Pythonで必要なデータを収集して上記のようなヒートマップを作っていきます。
目次
株価ヒートマップを使うとマーケットの動向が1発でわかる
まずは株価ヒートマップについて紹介します。
finvizの株価ヒートマップが有名です
ヒートマップは、データを数字によって色分けをして表現したチャートです。
finvizの株価ヒートマップが有名です。
引用元:https://finviz.com/map.ashx?t=sec
四角の大きさは時価総額を示しています。騰落率によって色が変化していることがわかります。
時価総額が最も大きいAppleが最大です。GAFAMはMeta以外どれも大きいですね。
全体のマーケット動向がわかる
株価ヒートマップを見ると、全体的なマーケット動向がすぐにわかります。
finvizの場合、騰落率がプラスならグリーン、マイナスならレッドになります。
全体を見てグリーンが多ければプラス、レッドが多ければマイナスと判断できます。
全体的に真っ赤な日には「おはぎゃー」と叫ばれながら株クラが賑やかになったりします。
関連記事: 【Pythonでデータ分析】株クラで目にする「おはぎゃー」のプロセスを自動化してみた!
セクター別の動向も簡単にわかる
finvizの株価ヒートマップは、セクター別にグルーピングされています。
よって、このグループ別に見れば、どのセクターが強いのか、同セクター内で違う動きをしている銘柄などを簡単に発見することができます。
上記の例(2022年10月11日時点)でいうと、OIL&GAS INTEGRATEDが特段マイナスが強いことが一目でわかります。
日本株でfinvizのような株価ヒートマップを作ってみたい
finvizのような株価ヒートマップを自力で作成することが本記事の目標です。
米国株のものはfinvizを見ればOKなので、ここでは日本株で作ってみようと思います。
必要なデータを整理する
まずは必要なデータを整理していきます。
株価ヒートマップを作成するために必要なデータは次の通りです。
必要なデータ
- 上場銘柄リスト(ここでは日経225を採用)
- 業種区分のリスト
- 各銘柄の株価と前日比騰落率
- 各銘柄の時価総額
上記のデータが必要になってきます。
全銘柄を株価ヒートマップにしてもカオスになるだけなので、今回は銘柄は日経225採用銘柄に絞っていきます。
市場ごとに時価総額の大きい銘柄トップ100とかに絞って作っても面白いかもですね。
データの準備
それではデータの準備をしていきます。
使用したコードはできる限り公開していきます。
サクッとスクレイピングで収集
日経225の情報がまとめられたサイトはいろいろあります。
今回はこちらのサイトからデータを取得しました。(スクレイピングのしやすさを考慮しました)
→ https://www.traders.co.jp/market_jp/nikkei225
Pythonでサクッとスクレイピングします。
import requests from bs4 import BeautifulSoup import re # HTMLを取得 url = "https://www.traders.co.jp/market_jp/nikkei225" r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") # テーブルを抽出してDataFrameに変換 df = pd.read_html(str(soup.find("table", {"class": "data_table"})))[0] # 「銘柄名(コード/市場)」から不要データを排除 df = df[df["銘柄名(コード/市場)"]!="銘柄名(コード/市場)"] # 銘柄名(コード/市場)から銘柄名、コード、市場を抽出 df["銘柄名"] = df["銘柄名(コード/市場)"].apply(lambda x: x.split("(")[0]) df["コード"] = df["銘柄名(コード/市場)"].apply(lambda x: x.split("(")[-1].split("/")[0]) df["市場"] = df["銘柄名(コード/市場)"].apply(lambda x: x.split("(")[-1].split("/")[1].replace(")", "")) # 前日比騰落率から騰落率を抽出 df["騰落率"] = df["前日比騰落率"].apply(lambda x: re.findall(pattern=r"([-]?[0-9.]+)%", string=x)[0]) # 数値に変換 df["騰落率"] = df["騰落率"].astype(float) df["現値"] = df["現値"].astype(float) df.head()
これで銘柄リスト、業種区分、前日比騰落率の情報が用意できました。
残すは時価総額のみです。
時価総額データはXBRLから収集
時価総額のデータについてはXBRLから収集しました。
実際には時価総額のデータではなくて、発行済株式数のデータを収集してます。
これに株価をかけると時価総額になります。
こちらは僕が運営している「投資でニート生活」で日々収集しているものです。
DBから直接引っ張ってきたのでコードは公開できません。
関連記事: PythonでTDNETとEDINETからXBRLデータを集めたら地獄だった話。
一応調べてみると、時価総額をまとめてくれているサイト(こことか)があるので、そこから収集しても同じチャートを作ることができます。
発行済株式数のデータが用意できれば、日々の株価をかければ最新の時価総額が計算できるので便利です。
データを結合して準備完了
次に、スクレイピングして収集したデータと発行済株式数のデータを結合します。
df = pd.merge( df, df_stock, how="left", left_on="コード", right_on="ticker", ) df.head()
最後に時価総額を計算すれば準備OKです。
df["時価総額"] = df["現値"] * df["value"] df.head()
これでデータの用意は完了です。
株価ヒートマップで可視化してみる
ようやく本番です。
用意したデータを使って株価ヒートマップを作っていきます。
Plotlyのtreemapを使います
チャートの作成にはPlotlyのtreemapを使います。
これを使えば、データをグルーピングして、データに基づいて大きさや色を変化させることができます。
業種でグルーピングして、大きさを時価総額、色を騰落率に設定すればOKです。
株価ヒートマップを作成する
株価ヒートマップを作ってみます。
Plotlyを使うと数行でできてしまいます。
import plotly.express as px # チャート作成 fig = px.treemap(df[df["時価総額"].isnull()==False], path=[px.Constant("全業種"), '業種', '銘柄名'], values='時価総額', color='騰落率', color_continuous_scale='RdBu', color_continuous_midpoint=0,) # 余白定義 fig.update_layout(margin = dict(t=10, l=10, r=10, b=10)) # チャートを表示 fig.show()
valuesを時価総額にしているので、四角の大きさが時価総額になります。
色(color)は騰落率です。
カラースケールはRdBuを選択しました。
マイナスならレッド、プラスならブルーになります。
ポイントはcolor_continuous_midpointを0にすることです。
こうすることで、プラスとマイナスで綺麗に色分けすることができます。
また、時価総額にNullがあって変な結果になってしまったので、これを除きました。
調べたら静岡銀行の発行済株式数のデータがありませんでしたw
とりあえず、これで株価ヒートマップが無事に完成しました。
業種別の動向が一目瞭然
上記のチャートは、2022年10月11日時点の株価データで作成しました。
全体的に赤色が目立つので、マーケット全体的には下がっていることがわかります。
そして業種別に見ると違いがよくわかります。
特に電気機器や精密機器の下げ方がひどいですね。
中でも日本電産が爆下がりしていることがわかります。
株価ヒートマップを使えば、マーケット全体はもちろん、業種別の動向もすぐに把握できるのでとても便利です。
時価総額を株価に変更してみる
最後におまけですが、四角の大きさを時価総額ではなくて直近の株価に変更してみます。
これで、時価総額関係なしに、株価の大きい銘柄が目立つようになります。
import plotly.express as px # チャート作成 fig = px.treemap(df, path=[px.Constant("全業種"), '業種', '銘柄名'], values='現値', color='騰落率', color_continuous_scale='RdBu', color_continuous_midpoint=0,) # 余白定義 fig.update_layout(margin = dict(t=25, l=25, r=25, b=25)) # チャートを表示 fig.show()
だいぶ見え方が変わりました。
電気機器は株価の高い銘柄が多いんですね。
小売業ではファーストリテイリングがずば抜けています。
いろいろとデータを変えながら見ていくと楽しそうです。
まとめ
本記事では、PythonのPlotlyを使って、finvizにあるような株価ヒートマップを日本株で作ってみました。
PythonのPlotlyを使うと、株価ヒートマップのような複雑なチャートでみ数行のコードで描くことができてしまいます。
特にPlotlyは便利です。インタラクティブな綺麗なチャートが簡単に描けます。便利すぎますね。
株価ヒートマップを使えば、マーケットの動向が一目でわかるのでとても便利です。
全体の動きも分かりますし、業種別の動きも簡単に把握できます。
急騰、急落している銘柄も簡単に見つかります。
本記事では、日経225銘柄を対象に株価ヒートマップを作ってみました。
これ以外にも、例えば市場別で時価総額の大きい銘柄トップ100とかを集めて株価ヒートマップを作ったりしても面白そうです。
ここまで読んでくださり、ありがとうございました。