本サイトは広告・プロモーションが含まれています
Python

【yfinance】Pythonで日本企業の株価一覧を取得してランキング化

Pythonを使って日本の株価を取得してラインキングしてみたので
そのコードの紹介。

証券コードについて

日本取引所グループさんが、良い感じのエクセルファイルを準備してくれてます!

上のリンクには、日本取引所グループさんが上場企業についてまとめたdata_j.xlsがダウンロードできます。

ダウンロードしたdata_j.xlsの中身を見てみると
以下のように、企業コードと、企業名などが記入されています。

企業コードが分かれば、後はyfinanceで検索していきます。

data_j.xlsの中身の一部

yfainanceを使ってjsonファイルに株価を保存

以下にyfinanceライブラリを使って
data_j.xlsに記載された企業の株価を取得します。

以下のコードが書かれたmain.pyをdata_j.xlsと同じディレクトリに保存します。

import os
import numpy as np
import pandas as pd
import yfinance as yf
from tqdm import tqdm
import json
import time

def save_stock_info_to_json(stock_info, filename="stock_info.json"):
    # ファイルが存在しない場合、空の配列を作成
    if not os.path.isfile(filename):
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump([], f, ensure_ascii=False, indent=4)
    
    # 既存のデータを読み込む
    with open(filename, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    # 新しい株式情報を追加
    data.append(stock_info)
    
    # 更新されたデータをファイルに書き戻す
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

def fetch_stock_info(ticker, df_data_j):
    ticker_num = f"{ticker}.T"
    ticker_data = yf.Ticker(ticker_num)
    history = ticker_data.history(period='1d')
    latest_date = history.index[-1].strftime('%Y-%m-%d') if not history.empty else None
    stock_name = df_data_j.loc[df_data_j['コード'] == ticker, '銘柄名'].values[0]
    return {
        '証券コード': ticker,
        '銘柄名': stock_name,
        '株価': history['Close'][-1] if not history.empty else None,
        '最新株価日付': latest_date
    }

def main():
    if not os.path.isfile('data_j.xls'):
        print(f"{os.getcwd()}\n東証上場銘柄一覧を[data_j.xls]のファイル名で保存してください。")
        exit()
        
    print('東証上場銘柄一覧を読み込みます。')
    df_data_j = pd.read_excel('data_j.xls', index_col=None)
    df_data_j = df_data_j[~df_data_j['市場・商品区分'].isin(['REIT・ベンチャーファンド・カントリーファンド・インフラファンド', 'ETF・ETN'])]
    df_data_j = df_data_j[df_data_j['コード'] != 25935]

    total_codes = len(df_data_j['コード'])
    start_index, end_index = 0, int(np.ceil(total_codes * 1))

    for ticker in tqdm(df_data_j['コード'][start_index:end_index]):
        try:
            stock_info = fetch_stock_info(ticker, df_data_j)
            print(stock_info)
            save_stock_info_to_json(stock_info)
        except Exception as e:
            print(f'証券コード {ticker} のデータ取得中にエラーが発生しました: {e}')

if __name__ == "__main__":
    main()

このコードを実行すると、stock_info.jsonにデータが保存されます。

今回は株価だけなので

df_data_j = pd.read_excel(‘data_j.xls’, index_col=None)
df_data_j = df_data_j[~df_data_j[‘市場・商品区分’].isin([‘REIT・ベンチャーファンド・カントリーファンド・インフラファンド’, ‘ETF・ETN’])]
df_data_j = df_data_j[df_data_j[‘コード’] != 25935]

と書かれた行で、関係のないコードを省いてます。

ランキング化

stock_info.jsonファイルが作成されたら
以下のコードをstock_info.jsonと同じディレクトリに保存します。

import json

def load_stock_info_from_json(filename="stock_info.json"):
    with open(filename, 'r', encoding='utf-8') as f:
        stock_info_list = json.load(f)  # ファイル全体を一つのJSONオブジェクトとして読み込む
    return stock_info_list

def print_top_10_stocks_by_price(stock_info_list):
    # '株価'がNoneでないものをフィルタリングし、株価でソートしてトップ10を取得
    top_10_stocks = sorted(
        [stock for stock in stock_info_list if stock['株価'] is not None],
        key=lambda x: x['株価'],
        reverse=True
    )[:10]
    
    # トップ10の株価を表示
    for stock in top_10_stocks:
        print(f"証券コード: {stock['証券コード']}, 銘柄名: {stock['銘柄名']}, 株価: {stock['株価']}, 最新株価日付: {stock['最新株価日付']}")

# JSONファイルから株情報を読み込む
stock_info_list = load_stock_info_from_json()

# 株価トップ10を表示
print_top_10_stocks_by_price(stock_info_list)

このコードを実行したら、コマンドプロンプトには以下のような感じで
株価上位ランキングが表示されます。


この画像の結果なのですが
信金中央金庫の株価めっちゃ高くて、コードがどこか悪いかと思いました。

てっきりファーストリテイリングが高いと思ってたんですけど
意外と4位??ディスコが上がってきてる気もする。


管理人の投資はインデックス投資に任せちゃってるので
株価色々と調べられて楽しかったです(小並感)

おわりに


ここまで読んでいただき、ありがとうございました。
今回はyfinanceを使った株価の取得について書かせてもらいました。

実は今回の記事は
企業コードにアルファベットが入るから、以前紹介してくれたコードだと無理だよと
コメントをいただけたのがきっかけでした。

なので企業コードについて再度調べて、他のサイト様の方法を参考させてもらい
jsonファイルに株価を保存→株価ランキングを表示するまでのコードを書かせていただきました。

非常にありがたいコメント誠にありがとうございました。
これからも皆様のコメントお待ちしております。

参考にしたサイト様

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA